// ************************************************************************** // * 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) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PARALLEL_SCAN_H_INCLUDED #define PARALLEL_SCAN_H_INCLUDED #include #include #include "hard_filter.h" #include "../structures.h" #include "../file_hierarchy.h" namespace zen { struct DirectoryKey { DirectoryKey(const Zstring& dirnameFull, const HardFilter::FilterRef& filter, SymLinkHandling handleSymlinks) : dirnameFull_(dirnameFull), filter_(filter), handleSymlinks_(handleSymlinks) {} Zstring dirnameFull_; HardFilter::FilterRef filter_; //filter interface: always bound by design! SymLinkHandling handleSymlinks_; }; inline bool operator<(const DirectoryKey& lhs, const DirectoryKey& rhs) { if (lhs.handleSymlinks_ != rhs.handleSymlinks_) return lhs.handleSymlinks_ < rhs.handleSymlinks_; const int cmpName = cmpFileName(lhs.dirnameFull_, rhs.dirnameFull_); if (cmpName != 0) return cmpName < 0; return *lhs.filter_ < *rhs.filter_; } struct DirectoryValue { DirContainer dirCont; std::set failedDirReads; //relative postfixed names (or empty string for root) for directories that could not be read (completely), e.g. access denied, or temporal network drop std::set failedItemReads; //relative postfixed names (never empty) for failure to read single file/dir/symlink }; class FillBufferCallback { public: virtual ~FillBufferCallback() {} enum HandleError { ON_ERROR_RETRY, ON_ERROR_IGNORE }; virtual HandleError reportError (const std::wstring& msg, size_t retryNumber) = 0; //may throw! virtual void reportStatus(const std::wstring& msg, int itemsTotal ) = 0; // }; //attention: ensure directory filtering is applied later to exclude filtered directories which have been kept as parent folders void fillBuffer(const std::set& keysToRead, //in std::map& buf, //out FillBufferCallback& callback, size_t updateInterval); //unit: [ms] } #endif // PARALLEL_SCAN_H_INCLUDED