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 CDirItem
     15 {
     16   UInt64 Size;
     17   FILETIME CTime;
     18   FILETIME ATime;
     19   FILETIME MTime;
     20   UString Name;
     21 
     22   #if defined(_WIN32) && !defined(UNDER_CE)
     23   // UString ShortName;
     24   CByteBuffer ReparseData;
     25   CByteBuffer ReparseData2; // fixed (reduced) absolute links
     26 
     27   bool AreReparseData() const { return ReparseData.Size() != 0 || ReparseData2.Size() != 0; }
     28   #endif
     29 
     30   UInt32 Attrib;
     31   int PhyParent;
     32   int LogParent;
     33   int SecureIndex;
     34 
     35   bool IsAltStream;
     36 
     37   CDirItem(): PhyParent(-1), LogParent(-1), SecureIndex(-1), IsAltStream(false) {}
     38   bool IsDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; }
     39 };
     40 
     41 class CDirItems
     42 {
     43   UStringVector Prefixes;
     44   CIntVector PhyParents;
     45   CIntVector LogParents;
     46 
     47   UString GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const;
     48 
     49   void EnumerateDir(int phyParent, int logParent, const FString &phyPrefix);
     50 
     51 public:
     52   CObjectVector<CDirItem> Items;
     53 
     54   bool SymLinks;
     55 
     56   bool ScanAltStreams;
     57   FStringVector ErrorPaths;
     58   CRecordVector<DWORD> ErrorCodes;
     59   UInt64 TotalSize;
     60 
     61 
     62   #ifndef UNDER_CE
     63   void SetLinkInfo(CDirItem &dirItem, const NWindows::NFile::NFind::CFileInfo &fi,
     64       const FString &phyPrefix);
     65   #endif
     66 
     67   void AddError(const FString &path, DWORD errorCode)
     68   {
     69     ErrorCodes.Add(errorCode);
     70     ErrorPaths.Add(path);
     71   }
     72 
     73   void AddError(const FString &path)
     74   {
     75     AddError(path, ::GetLastError());
     76   }
     77 
     78   #if defined(_WIN32) && !defined(UNDER_CE)
     79 
     80   CUniqBlocks SecureBlocks;
     81   CByteBuffer TempSecureBuf;
     82   bool _saclEnabled;
     83   bool ReadSecure;
     84 
     85   void AddSecurityItem(const FString &path, int &secureIndex);
     86 
     87   #endif
     88 
     89   CDirItems();
     90 
     91   int GetNumFolders() const { return Prefixes.Size(); }
     92   UString GetPhyPath(unsigned index) const;
     93   UString GetLogPath(unsigned index) const;
     94 
     95   unsigned AddPrefix(int phyParent, int logParent, const UString &prefix);
     96   void DeleteLastPrefix();
     97   void EnumerateItems2(
     98     const FString &phyPrefix,
     99     const UString &logPrefix,
    100     const FStringVector &filePaths,
    101     FStringVector *requestedPaths);
    102 
    103   #if defined(_WIN32) && !defined(UNDER_CE)
    104   void FillFixedReparse();
    105   #endif
    106 
    107   void ReserveDown();
    108 };
    109 
    110 struct CArcItem
    111 {
    112   UInt64 Size;
    113   FILETIME MTime;
    114   UString Name;
    115   bool IsDir;
    116   bool IsAltStream;
    117   bool SizeDefined;
    118   bool MTimeDefined;
    119   bool Censored;
    120   UInt32 IndexInServer;
    121   int TimeType;
    122 
    123   CArcItem(): IsDir(false), IsAltStream(false), SizeDefined(false), MTimeDefined(false), Censored(false), TimeType(-1) {}
    124 };
    125 
    126 #endif
    127