| #ifndef _RAR_SCANTREE_ |
| #define _RAR_SCANTREE_ |
| |
| namespace third_party_unrar { |
| |
| 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<uint> *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<uint> *Lengths) |
| { |
| ErrDirList=List; |
| ErrDirSpecPathLength=Lengths; |
| } |
| }; |
| |
| } // namespace third_party_unrar |
| |
| #endif |