#ifndef _RAR_SCANTREE_ #define _RAR_SCANTREE_ enum SCAN_DIRS { SCAN_SKIPDIRS, // Skip directories, but recurse for files if recursion mode is enabled. SCAN_GETDIRS, // Get subdirectories in recurse mode. SCAN_GETDIRSTWICE, // Get the directory name both before and after the list of files it contains. SCAN_GETCURDIRS // Get subdirectories in current directory even in RECURSE_NONE mode. }; enum SCAN_CODE { SCAN_SUCCESS,SCAN_DONE,SCAN_ERROR,SCAN_NEXT }; #define MAXSCANDEPTH (NM/2) class CommandData; class ScanTree { private: bool ExpandFolderMask(); bool GetFilteredMask(); bool GetNextMask(); SCAN_CODE FindProc(FindData *FD); void ScanError(bool &Error); FindFile *FindStack[MAXSCANDEPTH]; int Depth; int SetAllMaskDepth; StringList *FileMasks; RECURSE_MODE Recurse; bool GetLinks; SCAN_DIRS GetDirs; int Errors; // Set when processing paths like c:\ (root directory without wildcards). bool ScanEntireDisk; wchar CurMask[NM]; wchar OrigCurMask[NM]; // Store all folder masks generated from folder wildcard mask in non-recursive mode. StringList ExpandedFolderList; // Store a filter string for folder wildcard in recursive mode. StringList FilterList; // Save the list of unreadable dirs here. StringList *ErrDirList; Array *ErrDirSpecPathLength; // Set if processing a folder wildcard mask. bool FolderWildcards; bool SearchAllInRoot; size_t SpecPathLength; wchar ErrArcName[NM]; CommandData *Cmd; public: ScanTree(StringList *FileMasks,RECURSE_MODE Recurse,bool GetLinks,SCAN_DIRS GetDirs); ~ScanTree(); SCAN_CODE GetNext(FindData *FindData); size_t GetSpecPathLength() {return SpecPathLength;}; int GetErrors() {return Errors;}; void SetErrArcName(const wchar *Name) {wcsncpyz(ErrArcName,Name,ASIZE(ErrArcName));} void SetCommandData(CommandData *Cmd) {ScanTree::Cmd=Cmd;} void SetErrDirList(StringList *List,Array *Lengths) { ErrDirList=List; ErrDirSpecPathLength=Lengths; } }; #endif