xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Agent/AgentProxy.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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