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];