Home | History | Annotate | Download | only in Common
      1 // DirItem.h
      2 
      3 #ifndef __DIR_ITEM_H
      4 #define __DIR_ITEM_H
      5 
      6 #include "../../../Common/MyString.h"
      7 
      8 #include "../../../Windows/FileFind.h"
      9 
     10 #include "../../Common/UniqBlocks.h"
     11 
     12 #include "../../Archive/IArchive.h"
     13 
     14 struct CDirItemsStat
     15 {
     16   UInt64 NumDirs;
     17   UInt64 NumFiles;
     18   UInt64 NumAltStreams;
     19   UInt64 FilesSize;
     20   UInt64 AltStreamsSize;
     21 
     22   UInt64 NumErrors;
     23   // UInt64 GetTotalItems() const { return NumDirs + NumFiles + NumAltStreams; }
     24 
     25   UInt64 GetTotalBytes() const { return FilesSize + AltStreamsSize; }
     26 
     27   CDirItemsStat():
     28       NumDirs(0),
     29       NumFiles(0),
     30       NumAltStreams(0),
     31       FilesSize(0),
     32       AltStreamsSize(0),
     33       NumErrors(0)
     34     {}
     35 };
     36 
     37 #define INTERFACE_IDirItemsCallback(x) \
     38   virtual HRESULT ScanError(const FString &path, DWORD systemError) x; \
     39   virtual HRESULT ScanProgress(const CDirItemsStat &st, const FString &path, bool isDir) x; \
     40 
     41 struct IDirItemsCallback
     42 {
     43   INTERFACE_IDirItemsCallback(=0)
     44 };
     45 
     46 struct CDirItem
     47 {
     48   UInt64 Size;
     49   FILETIME CTime;
     50   FILETIME ATime;
     51   FILETIME MTime;
     52   UString Name;
     53 
     54   #if defined(_WIN32) && !defined(UNDER_CE)
     55   // UString ShortName;
     56   CByteBuffer ReparseData;
     57   CByteBuffer ReparseData2; // fixed (reduced) absolute links
     58 
     59   bool AreReparseData() const { return ReparseData.Size() != 0 || ReparseData2.Size() != 0; }
     60   #endif
     61 
     62   UInt32 Attrib;
     63   int PhyParent;
     64   int LogParent;
     65   int SecureIndex;
     66 
     67   bool IsAltStream;
     68 
     69   CDirItem(): PhyParent(-1), LogParent(-1), SecureIndex(-1), IsAltStream(false) {}
     70   bool IsDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; }
     71 };
     72 
     73 class CDirItems
     74 {
     75   UStringVector Prefixes;
     76   CIntVector PhyParents;
     77   CIntVector LogParents;
     78 
     79   UString GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const;
     80 
     81   HRESULT EnumerateDir(int phyParent, int logParent, const FString &phyPrefix);
     82 
     83 public:
     84   CObjectVector<CDirItem> Items;
     85 
     86   bool SymLinks;
     87 
     88   bool ScanAltStreams;
     89 
     90   CDirItemsStat Stat;
     91 
     92   #ifndef UNDER_CE
     93   HRESULT SetLinkInfo(CDirItem &dirItem, const NWindows::NFile::NFind::CFileInfo &fi,
     94       const FString &phyPrefix);
     95   #endif
     96 
     97 
     98   #if defined(_WIN32) && !defined(UNDER_CE)
     99 
    100   CUniqBlocks SecureBlocks;
    101   CByteBuffer TempSecureBuf;
    102   bool _saclEnabled;
    103   bool ReadSecure;
    104 
    105   HRESULT AddSecurityItem(const FString &path, int &secureIndex);
    106 
    107   #endif
    108 
    109   IDirItemsCallback *Callback;
    110 
    111   CDirItems();
    112 
    113   void AddDirFileInfo(int phyParent, int logParent, int secureIndex,
    114       const NWindows::NFile::NFind::CFileInfo &fi);
    115 
    116   HRESULT AddError(const FString &path, DWORD errorCode);
    117   HRESULT AddError(const FString &path);
    118 
    119   HRESULT ScanProgress(const FString &path);
    120 
    121   // unsigned GetNumFolders() const { return Prefixes.Size(); }
    122   FString GetPhyPath(unsigned index) const;
    123   UString GetLogPath(unsigned index) const;
    124 
    125   unsigned AddPrefix(int phyParent, int logParent, const UString &prefix);
    126   void DeleteLastPrefix();
    127 
    128   HRESULT EnumerateItems2(
    129     const FString &phyPrefix,
    130     const UString &logPrefix,
    131     const FStringVector &filePaths,
    132     FStringVector *requestedPaths);
    133 
    134   #if defined(_WIN32) && !defined(UNDER_CE)
    135   void FillFixedReparse();
    136   #endif
    137 
    138   void ReserveDown();
    139 };
    140 
    141 struct CArcItem
    142 {
    143   UInt64 Size;
    144   FILETIME MTime;
    145   UString Name;
    146   bool IsDir;
    147   bool IsAltStream;
    148   bool SizeDefined;
    149   bool MTimeDefined;
    150   bool Censored;
    151   UInt32 IndexInServer;
    152   int TimeType;
    153 
    154   CArcItem(): IsDir(false), IsAltStream(false), SizeDefined(false), MTimeDefined(false), Censored(false), TimeType(-1) {}
    155 };
    156 
    157 #endif
    158