summaryrefslogtreecommitdiff
path: root/zen/file_traverser.h
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:15:16 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:15:16 +0200
commitbd6336c629841c6db3a6ca53a936d629d34db53b (patch)
tree3721ef997864108df175ce677a8a7d4342a6f1d2 /zen/file_traverser.h
parent4.0 (diff)
downloadFreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.gz
FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.bz2
FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.zip
4.1
Diffstat (limited to 'zen/file_traverser.h')
-rw-r--r--zen/file_traverser.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/zen/file_traverser.h b/zen/file_traverser.h
new file mode 100644
index 00000000..4dbed9f9
--- /dev/null
+++ b/zen/file_traverser.h
@@ -0,0 +1,86 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+
+#ifndef FILETRAVERSER_H_INCLUDED
+#define FILETRAVERSER_H_INCLUDED
+
+#include "zstring.h"
+#include "type_tools.h"
+#include "int64.h"
+
+//advanced file traverser returning metadata and hierarchical information on files and directories
+
+namespace zen
+{
+class TraverseCallback
+{
+public:
+ virtual ~TraverseCallback() {}
+
+ struct FileInfo
+ {
+ UInt64 fileSize; //unit: bytes!
+ Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
+ };
+
+ struct SymlinkInfo
+ {
+ Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
+ Zstring targetPath; //may be empty if something goes wrong
+ bool dirLink; //"true": point to dir; "false": point to file (or broken Link on Linux)
+ };
+
+ struct ReturnValDir
+ {
+ enum ReturnValueEnh
+ {
+ TRAVERSING_DIR_IGNORE,
+ TRAVERSING_DIR_CONTINUE
+ };
+
+ ReturnValDir(Int2Type<TRAVERSING_DIR_IGNORE>) : returnCode(TRAVERSING_DIR_IGNORE), subDirCb(NULL) {}
+ ReturnValDir(Int2Type<TRAVERSING_DIR_CONTINUE>, TraverseCallback& subDirCallback) : returnCode(TRAVERSING_DIR_CONTINUE), subDirCb(&subDirCallback) {}
+
+ ReturnValueEnh returnCode;
+ TraverseCallback* subDirCb;
+ };
+
+ enum HandleError
+ {
+ TRAV_ERROR_RETRY,
+ TRAV_ERROR_IGNORE
+ };
+
+ //overwrite these virtual methods
+ virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) = 0;
+ virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0;
+ virtual ReturnValDir onDir (const Zchar* shortName, const Zstring& fullName) = 0;
+ virtual HandleError onError (const std::wstring& errorText) = 0;
+};
+
+
+#ifdef FFS_WIN
+struct DstHackCallback
+{
+ virtual ~DstHackCallback() {}
+ virtual void requestUiRefresh(const Zstring& filename) = 0; //applying DST hack imposes significant one-time performance drawback => callback to inform user
+};
+#else
+struct DstHackCallback; //DST hack not required on Linux
+#endif
+
+//custom traverser with detail information about files
+//directory may end with PATH_SEPARATOR
+void traverseFolder(const Zstring& directory, //throw();
+ bool followSymlinks,
+ TraverseCallback& sink,
+ DstHackCallback* dstCallback = NULL); //apply DST hack if callback is supplied
+//followSymlinks:
+//"true": Symlinks dereferenced and reported via onFile() and onDir() => onSymlink not used!
+//"false": Symlinks directly reported via onSymlink(), directory symlinks are not followed
+}
+
+#endif // FILETRAVERSER_H_INCLUDED
bgstack15