libclamunrar/scantree.hpp
d39cb658
 #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<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;
     }
 };
 
 #endif