diff --git a/Makefile b/Makefile index 573b8f1..8e9a787 100644 --- a/Makefile +++ b/Makefile @@ -17,14 +17,19 @@ HEADS = \ src/util.h \ src/crc.h \ src/fileutil.h \ - src/filenode.h + src/filenode.h \ + src/actionfilenode.h \ + src/actionfilenodesync.h \ + src/actionfilenodecopy.h OBJS_BASE = \ $(BUILDDIR)/util.o \ $(BUILDDIR)/crc.o \ $(BUILDDIR)/fileutil.o \ $(BUILDDIR)/filenode.o \ - $(BUILDDIR)/filenodecmp.o + $(BUILDDIR)/actionfilenode.o \ + $(BUILDDIR)/actionfilenodesync.o \ + $(BUILDDIR)/actionfilenodecopy.o OBJS_APP = \ $(OBJS_BASE) \ @@ -61,9 +66,14 @@ $(BUILDDIR)/fileutil.o: src/fileutil.c $(HEADS) $(BUILDDIR)/filenode.o: src/filenode.c $(HEADS) $(DO_CC) -$(BUILDDIR)/filenodecmp.o: src/filenodecmp.c $(HEADS) +$(BUILDDIR)/actionfilenode.o: src/actionfilenode.c $(HEADS) $(DO_CC) +$(BUILDDIR)/actionfilenodesync.o: src/actionfilenodesync.c $(HEADS) + $(DO_CC) + +$(BUILDDIR)/actionfilenodecopy.o: src/actionfilenodecopy.c $(HEADS) + $(DO_CC) $(BUILDDIR)/main.o: src/main.c $(HEADS) $(DO_CC) @@ -74,4 +84,3 @@ $(RES_APP): $(BUILDDIR) $(OBJS_APP) @$(CC) $(OBJS_APP) \ -o $(RES_APP) $(LIBS) - diff --git a/MonoDevelop/FileSync/FileSync.cproj b/MonoDevelop/FileSync/FileSync.cproj index 931b054..8043657 100644 --- a/MonoDevelop/FileSync/FileSync.cproj +++ b/MonoDevelop/FileSync/FileSync.cproj @@ -36,8 +36,14 @@ src\filenode.c - - src\filenodecmp.c + + src\actionfilenode.c + + + src\actionfilenodesync.c + + + src\actionfilenodecopy.c src\fileutil.c @@ -56,8 +62,14 @@ src\filenode.h - - src\filenodecmp.h + + src\actionfilenode.h + + + src\actionfilenodesync.h + + + src\actionfilenodecopy.h src\fileutil.h diff --git a/VisualStudio/filesync/filesync.vcxproj b/VisualStudio/filesync/filesync.vcxproj index ac68d4f..8559ac1 100644 --- a/VisualStudio/filesync/filesync.vcxproj +++ b/VisualStudio/filesync/filesync.vcxproj @@ -121,17 +121,21 @@ + + + - + + + - diff --git a/VisualStudio/filesync/filesync.vcxproj.filters b/VisualStudio/filesync/filesync.vcxproj.filters index 9e03e75..a87f9da 100644 --- a/VisualStudio/filesync/filesync.vcxproj.filters +++ b/VisualStudio/filesync/filesync.vcxproj.filters @@ -21,9 +21,6 @@ Archivos de código fuente - - Archivos de código fuente - Archivos de código fuente @@ -33,6 +30,15 @@ Archivos de código fuente + + Archivos de código fuente + + + Archivos de código fuente + + + Archivos de código fuente + @@ -41,15 +47,21 @@ Archivos de encabezado - - Archivos de encabezado - Archivos de encabezado Archivos de encabezado + + Archivos de encabezado + + + Archivos de encabezado + + + Archivos de encabezado + diff --git a/src/filenodecmp.c b/src/actionfilenode.c similarity index 53% rename from src/filenodecmp.c rename to src/actionfilenode.c index d1810e4..b704d6a 100644 --- a/src/filenodecmp.c +++ b/src/actionfilenode.c @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -6,11 +6,7 @@ #include "crc.h" #include "fileutil.h" #include "filenode.h" -#include "filenodecmp.h" - -int maxDeltaTime = 4000; - -#define QueueNode(queue,node) (queue)->next = (node); (queue) = (node); +#include "actionfilenode.h" ActionFileNode _actionFileNodeFree = NULL; #define AccionFileNode_Block 1024 @@ -63,7 +59,8 @@ ActionFileNode ActionFileNode_CreateNormal(FileNode fileNodeLeft, } -void AccionFileNode_CompareChilds(ActionFileNode actionFileNodeRoot, +void AccionFileNode_CompareChilds( + ActionFileNode actionFileNodeRoot, ActionFileNode *actionFileNodeQueue, void(*CheckPair)(FileNode fileNodeLeft, FileNode fileNodeRight, ActionFileNode *actionFileNodeQueue)) @@ -152,373 +149,8 @@ void AccionFileNode_CompareChilds(ActionFileNode actionFileNodeRoot, } -void AccionFileNode_DeletePair(FileNode fileNodeLeft, FileNode fileNodeRight, - ActionFileNode *actionFileNodeQueue) -{ - ActionFileNode actionFileNodeNew = ActionFileNode_CreateNormal( - fileNodeLeft, fileNodeRight); - - if (!fileNodeLeft && !fileNodeRight) { - AccionFileNode_Destroy(actionFileNodeNew); - return; - } - if (!fileNodeLeft && fileNodeRight) { - if (fileNodeRight->flags & FileFlag_Directory) { - // Iterate childs for deletion - AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, - AccionFileNode_DeletePair); - } - - if (fileNodeRight->status != FileStatus_Deleted) { - // Node delete action - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - else { - AccionFileNode_Destroy(actionFileNodeNew); - } - } - if (fileNodeLeft && !fileNodeRight) { - if (fileNodeLeft->flags & FileFlag_Directory) { - // Iterate childs for deletion - AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, - AccionFileNode_DeletePair); - } - - if (fileNodeLeft->status != FileStatus_Deleted) { - // Node delete action - actionFileNodeNew->action = ActionFileCmp_DeleteLeft; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - else { - AccionFileNode_Destroy(actionFileNodeNew); - } - } - if (fileNodeLeft && fileNodeRight) { - if ((fileNodeLeft->flags & FileFlag_Directory) - || (fileNodeRight->flags & FileFlag_Directory)) { - // One is Directory - - // Iterate childs for deletion - AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, - AccionFileNode_DeletePair); - } - - if (fileNodeLeft->status != FileStatus_Deleted) { - // Left node delete action - actionFileNodeNew->action = ActionFileCmp_DeleteLeft; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - actionFileNodeNew = NULL; - } - if (fileNodeRight->status != FileStatus_Deleted) { - if (!actionFileNodeNew) { - actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, - fileNodeRight); - } - // Right node delete action - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - actionFileNodeNew = NULL; - } - if (actionFileNodeNew) { - AccionFileNode_Destroy(actionFileNodeNew); - } - } -} - -void AccionFileNode_SyncPair(FileNode fileNodeLeft, FileNode fileNodeRight, - ActionFileNode *actionFileNodeQueue) -{ - ActionFileNode actionFileNodeNew = ActionFileNode_CreateNormal( - fileNodeLeft, fileNodeRight); - - if (!fileNodeLeft && !fileNodeRight) { - AccionFileNode_Destroy(actionFileNodeNew); - return; - } - if (!fileNodeLeft && fileNodeRight) { - if (fileNodeRight->flags & FileFlag_Directory) { - // Directory - if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - else { - actionFileNodeNew->action = ActionFileCmp_MakeLeftDirectory; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - - // Iterate childs - AccionFileNode_CompareChilds(actionFileNodeNew, - actionFileNodeQueue, AccionFileNode_SyncPair); - - // Creatre new action for date copy - actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, - fileNodeRight); - actionFileNodeNew->action = ActionFileCmp_DateRightToLeft; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - } - else { - // File - if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - else { - actionFileNodeNew->action = ActionFileCmp_RightToLeft; - } - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - } - if (fileNodeLeft && !fileNodeRight) { - if (fileNodeLeft->flags & FileFlag_Directory) { - // Directory - if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - else { - actionFileNodeNew->action = ActionFileCmp_MakeRightDirectory; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - - // Iterate childs - AccionFileNode_CompareChilds(actionFileNodeNew, - actionFileNodeQueue, AccionFileNode_SyncPair); - - // Create new action for date copy - actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, - fileNodeRight); - actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - } - else { - // File - if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - else { - actionFileNodeNew->action = ActionFileCmp_LeftToRight; - } - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - } - if (fileNodeLeft && fileNodeRight) { - if ((fileNodeLeft->flags & FileFlag_Directory) - && (fileNodeRight->flags & FileFlag_Directory)) - { - // Directory - - // Prepare action for directory pair - if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) <= maxDeltaTime) { // aprox. equal - if (fileNodeRight->status == FileStatus_Deleted - && fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - else if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteLeft; - } - else if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - } - else { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - } - else if (fileNodeLeft->fileTime < fileNodeRight->fileTime) { - actionFileNodeNew->action = ActionFileCmp_DateRightToLeft; - if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteLeft; - if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - } - } - else if (fileNodeLeft->fileTime > fileNodeRight->fileTime) { - actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; - if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - } - } - - // Process child nodes - if (actionFileNodeNew->action == ActionFileCmp_DeleteRight - || actionFileNodeNew->action == ActionFileCmp_DeleteLeft - || (fileNodeLeft->status == FileStatus_Deleted - && fileNodeRight->status == FileStatus_Deleted)) { - // Iterate child nodes for deletion - AccionFileNode_CompareChilds(actionFileNodeNew, - actionFileNodeQueue, AccionFileNode_DeletePair); - } - else { - AccionFileNode_CompareChilds(actionFileNodeNew, - actionFileNodeQueue, AccionFileNode_SyncPair); - } - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - else if ((fileNodeLeft->flags & FileFlag_Normal) - && (fileNodeRight->flags & FileFlag_Normal)) - { - // Files - - // Prepare action for file pair - if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) <= maxDeltaTime) { // aprox. equal - if (fileNodeRight->status == FileStatus_Deleted - && fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - else if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteLeft; - } - else if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - } - else { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - } - else if (fileNodeLeft->fileTime < fileNodeRight->fileTime) { - // FIXME: Check size to determine y further checks are necessary - actionFileNodeNew->action = ActionFileCmp_RightToLeft; - if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteLeft; - if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - } - } - else if (fileNodeLeft->fileTime > fileNodeRight->fileTime) { - // FIXME: Check size to determine y further checks are necessary - actionFileNodeNew->action = ActionFileCmp_LeftToRight; - if (fileNodeLeft->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - if (fileNodeRight->status == FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - } - } - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - else { - // FIXME: !!!!! - // Directory vs File - - } - } -} - -ActionFileNode ActionFileNode_BuildSync(FileNode izquierda, FileNode derecha) { - ActionFileNode actionFileNodeRoot = ActionFileNode_CreateNormal(izquierda, - derecha); - ActionFileNode actionFileNodeQueue = actionFileNodeRoot; - AccionFileNode_CompareChilds(actionFileNodeRoot, &actionFileNodeQueue, - AccionFileNode_SyncPair); - return actionFileNodeRoot; -} - -void AccionFileNode_Copy(FileNode fileNodeLeft, FileNode fileNodeRight, - ActionFileNode *actionFileNodeQueue) -{ - ActionFileNode actionFileNodeNew = ActionFileNode_CreateNormal( - fileNodeLeft, fileNodeRight); - - if (!fileNodeLeft && !fileNodeRight) { - AccionFileNode_Destroy(actionFileNodeNew); - return; - } - if (!fileNodeLeft && fileNodeRight) { - if (fileNodeRight->flags & FileFlag_Directory) { - AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, - AccionFileNode_DeletePair); - } - - if (fileNodeRight->status != FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - } - else { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - if (fileNodeLeft && !fileNodeRight) { - if (fileNodeLeft->status != FileStatus_Deleted) { - if (fileNodeLeft->flags & FileFlag_Directory) { - actionFileNodeNew->action = ActionFileCmp_MakeRightDirectory; - (*actionFileNodeQueue)->next = actionFileNodeNew; - (*actionFileNodeQueue) = actionFileNodeNew; - AccionFileNode_CompareChilds(actionFileNodeNew, - actionFileNodeQueue, AccionFileNode_Copy); - actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, - fileNodeRight); - actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; - } - else { - actionFileNodeNew->action = ActionFileCmp_LeftToRight; - } - } - else { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } - if (fileNodeLeft && fileNodeRight) { - if ((fileNodeLeft->flags & FileFlag_Directory) - || (fileNodeRight->flags & FileFlag_Directory)) - { - if (fileNodeLeft->status != FileStatus_Deleted) { - AccionFileNode_CompareChilds(actionFileNodeNew, - actionFileNodeQueue, AccionFileNode_Copy); - if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) - <= maxDeltaTime) { // appox. equal - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - else { - actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; - } - } - else { - AccionFileNode_CompareChilds(actionFileNodeNew, - actionFileNodeQueue, AccionFileNode_DeletePair); - if (fileNodeRight->status != FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - } - } - } - else { - if (fileNodeLeft->status != FileStatus_Deleted) { - if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) - <= maxDeltaTime) - { - actionFileNodeNew->action = ActionFileCmp_Nothing; - } - else { - actionFileNodeNew->action = ActionFileCmp_LeftToRight; - } - } - else { - if (fileNodeRight->status != FileStatus_Deleted) { - actionFileNodeNew->action = ActionFileCmp_DeleteRight; - } - } - } - QueueNode(*actionFileNodeQueue, actionFileNodeNew); - } -} - -ActionFileNode ActionFileNode_BuildCopy(FileNode fileNodeLeft, - FileNode fileNodeRight) { - ActionFileNode actionFileNodeRoot = ActionFileNode_CreateNormal( - fileNodeLeft, fileNodeRight); - ActionFileNode actionFileNodeQueue = actionFileNodeRoot; - AccionFileNode_CompareChilds(actionFileNodeRoot, &actionFileNodeQueue, - AccionFileNode_Copy); - return actionFileNodeRoot; -} - void ActionFileNode_Statistics(ActionFileNode actionFileNode, - ActionQueueStatistics *statistics) + ActionQueueStatistics *statistics) { statistics->readLeft = 0; statistics->writeLeft = 0; @@ -643,7 +275,7 @@ void AccionFileNodeAux_MakeDir(char *pathOrig, char *pathDest) { } void ActionFileNode_RunList(ActionFileNode actionFileNode, char *pathLeft, - char *pathRight) + char *pathRight) { char fullPathLeft[MaxPath], fullPathRight[MaxPath], showPath[MaxPath]; while (actionFileNode != NULL) { @@ -706,3 +338,83 @@ void ActionFileNode_RunList(ActionFileNode actionFileNode, char *pathLeft, } printff("End\n"); } + + +// ---------------------------------------------------------------------------- +// Common utilities + +#define QueueNode(queue,node) (queue)->next = (node); (queue) = (node); + +void AccionFileNode_DeletePair(FileNode fileNodeLeft, FileNode fileNodeRight, + ActionFileNode *actionFileNodeQueue) +{ + ActionFileNode actionFileNodeNew = ActionFileNode_CreateNormal( + fileNodeLeft, fileNodeRight); + + if (!fileNodeLeft && !fileNodeRight) { + AccionFileNode_Destroy(actionFileNodeNew); + return; + } + if (!fileNodeLeft && fileNodeRight) { + if (fileNodeRight->flags & FileFlag_Directory) { + // Iterate childs for deletion + AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, + AccionFileNode_DeletePair); + } + + if (fileNodeRight->status != FileStatus_Deleted) { + // Node delete action + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + else { + AccionFileNode_Destroy(actionFileNodeNew); + } + } + if (fileNodeLeft && !fileNodeRight) { + if (fileNodeLeft->flags & FileFlag_Directory) { + // Iterate childs for deletion + AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, + AccionFileNode_DeletePair); + } + + if (fileNodeLeft->status != FileStatus_Deleted) { + // Node delete action + actionFileNodeNew->action = ActionFileCmp_DeleteLeft; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + else { + AccionFileNode_Destroy(actionFileNodeNew); + } + } + if (fileNodeLeft && fileNodeRight) { + if ((fileNodeLeft->flags & FileFlag_Directory) + || (fileNodeRight->flags & FileFlag_Directory)) { + // One is Directory + + // Iterate childs for deletion + AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, + AccionFileNode_DeletePair); + } + + if (fileNodeLeft->status != FileStatus_Deleted) { + // Left node delete action + actionFileNodeNew->action = ActionFileCmp_DeleteLeft; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + actionFileNodeNew = NULL; + } + if (fileNodeRight->status != FileStatus_Deleted) { + if (!actionFileNodeNew) { + actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, + fileNodeRight); + } + // Right node delete action + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + actionFileNodeNew = NULL; + } + if (actionFileNodeNew) { + AccionFileNode_Destroy(actionFileNodeNew); + } + } +} diff --git a/src/filenodecmp.h b/src/actionfilenode.h similarity index 75% rename from src/filenodecmp.h rename to src/actionfilenode.h index 961014d..cacf192 100644 --- a/src/filenodecmp.h +++ b/src/actionfilenode.h @@ -1,5 +1,5 @@ -#ifndef _FILENODECMP_H_ -#define _FILENODECMP_H_ +#ifndef _ACTIONFILENODE_H_ +#define _ACTIONFILENODE_H_ #include "filenode.h" @@ -28,10 +28,11 @@ void AccionFileNode_Destroy(ActionFileNode actionFileNode); ActionFileNode ActionFileNode_CreateNormal(FileNode fileNodeLeft, FileNode fileNodeRight); -ActionFileNode ActionFileNode_BuildSync(FileNode fileNodeLeft, - FileNode fileNodeRight); -ActionFileNode ActionFileNode_BuildCopy(FileNode fileNodeLeft, - FileNode fileNodeRight); +void AccionFileNode_CompareChilds( + ActionFileNode actionFileNodeRoot, + ActionFileNode *actionFileNodeQueue, + void(*CheckPair)(FileNode fileNodeLeft, FileNode fileNodeRight, + ActionFileNode *actionFileNodeQueue)); typedef struct SActionQueueStatistics { long long readLeft; @@ -54,4 +55,10 @@ void ActionFileNode_Print(ActionFileNode actionFileNode); void ActionFileNode_RunList(ActionFileNode actionFileNode, char *pathLeft, char *pathRight); + +// Common utilities + +void AccionFileNode_DeletePair(FileNode fileNodeLeft, FileNode fileNodeRight, + ActionFileNode *actionFileNodeQueue); + #endif diff --git a/src/actionfilenodecopy.c b/src/actionfilenodecopy.c new file mode 100644 index 0000000..ec740d0 --- /dev/null +++ b/src/actionfilenodecopy.c @@ -0,0 +1,115 @@ +#include +#include +#include + +#include "util.h" +#include "crc.h" +#include "fileutil.h" +#include "filenode.h" +#include "actionfilenode.h" +#include "actionfilenodesync.h" + +#define maxDeltaTime 4000 + +#define QueueNode(queue,node) (queue)->next = (node); (queue) = (node); + + +void AccionFileNode_CopyPair(FileNode fileNodeLeft, FileNode fileNodeRight, + ActionFileNode *actionFileNodeQueue) +{ + ActionFileNode actionFileNodeNew = ActionFileNode_CreateNormal( + fileNodeLeft, fileNodeRight); + + if (!fileNodeLeft && !fileNodeRight) { + AccionFileNode_Destroy(actionFileNodeNew); + return; + } + if (!fileNodeLeft && fileNodeRight) { + if (fileNodeRight->flags & FileFlag_Directory) { + AccionFileNode_CompareChilds(actionFileNodeNew, actionFileNodeQueue, + AccionFileNode_DeletePair); + } + + if (fileNodeRight->status != FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + } + else { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + if (fileNodeLeft && !fileNodeRight) { + if (fileNodeLeft->status != FileStatus_Deleted) { + if (fileNodeLeft->flags & FileFlag_Directory) { + actionFileNodeNew->action = ActionFileCmp_MakeRightDirectory; + (*actionFileNodeQueue)->next = actionFileNodeNew; + (*actionFileNodeQueue) = actionFileNodeNew; + AccionFileNode_CompareChilds(actionFileNodeNew, + actionFileNodeQueue, AccionFileNode_CopyPair); + actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, + fileNodeRight); + actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; + } + else { + actionFileNodeNew->action = ActionFileCmp_LeftToRight; + } + } + else { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + if (fileNodeLeft && fileNodeRight) { + if ((fileNodeLeft->flags & FileFlag_Directory) + || (fileNodeRight->flags & FileFlag_Directory)) + { + if (fileNodeLeft->status != FileStatus_Deleted) { + AccionFileNode_CompareChilds(actionFileNodeNew, + actionFileNodeQueue, AccionFileNode_CopyPair); + if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) + <= maxDeltaTime) { // appox. equal + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + else { + actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; + } + } + else { + AccionFileNode_CompareChilds(actionFileNodeNew, + actionFileNodeQueue, AccionFileNode_DeletePair); + if (fileNodeRight->status != FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + } + } + } + else { + if (fileNodeLeft->status != FileStatus_Deleted) { + if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) + <= maxDeltaTime) + { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + else { + actionFileNodeNew->action = ActionFileCmp_LeftToRight; + } + } + else { + if (fileNodeRight->status != FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + } + } + } + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } +} + +ActionFileNode ActionFileNode_BuildCopy(FileNode fileNodeLeft, + FileNode fileNodeRight) { + ActionFileNode actionFileNodeRoot = ActionFileNode_CreateNormal( + fileNodeLeft, fileNodeRight); + ActionFileNode actionFileNodeQueue = actionFileNodeRoot; + AccionFileNode_CompareChilds(actionFileNodeRoot, &actionFileNodeQueue, + AccionFileNode_CopyPair); + return actionFileNodeRoot; +} + diff --git a/src/actionfilenodecopy.h b/src/actionfilenodecopy.h new file mode 100644 index 0000000..708cf2c --- /dev/null +++ b/src/actionfilenodecopy.h @@ -0,0 +1,10 @@ +#ifndef _ACTIONFILENODECOPY_H_ +#define _ACTIONFILENODECOPY_H_ + +#include "filenode.h" +#include "actionfilenode.h" + +ActionFileNode ActionFileNode_BuildCopy(FileNode fileNodeLeft, + FileNode fileNodeRight); + +#endif diff --git a/src/actionfilenodesync.c b/src/actionfilenodesync.c new file mode 100644 index 0000000..b082774 --- /dev/null +++ b/src/actionfilenodesync.c @@ -0,0 +1,206 @@ +#include +#include +#include + +#include "util.h" +#include "crc.h" +#include "fileutil.h" +#include "filenode.h" +#include "actionfilenode.h" +#include "actionfilenodesync.h" + +#define maxDeltaTime 4000 + +#define QueueNode(queue,node) (queue)->next = (node); (queue) = (node); + +void AccionFileNode_SyncPair(FileNode fileNodeLeft, FileNode fileNodeRight, + ActionFileNode *actionFileNodeQueue) +{ + ActionFileNode actionFileNodeNew = ActionFileNode_CreateNormal( + fileNodeLeft, fileNodeRight); + + if (!fileNodeLeft && !fileNodeRight) { + AccionFileNode_Destroy(actionFileNodeNew); + return; + } + if (!fileNodeLeft && fileNodeRight) { + if (fileNodeRight->flags & FileFlag_Directory) { + // Directory + if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + else { + actionFileNodeNew->action = ActionFileCmp_MakeLeftDirectory; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + + // Iterate childs + AccionFileNode_CompareChilds(actionFileNodeNew, + actionFileNodeQueue, AccionFileNode_SyncPair); + + // Creatre new action for date copy + actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, + fileNodeRight); + actionFileNodeNew->action = ActionFileCmp_DateRightToLeft; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + } + else { + // File + if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + else { + actionFileNodeNew->action = ActionFileCmp_RightToLeft; + } + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + } + if (fileNodeLeft && !fileNodeRight) { + if (fileNodeLeft->flags & FileFlag_Directory) { + // Directory + if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + else { + actionFileNodeNew->action = ActionFileCmp_MakeRightDirectory; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + + // Iterate childs + AccionFileNode_CompareChilds(actionFileNodeNew, + actionFileNodeQueue, AccionFileNode_SyncPair); + + // Create new action for date copy + actionFileNodeNew = ActionFileNode_CreateNormal(fileNodeLeft, + fileNodeRight); + actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + } + else { + // File + if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + else { + actionFileNodeNew->action = ActionFileCmp_LeftToRight; + } + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + } + if (fileNodeLeft && fileNodeRight) { + if ((fileNodeLeft->flags & FileFlag_Directory) + && (fileNodeRight->flags & FileFlag_Directory)) + { + // Directory + + // Prepare action for directory pair + if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) <= maxDeltaTime) { // aprox. equal + if (fileNodeRight->status == FileStatus_Deleted + && fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + else if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteLeft; + } + else if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + } + else { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + } + else if (fileNodeLeft->fileTime < fileNodeRight->fileTime) { + actionFileNodeNew->action = ActionFileCmp_DateRightToLeft; + if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteLeft; + if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + } + } + else if (fileNodeLeft->fileTime > fileNodeRight->fileTime) { + actionFileNodeNew->action = ActionFileCmp_DateLeftToRight; + if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + } + } + + // Process child nodes + if (actionFileNodeNew->action == ActionFileCmp_DeleteRight + || actionFileNodeNew->action == ActionFileCmp_DeleteLeft + || (fileNodeLeft->status == FileStatus_Deleted + && fileNodeRight->status == FileStatus_Deleted)) { + // Iterate child nodes for deletion + AccionFileNode_CompareChilds(actionFileNodeNew, + actionFileNodeQueue, AccionFileNode_DeletePair); + } + else { + AccionFileNode_CompareChilds(actionFileNodeNew, + actionFileNodeQueue, AccionFileNode_SyncPair); + } + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + else if ((fileNodeLeft->flags & FileFlag_Normal) + && (fileNodeRight->flags & FileFlag_Normal)) + { + // Files + + // Prepare action for file pair + if (abs((int)(fileNodeLeft->fileTime - fileNodeRight->fileTime)) <= maxDeltaTime) { // aprox. equal + if (fileNodeRight->status == FileStatus_Deleted + && fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + else if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteLeft; + } + else if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + } + else { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + } + else if (fileNodeLeft->fileTime < fileNodeRight->fileTime) { + // FIXME: Check size to determine y further checks are necessary + actionFileNodeNew->action = ActionFileCmp_RightToLeft; + if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteLeft; + if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + } + } + else if (fileNodeLeft->fileTime > fileNodeRight->fileTime) { + // FIXME: Check size to determine y further checks are necessary + actionFileNodeNew->action = ActionFileCmp_LeftToRight; + if (fileNodeLeft->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_DeleteRight; + if (fileNodeRight->status == FileStatus_Deleted) { + actionFileNodeNew->action = ActionFileCmp_Nothing; + } + } + } + QueueNode(*actionFileNodeQueue, actionFileNodeNew); + } + else { + // FIXME: !!!!! + // Directory vs File + + } + } +} + +ActionFileNode ActionFileNode_BuildSync(FileNode izquierda, FileNode derecha) { + ActionFileNode actionFileNodeRoot = ActionFileNode_CreateNormal(izquierda, + derecha); + ActionFileNode actionFileNodeQueue = actionFileNodeRoot; + AccionFileNode_CompareChilds(actionFileNodeRoot, &actionFileNodeQueue, + AccionFileNode_SyncPair); + return actionFileNodeRoot; +} diff --git a/src/actionfilenodesync.h b/src/actionfilenodesync.h new file mode 100644 index 0000000..4b1b00c --- /dev/null +++ b/src/actionfilenodesync.h @@ -0,0 +1,10 @@ +#ifndef _ACTIONFILENODESYNC_H_ +#define _ACTIONFILENODESYNC_H_ + +#include "filenode.h" +#include "actionfilenode.h" + +ActionFileNode ActionFileNode_BuildSync(FileNode fileNodeLeft, + FileNode fileNodeRight); + +#endif diff --git a/src/main.c b/src/main.c index 4377e73..aabb8aa 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,10 @@ #include "crc.h" #include "fileutil.h" #include "filenode.h" -#include "filenodecmp.h" +#include "actionfilenode.h" +#include "actionfilenodesync.h" +#include "actionfilenodecopy.h" + void Help(char *exe) { char exeFilename[MaxPath];