#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

V688 The 'Cmd' function argument possesses the same name as one of the class members, which can result in a confusion.