#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
