1*f6dc9357SAndroid Build Coastguard Worker // AgentProxy.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_AGENT_PROXY_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_AGENT_PROXY_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/OpenArchive.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker struct CProxyFile 9*f6dc9357SAndroid Build Coastguard Worker { 10*f6dc9357SAndroid Build Coastguard Worker const wchar_t *Name; 11*f6dc9357SAndroid Build Coastguard Worker unsigned NameLen; 12*f6dc9357SAndroid Build Coastguard Worker bool NeedDeleteName; 13*f6dc9357SAndroid Build Coastguard Worker CProxyFileCProxyFile14*f6dc9357SAndroid Build Coastguard Worker CProxyFile(): Name(NULL), NameLen(0), NeedDeleteName(false) {} ~CProxyFileCProxyFile15*f6dc9357SAndroid Build Coastguard Worker ~CProxyFile() { if (NeedDeleteName) delete [](wchar_t *)(void *)Name; } // delete [](wchar_t *)Name; 16*f6dc9357SAndroid Build Coastguard Worker }; 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker const unsigned k_Proxy_RootDirIndex = 0; 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker struct CProxyDir 21*f6dc9357SAndroid Build Coastguard Worker { 22*f6dc9357SAndroid Build Coastguard Worker const wchar_t *Name; 23*f6dc9357SAndroid Build Coastguard Worker unsigned NameLen; 24*f6dc9357SAndroid Build Coastguard Worker 25*f6dc9357SAndroid Build Coastguard Worker int ArcIndex; // index in proxy->Files[] ; -1 if there is no item for that folder 26*f6dc9357SAndroid Build Coastguard Worker int ParentDir; // index in proxy->Dirs[] ; -1 for root folder; ; 27*f6dc9357SAndroid Build Coastguard Worker CRecordVector<unsigned> SubDirs; 28*f6dc9357SAndroid Build Coastguard Worker CRecordVector<unsigned> SubFiles; 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; 31*f6dc9357SAndroid Build Coastguard Worker UInt64 PackSize; 32*f6dc9357SAndroid Build Coastguard Worker UInt32 Crc; 33*f6dc9357SAndroid Build Coastguard Worker UInt32 NumSubDirs; 34*f6dc9357SAndroid Build Coastguard Worker UInt32 NumSubFiles; 35*f6dc9357SAndroid Build Coastguard Worker bool CrcIsDefined; 36*f6dc9357SAndroid Build Coastguard Worker CProxyDirCProxyDir37*f6dc9357SAndroid Build Coastguard Worker CProxyDir(): Name(NULL), NameLen(0), ParentDir(-1) {} ~CProxyDirCProxyDir38*f6dc9357SAndroid Build Coastguard Worker ~CProxyDir() { delete [](wchar_t *)(void *)Name; } 39*f6dc9357SAndroid Build Coastguard Worker 40*f6dc9357SAndroid Build Coastguard Worker void Clear(); IsLeafCProxyDir41*f6dc9357SAndroid Build Coastguard Worker bool IsLeaf() const { return ArcIndex != -1; } 42*f6dc9357SAndroid Build Coastguard Worker }; 43*f6dc9357SAndroid Build Coastguard Worker 44*f6dc9357SAndroid Build Coastguard Worker class CProxyArc 45*f6dc9357SAndroid Build Coastguard Worker { 46*f6dc9357SAndroid Build Coastguard Worker int FindSubDir(unsigned dirIndex, const wchar_t *name, unsigned &insertPos) const; 47*f6dc9357SAndroid Build Coastguard Worker 48*f6dc9357SAndroid Build Coastguard Worker void CalculateSizes(unsigned dirIndex, IInArchive *archive); 49*f6dc9357SAndroid Build Coastguard Worker unsigned AddDir(unsigned dirIndex, int arcIndex, const UString &name); 50*f6dc9357SAndroid Build Coastguard Worker public: 51*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CProxyDir> Dirs; // Dirs[0] - root 52*f6dc9357SAndroid Build Coastguard Worker CObjArray<CProxyFile> Files; // all items from archive in same order 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker // returns index in Dirs[], or -1, 55*f6dc9357SAndroid Build Coastguard Worker int FindSubDir(unsigned dirIndex, const wchar_t *name) const; 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker void GetDirPathParts(unsigned dirIndex, UStringVector &pathParts) const; 58*f6dc9357SAndroid Build Coastguard Worker // returns full path of Dirs[dirIndex], including back slash 59*f6dc9357SAndroid Build Coastguard Worker UString GetDirPath_as_Prefix(unsigned dirIndex) const; 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker // AddRealIndices DOES ADD also item represented by dirIndex (if it's Leaf) 62*f6dc9357SAndroid Build Coastguard Worker void AddRealIndices(unsigned dirIndex, CUIntVector &realIndices) const; 63*f6dc9357SAndroid Build Coastguard Worker int GetRealIndex(unsigned dirIndex, unsigned index) const; 64*f6dc9357SAndroid Build Coastguard Worker void GetRealIndices(unsigned dirIndex, const UInt32 *indices, UInt32 numItems, CUIntVector &realIndices) const; 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker HRESULT Load(const CArc &arc, IProgress *progress); 67*f6dc9357SAndroid Build Coastguard Worker }; 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker 70*f6dc9357SAndroid Build Coastguard Worker // ---------- for Tree-mode archive ---------- 71*f6dc9357SAndroid Build Coastguard Worker 72*f6dc9357SAndroid Build Coastguard Worker struct CProxyFile2 73*f6dc9357SAndroid Build Coastguard Worker { 74*f6dc9357SAndroid Build Coastguard Worker int DirIndex; // >= 0 for dir. (index in ProxyArchive2->Dirs) 75*f6dc9357SAndroid Build Coastguard Worker int AltDirIndex; // >= 0 if there are alt streams. (index in ProxyArchive2->Dirs) 76*f6dc9357SAndroid Build Coastguard Worker int Parent; // >= 0 if there is parent. (index in archive and in ProxyArchive2->Files) 77*f6dc9357SAndroid Build Coastguard Worker const wchar_t *Name; 78*f6dc9357SAndroid Build Coastguard Worker unsigned NameLen; 79*f6dc9357SAndroid Build Coastguard Worker bool NeedDeleteName; 80*f6dc9357SAndroid Build Coastguard Worker bool Ignore; 81*f6dc9357SAndroid Build Coastguard Worker bool IsAltStream; 82*f6dc9357SAndroid Build Coastguard Worker GetDirIndexCProxyFile283*f6dc9357SAndroid Build Coastguard Worker int GetDirIndex(bool forAltStreams) const { return forAltStreams ? AltDirIndex : DirIndex; } 84*f6dc9357SAndroid Build Coastguard Worker IsDirCProxyFile285*f6dc9357SAndroid Build Coastguard Worker bool IsDir() const { return DirIndex != -1; } CProxyFile2CProxyFile286*f6dc9357SAndroid Build Coastguard Worker CProxyFile2(): 87*f6dc9357SAndroid Build Coastguard Worker DirIndex(-1), AltDirIndex(-1), Parent(-1), 88*f6dc9357SAndroid Build Coastguard Worker Name(NULL), NameLen(0), 89*f6dc9357SAndroid Build Coastguard Worker NeedDeleteName(false), 90*f6dc9357SAndroid Build Coastguard Worker Ignore(false), 91*f6dc9357SAndroid Build Coastguard Worker IsAltStream(false) 92*f6dc9357SAndroid Build Coastguard Worker {} ~CProxyFile2CProxyFile293*f6dc9357SAndroid Build Coastguard Worker ~CProxyFile2() 94*f6dc9357SAndroid Build Coastguard Worker { 95*f6dc9357SAndroid Build Coastguard Worker if (NeedDeleteName) 96*f6dc9357SAndroid Build Coastguard Worker delete [](wchar_t *)(void *)Name; 97*f6dc9357SAndroid Build Coastguard Worker } 98*f6dc9357SAndroid Build Coastguard Worker }; 99*f6dc9357SAndroid Build Coastguard Worker 100*f6dc9357SAndroid Build Coastguard Worker struct CProxyDir2 101*f6dc9357SAndroid Build Coastguard Worker { 102*f6dc9357SAndroid Build Coastguard Worker int ArcIndex; // = -1 for root folders, index in proxy->Files[] 103*f6dc9357SAndroid Build Coastguard Worker CRecordVector<unsigned> Items; 104*f6dc9357SAndroid Build Coastguard Worker UString PathPrefix; 105*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; 106*f6dc9357SAndroid Build Coastguard Worker UInt64 PackSize; 107*f6dc9357SAndroid Build Coastguard Worker bool CrcIsDefined; 108*f6dc9357SAndroid Build Coastguard Worker UInt32 Crc; 109*f6dc9357SAndroid Build Coastguard Worker UInt32 NumSubDirs; 110*f6dc9357SAndroid Build Coastguard Worker UInt32 NumSubFiles; 111*f6dc9357SAndroid Build Coastguard Worker CProxyDir2CProxyDir2112*f6dc9357SAndroid Build Coastguard Worker CProxyDir2(): ArcIndex(-1) {} 113*f6dc9357SAndroid Build Coastguard Worker void AddFileSubItem(UInt32 index, const UString &name); 114*f6dc9357SAndroid Build Coastguard Worker void Clear(); 115*f6dc9357SAndroid Build Coastguard Worker }; 116*f6dc9357SAndroid Build Coastguard Worker 117*f6dc9357SAndroid Build Coastguard Worker const unsigned k_Proxy2_RootDirIndex = k_Proxy_RootDirIndex; 118*f6dc9357SAndroid Build Coastguard Worker const unsigned k_Proxy2_AltRootDirIndex = 1; 119*f6dc9357SAndroid Build Coastguard Worker const unsigned k_Proxy2_NumRootDirs = 2; 120*f6dc9357SAndroid Build Coastguard Worker 121*f6dc9357SAndroid Build Coastguard Worker class CProxyArc2 122*f6dc9357SAndroid Build Coastguard Worker { 123*f6dc9357SAndroid Build Coastguard Worker void CalculateSizes(unsigned dirIndex, IInArchive *archive); 124*f6dc9357SAndroid Build Coastguard Worker // AddRealIndices_of_Dir DOES NOT ADD item itself represented by dirIndex 125*f6dc9357SAndroid Build Coastguard Worker void AddRealIndices_of_Dir(unsigned dirIndex, bool includeAltStreams, CUIntVector &realIndices) const; 126*f6dc9357SAndroid Build Coastguard Worker public: 127*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CProxyDir2> Dirs; // Dirs[0] - root folder 128*f6dc9357SAndroid Build Coastguard Worker // Dirs[1] - for alt streams of root dir 129*f6dc9357SAndroid Build Coastguard Worker CObjArray<CProxyFile2> Files; // all items from archive in same order 130*f6dc9357SAndroid Build Coastguard Worker 131*f6dc9357SAndroid Build Coastguard Worker bool IsThere_SubDir(unsigned dirIndex, const UString &name) const; 132*f6dc9357SAndroid Build Coastguard Worker 133*f6dc9357SAndroid Build Coastguard Worker void GetDirPathParts(unsigned dirIndex, UStringVector &pathParts, bool &isAltStreamDir) const; 134*f6dc9357SAndroid Build Coastguard Worker UString GetDirPath_as_Prefix(unsigned dirIndex, bool &isAltStreamDir) const; 135*f6dc9357SAndroid Build Coastguard Worker bool IsAltDir(unsigned dirIndex) const; 136*f6dc9357SAndroid Build Coastguard Worker 137*f6dc9357SAndroid Build Coastguard Worker // AddRealIndices_of_ArcItem DOES ADD item and subItems 138*f6dc9357SAndroid Build Coastguard Worker void AddRealIndices_of_ArcItem(unsigned arcIndex, bool includeAltStreams, CUIntVector &realIndices) const; 139*f6dc9357SAndroid Build Coastguard Worker unsigned GetRealIndex(unsigned dirIndex, unsigned index) const; 140*f6dc9357SAndroid Build Coastguard Worker void GetRealIndices(unsigned dirIndex, const UInt32 *indices, UInt32 numItems, bool includeAltStreams, CUIntVector &realIndices) const; 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker HRESULT Load(const CArc &arc, IProgress *progress); 143*f6dc9357SAndroid Build Coastguard Worker GetParentDirOfFile(UInt32 arcIndex)144*f6dc9357SAndroid Build Coastguard Worker int GetParentDirOfFile(UInt32 arcIndex) const 145*f6dc9357SAndroid Build Coastguard Worker { 146*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &file = Files[arcIndex]; 147*f6dc9357SAndroid Build Coastguard Worker 148*f6dc9357SAndroid Build Coastguard Worker if (file.Parent == -1) 149*f6dc9357SAndroid Build Coastguard Worker return file.IsAltStream ? 150*f6dc9357SAndroid Build Coastguard Worker k_Proxy2_AltRootDirIndex : 151*f6dc9357SAndroid Build Coastguard Worker k_Proxy2_RootDirIndex; 152*f6dc9357SAndroid Build Coastguard Worker 153*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &parentFile = Files[file.Parent]; 154*f6dc9357SAndroid Build Coastguard Worker return file.IsAltStream ? 155*f6dc9357SAndroid Build Coastguard Worker parentFile.AltDirIndex : 156*f6dc9357SAndroid Build Coastguard Worker parentFile.DirIndex; 157*f6dc9357SAndroid Build Coastguard Worker } 158*f6dc9357SAndroid Build Coastguard Worker 159*f6dc9357SAndroid Build Coastguard Worker int FindItem(unsigned dirIndex, const wchar_t *name, bool foldersOnly) const; 160*f6dc9357SAndroid Build Coastguard Worker }; 161*f6dc9357SAndroid Build Coastguard Worker 162*f6dc9357SAndroid Build Coastguard Worker #endif 163