1*f6dc9357SAndroid Build Coastguard Worker // Agent.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include <wchar.h>
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/Sort.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/ComTry.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariantConv.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
16*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
17*f6dc9357SAndroid Build Coastguard Worker #endif
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveExtractCallback.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/RegistryUtils.h"
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker #include "Agent.h"
23*f6dc9357SAndroid Build Coastguard Worker
24*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
25*f6dc9357SAndroid Build Coastguard Worker
26*f6dc9357SAndroid Build Coastguard Worker CCodecs *g_CodecsObj;
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker static const bool k_keepEmptyDirPrefixes =
29*f6dc9357SAndroid Build Coastguard Worker false; // 22.00
30*f6dc9357SAndroid Build Coastguard Worker // true; // 21.07
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
33*f6dc9357SAndroid Build Coastguard Worker extern
34*f6dc9357SAndroid Build Coastguard Worker CExternalCodecs g_ExternalCodecs;
35*f6dc9357SAndroid Build Coastguard Worker CExternalCodecs g_ExternalCodecs;
36*f6dc9357SAndroid Build Coastguard Worker extern
37*f6dc9357SAndroid Build Coastguard Worker const CExternalCodecs *g_ExternalCodecs_Ptr;
38*f6dc9357SAndroid Build Coastguard Worker const CExternalCodecs *g_ExternalCodecs_Ptr;
39*f6dc9357SAndroid Build Coastguard Worker static CCodecs::CReleaser g_CodecsReleaser;
40*f6dc9357SAndroid Build Coastguard Worker #else
41*f6dc9357SAndroid Build Coastguard Worker extern
42*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IUnknown> g_CodecsRef;
43*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IUnknown> g_CodecsRef;
44*f6dc9357SAndroid Build Coastguard Worker #endif
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
47*f6dc9357SAndroid Build Coastguard Worker static NSynchronization::CCriticalSection g_CriticalSection;
48*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
49*f6dc9357SAndroid Build Coastguard Worker #else
50*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK
51*f6dc9357SAndroid Build Coastguard Worker #endif
52*f6dc9357SAndroid Build Coastguard Worker
FreeGlobalCodecs()53*f6dc9357SAndroid Build Coastguard Worker void FreeGlobalCodecs()
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
56*f6dc9357SAndroid Build Coastguard Worker
57*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
58*f6dc9357SAndroid Build Coastguard Worker if (g_CodecsObj)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker g_CodecsObj->CloseLibs();
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker g_CodecsReleaser.Set(NULL);
63*f6dc9357SAndroid Build Coastguard Worker g_CodecsObj = NULL;
64*f6dc9357SAndroid Build Coastguard Worker g_ExternalCodecs.ClearAndRelease();
65*f6dc9357SAndroid Build Coastguard Worker g_ExternalCodecs_Ptr = NULL;
66*f6dc9357SAndroid Build Coastguard Worker #else
67*f6dc9357SAndroid Build Coastguard Worker g_CodecsRef.Release();
68*f6dc9357SAndroid Build Coastguard Worker #endif
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker
LoadGlobalCodecs()71*f6dc9357SAndroid Build Coastguard Worker HRESULT LoadGlobalCodecs()
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
74*f6dc9357SAndroid Build Coastguard Worker
75*f6dc9357SAndroid Build Coastguard Worker if (g_CodecsObj)
76*f6dc9357SAndroid Build Coastguard Worker return S_OK;
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker g_CodecsObj = new CCodecs;
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
81*f6dc9357SAndroid Build Coastguard Worker g_ExternalCodecs.GetCodecs = g_CodecsObj;
82*f6dc9357SAndroid Build Coastguard Worker g_ExternalCodecs.GetHashers = g_CodecsObj;
83*f6dc9357SAndroid Build Coastguard Worker g_CodecsReleaser.Set(g_CodecsObj);
84*f6dc9357SAndroid Build Coastguard Worker #else
85*f6dc9357SAndroid Build Coastguard Worker g_CodecsRef.Release();
86*f6dc9357SAndroid Build Coastguard Worker g_CodecsRef = g_CodecsObj;
87*f6dc9357SAndroid Build Coastguard Worker #endif
88*f6dc9357SAndroid Build Coastguard Worker
89*f6dc9357SAndroid Build Coastguard Worker RINOK(g_CodecsObj->Load())
90*f6dc9357SAndroid Build Coastguard Worker if (g_CodecsObj->Formats.IsEmpty())
91*f6dc9357SAndroid Build Coastguard Worker {
92*f6dc9357SAndroid Build Coastguard Worker FreeGlobalCodecs();
93*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
94*f6dc9357SAndroid Build Coastguard Worker }
95*f6dc9357SAndroid Build Coastguard Worker
96*f6dc9357SAndroid Build Coastguard Worker Codecs_AddHashArcHandler(g_CodecsObj);
97*f6dc9357SAndroid Build Coastguard Worker
98*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
99*f6dc9357SAndroid Build Coastguard Worker RINOK(g_ExternalCodecs.Load())
100*f6dc9357SAndroid Build Coastguard Worker g_ExternalCodecs_Ptr = &g_ExternalCodecs;
101*f6dc9357SAndroid Build Coastguard Worker #endif
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker return S_OK;
104*f6dc9357SAndroid Build Coastguard Worker }
105*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetAgentFolder (CAgentFolder ** agentFolder))106*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetAgentFolder(CAgentFolder **agentFolder))
107*f6dc9357SAndroid Build Coastguard Worker {
108*f6dc9357SAndroid Build Coastguard Worker *agentFolder = this;
109*f6dc9357SAndroid Build Coastguard Worker return S_OK;
110*f6dc9357SAndroid Build Coastguard Worker }
111*f6dc9357SAndroid Build Coastguard Worker
LoadFolder(unsigned proxyDirIndex)112*f6dc9357SAndroid Build Coastguard Worker void CAgentFolder::LoadFolder(unsigned proxyDirIndex)
113*f6dc9357SAndroid Build Coastguard Worker {
114*f6dc9357SAndroid Build Coastguard Worker CProxyItem item;
115*f6dc9357SAndroid Build Coastguard Worker item.DirIndex = proxyDirIndex;
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 &dir = _proxy2->Dirs[proxyDirIndex];
120*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, dir.Items)
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker item.Index = i;
123*f6dc9357SAndroid Build Coastguard Worker _items.Add(item);
124*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &file = _proxy2->Files[dir.Items[i]];
125*f6dc9357SAndroid Build Coastguard Worker if (file.DirIndex != -1)
126*f6dc9357SAndroid Build Coastguard Worker LoadFolder((unsigned)file.DirIndex);
127*f6dc9357SAndroid Build Coastguard Worker if (_loadAltStreams && file.AltDirIndex != -1)
128*f6dc9357SAndroid Build Coastguard Worker LoadFolder((unsigned)file.AltDirIndex);
129*f6dc9357SAndroid Build Coastguard Worker }
130*f6dc9357SAndroid Build Coastguard Worker return;
131*f6dc9357SAndroid Build Coastguard Worker }
132*f6dc9357SAndroid Build Coastguard Worker
133*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &dir = _proxy->Dirs[proxyDirIndex];
134*f6dc9357SAndroid Build Coastguard Worker unsigned i;
135*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < dir.SubDirs.Size(); i++)
136*f6dc9357SAndroid Build Coastguard Worker {
137*f6dc9357SAndroid Build Coastguard Worker item.Index = i;
138*f6dc9357SAndroid Build Coastguard Worker _items.Add(item);
139*f6dc9357SAndroid Build Coastguard Worker LoadFolder(dir.SubDirs[i]);
140*f6dc9357SAndroid Build Coastguard Worker }
141*f6dc9357SAndroid Build Coastguard Worker
142*f6dc9357SAndroid Build Coastguard Worker unsigned start = dir.SubDirs.Size();
143*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < dir.SubFiles.Size(); i++)
144*f6dc9357SAndroid Build Coastguard Worker {
145*f6dc9357SAndroid Build Coastguard Worker item.Index = start + i;
146*f6dc9357SAndroid Build Coastguard Worker _items.Add(item);
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker }
149*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::LoadItems ())150*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::LoadItems())
151*f6dc9357SAndroid Build Coastguard Worker {
152*f6dc9357SAndroid Build Coastguard Worker if (!_agentSpec->_archiveLink.IsOpen)
153*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
154*f6dc9357SAndroid Build Coastguard Worker _items.Clear();
155*f6dc9357SAndroid Build Coastguard Worker if (_flatMode)
156*f6dc9357SAndroid Build Coastguard Worker {
157*f6dc9357SAndroid Build Coastguard Worker LoadFolder(_proxyDirIndex);
158*f6dc9357SAndroid Build Coastguard Worker if (_proxy2 && _loadAltStreams)
159*f6dc9357SAndroid Build Coastguard Worker {
160*f6dc9357SAndroid Build Coastguard Worker if (_proxyDirIndex == k_Proxy2_RootDirIndex)
161*f6dc9357SAndroid Build Coastguard Worker LoadFolder(k_Proxy2_AltRootDirIndex);
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker }
164*f6dc9357SAndroid Build Coastguard Worker return S_OK;
165*f6dc9357SAndroid Build Coastguard Worker }
166*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetNumberOfItems (UInt32 * numItems))167*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetNumberOfItems(UInt32 *numItems))
168*f6dc9357SAndroid Build Coastguard Worker {
169*f6dc9357SAndroid Build Coastguard Worker if (_flatMode)
170*f6dc9357SAndroid Build Coastguard Worker *numItems = _items.Size();
171*f6dc9357SAndroid Build Coastguard Worker else if (_proxy2)
172*f6dc9357SAndroid Build Coastguard Worker *numItems = _proxy2->Dirs[_proxyDirIndex].Items.Size();
173*f6dc9357SAndroid Build Coastguard Worker else
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *dir = &_proxy->Dirs[_proxyDirIndex];
176*f6dc9357SAndroid Build Coastguard Worker *numItems = dir->SubDirs.Size() + dir->SubFiles.Size();
177*f6dc9357SAndroid Build Coastguard Worker }
178*f6dc9357SAndroid Build Coastguard Worker return S_OK;
179*f6dc9357SAndroid Build Coastguard Worker }
180*f6dc9357SAndroid Build Coastguard Worker
181*f6dc9357SAndroid Build Coastguard Worker #define SET_realIndex_AND_dir \
182*f6dc9357SAndroid Build Coastguard Worker unsigned realIndex; const CProxyDir *dir; \
183*f6dc9357SAndroid Build Coastguard Worker if (_flatMode) { const CProxyItem &item = _items[index]; dir = &_proxy->Dirs[item.DirIndex]; realIndex = item.Index; } \
184*f6dc9357SAndroid Build Coastguard Worker else { dir = &_proxy->Dirs[_proxyDirIndex]; realIndex = index; }
185*f6dc9357SAndroid Build Coastguard Worker
186*f6dc9357SAndroid Build Coastguard Worker #define SET_realIndex_AND_dir_2 \
187*f6dc9357SAndroid Build Coastguard Worker unsigned realIndex; const CProxyDir2 *dir; \
188*f6dc9357SAndroid Build Coastguard Worker if (_flatMode) { const CProxyItem &item = _items[index]; dir = &_proxy2->Dirs[item.DirIndex]; realIndex = item.Index; } \
189*f6dc9357SAndroid Build Coastguard Worker else { dir = &_proxy2->Dirs[_proxyDirIndex]; realIndex = index; }
190*f6dc9357SAndroid Build Coastguard Worker
GetName(UInt32 index) const191*f6dc9357SAndroid Build Coastguard Worker UString CAgentFolder::GetName(UInt32 index) const
192*f6dc9357SAndroid Build Coastguard Worker {
193*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
194*f6dc9357SAndroid Build Coastguard Worker {
195*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
196*f6dc9357SAndroid Build Coastguard Worker return _proxy2->Files[dir->Items[realIndex]].Name;
197*f6dc9357SAndroid Build Coastguard Worker }
198*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir
199*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
200*f6dc9357SAndroid Build Coastguard Worker return _proxy->Dirs[dir->SubDirs[realIndex]].Name;
201*f6dc9357SAndroid Build Coastguard Worker return _proxy->Files[dir->SubFiles[realIndex - dir->SubDirs.Size()]].Name;
202*f6dc9357SAndroid Build Coastguard Worker }
203*f6dc9357SAndroid Build Coastguard Worker
GetPrefix(UInt32 index,UString & prefix) const204*f6dc9357SAndroid Build Coastguard Worker void CAgentFolder::GetPrefix(UInt32 index, UString &prefix) const
205*f6dc9357SAndroid Build Coastguard Worker {
206*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
207*f6dc9357SAndroid Build Coastguard Worker {
208*f6dc9357SAndroid Build Coastguard Worker prefix.Empty();
209*f6dc9357SAndroid Build Coastguard Worker return;
210*f6dc9357SAndroid Build Coastguard Worker }
211*f6dc9357SAndroid Build Coastguard Worker
212*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item = _items[index];
213*f6dc9357SAndroid Build Coastguard Worker unsigned proxyIndex = item.DirIndex;
214*f6dc9357SAndroid Build Coastguard Worker
215*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
216*f6dc9357SAndroid Build Coastguard Worker {
217*f6dc9357SAndroid Build Coastguard Worker // that code is unused. 7-Zip gets prefix via GetItemPrefix() .
218*f6dc9357SAndroid Build Coastguard Worker
219*f6dc9357SAndroid Build Coastguard Worker unsigned len = 0;
220*f6dc9357SAndroid Build Coastguard Worker while (proxyIndex != _proxyDirIndex && proxyIndex >= k_Proxy2_NumRootDirs)
221*f6dc9357SAndroid Build Coastguard Worker {
222*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &file = _proxy2->Files[(unsigned)_proxy2->Dirs[proxyIndex].ArcIndex];
223*f6dc9357SAndroid Build Coastguard Worker len += file.NameLen + 1;
224*f6dc9357SAndroid Build Coastguard Worker proxyIndex = (file.Parent == -1) ? 0 : (unsigned)_proxy2->Files[(unsigned)file.Parent].GetDirIndex(file.IsAltStream);
225*f6dc9357SAndroid Build Coastguard Worker }
226*f6dc9357SAndroid Build Coastguard Worker
227*f6dc9357SAndroid Build Coastguard Worker wchar_t *p = prefix.GetBuf_SetEnd(len) + len;
228*f6dc9357SAndroid Build Coastguard Worker proxyIndex = item.DirIndex;
229*f6dc9357SAndroid Build Coastguard Worker while (proxyIndex != _proxyDirIndex && proxyIndex >= k_Proxy2_NumRootDirs)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &file = _proxy2->Files[(unsigned)_proxy2->Dirs[proxyIndex].ArcIndex];
232*f6dc9357SAndroid Build Coastguard Worker p--;
233*f6dc9357SAndroid Build Coastguard Worker *p = WCHAR_PATH_SEPARATOR;
234*f6dc9357SAndroid Build Coastguard Worker p -= file.NameLen;
235*f6dc9357SAndroid Build Coastguard Worker wmemcpy(p, file.Name, file.NameLen);
236*f6dc9357SAndroid Build Coastguard Worker proxyIndex = (file.Parent == -1) ? 0 : (unsigned)_proxy2->Files[(unsigned)file.Parent].GetDirIndex(file.IsAltStream);
237*f6dc9357SAndroid Build Coastguard Worker }
238*f6dc9357SAndroid Build Coastguard Worker }
239*f6dc9357SAndroid Build Coastguard Worker else
240*f6dc9357SAndroid Build Coastguard Worker {
241*f6dc9357SAndroid Build Coastguard Worker unsigned len = 0;
242*f6dc9357SAndroid Build Coastguard Worker while (proxyIndex != _proxyDirIndex)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *dir = &_proxy->Dirs[proxyIndex];
245*f6dc9357SAndroid Build Coastguard Worker len += dir->NameLen + 1;
246*f6dc9357SAndroid Build Coastguard Worker proxyIndex = (unsigned)dir->ParentDir;
247*f6dc9357SAndroid Build Coastguard Worker }
248*f6dc9357SAndroid Build Coastguard Worker
249*f6dc9357SAndroid Build Coastguard Worker wchar_t *p = prefix.GetBuf_SetEnd(len) + len;
250*f6dc9357SAndroid Build Coastguard Worker proxyIndex = item.DirIndex;
251*f6dc9357SAndroid Build Coastguard Worker while (proxyIndex != _proxyDirIndex)
252*f6dc9357SAndroid Build Coastguard Worker {
253*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *dir = &_proxy->Dirs[proxyIndex];
254*f6dc9357SAndroid Build Coastguard Worker p--;
255*f6dc9357SAndroid Build Coastguard Worker *p = WCHAR_PATH_SEPARATOR;
256*f6dc9357SAndroid Build Coastguard Worker p -= dir->NameLen;
257*f6dc9357SAndroid Build Coastguard Worker wmemcpy(p, dir->Name, dir->NameLen);
258*f6dc9357SAndroid Build Coastguard Worker proxyIndex = (unsigned)dir->ParentDir;
259*f6dc9357SAndroid Build Coastguard Worker }
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker }
262*f6dc9357SAndroid Build Coastguard Worker
GetFullPrefix(UInt32 index) const263*f6dc9357SAndroid Build Coastguard Worker UString CAgentFolder::GetFullPrefix(UInt32 index) const
264*f6dc9357SAndroid Build Coastguard Worker {
265*f6dc9357SAndroid Build Coastguard Worker unsigned foldIndex = _proxyDirIndex;
266*f6dc9357SAndroid Build Coastguard Worker
267*f6dc9357SAndroid Build Coastguard Worker if (_flatMode)
268*f6dc9357SAndroid Build Coastguard Worker foldIndex = _items[index].DirIndex;
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
271*f6dc9357SAndroid Build Coastguard Worker return _proxy2->Dirs[foldIndex].PathPrefix;
272*f6dc9357SAndroid Build Coastguard Worker else
273*f6dc9357SAndroid Build Coastguard Worker return _proxy->GetDirPath_as_Prefix(foldIndex);
274*f6dc9357SAndroid Build Coastguard Worker }
275*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF2(UInt64,CAgentFolder::GetItemSize (UInt32 index))276*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(UInt64, CAgentFolder::GetItemSize(UInt32 index))
277*f6dc9357SAndroid Build Coastguard Worker {
278*f6dc9357SAndroid Build Coastguard Worker unsigned arcIndex;
279*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
280*f6dc9357SAndroid Build Coastguard Worker {
281*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
282*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->Items[realIndex];
283*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &item = _proxy2->Files[arcIndex];
284*f6dc9357SAndroid Build Coastguard Worker if (item.IsDir())
285*f6dc9357SAndroid Build Coastguard Worker {
286*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 &itemFolder = _proxy2->Dirs[item.DirIndex];
287*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
288*f6dc9357SAndroid Build Coastguard Worker return itemFolder.Size;
289*f6dc9357SAndroid Build Coastguard Worker }
290*f6dc9357SAndroid Build Coastguard Worker }
291*f6dc9357SAndroid Build Coastguard Worker else
292*f6dc9357SAndroid Build Coastguard Worker {
293*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir
294*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &item = _proxy->Dirs[dir->SubDirs[realIndex]];
297*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
298*f6dc9357SAndroid Build Coastguard Worker return item.Size;
299*f6dc9357SAndroid Build Coastguard Worker if (!item.IsLeaf())
300*f6dc9357SAndroid Build Coastguard Worker return 0;
301*f6dc9357SAndroid Build Coastguard Worker arcIndex = (unsigned)item.ArcIndex;
302*f6dc9357SAndroid Build Coastguard Worker }
303*f6dc9357SAndroid Build Coastguard Worker else
304*f6dc9357SAndroid Build Coastguard Worker {
305*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->SubFiles[realIndex - dir->SubDirs.Size()];
306*f6dc9357SAndroid Build Coastguard Worker }
307*f6dc9357SAndroid Build Coastguard Worker }
308*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
309*f6dc9357SAndroid Build Coastguard Worker _agentSpec->GetArchive()->GetProperty(arcIndex, kpidSize, &prop);
310*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_UI8)
311*f6dc9357SAndroid Build Coastguard Worker return prop.uhVal.QuadPart;
312*f6dc9357SAndroid Build Coastguard Worker else
313*f6dc9357SAndroid Build Coastguard Worker return 0;
314*f6dc9357SAndroid Build Coastguard Worker }
315*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetProperty (UInt32 index,PROPID propID,PROPVARIANT * value))316*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value))
317*f6dc9357SAndroid Build Coastguard Worker {
318*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
319*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
320*f6dc9357SAndroid Build Coastguard Worker
321*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidPrefix)
322*f6dc9357SAndroid Build Coastguard Worker {
323*f6dc9357SAndroid Build Coastguard Worker if (_flatMode)
324*f6dc9357SAndroid Build Coastguard Worker {
325*f6dc9357SAndroid Build Coastguard Worker UString prefix;
326*f6dc9357SAndroid Build Coastguard Worker GetPrefix(index, prefix);
327*f6dc9357SAndroid Build Coastguard Worker prop = prefix;
328*f6dc9357SAndroid Build Coastguard Worker }
329*f6dc9357SAndroid Build Coastguard Worker }
330*f6dc9357SAndroid Build Coastguard Worker else if (_proxy2)
331*f6dc9357SAndroid Build Coastguard Worker {
332*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
333*f6dc9357SAndroid Build Coastguard Worker unsigned arcIndex = dir->Items[realIndex];
334*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &item = _proxy2->Files[arcIndex];
335*f6dc9357SAndroid Build Coastguard Worker /*
336*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidNumAltStreams)
337*f6dc9357SAndroid Build Coastguard Worker {
338*f6dc9357SAndroid Build Coastguard Worker if (item.AltDirIndex != -1)
339*f6dc9357SAndroid Build Coastguard Worker prop = _proxy2->Dirs[item.AltDirIndex].Items.Size();
340*f6dc9357SAndroid Build Coastguard Worker }
341*f6dc9357SAndroid Build Coastguard Worker else
342*f6dc9357SAndroid Build Coastguard Worker */
343*f6dc9357SAndroid Build Coastguard Worker if (!item.IsDir())
344*f6dc9357SAndroid Build Coastguard Worker {
345*f6dc9357SAndroid Build Coastguard Worker switch (propID)
346*f6dc9357SAndroid Build Coastguard Worker {
347*f6dc9357SAndroid Build Coastguard Worker case kpidIsDir: prop = false; break;
348*f6dc9357SAndroid Build Coastguard Worker case kpidName: prop = item.Name; break;
349*f6dc9357SAndroid Build Coastguard Worker default: return _agentSpec->GetArchive()->GetProperty(arcIndex, propID, value);
350*f6dc9357SAndroid Build Coastguard Worker }
351*f6dc9357SAndroid Build Coastguard Worker }
352*f6dc9357SAndroid Build Coastguard Worker else
353*f6dc9357SAndroid Build Coastguard Worker {
354*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 &itemFolder = _proxy2->Dirs[item.DirIndex];
355*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode && propID == kpidSize)
356*f6dc9357SAndroid Build Coastguard Worker prop = itemFolder.Size;
357*f6dc9357SAndroid Build Coastguard Worker else if (!_flatMode && propID == kpidPackSize)
358*f6dc9357SAndroid Build Coastguard Worker prop = itemFolder.PackSize;
359*f6dc9357SAndroid Build Coastguard Worker else switch (propID)
360*f6dc9357SAndroid Build Coastguard Worker {
361*f6dc9357SAndroid Build Coastguard Worker case kpidIsDir: prop = true; break;
362*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubDirs: prop = itemFolder.NumSubDirs; break;
363*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubFiles: prop = itemFolder.NumSubFiles; break;
364*f6dc9357SAndroid Build Coastguard Worker case kpidName: prop = item.Name; break;
365*f6dc9357SAndroid Build Coastguard Worker case kpidCRC:
366*f6dc9357SAndroid Build Coastguard Worker {
367*f6dc9357SAndroid Build Coastguard Worker // if (itemFolder.IsLeaf)
368*f6dc9357SAndroid Build Coastguard Worker if (!item.Ignore)
369*f6dc9357SAndroid Build Coastguard Worker {
370*f6dc9357SAndroid Build Coastguard Worker RINOK(_agentSpec->GetArchive()->GetProperty(arcIndex, propID, value))
371*f6dc9357SAndroid Build Coastguard Worker }
372*f6dc9357SAndroid Build Coastguard Worker if (itemFolder.CrcIsDefined && value->vt == VT_EMPTY)
373*f6dc9357SAndroid Build Coastguard Worker prop = itemFolder.Crc;
374*f6dc9357SAndroid Build Coastguard Worker break;
375*f6dc9357SAndroid Build Coastguard Worker }
376*f6dc9357SAndroid Build Coastguard Worker default:
377*f6dc9357SAndroid Build Coastguard Worker // if (itemFolder.IsLeaf)
378*f6dc9357SAndroid Build Coastguard Worker if (!item.Ignore)
379*f6dc9357SAndroid Build Coastguard Worker return _agentSpec->GetArchive()->GetProperty(arcIndex, propID, value);
380*f6dc9357SAndroid Build Coastguard Worker }
381*f6dc9357SAndroid Build Coastguard Worker }
382*f6dc9357SAndroid Build Coastguard Worker }
383*f6dc9357SAndroid Build Coastguard Worker else
384*f6dc9357SAndroid Build Coastguard Worker {
385*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir
386*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
387*f6dc9357SAndroid Build Coastguard Worker {
388*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &item = _proxy->Dirs[dir->SubDirs[realIndex]];
389*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode && propID == kpidSize)
390*f6dc9357SAndroid Build Coastguard Worker prop = item.Size;
391*f6dc9357SAndroid Build Coastguard Worker else if (!_flatMode && propID == kpidPackSize)
392*f6dc9357SAndroid Build Coastguard Worker prop = item.PackSize;
393*f6dc9357SAndroid Build Coastguard Worker else
394*f6dc9357SAndroid Build Coastguard Worker switch (propID)
395*f6dc9357SAndroid Build Coastguard Worker {
396*f6dc9357SAndroid Build Coastguard Worker case kpidIsDir: prop = true; break;
397*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubDirs: prop = item.NumSubDirs; break;
398*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubFiles: prop = item.NumSubFiles; break;
399*f6dc9357SAndroid Build Coastguard Worker case kpidName: prop = item.Name; break;
400*f6dc9357SAndroid Build Coastguard Worker case kpidCRC:
401*f6dc9357SAndroid Build Coastguard Worker {
402*f6dc9357SAndroid Build Coastguard Worker if (item.IsLeaf())
403*f6dc9357SAndroid Build Coastguard Worker {
404*f6dc9357SAndroid Build Coastguard Worker RINOK(_agentSpec->GetArchive()->GetProperty((unsigned)item.ArcIndex, propID, value))
405*f6dc9357SAndroid Build Coastguard Worker }
406*f6dc9357SAndroid Build Coastguard Worker if (item.CrcIsDefined && value->vt == VT_EMPTY)
407*f6dc9357SAndroid Build Coastguard Worker prop = item.Crc;
408*f6dc9357SAndroid Build Coastguard Worker break;
409*f6dc9357SAndroid Build Coastguard Worker }
410*f6dc9357SAndroid Build Coastguard Worker default:
411*f6dc9357SAndroid Build Coastguard Worker if (item.IsLeaf())
412*f6dc9357SAndroid Build Coastguard Worker return _agentSpec->GetArchive()->GetProperty((unsigned)item.ArcIndex, propID, value);
413*f6dc9357SAndroid Build Coastguard Worker }
414*f6dc9357SAndroid Build Coastguard Worker }
415*f6dc9357SAndroid Build Coastguard Worker else
416*f6dc9357SAndroid Build Coastguard Worker {
417*f6dc9357SAndroid Build Coastguard Worker unsigned arcIndex = dir->SubFiles[realIndex - dir->SubDirs.Size()];
418*f6dc9357SAndroid Build Coastguard Worker switch (propID)
419*f6dc9357SAndroid Build Coastguard Worker {
420*f6dc9357SAndroid Build Coastguard Worker case kpidIsDir: prop = false; break;
421*f6dc9357SAndroid Build Coastguard Worker case kpidName: prop = _proxy->Files[arcIndex].Name; break;
422*f6dc9357SAndroid Build Coastguard Worker default:
423*f6dc9357SAndroid Build Coastguard Worker return _agentSpec->GetArchive()->GetProperty(arcIndex, propID, value);
424*f6dc9357SAndroid Build Coastguard Worker }
425*f6dc9357SAndroid Build Coastguard Worker }
426*f6dc9357SAndroid Build Coastguard Worker }
427*f6dc9357SAndroid Build Coastguard Worker prop.Detach(value);
428*f6dc9357SAndroid Build Coastguard Worker return S_OK;
429*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
430*f6dc9357SAndroid Build Coastguard Worker }
431*f6dc9357SAndroid Build Coastguard Worker
GetUInt64Prop(IInArchive * archive,UInt32 index,PROPID propID)432*f6dc9357SAndroid Build Coastguard Worker static UInt64 GetUInt64Prop(IInArchive *archive, UInt32 index, PROPID propID)
433*f6dc9357SAndroid Build Coastguard Worker {
434*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
435*f6dc9357SAndroid Build Coastguard Worker if (archive->GetProperty(index, propID, &prop) != S_OK)
436*f6dc9357SAndroid Build Coastguard Worker throw 111233443;
437*f6dc9357SAndroid Build Coastguard Worker UInt64 v = 0;
438*f6dc9357SAndroid Build Coastguard Worker if (ConvertPropVariantToUInt64(prop, v))
439*f6dc9357SAndroid Build Coastguard Worker return v;
440*f6dc9357SAndroid Build Coastguard Worker return 0;
441*f6dc9357SAndroid Build Coastguard Worker }
442*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetItemName (UInt32 index,const wchar_t ** name,unsigned * len))443*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetItemName(UInt32 index, const wchar_t **name, unsigned *len))
444*f6dc9357SAndroid Build Coastguard Worker {
445*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
446*f6dc9357SAndroid Build Coastguard Worker {
447*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
448*f6dc9357SAndroid Build Coastguard Worker unsigned arcIndex = dir->Items[realIndex];
449*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &item = _proxy2->Files[arcIndex];
450*f6dc9357SAndroid Build Coastguard Worker *name = item.Name;
451*f6dc9357SAndroid Build Coastguard Worker *len = item.NameLen;
452*f6dc9357SAndroid Build Coastguard Worker return S_OK;
453*f6dc9357SAndroid Build Coastguard Worker }
454*f6dc9357SAndroid Build Coastguard Worker else
455*f6dc9357SAndroid Build Coastguard Worker {
456*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir
457*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
458*f6dc9357SAndroid Build Coastguard Worker {
459*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &item = _proxy->Dirs[dir->SubDirs[realIndex]];
460*f6dc9357SAndroid Build Coastguard Worker *name = item.Name;
461*f6dc9357SAndroid Build Coastguard Worker *len = item.NameLen;
462*f6dc9357SAndroid Build Coastguard Worker return S_OK;
463*f6dc9357SAndroid Build Coastguard Worker }
464*f6dc9357SAndroid Build Coastguard Worker else
465*f6dc9357SAndroid Build Coastguard Worker {
466*f6dc9357SAndroid Build Coastguard Worker const CProxyFile &item = _proxy->Files[dir->SubFiles[realIndex - dir->SubDirs.Size()]];
467*f6dc9357SAndroid Build Coastguard Worker *name = item.Name;
468*f6dc9357SAndroid Build Coastguard Worker *len = item.NameLen;
469*f6dc9357SAndroid Build Coastguard Worker return S_OK;
470*f6dc9357SAndroid Build Coastguard Worker }
471*f6dc9357SAndroid Build Coastguard Worker }
472*f6dc9357SAndroid Build Coastguard Worker }
473*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetItemPrefix (UInt32 index,const wchar_t ** name,unsigned * len))474*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetItemPrefix(UInt32 index, const wchar_t **name, unsigned *len))
475*f6dc9357SAndroid Build Coastguard Worker {
476*f6dc9357SAndroid Build Coastguard Worker *name = NULL;
477*f6dc9357SAndroid Build Coastguard Worker *len = 0;
478*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
479*f6dc9357SAndroid Build Coastguard Worker return S_OK;
480*f6dc9357SAndroid Build Coastguard Worker
481*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
482*f6dc9357SAndroid Build Coastguard Worker {
483*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item = _items[index];
484*f6dc9357SAndroid Build Coastguard Worker const UString &s = _proxy2->Dirs[item.DirIndex].PathPrefix;
485*f6dc9357SAndroid Build Coastguard Worker unsigned baseLen = _proxy2->Dirs[_proxyDirIndex].PathPrefix.Len();
486*f6dc9357SAndroid Build Coastguard Worker if (baseLen <= s.Len())
487*f6dc9357SAndroid Build Coastguard Worker {
488*f6dc9357SAndroid Build Coastguard Worker *name = (const wchar_t *)s + baseLen;
489*f6dc9357SAndroid Build Coastguard Worker *len = s.Len() - baseLen;
490*f6dc9357SAndroid Build Coastguard Worker }
491*f6dc9357SAndroid Build Coastguard Worker else
492*f6dc9357SAndroid Build Coastguard Worker {
493*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
494*f6dc9357SAndroid Build Coastguard Worker // throw 111l;
495*f6dc9357SAndroid Build Coastguard Worker }
496*f6dc9357SAndroid Build Coastguard Worker }
497*f6dc9357SAndroid Build Coastguard Worker return S_OK;
498*f6dc9357SAndroid Build Coastguard Worker }
499*f6dc9357SAndroid Build Coastguard Worker
CompareRawProps(IArchiveGetRawProps * rawProps,unsigned arcIndex1,unsigned arcIndex2,PROPID propID)500*f6dc9357SAndroid Build Coastguard Worker static int CompareRawProps(IArchiveGetRawProps *rawProps, unsigned arcIndex1, unsigned arcIndex2, PROPID propID)
501*f6dc9357SAndroid Build Coastguard Worker {
502*f6dc9357SAndroid Build Coastguard Worker // if (propID == kpidSha1)
503*f6dc9357SAndroid Build Coastguard Worker if (rawProps)
504*f6dc9357SAndroid Build Coastguard Worker {
505*f6dc9357SAndroid Build Coastguard Worker const void *p1, *p2;
506*f6dc9357SAndroid Build Coastguard Worker UInt32 size1, size2;
507*f6dc9357SAndroid Build Coastguard Worker UInt32 propType1, propType2;
508*f6dc9357SAndroid Build Coastguard Worker const HRESULT res1 = rawProps->GetRawProp(arcIndex1, propID, &p1, &size1, &propType1);
509*f6dc9357SAndroid Build Coastguard Worker const HRESULT res2 = rawProps->GetRawProp(arcIndex2, propID, &p2, &size2, &propType2);
510*f6dc9357SAndroid Build Coastguard Worker if (res1 == S_OK && res2 == S_OK)
511*f6dc9357SAndroid Build Coastguard Worker {
512*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < size1 && i < size2; i++)
513*f6dc9357SAndroid Build Coastguard Worker {
514*f6dc9357SAndroid Build Coastguard Worker const Byte b1 = ((const Byte *)p1)[i];
515*f6dc9357SAndroid Build Coastguard Worker const Byte b2 = ((const Byte *)p2)[i];
516*f6dc9357SAndroid Build Coastguard Worker if (b1 < b2) return -1;
517*f6dc9357SAndroid Build Coastguard Worker if (b1 > b2) return 1;
518*f6dc9357SAndroid Build Coastguard Worker }
519*f6dc9357SAndroid Build Coastguard Worker if (size1 < size2) return -1;
520*f6dc9357SAndroid Build Coastguard Worker if (size1 > size2) return 1;
521*f6dc9357SAndroid Build Coastguard Worker return 0;
522*f6dc9357SAndroid Build Coastguard Worker }
523*f6dc9357SAndroid Build Coastguard Worker }
524*f6dc9357SAndroid Build Coastguard Worker return 0;
525*f6dc9357SAndroid Build Coastguard Worker }
526*f6dc9357SAndroid Build Coastguard Worker
527*f6dc9357SAndroid Build Coastguard Worker // returns pointer to extension including '.'
528*f6dc9357SAndroid Build Coastguard Worker
GetExtension(const wchar_t * name)529*f6dc9357SAndroid Build Coastguard Worker static const wchar_t *GetExtension(const wchar_t *name)
530*f6dc9357SAndroid Build Coastguard Worker {
531*f6dc9357SAndroid Build Coastguard Worker for (const wchar_t *dotPtr = NULL;; name++)
532*f6dc9357SAndroid Build Coastguard Worker {
533*f6dc9357SAndroid Build Coastguard Worker wchar_t c = *name;
534*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
535*f6dc9357SAndroid Build Coastguard Worker return dotPtr ? dotPtr : name;
536*f6dc9357SAndroid Build Coastguard Worker if (c == '.')
537*f6dc9357SAndroid Build Coastguard Worker dotPtr = name;
538*f6dc9357SAndroid Build Coastguard Worker }
539*f6dc9357SAndroid Build Coastguard Worker }
540*f6dc9357SAndroid Build Coastguard Worker
541*f6dc9357SAndroid Build Coastguard Worker
CompareItems3(UInt32 index1,UInt32 index2,PROPID propID)542*f6dc9357SAndroid Build Coastguard Worker int CAgentFolder::CompareItems3(UInt32 index1, UInt32 index2, PROPID propID)
543*f6dc9357SAndroid Build Coastguard Worker {
544*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop1, prop2;
545*f6dc9357SAndroid Build Coastguard Worker // Name must be first property
546*f6dc9357SAndroid Build Coastguard Worker GetProperty(index1, propID, &prop1);
547*f6dc9357SAndroid Build Coastguard Worker GetProperty(index2, propID, &prop2);
548*f6dc9357SAndroid Build Coastguard Worker if (prop1.vt != prop2.vt)
549*f6dc9357SAndroid Build Coastguard Worker return MyCompare(prop1.vt, prop2.vt);
550*f6dc9357SAndroid Build Coastguard Worker if (prop1.vt == VT_BSTR)
551*f6dc9357SAndroid Build Coastguard Worker return MyStringCompareNoCase(prop1.bstrVal, prop2.bstrVal);
552*f6dc9357SAndroid Build Coastguard Worker return prop1.Compare(prop2);
553*f6dc9357SAndroid Build Coastguard Worker }
554*f6dc9357SAndroid Build Coastguard Worker
555*f6dc9357SAndroid Build Coastguard Worker
CompareItems2(UInt32 index1,UInt32 index2,PROPID propID,Int32 propIsRaw)556*f6dc9357SAndroid Build Coastguard Worker int CAgentFolder::CompareItems2(UInt32 index1, UInt32 index2, PROPID propID, Int32 propIsRaw)
557*f6dc9357SAndroid Build Coastguard Worker {
558*f6dc9357SAndroid Build Coastguard Worker unsigned realIndex1, realIndex2;
559*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 *dir1, *dir2;
560*f6dc9357SAndroid Build Coastguard Worker
561*f6dc9357SAndroid Build Coastguard Worker if (_flatMode)
562*f6dc9357SAndroid Build Coastguard Worker {
563*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item1 = _items[index1];
564*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item2 = _items[index2];
565*f6dc9357SAndroid Build Coastguard Worker dir1 = &_proxy2->Dirs[item1.DirIndex];
566*f6dc9357SAndroid Build Coastguard Worker dir2 = &_proxy2->Dirs[item2.DirIndex];
567*f6dc9357SAndroid Build Coastguard Worker realIndex1 = item1.Index;
568*f6dc9357SAndroid Build Coastguard Worker realIndex2 = item2.Index;
569*f6dc9357SAndroid Build Coastguard Worker }
570*f6dc9357SAndroid Build Coastguard Worker else
571*f6dc9357SAndroid Build Coastguard Worker {
572*f6dc9357SAndroid Build Coastguard Worker dir2 = dir1 = &_proxy2->Dirs[_proxyDirIndex];
573*f6dc9357SAndroid Build Coastguard Worker realIndex1 = index1;
574*f6dc9357SAndroid Build Coastguard Worker realIndex2 = index2;
575*f6dc9357SAndroid Build Coastguard Worker }
576*f6dc9357SAndroid Build Coastguard Worker
577*f6dc9357SAndroid Build Coastguard Worker UInt32 arcIndex1;
578*f6dc9357SAndroid Build Coastguard Worker UInt32 arcIndex2;
579*f6dc9357SAndroid Build Coastguard Worker bool isDir1, isDir2;
580*f6dc9357SAndroid Build Coastguard Worker arcIndex1 = dir1->Items[realIndex1];
581*f6dc9357SAndroid Build Coastguard Worker arcIndex2 = dir2->Items[realIndex2];
582*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &prox1 = _proxy2->Files[arcIndex1];
583*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &prox2 = _proxy2->Files[arcIndex2];
584*f6dc9357SAndroid Build Coastguard Worker
585*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidName)
586*f6dc9357SAndroid Build Coastguard Worker {
587*f6dc9357SAndroid Build Coastguard Worker return CompareFileNames_ForFolderList(prox1.Name, prox2.Name);
588*f6dc9357SAndroid Build Coastguard Worker }
589*f6dc9357SAndroid Build Coastguard Worker
590*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidPrefix)
591*f6dc9357SAndroid Build Coastguard Worker {
592*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
593*f6dc9357SAndroid Build Coastguard Worker return 0;
594*f6dc9357SAndroid Build Coastguard Worker return CompareFileNames_ForFolderList(
595*f6dc9357SAndroid Build Coastguard Worker _proxy2->Dirs[_items[index1].DirIndex].PathPrefix,
596*f6dc9357SAndroid Build Coastguard Worker _proxy2->Dirs[_items[index2].DirIndex].PathPrefix);
597*f6dc9357SAndroid Build Coastguard Worker }
598*f6dc9357SAndroid Build Coastguard Worker
599*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidExtension)
600*f6dc9357SAndroid Build Coastguard Worker {
601*f6dc9357SAndroid Build Coastguard Worker return CompareFileNames_ForFolderList(
602*f6dc9357SAndroid Build Coastguard Worker GetExtension(prox1.Name),
603*f6dc9357SAndroid Build Coastguard Worker GetExtension(prox2.Name));
604*f6dc9357SAndroid Build Coastguard Worker }
605*f6dc9357SAndroid Build Coastguard Worker
606*f6dc9357SAndroid Build Coastguard Worker isDir1 = prox1.IsDir();
607*f6dc9357SAndroid Build Coastguard Worker isDir2 = prox2.IsDir();
608*f6dc9357SAndroid Build Coastguard Worker
609*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidIsDir)
610*f6dc9357SAndroid Build Coastguard Worker {
611*f6dc9357SAndroid Build Coastguard Worker if (isDir1 == isDir2)
612*f6dc9357SAndroid Build Coastguard Worker return 0;
613*f6dc9357SAndroid Build Coastguard Worker return isDir1 ? -1 : 1;
614*f6dc9357SAndroid Build Coastguard Worker }
615*f6dc9357SAndroid Build Coastguard Worker
616*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 *proxFolder1 = NULL;
617*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 *proxFolder2 = NULL;
618*f6dc9357SAndroid Build Coastguard Worker if (isDir1) proxFolder1 = &_proxy2->Dirs[prox1.DirIndex];
619*f6dc9357SAndroid Build Coastguard Worker if (isDir2) proxFolder2 = &_proxy2->Dirs[prox2.DirIndex];
620*f6dc9357SAndroid Build Coastguard Worker
621*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidNumSubDirs)
622*f6dc9357SAndroid Build Coastguard Worker {
623*f6dc9357SAndroid Build Coastguard Worker UInt32 n1 = 0;
624*f6dc9357SAndroid Build Coastguard Worker UInt32 n2 = 0;
625*f6dc9357SAndroid Build Coastguard Worker if (isDir1) n1 = proxFolder1->NumSubDirs;
626*f6dc9357SAndroid Build Coastguard Worker if (isDir2) n2 = proxFolder2->NumSubDirs;
627*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
628*f6dc9357SAndroid Build Coastguard Worker }
629*f6dc9357SAndroid Build Coastguard Worker
630*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidNumSubFiles)
631*f6dc9357SAndroid Build Coastguard Worker {
632*f6dc9357SAndroid Build Coastguard Worker UInt32 n1 = 0;
633*f6dc9357SAndroid Build Coastguard Worker UInt32 n2 = 0;
634*f6dc9357SAndroid Build Coastguard Worker if (isDir1) n1 = proxFolder1->NumSubFiles;
635*f6dc9357SAndroid Build Coastguard Worker if (isDir2) n2 = proxFolder2->NumSubFiles;
636*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
637*f6dc9357SAndroid Build Coastguard Worker }
638*f6dc9357SAndroid Build Coastguard Worker
639*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidSize)
640*f6dc9357SAndroid Build Coastguard Worker {
641*f6dc9357SAndroid Build Coastguard Worker UInt64 n1, n2;
642*f6dc9357SAndroid Build Coastguard Worker if (isDir1)
643*f6dc9357SAndroid Build Coastguard Worker n1 = _flatMode ? 0 : proxFolder1->Size;
644*f6dc9357SAndroid Build Coastguard Worker else
645*f6dc9357SAndroid Build Coastguard Worker n1 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex1, kpidSize);
646*f6dc9357SAndroid Build Coastguard Worker if (isDir2)
647*f6dc9357SAndroid Build Coastguard Worker n2 = _flatMode ? 0 : proxFolder2->Size;
648*f6dc9357SAndroid Build Coastguard Worker else
649*f6dc9357SAndroid Build Coastguard Worker n2 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex2, kpidSize);
650*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
651*f6dc9357SAndroid Build Coastguard Worker }
652*f6dc9357SAndroid Build Coastguard Worker
653*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidPackSize)
654*f6dc9357SAndroid Build Coastguard Worker {
655*f6dc9357SAndroid Build Coastguard Worker UInt64 n1, n2;
656*f6dc9357SAndroid Build Coastguard Worker if (isDir1)
657*f6dc9357SAndroid Build Coastguard Worker n1 = _flatMode ? 0 : proxFolder1->PackSize;
658*f6dc9357SAndroid Build Coastguard Worker else
659*f6dc9357SAndroid Build Coastguard Worker n1 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex1, kpidPackSize);
660*f6dc9357SAndroid Build Coastguard Worker if (isDir2)
661*f6dc9357SAndroid Build Coastguard Worker n2 = _flatMode ? 0 : proxFolder2->PackSize;
662*f6dc9357SAndroid Build Coastguard Worker else
663*f6dc9357SAndroid Build Coastguard Worker n2 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex2, kpidPackSize);
664*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
665*f6dc9357SAndroid Build Coastguard Worker }
666*f6dc9357SAndroid Build Coastguard Worker
667*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidCRC)
668*f6dc9357SAndroid Build Coastguard Worker {
669*f6dc9357SAndroid Build Coastguard Worker UInt64 n1, n2;
670*f6dc9357SAndroid Build Coastguard Worker if (!isDir1 || !prox1.Ignore)
671*f6dc9357SAndroid Build Coastguard Worker n1 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex1, kpidCRC);
672*f6dc9357SAndroid Build Coastguard Worker else
673*f6dc9357SAndroid Build Coastguard Worker n1 = proxFolder1->Crc;
674*f6dc9357SAndroid Build Coastguard Worker if (!isDir2 || !prox2.Ignore)
675*f6dc9357SAndroid Build Coastguard Worker n2 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex2, kpidCRC);
676*f6dc9357SAndroid Build Coastguard Worker else
677*f6dc9357SAndroid Build Coastguard Worker n2 = proxFolder2->Crc;
678*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
679*f6dc9357SAndroid Build Coastguard Worker }
680*f6dc9357SAndroid Build Coastguard Worker
681*f6dc9357SAndroid Build Coastguard Worker if (propIsRaw)
682*f6dc9357SAndroid Build Coastguard Worker return CompareRawProps(_agentSpec->_archiveLink.GetArchiveGetRawProps(), arcIndex1, arcIndex2, propID);
683*f6dc9357SAndroid Build Coastguard Worker
684*f6dc9357SAndroid Build Coastguard Worker return CompareItems3(index1, index2, propID);
685*f6dc9357SAndroid Build Coastguard Worker }
686*f6dc9357SAndroid Build Coastguard Worker
687*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF2(Int32,CAgentFolder::CompareItems (UInt32 index1,UInt32 index2,PROPID propID,Int32 propIsRaw))688*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(Int32, CAgentFolder::CompareItems(UInt32 index1, UInt32 index2, PROPID propID, Int32 propIsRaw))
689*f6dc9357SAndroid Build Coastguard Worker {
690*f6dc9357SAndroid Build Coastguard Worker try {
691*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
692*f6dc9357SAndroid Build Coastguard Worker return CompareItems2(index1, index2, propID, propIsRaw);
693*f6dc9357SAndroid Build Coastguard Worker
694*f6dc9357SAndroid Build Coastguard Worker unsigned realIndex1, realIndex2;
695*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *dir1, *dir2;
696*f6dc9357SAndroid Build Coastguard Worker
697*f6dc9357SAndroid Build Coastguard Worker if (_flatMode)
698*f6dc9357SAndroid Build Coastguard Worker {
699*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item1 = _items[index1];
700*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item2 = _items[index2];
701*f6dc9357SAndroid Build Coastguard Worker dir1 = &_proxy->Dirs[item1.DirIndex];
702*f6dc9357SAndroid Build Coastguard Worker dir2 = &_proxy->Dirs[item2.DirIndex];
703*f6dc9357SAndroid Build Coastguard Worker realIndex1 = item1.Index;
704*f6dc9357SAndroid Build Coastguard Worker realIndex2 = item2.Index;
705*f6dc9357SAndroid Build Coastguard Worker }
706*f6dc9357SAndroid Build Coastguard Worker else
707*f6dc9357SAndroid Build Coastguard Worker {
708*f6dc9357SAndroid Build Coastguard Worker dir2 = dir1 = &_proxy->Dirs[_proxyDirIndex];
709*f6dc9357SAndroid Build Coastguard Worker realIndex1 = index1;
710*f6dc9357SAndroid Build Coastguard Worker realIndex2 = index2;
711*f6dc9357SAndroid Build Coastguard Worker }
712*f6dc9357SAndroid Build Coastguard Worker
713*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidPrefix)
714*f6dc9357SAndroid Build Coastguard Worker {
715*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
716*f6dc9357SAndroid Build Coastguard Worker return 0;
717*f6dc9357SAndroid Build Coastguard Worker UString prefix1, prefix2;
718*f6dc9357SAndroid Build Coastguard Worker GetPrefix(index1, prefix1);
719*f6dc9357SAndroid Build Coastguard Worker GetPrefix(index2, prefix2);
720*f6dc9357SAndroid Build Coastguard Worker return CompareFileNames_ForFolderList(prefix1, prefix2);
721*f6dc9357SAndroid Build Coastguard Worker }
722*f6dc9357SAndroid Build Coastguard Worker
723*f6dc9357SAndroid Build Coastguard Worker UInt32 arcIndex1;
724*f6dc9357SAndroid Build Coastguard Worker UInt32 arcIndex2;
725*f6dc9357SAndroid Build Coastguard Worker
726*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *proxFolder1 = NULL;
727*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *proxFolder2 = NULL;
728*f6dc9357SAndroid Build Coastguard Worker
729*f6dc9357SAndroid Build Coastguard Worker if (realIndex1 < dir1->SubDirs.Size())
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker proxFolder1 = &_proxy->Dirs[dir1->SubDirs[realIndex1]];
732*f6dc9357SAndroid Build Coastguard Worker arcIndex1 = (unsigned)proxFolder1->ArcIndex;
733*f6dc9357SAndroid Build Coastguard Worker }
734*f6dc9357SAndroid Build Coastguard Worker else
735*f6dc9357SAndroid Build Coastguard Worker arcIndex1 = dir1->SubFiles[realIndex1 - dir1->SubDirs.Size()];
736*f6dc9357SAndroid Build Coastguard Worker
737*f6dc9357SAndroid Build Coastguard Worker if (realIndex2 < dir2->SubDirs.Size())
738*f6dc9357SAndroid Build Coastguard Worker {
739*f6dc9357SAndroid Build Coastguard Worker proxFolder2 = &_proxy->Dirs[dir2->SubDirs[realIndex2]];
740*f6dc9357SAndroid Build Coastguard Worker arcIndex2 = (unsigned)proxFolder2->ArcIndex;
741*f6dc9357SAndroid Build Coastguard Worker }
742*f6dc9357SAndroid Build Coastguard Worker else
743*f6dc9357SAndroid Build Coastguard Worker arcIndex2 = dir2->SubFiles[realIndex2 - dir2->SubDirs.Size()];
744*f6dc9357SAndroid Build Coastguard Worker
745*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidName)
746*f6dc9357SAndroid Build Coastguard Worker return CompareFileNames_ForFolderList(
747*f6dc9357SAndroid Build Coastguard Worker proxFolder1 ? proxFolder1->Name : _proxy->Files[arcIndex1].Name,
748*f6dc9357SAndroid Build Coastguard Worker proxFolder2 ? proxFolder2->Name : _proxy->Files[arcIndex2].Name);
749*f6dc9357SAndroid Build Coastguard Worker
750*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidExtension)
751*f6dc9357SAndroid Build Coastguard Worker return CompareFileNames_ForFolderList(
752*f6dc9357SAndroid Build Coastguard Worker GetExtension(proxFolder1 ? proxFolder1->Name : _proxy->Files[arcIndex1].Name),
753*f6dc9357SAndroid Build Coastguard Worker GetExtension(proxFolder2 ? proxFolder2->Name : _proxy->Files[arcIndex2].Name));
754*f6dc9357SAndroid Build Coastguard Worker
755*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidIsDir)
756*f6dc9357SAndroid Build Coastguard Worker {
757*f6dc9357SAndroid Build Coastguard Worker if (proxFolder1)
758*f6dc9357SAndroid Build Coastguard Worker return proxFolder2 ? 0 : -1;
759*f6dc9357SAndroid Build Coastguard Worker return proxFolder2 ? 1 : 0;
760*f6dc9357SAndroid Build Coastguard Worker }
761*f6dc9357SAndroid Build Coastguard Worker
762*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidNumSubDirs)
763*f6dc9357SAndroid Build Coastguard Worker {
764*f6dc9357SAndroid Build Coastguard Worker UInt32 n1 = 0;
765*f6dc9357SAndroid Build Coastguard Worker UInt32 n2 = 0;
766*f6dc9357SAndroid Build Coastguard Worker if (proxFolder1) n1 = proxFolder1->NumSubDirs;
767*f6dc9357SAndroid Build Coastguard Worker if (proxFolder2) n2 = proxFolder2->NumSubDirs;
768*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
769*f6dc9357SAndroid Build Coastguard Worker }
770*f6dc9357SAndroid Build Coastguard Worker
771*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidNumSubFiles)
772*f6dc9357SAndroid Build Coastguard Worker {
773*f6dc9357SAndroid Build Coastguard Worker UInt32 n1 = 0;
774*f6dc9357SAndroid Build Coastguard Worker UInt32 n2 = 0;
775*f6dc9357SAndroid Build Coastguard Worker if (proxFolder1) n1 = proxFolder1->NumSubFiles;
776*f6dc9357SAndroid Build Coastguard Worker if (proxFolder2) n2 = proxFolder2->NumSubFiles;
777*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
778*f6dc9357SAndroid Build Coastguard Worker }
779*f6dc9357SAndroid Build Coastguard Worker
780*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidSize)
781*f6dc9357SAndroid Build Coastguard Worker {
782*f6dc9357SAndroid Build Coastguard Worker UInt64 n1, n2;
783*f6dc9357SAndroid Build Coastguard Worker if (proxFolder1)
784*f6dc9357SAndroid Build Coastguard Worker n1 = _flatMode ? 0 : proxFolder1->Size;
785*f6dc9357SAndroid Build Coastguard Worker else
786*f6dc9357SAndroid Build Coastguard Worker n1 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex1, kpidSize);
787*f6dc9357SAndroid Build Coastguard Worker if (proxFolder2)
788*f6dc9357SAndroid Build Coastguard Worker n2 = _flatMode ? 0 : proxFolder2->Size;
789*f6dc9357SAndroid Build Coastguard Worker else
790*f6dc9357SAndroid Build Coastguard Worker n2 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex2, kpidSize);
791*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
792*f6dc9357SAndroid Build Coastguard Worker }
793*f6dc9357SAndroid Build Coastguard Worker
794*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidPackSize)
795*f6dc9357SAndroid Build Coastguard Worker {
796*f6dc9357SAndroid Build Coastguard Worker UInt64 n1, n2;
797*f6dc9357SAndroid Build Coastguard Worker if (proxFolder1)
798*f6dc9357SAndroid Build Coastguard Worker n1 = _flatMode ? 0 : proxFolder1->PackSize;
799*f6dc9357SAndroid Build Coastguard Worker else
800*f6dc9357SAndroid Build Coastguard Worker n1 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex1, kpidPackSize);
801*f6dc9357SAndroid Build Coastguard Worker if (proxFolder2)
802*f6dc9357SAndroid Build Coastguard Worker n2 = _flatMode ? 0 : proxFolder2->PackSize;
803*f6dc9357SAndroid Build Coastguard Worker else
804*f6dc9357SAndroid Build Coastguard Worker n2 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex2, kpidPackSize);
805*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
806*f6dc9357SAndroid Build Coastguard Worker }
807*f6dc9357SAndroid Build Coastguard Worker
808*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidCRC)
809*f6dc9357SAndroid Build Coastguard Worker {
810*f6dc9357SAndroid Build Coastguard Worker UInt64 n1, n2;
811*f6dc9357SAndroid Build Coastguard Worker if (proxFolder1 && !proxFolder1->IsLeaf())
812*f6dc9357SAndroid Build Coastguard Worker n1 = proxFolder1->Crc;
813*f6dc9357SAndroid Build Coastguard Worker else
814*f6dc9357SAndroid Build Coastguard Worker n1 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex1, kpidCRC);
815*f6dc9357SAndroid Build Coastguard Worker if (proxFolder2 && !proxFolder2->IsLeaf())
816*f6dc9357SAndroid Build Coastguard Worker n2 = proxFolder2->Crc;
817*f6dc9357SAndroid Build Coastguard Worker else
818*f6dc9357SAndroid Build Coastguard Worker n2 = GetUInt64Prop(_agentSpec->GetArchive(), arcIndex2, kpidCRC);
819*f6dc9357SAndroid Build Coastguard Worker return MyCompare(n1, n2);
820*f6dc9357SAndroid Build Coastguard Worker }
821*f6dc9357SAndroid Build Coastguard Worker
822*f6dc9357SAndroid Build Coastguard Worker if (propIsRaw)
823*f6dc9357SAndroid Build Coastguard Worker {
824*f6dc9357SAndroid Build Coastguard Worker bool isVirt1 = (proxFolder1 && !proxFolder1->IsLeaf());
825*f6dc9357SAndroid Build Coastguard Worker bool isVirt2 = (proxFolder2 && !proxFolder2->IsLeaf());
826*f6dc9357SAndroid Build Coastguard Worker if (isVirt1)
827*f6dc9357SAndroid Build Coastguard Worker return isVirt2 ? 0 : -1;
828*f6dc9357SAndroid Build Coastguard Worker if (isVirt2)
829*f6dc9357SAndroid Build Coastguard Worker return 1;
830*f6dc9357SAndroid Build Coastguard Worker return CompareRawProps(_agentSpec->_archiveLink.GetArchiveGetRawProps(), arcIndex1, arcIndex2, propID);
831*f6dc9357SAndroid Build Coastguard Worker }
832*f6dc9357SAndroid Build Coastguard Worker
833*f6dc9357SAndroid Build Coastguard Worker return CompareItems3(index1, index2, propID);
834*f6dc9357SAndroid Build Coastguard Worker
835*f6dc9357SAndroid Build Coastguard Worker } catch(...) { return 0; }
836*f6dc9357SAndroid Build Coastguard Worker }
837*f6dc9357SAndroid Build Coastguard Worker
838*f6dc9357SAndroid Build Coastguard Worker
BindToFolder_Internal(unsigned proxyDirIndex,IFolderFolder ** resultFolder)839*f6dc9357SAndroid Build Coastguard Worker HRESULT CAgentFolder::BindToFolder_Internal(unsigned proxyDirIndex, IFolderFolder **resultFolder)
840*f6dc9357SAndroid Build Coastguard Worker {
841*f6dc9357SAndroid Build Coastguard Worker /*
842*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> parentFolder;
843*f6dc9357SAndroid Build Coastguard Worker
844*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
845*f6dc9357SAndroid Build Coastguard Worker {
846*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 &dir = _proxy2->Dirs[proxyDirIndex];
847*f6dc9357SAndroid Build Coastguard Worker int par = _proxy2->GetParentFolderOfFile(dir.ArcIndex);
848*f6dc9357SAndroid Build Coastguard Worker if (par != (int)_proxyDirIndex)
849*f6dc9357SAndroid Build Coastguard Worker {
850*f6dc9357SAndroid Build Coastguard Worker RINOK(BindToFolder_Internal(par, &parentFolder));
851*f6dc9357SAndroid Build Coastguard Worker }
852*f6dc9357SAndroid Build Coastguard Worker else
853*f6dc9357SAndroid Build Coastguard Worker parentFolder = this;
854*f6dc9357SAndroid Build Coastguard Worker }
855*f6dc9357SAndroid Build Coastguard Worker else
856*f6dc9357SAndroid Build Coastguard Worker {
857*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &dir = _proxy->Dirs[proxyDirIndex];
858*f6dc9357SAndroid Build Coastguard Worker if (dir.Parent != (int)_proxyDirIndex)
859*f6dc9357SAndroid Build Coastguard Worker {
860*f6dc9357SAndroid Build Coastguard Worker RINOK(BindToFolder_Internal(dir.Parent, &parentFolder));
861*f6dc9357SAndroid Build Coastguard Worker }
862*f6dc9357SAndroid Build Coastguard Worker else
863*f6dc9357SAndroid Build Coastguard Worker parentFolder = this;
864*f6dc9357SAndroid Build Coastguard Worker }
865*f6dc9357SAndroid Build Coastguard Worker */
866*f6dc9357SAndroid Build Coastguard Worker CAgentFolder *folderSpec = new CAgentFolder;
867*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> agentFolder = folderSpec;
868*f6dc9357SAndroid Build Coastguard Worker folderSpec->Init(_proxy, _proxy2, proxyDirIndex, /* parentFolder, */ _agentSpec);
869*f6dc9357SAndroid Build Coastguard Worker *resultFolder = agentFolder.Detach();
870*f6dc9357SAndroid Build Coastguard Worker return S_OK;
871*f6dc9357SAndroid Build Coastguard Worker }
872*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::BindToFolder (UInt32 index,IFolderFolder ** resultFolder))873*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder))
874*f6dc9357SAndroid Build Coastguard Worker {
875*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
876*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
877*f6dc9357SAndroid Build Coastguard Worker {
878*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
879*f6dc9357SAndroid Build Coastguard Worker const unsigned arcIndex = dir->Items[realIndex];
880*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &item = _proxy2->Files[arcIndex];
881*f6dc9357SAndroid Build Coastguard Worker if (!item.IsDir())
882*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
883*f6dc9357SAndroid Build Coastguard Worker return BindToFolder_Internal((unsigned)item.DirIndex, resultFolder);
884*f6dc9357SAndroid Build Coastguard Worker }
885*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir
886*f6dc9357SAndroid Build Coastguard Worker if (realIndex >= (UInt32)dir->SubDirs.Size())
887*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
888*f6dc9357SAndroid Build Coastguard Worker return BindToFolder_Internal(dir->SubDirs[realIndex], resultFolder);
889*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
890*f6dc9357SAndroid Build Coastguard Worker }
891*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::BindToFolder (const wchar_t * name,IFolderFolder ** resultFolder))892*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder))
893*f6dc9357SAndroid Build Coastguard Worker {
894*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
895*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
896*f6dc9357SAndroid Build Coastguard Worker {
897*f6dc9357SAndroid Build Coastguard Worker const int index = _proxy2->FindItem(_proxyDirIndex, name, true);
898*f6dc9357SAndroid Build Coastguard Worker if (index == -1)
899*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
900*f6dc9357SAndroid Build Coastguard Worker return BindToFolder_Internal((unsigned)_proxy2->Files[_proxy2->Dirs[_proxyDirIndex].Items[index]].DirIndex, resultFolder);
901*f6dc9357SAndroid Build Coastguard Worker }
902*f6dc9357SAndroid Build Coastguard Worker const int index = _proxy->FindSubDir(_proxyDirIndex, name);
903*f6dc9357SAndroid Build Coastguard Worker if (index == -1)
904*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
905*f6dc9357SAndroid Build Coastguard Worker return BindToFolder_Internal((unsigned)index, resultFolder);
906*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
907*f6dc9357SAndroid Build Coastguard Worker }
908*f6dc9357SAndroid Build Coastguard Worker
909*f6dc9357SAndroid Build Coastguard Worker
910*f6dc9357SAndroid Build Coastguard Worker
911*f6dc9357SAndroid Build Coastguard Worker // ---------- IFolderAltStreams ----------
912*f6dc9357SAndroid Build Coastguard Worker
BindToAltStreams_Internal(unsigned proxyDirIndex,IFolderFolder ** resultFolder)913*f6dc9357SAndroid Build Coastguard Worker HRESULT CAgentFolder::BindToAltStreams_Internal(unsigned proxyDirIndex, IFolderFolder **resultFolder)
914*f6dc9357SAndroid Build Coastguard Worker {
915*f6dc9357SAndroid Build Coastguard Worker *resultFolder = NULL;
916*f6dc9357SAndroid Build Coastguard Worker if (!_proxy2)
917*f6dc9357SAndroid Build Coastguard Worker return S_OK;
918*f6dc9357SAndroid Build Coastguard Worker
919*f6dc9357SAndroid Build Coastguard Worker /*
920*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> parentFolder;
921*f6dc9357SAndroid Build Coastguard Worker
922*f6dc9357SAndroid Build Coastguard Worker int par = _proxy2->GetParentFolderOfFile(_proxy2->Dirs[proxyDirIndex].ArcIndex);
923*f6dc9357SAndroid Build Coastguard Worker if (par != (int)_proxyDirIndex)
924*f6dc9357SAndroid Build Coastguard Worker {
925*f6dc9357SAndroid Build Coastguard Worker RINOK(BindToFolder_Internal(par, &parentFolder));
926*f6dc9357SAndroid Build Coastguard Worker if (!parentFolder)
927*f6dc9357SAndroid Build Coastguard Worker return S_OK;
928*f6dc9357SAndroid Build Coastguard Worker }
929*f6dc9357SAndroid Build Coastguard Worker else
930*f6dc9357SAndroid Build Coastguard Worker parentFolder = this;
931*f6dc9357SAndroid Build Coastguard Worker */
932*f6dc9357SAndroid Build Coastguard Worker
933*f6dc9357SAndroid Build Coastguard Worker CAgentFolder *folderSpec = new CAgentFolder;
934*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> agentFolder = folderSpec;
935*f6dc9357SAndroid Build Coastguard Worker folderSpec->Init(_proxy, _proxy2, proxyDirIndex, /* parentFolder, */ _agentSpec);
936*f6dc9357SAndroid Build Coastguard Worker *resultFolder = agentFolder.Detach();
937*f6dc9357SAndroid Build Coastguard Worker return S_OK;
938*f6dc9357SAndroid Build Coastguard Worker }
939*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::BindToAltStreams (UInt32 index,IFolderFolder ** resultFolder))940*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::BindToAltStreams(UInt32 index, IFolderFolder **resultFolder))
941*f6dc9357SAndroid Build Coastguard Worker {
942*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
943*f6dc9357SAndroid Build Coastguard Worker
944*f6dc9357SAndroid Build Coastguard Worker *resultFolder = NULL;
945*f6dc9357SAndroid Build Coastguard Worker
946*f6dc9357SAndroid Build Coastguard Worker if (!_proxy2)
947*f6dc9357SAndroid Build Coastguard Worker return S_OK;
948*f6dc9357SAndroid Build Coastguard Worker
949*f6dc9357SAndroid Build Coastguard Worker if (_proxy2->IsAltDir(_proxyDirIndex))
950*f6dc9357SAndroid Build Coastguard Worker return S_OK;
951*f6dc9357SAndroid Build Coastguard Worker
952*f6dc9357SAndroid Build Coastguard Worker {
953*f6dc9357SAndroid Build Coastguard Worker if (index == (UInt32)(Int32)-1)
954*f6dc9357SAndroid Build Coastguard Worker {
955*f6dc9357SAndroid Build Coastguard Worker unsigned altDirIndex;
956*f6dc9357SAndroid Build Coastguard Worker // IFolderFolder *parentFolder;
957*f6dc9357SAndroid Build Coastguard Worker
958*f6dc9357SAndroid Build Coastguard Worker if (_proxyDirIndex == k_Proxy2_RootDirIndex)
959*f6dc9357SAndroid Build Coastguard Worker {
960*f6dc9357SAndroid Build Coastguard Worker altDirIndex = k_Proxy2_AltRootDirIndex;
961*f6dc9357SAndroid Build Coastguard Worker // parentFolder = this; // we want to use Root dir as parent for alt root
962*f6dc9357SAndroid Build Coastguard Worker }
963*f6dc9357SAndroid Build Coastguard Worker else
964*f6dc9357SAndroid Build Coastguard Worker {
965*f6dc9357SAndroid Build Coastguard Worker const unsigned arcIndex = (unsigned)_proxy2->Dirs[_proxyDirIndex].ArcIndex;
966*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &item = _proxy2->Files[arcIndex];
967*f6dc9357SAndroid Build Coastguard Worker if (item.AltDirIndex == -1)
968*f6dc9357SAndroid Build Coastguard Worker return S_OK;
969*f6dc9357SAndroid Build Coastguard Worker altDirIndex = (unsigned)item.AltDirIndex;
970*f6dc9357SAndroid Build Coastguard Worker // parentFolder = _parentFolder;
971*f6dc9357SAndroid Build Coastguard Worker }
972*f6dc9357SAndroid Build Coastguard Worker
973*f6dc9357SAndroid Build Coastguard Worker CAgentFolder *folderSpec = new CAgentFolder;
974*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> agentFolder = folderSpec;
975*f6dc9357SAndroid Build Coastguard Worker folderSpec->Init(_proxy, _proxy2, altDirIndex, /* parentFolder, */ _agentSpec);
976*f6dc9357SAndroid Build Coastguard Worker *resultFolder = agentFolder.Detach();
977*f6dc9357SAndroid Build Coastguard Worker return S_OK;
978*f6dc9357SAndroid Build Coastguard Worker }
979*f6dc9357SAndroid Build Coastguard Worker
980*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
981*f6dc9357SAndroid Build Coastguard Worker const unsigned arcIndex = dir->Items[realIndex];
982*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &item = _proxy2->Files[arcIndex];
983*f6dc9357SAndroid Build Coastguard Worker if (item.AltDirIndex == -1)
984*f6dc9357SAndroid Build Coastguard Worker return S_OK;
985*f6dc9357SAndroid Build Coastguard Worker return BindToAltStreams_Internal((unsigned)item.AltDirIndex, resultFolder);
986*f6dc9357SAndroid Build Coastguard Worker }
987*f6dc9357SAndroid Build Coastguard Worker
988*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
989*f6dc9357SAndroid Build Coastguard Worker }
990*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::BindToAltStreams (const wchar_t * name,IFolderFolder ** resultFolder))991*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::BindToAltStreams(const wchar_t *name, IFolderFolder **resultFolder))
992*f6dc9357SAndroid Build Coastguard Worker {
993*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
994*f6dc9357SAndroid Build Coastguard Worker
995*f6dc9357SAndroid Build Coastguard Worker *resultFolder = NULL;
996*f6dc9357SAndroid Build Coastguard Worker
997*f6dc9357SAndroid Build Coastguard Worker if (!_proxy2)
998*f6dc9357SAndroid Build Coastguard Worker return S_OK;
999*f6dc9357SAndroid Build Coastguard Worker
1000*f6dc9357SAndroid Build Coastguard Worker if (_proxy2->IsAltDir(_proxyDirIndex))
1001*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1002*f6dc9357SAndroid Build Coastguard Worker
1003*f6dc9357SAndroid Build Coastguard Worker if (name[0] == 0)
1004*f6dc9357SAndroid Build Coastguard Worker return BindToAltStreams((UInt32)(Int32)-1, resultFolder);
1005*f6dc9357SAndroid Build Coastguard Worker
1006*f6dc9357SAndroid Build Coastguard Worker {
1007*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 &dir = _proxy2->Dirs[_proxyDirIndex];
1008*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, dir.Items)
1009*f6dc9357SAndroid Build Coastguard Worker {
1010*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &file = _proxy2->Files[dir.Items[i]];
1011*f6dc9357SAndroid Build Coastguard Worker if (file.AltDirIndex != -1)
1012*f6dc9357SAndroid Build Coastguard Worker if (CompareFileNames(file.Name, name) == 0)
1013*f6dc9357SAndroid Build Coastguard Worker return BindToAltStreams_Internal((unsigned)file.AltDirIndex, resultFolder);
1014*f6dc9357SAndroid Build Coastguard Worker }
1015*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
1016*f6dc9357SAndroid Build Coastguard Worker }
1017*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1018*f6dc9357SAndroid Build Coastguard Worker }
1019*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::AreAltStreamsSupported (UInt32 index,Int32 * isSupported))1020*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::AreAltStreamsSupported(UInt32 index, Int32 *isSupported))
1021*f6dc9357SAndroid Build Coastguard Worker {
1022*f6dc9357SAndroid Build Coastguard Worker *isSupported = BoolToInt(false);
1023*f6dc9357SAndroid Build Coastguard Worker
1024*f6dc9357SAndroid Build Coastguard Worker if (!_proxy2)
1025*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1026*f6dc9357SAndroid Build Coastguard Worker
1027*f6dc9357SAndroid Build Coastguard Worker if (_proxy2->IsAltDir(_proxyDirIndex))
1028*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1029*f6dc9357SAndroid Build Coastguard Worker
1030*f6dc9357SAndroid Build Coastguard Worker unsigned arcIndex;
1031*f6dc9357SAndroid Build Coastguard Worker
1032*f6dc9357SAndroid Build Coastguard Worker if (index == (UInt32)(Int32)-1)
1033*f6dc9357SAndroid Build Coastguard Worker {
1034*f6dc9357SAndroid Build Coastguard Worker if (_proxyDirIndex == k_Proxy2_RootDirIndex)
1035*f6dc9357SAndroid Build Coastguard Worker {
1036*f6dc9357SAndroid Build Coastguard Worker *isSupported = BoolToInt(true);
1037*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1038*f6dc9357SAndroid Build Coastguard Worker }
1039*f6dc9357SAndroid Build Coastguard Worker arcIndex = (unsigned)_proxy2->Dirs[_proxyDirIndex].ArcIndex;
1040*f6dc9357SAndroid Build Coastguard Worker }
1041*f6dc9357SAndroid Build Coastguard Worker else
1042*f6dc9357SAndroid Build Coastguard Worker {
1043*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
1044*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->Items[realIndex];
1045*f6dc9357SAndroid Build Coastguard Worker }
1046*f6dc9357SAndroid Build Coastguard Worker
1047*f6dc9357SAndroid Build Coastguard Worker if (_proxy2->Files[arcIndex].AltDirIndex != -1)
1048*f6dc9357SAndroid Build Coastguard Worker *isSupported = BoolToInt(true);
1049*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1050*f6dc9357SAndroid Build Coastguard Worker }
1051*f6dc9357SAndroid Build Coastguard Worker
1052*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::BindToParentFolder (IFolderFolder ** resultFolder))1053*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::BindToParentFolder(IFolderFolder **resultFolder))
1054*f6dc9357SAndroid Build Coastguard Worker {
1055*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1056*f6dc9357SAndroid Build Coastguard Worker /*
1057*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> parentFolder = _parentFolder;
1058*f6dc9357SAndroid Build Coastguard Worker *resultFolder = parentFolder.Detach();
1059*f6dc9357SAndroid Build Coastguard Worker */
1060*f6dc9357SAndroid Build Coastguard Worker *resultFolder = NULL;
1061*f6dc9357SAndroid Build Coastguard Worker
1062*f6dc9357SAndroid Build Coastguard Worker unsigned proxyDirIndex;
1063*f6dc9357SAndroid Build Coastguard Worker
1064*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1065*f6dc9357SAndroid Build Coastguard Worker {
1066*f6dc9357SAndroid Build Coastguard Worker if (_proxyDirIndex == k_Proxy2_RootDirIndex)
1067*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1068*f6dc9357SAndroid Build Coastguard Worker if (_proxyDirIndex == k_Proxy2_AltRootDirIndex)
1069*f6dc9357SAndroid Build Coastguard Worker proxyDirIndex = k_Proxy2_RootDirIndex;
1070*f6dc9357SAndroid Build Coastguard Worker else
1071*f6dc9357SAndroid Build Coastguard Worker {
1072*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 &fold = _proxy2->Dirs[_proxyDirIndex];
1073*f6dc9357SAndroid Build Coastguard Worker const CProxyFile2 &file = _proxy2->Files[(unsigned)fold.ArcIndex];
1074*f6dc9357SAndroid Build Coastguard Worker const int parentIndex = file.Parent;
1075*f6dc9357SAndroid Build Coastguard Worker if (parentIndex == -1)
1076*f6dc9357SAndroid Build Coastguard Worker proxyDirIndex = k_Proxy2_RootDirIndex;
1077*f6dc9357SAndroid Build Coastguard Worker else
1078*f6dc9357SAndroid Build Coastguard Worker proxyDirIndex = (unsigned)_proxy2->Files[(unsigned)parentIndex].DirIndex;
1079*f6dc9357SAndroid Build Coastguard Worker }
1080*f6dc9357SAndroid Build Coastguard Worker }
1081*f6dc9357SAndroid Build Coastguard Worker else
1082*f6dc9357SAndroid Build Coastguard Worker {
1083*f6dc9357SAndroid Build Coastguard Worker const int parent = _proxy->Dirs[_proxyDirIndex].ParentDir;
1084*f6dc9357SAndroid Build Coastguard Worker if (parent == -1)
1085*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1086*f6dc9357SAndroid Build Coastguard Worker proxyDirIndex = (unsigned)parent;
1087*f6dc9357SAndroid Build Coastguard Worker }
1088*f6dc9357SAndroid Build Coastguard Worker
1089*f6dc9357SAndroid Build Coastguard Worker CAgentFolder *folderSpec = new CAgentFolder;
1090*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> agentFolder = folderSpec;
1091*f6dc9357SAndroid Build Coastguard Worker folderSpec->Init(_proxy, _proxy2, proxyDirIndex, /* parentFolder, */ _agentSpec);
1092*f6dc9357SAndroid Build Coastguard Worker *resultFolder = agentFolder.Detach();
1093*f6dc9357SAndroid Build Coastguard Worker
1094*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1095*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1096*f6dc9357SAndroid Build Coastguard Worker }
1097*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetStream (UInt32 index,ISequentialInStream ** stream))1098*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetStream(UInt32 index, ISequentialInStream **stream))
1099*f6dc9357SAndroid Build Coastguard Worker {
1100*f6dc9357SAndroid Build Coastguard Worker Z7_DECL_CMyComPtr_QI_FROM(
1101*f6dc9357SAndroid Build Coastguard Worker IInArchiveGetStream,
1102*f6dc9357SAndroid Build Coastguard Worker getStream, _agentSpec->GetArchive())
1103*f6dc9357SAndroid Build Coastguard Worker if (!getStream)
1104*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1105*f6dc9357SAndroid Build Coastguard Worker
1106*f6dc9357SAndroid Build Coastguard Worker UInt32 arcIndex;
1107*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1108*f6dc9357SAndroid Build Coastguard Worker {
1109*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
1110*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->Items[realIndex];
1111*f6dc9357SAndroid Build Coastguard Worker }
1112*f6dc9357SAndroid Build Coastguard Worker else
1113*f6dc9357SAndroid Build Coastguard Worker {
1114*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir
1115*f6dc9357SAndroid Build Coastguard Worker
1116*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
1117*f6dc9357SAndroid Build Coastguard Worker {
1118*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &item = _proxy->Dirs[dir->SubDirs[realIndex]];
1119*f6dc9357SAndroid Build Coastguard Worker if (!item.IsLeaf())
1120*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1121*f6dc9357SAndroid Build Coastguard Worker arcIndex = (unsigned)item.ArcIndex;
1122*f6dc9357SAndroid Build Coastguard Worker }
1123*f6dc9357SAndroid Build Coastguard Worker else
1124*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->SubFiles[realIndex - dir->SubDirs.Size()];
1125*f6dc9357SAndroid Build Coastguard Worker }
1126*f6dc9357SAndroid Build Coastguard Worker return getStream->GetStream(arcIndex, stream);
1127*f6dc9357SAndroid Build Coastguard Worker }
1128*f6dc9357SAndroid Build Coastguard Worker
1129*f6dc9357SAndroid Build Coastguard Worker // static const unsigned k_FirstOptionalProp = 2;
1130*f6dc9357SAndroid Build Coastguard Worker
1131*f6dc9357SAndroid Build Coastguard Worker static const PROPID kProps[] =
1132*f6dc9357SAndroid Build Coastguard Worker {
1133*f6dc9357SAndroid Build Coastguard Worker kpidNumSubDirs,
1134*f6dc9357SAndroid Build Coastguard Worker kpidNumSubFiles,
1135*f6dc9357SAndroid Build Coastguard Worker
1136*f6dc9357SAndroid Build Coastguard Worker // kpidNumAltStreams,
1137*f6dc9357SAndroid Build Coastguard Worker kpidPrefix
1138*f6dc9357SAndroid Build Coastguard Worker };
1139*f6dc9357SAndroid Build Coastguard Worker
1140*f6dc9357SAndroid Build Coastguard Worker struct CArchiveItemPropertyTemp
1141*f6dc9357SAndroid Build Coastguard Worker {
1142*f6dc9357SAndroid Build Coastguard Worker UString Name;
1143*f6dc9357SAndroid Build Coastguard Worker PROPID ID;
1144*f6dc9357SAndroid Build Coastguard Worker VARTYPE Type;
1145*f6dc9357SAndroid Build Coastguard Worker };
1146*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetNumberOfProperties (UInt32 * numProps))1147*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetNumberOfProperties(UInt32 *numProps))
1148*f6dc9357SAndroid Build Coastguard Worker {
1149*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1150*f6dc9357SAndroid Build Coastguard Worker RINOK(_agentSpec->GetArchive()->GetNumberOfProperties(numProps))
1151*f6dc9357SAndroid Build Coastguard Worker *numProps += Z7_ARRAY_SIZE(kProps);
1152*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
1153*f6dc9357SAndroid Build Coastguard Worker (*numProps)--;
1154*f6dc9357SAndroid Build Coastguard Worker /*
1155*f6dc9357SAndroid Build Coastguard Worker if (!_agentSpec->ThereIsAltStreamProp)
1156*f6dc9357SAndroid Build Coastguard Worker (*numProps)--;
1157*f6dc9357SAndroid Build Coastguard Worker */
1158*f6dc9357SAndroid Build Coastguard Worker /*
1159*f6dc9357SAndroid Build Coastguard Worker bool thereIsPathProp = _proxy2 ?
1160*f6dc9357SAndroid Build Coastguard Worker _agentSpec->_proxy2->ThereIsPathProp :
1161*f6dc9357SAndroid Build Coastguard Worker _agentSpec->_proxy->ThereIsPathProp;
1162*f6dc9357SAndroid Build Coastguard Worker */
1163*f6dc9357SAndroid Build Coastguard Worker
1164*f6dc9357SAndroid Build Coastguard Worker // if there is kpidPath, we change kpidPath to kpidName
1165*f6dc9357SAndroid Build Coastguard Worker // if there is no kpidPath, we add kpidName.
1166*f6dc9357SAndroid Build Coastguard Worker if (!_agentSpec->ThereIsPathProp)
1167*f6dc9357SAndroid Build Coastguard Worker (*numProps)++;
1168*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1169*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1170*f6dc9357SAndroid Build Coastguard Worker }
1171*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetPropertyInfo (UInt32 index,BSTR * name,PROPID * propID,VARTYPE * varType))1172*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType))
1173*f6dc9357SAndroid Build Coastguard Worker {
1174*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1175*f6dc9357SAndroid Build Coastguard Worker UInt32 numProps;
1176*f6dc9357SAndroid Build Coastguard Worker _agentSpec->GetArchive()->GetNumberOfProperties(&numProps);
1177*f6dc9357SAndroid Build Coastguard Worker
1178*f6dc9357SAndroid Build Coastguard Worker /*
1179*f6dc9357SAndroid Build Coastguard Worker bool thereIsPathProp = _proxy2 ?
1180*f6dc9357SAndroid Build Coastguard Worker _agentSpec->_proxy2->ThereIsPathProp :
1181*f6dc9357SAndroid Build Coastguard Worker _agentSpec->_proxy->ThereIsPathProp;
1182*f6dc9357SAndroid Build Coastguard Worker */
1183*f6dc9357SAndroid Build Coastguard Worker
1184*f6dc9357SAndroid Build Coastguard Worker if (!_agentSpec->ThereIsPathProp)
1185*f6dc9357SAndroid Build Coastguard Worker {
1186*f6dc9357SAndroid Build Coastguard Worker if (index == 0)
1187*f6dc9357SAndroid Build Coastguard Worker {
1188*f6dc9357SAndroid Build Coastguard Worker *propID = kpidName;
1189*f6dc9357SAndroid Build Coastguard Worker *varType = VT_BSTR;
1190*f6dc9357SAndroid Build Coastguard Worker *name = NULL;
1191*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1192*f6dc9357SAndroid Build Coastguard Worker }
1193*f6dc9357SAndroid Build Coastguard Worker index--;
1194*f6dc9357SAndroid Build Coastguard Worker }
1195*f6dc9357SAndroid Build Coastguard Worker
1196*f6dc9357SAndroid Build Coastguard Worker if (index < numProps)
1197*f6dc9357SAndroid Build Coastguard Worker {
1198*f6dc9357SAndroid Build Coastguard Worker RINOK(_agentSpec->GetArchive()->GetPropertyInfo(index, name, propID, varType))
1199*f6dc9357SAndroid Build Coastguard Worker if (*propID == kpidPath)
1200*f6dc9357SAndroid Build Coastguard Worker *propID = kpidName;
1201*f6dc9357SAndroid Build Coastguard Worker }
1202*f6dc9357SAndroid Build Coastguard Worker else
1203*f6dc9357SAndroid Build Coastguard Worker {
1204*f6dc9357SAndroid Build Coastguard Worker index -= numProps;
1205*f6dc9357SAndroid Build Coastguard Worker /*
1206*f6dc9357SAndroid Build Coastguard Worker if (index >= k_FirstOptionalProp)
1207*f6dc9357SAndroid Build Coastguard Worker {
1208*f6dc9357SAndroid Build Coastguard Worker if (!_agentSpec->ThereIsAltStreamProp)
1209*f6dc9357SAndroid Build Coastguard Worker index++;
1210*f6dc9357SAndroid Build Coastguard Worker }
1211*f6dc9357SAndroid Build Coastguard Worker */
1212*f6dc9357SAndroid Build Coastguard Worker *propID = kProps[index];
1213*f6dc9357SAndroid Build Coastguard Worker *varType = k7z_PROPID_To_VARTYPE[(unsigned)*propID];
1214*f6dc9357SAndroid Build Coastguard Worker *name = NULL;
1215*f6dc9357SAndroid Build Coastguard Worker }
1216*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1217*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1218*f6dc9357SAndroid Build Coastguard Worker }
1219*f6dc9357SAndroid Build Coastguard Worker
1220*f6dc9357SAndroid Build Coastguard Worker static const PROPID kFolderProps[] =
1221*f6dc9357SAndroid Build Coastguard Worker {
1222*f6dc9357SAndroid Build Coastguard Worker kpidSize,
1223*f6dc9357SAndroid Build Coastguard Worker kpidPackSize,
1224*f6dc9357SAndroid Build Coastguard Worker kpidNumSubDirs,
1225*f6dc9357SAndroid Build Coastguard Worker kpidNumSubFiles,
1226*f6dc9357SAndroid Build Coastguard Worker kpidCRC
1227*f6dc9357SAndroid Build Coastguard Worker };
1228*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetFolderProperty (PROPID propID,PROPVARIANT * value))1229*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetFolderProperty(PROPID propID, PROPVARIANT *value))
1230*f6dc9357SAndroid Build Coastguard Worker {
1231*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1232*f6dc9357SAndroid Build Coastguard Worker
1233*f6dc9357SAndroid Build Coastguard Worker NWindows::NCOM::CPropVariant prop;
1234*f6dc9357SAndroid Build Coastguard Worker
1235*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidReadOnly)
1236*f6dc9357SAndroid Build Coastguard Worker {
1237*f6dc9357SAndroid Build Coastguard Worker if (_agentSpec->Is_Attrib_ReadOnly())
1238*f6dc9357SAndroid Build Coastguard Worker prop = true;
1239*f6dc9357SAndroid Build Coastguard Worker else
1240*f6dc9357SAndroid Build Coastguard Worker prop = _agentSpec->IsThere_ReadOnlyArc();
1241*f6dc9357SAndroid Build Coastguard Worker }
1242*f6dc9357SAndroid Build Coastguard Worker else if (propID == kpidIsHash)
1243*f6dc9357SAndroid Build Coastguard Worker {
1244*f6dc9357SAndroid Build Coastguard Worker prop = _agentSpec->_isHashHandler;
1245*f6dc9357SAndroid Build Coastguard Worker }
1246*f6dc9357SAndroid Build Coastguard Worker else if (_proxy2)
1247*f6dc9357SAndroid Build Coastguard Worker {
1248*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 &dir = _proxy2->Dirs[_proxyDirIndex];
1249*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidName)
1250*f6dc9357SAndroid Build Coastguard Worker {
1251*f6dc9357SAndroid Build Coastguard Worker if (dir.ArcIndex != -1)
1252*f6dc9357SAndroid Build Coastguard Worker prop = _proxy2->Files[(unsigned)dir.ArcIndex].Name;
1253*f6dc9357SAndroid Build Coastguard Worker }
1254*f6dc9357SAndroid Build Coastguard Worker else if (propID == kpidPath)
1255*f6dc9357SAndroid Build Coastguard Worker {
1256*f6dc9357SAndroid Build Coastguard Worker bool isAltStreamFolder = false;
1257*f6dc9357SAndroid Build Coastguard Worker prop = _proxy2->GetDirPath_as_Prefix(_proxyDirIndex, isAltStreamFolder);
1258*f6dc9357SAndroid Build Coastguard Worker }
1259*f6dc9357SAndroid Build Coastguard Worker else switch (propID)
1260*f6dc9357SAndroid Build Coastguard Worker {
1261*f6dc9357SAndroid Build Coastguard Worker case kpidSize: prop = dir.Size; break;
1262*f6dc9357SAndroid Build Coastguard Worker case kpidPackSize: prop = dir.PackSize; break;
1263*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubDirs: prop = dir.NumSubDirs; break;
1264*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubFiles: prop = dir.NumSubFiles; break;
1265*f6dc9357SAndroid Build Coastguard Worker // case kpidName: prop = dir.Name; break;
1266*f6dc9357SAndroid Build Coastguard Worker // case kpidPath: prop = _proxy2->GetFullPathPrefix(_proxyDirIndex); break;
1267*f6dc9357SAndroid Build Coastguard Worker case kpidType: prop = UString("7-Zip.") + _agentSpec->ArchiveType; break;
1268*f6dc9357SAndroid Build Coastguard Worker case kpidCRC: if (dir.CrcIsDefined) { prop = dir.Crc; } break;
1269*f6dc9357SAndroid Build Coastguard Worker }
1270*f6dc9357SAndroid Build Coastguard Worker
1271*f6dc9357SAndroid Build Coastguard Worker }
1272*f6dc9357SAndroid Build Coastguard Worker else
1273*f6dc9357SAndroid Build Coastguard Worker {
1274*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &dir = _proxy->Dirs[_proxyDirIndex];
1275*f6dc9357SAndroid Build Coastguard Worker switch (propID)
1276*f6dc9357SAndroid Build Coastguard Worker {
1277*f6dc9357SAndroid Build Coastguard Worker case kpidSize: prop = dir.Size; break;
1278*f6dc9357SAndroid Build Coastguard Worker case kpidPackSize: prop = dir.PackSize; break;
1279*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubDirs: prop = dir.NumSubDirs; break;
1280*f6dc9357SAndroid Build Coastguard Worker case kpidNumSubFiles: prop = dir.NumSubFiles; break;
1281*f6dc9357SAndroid Build Coastguard Worker case kpidName: prop = dir.Name; break;
1282*f6dc9357SAndroid Build Coastguard Worker case kpidPath: prop = _proxy->GetDirPath_as_Prefix(_proxyDirIndex); break;
1283*f6dc9357SAndroid Build Coastguard Worker case kpidType: prop = UString("7-Zip.") + _agentSpec->ArchiveType; break;
1284*f6dc9357SAndroid Build Coastguard Worker case kpidCRC: if (dir.CrcIsDefined) prop = dir.Crc; break;
1285*f6dc9357SAndroid Build Coastguard Worker }
1286*f6dc9357SAndroid Build Coastguard Worker }
1287*f6dc9357SAndroid Build Coastguard Worker prop.Detach(value);
1288*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1289*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1290*f6dc9357SAndroid Build Coastguard Worker }
1291*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetNumberOfFolderProperties (UInt32 * numProps))1292*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetNumberOfFolderProperties(UInt32 *numProps))
1293*f6dc9357SAndroid Build Coastguard Worker {
1294*f6dc9357SAndroid Build Coastguard Worker *numProps = Z7_ARRAY_SIZE(kFolderProps);
1295*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1296*f6dc9357SAndroid Build Coastguard Worker }
1297*f6dc9357SAndroid Build Coastguard Worker
IMP_IFolderFolder_GetProp(CAgentFolder::GetFolderPropertyInfo,kFolderProps)1298*f6dc9357SAndroid Build Coastguard Worker IMP_IFolderFolder_GetProp(
1299*f6dc9357SAndroid Build Coastguard Worker CAgentFolder::GetFolderPropertyInfo,
1300*f6dc9357SAndroid Build Coastguard Worker kFolderProps)
1301*f6dc9357SAndroid Build Coastguard Worker
1302*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetParent(UInt32 /* index */, UInt32 * /* parent */, UInt32 * /* parentType */))
1303*f6dc9357SAndroid Build Coastguard Worker {
1304*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1305*f6dc9357SAndroid Build Coastguard Worker }
1306*f6dc9357SAndroid Build Coastguard Worker
1307*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetNumRawProps (UInt32 * numProps))1308*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetNumRawProps(UInt32 *numProps))
1309*f6dc9357SAndroid Build Coastguard Worker {
1310*f6dc9357SAndroid Build Coastguard Worker IArchiveGetRawProps *rawProps = _agentSpec->_archiveLink.GetArchiveGetRawProps();
1311*f6dc9357SAndroid Build Coastguard Worker if (rawProps)
1312*f6dc9357SAndroid Build Coastguard Worker return rawProps->GetNumRawProps(numProps);
1313*f6dc9357SAndroid Build Coastguard Worker *numProps = 0;
1314*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1315*f6dc9357SAndroid Build Coastguard Worker }
1316*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetRawPropInfo (UInt32 index,BSTR * name,PROPID * propID))1317*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetRawPropInfo(UInt32 index, BSTR *name, PROPID *propID))
1318*f6dc9357SAndroid Build Coastguard Worker {
1319*f6dc9357SAndroid Build Coastguard Worker IArchiveGetRawProps *rawProps = _agentSpec->_archiveLink.GetArchiveGetRawProps();
1320*f6dc9357SAndroid Build Coastguard Worker if (rawProps)
1321*f6dc9357SAndroid Build Coastguard Worker return rawProps->GetRawPropInfo(index, name, propID);
1322*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1323*f6dc9357SAndroid Build Coastguard Worker }
1324*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetRawProp (UInt32 index,PROPID propID,const void ** data,UInt32 * dataSize,UInt32 * propType))1325*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType))
1326*f6dc9357SAndroid Build Coastguard Worker {
1327*f6dc9357SAndroid Build Coastguard Worker IArchiveGetRawProps *rawProps = _agentSpec->_archiveLink.GetArchiveGetRawProps();
1328*f6dc9357SAndroid Build Coastguard Worker if (rawProps)
1329*f6dc9357SAndroid Build Coastguard Worker {
1330*f6dc9357SAndroid Build Coastguard Worker unsigned arcIndex;
1331*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1332*f6dc9357SAndroid Build Coastguard Worker {
1333*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir_2
1334*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->Items[realIndex];
1335*f6dc9357SAndroid Build Coastguard Worker }
1336*f6dc9357SAndroid Build Coastguard Worker else
1337*f6dc9357SAndroid Build Coastguard Worker {
1338*f6dc9357SAndroid Build Coastguard Worker SET_realIndex_AND_dir
1339*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
1340*f6dc9357SAndroid Build Coastguard Worker {
1341*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &item = _proxy->Dirs[dir->SubDirs[realIndex]];
1342*f6dc9357SAndroid Build Coastguard Worker if (!item.IsLeaf())
1343*f6dc9357SAndroid Build Coastguard Worker {
1344*f6dc9357SAndroid Build Coastguard Worker *data = NULL;
1345*f6dc9357SAndroid Build Coastguard Worker *dataSize = 0;
1346*f6dc9357SAndroid Build Coastguard Worker *propType = 0;
1347*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1348*f6dc9357SAndroid Build Coastguard Worker }
1349*f6dc9357SAndroid Build Coastguard Worker arcIndex = (unsigned)item.ArcIndex;
1350*f6dc9357SAndroid Build Coastguard Worker }
1351*f6dc9357SAndroid Build Coastguard Worker else
1352*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->SubFiles[realIndex - dir->SubDirs.Size()];
1353*f6dc9357SAndroid Build Coastguard Worker }
1354*f6dc9357SAndroid Build Coastguard Worker return rawProps->GetRawProp(arcIndex, propID, data, dataSize, propType);
1355*f6dc9357SAndroid Build Coastguard Worker }
1356*f6dc9357SAndroid Build Coastguard Worker *data = NULL;
1357*f6dc9357SAndroid Build Coastguard Worker *dataSize = 0;
1358*f6dc9357SAndroid Build Coastguard Worker *propType = 0;
1359*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1360*f6dc9357SAndroid Build Coastguard Worker }
1361*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::GetFolderArcProps (IFolderArcProps ** object))1362*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::GetFolderArcProps(IFolderArcProps **object))
1363*f6dc9357SAndroid Build Coastguard Worker {
1364*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArcProps> temp = _agentSpec;
1365*f6dc9357SAndroid Build Coastguard Worker *object = temp.Detach();
1366*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1367*f6dc9357SAndroid Build Coastguard Worker }
1368*f6dc9357SAndroid Build Coastguard Worker
1369*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::SetFlatMode (Int32 flatMode))1370*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::SetFlatMode(Int32 flatMode))
1371*f6dc9357SAndroid Build Coastguard Worker {
1372*f6dc9357SAndroid Build Coastguard Worker _flatMode = IntToBool(flatMode);
1373*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1374*f6dc9357SAndroid Build Coastguard Worker }
1375*f6dc9357SAndroid Build Coastguard Worker
1376*f6dc9357SAndroid Build Coastguard Worker
GetRealIndex(unsigned index) const1377*f6dc9357SAndroid Build Coastguard Worker int CAgentFolder::GetRealIndex(unsigned index) const
1378*f6dc9357SAndroid Build Coastguard Worker {
1379*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
1380*f6dc9357SAndroid Build Coastguard Worker {
1381*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1382*f6dc9357SAndroid Build Coastguard Worker return (int)_proxy2->GetRealIndex(_proxyDirIndex, index);
1383*f6dc9357SAndroid Build Coastguard Worker else
1384*f6dc9357SAndroid Build Coastguard Worker return _proxy->GetRealIndex(_proxyDirIndex, index);
1385*f6dc9357SAndroid Build Coastguard Worker }
1386*f6dc9357SAndroid Build Coastguard Worker {
1387*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item = _items[index];
1388*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1389*f6dc9357SAndroid Build Coastguard Worker {
1390*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 *dir = &_proxy2->Dirs[item.DirIndex];
1391*f6dc9357SAndroid Build Coastguard Worker return (int)dir->Items[item.Index];
1392*f6dc9357SAndroid Build Coastguard Worker }
1393*f6dc9357SAndroid Build Coastguard Worker else
1394*f6dc9357SAndroid Build Coastguard Worker {
1395*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *dir = &_proxy->Dirs[item.DirIndex];
1396*f6dc9357SAndroid Build Coastguard Worker const unsigned realIndex = item.Index;
1397*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
1398*f6dc9357SAndroid Build Coastguard Worker {
1399*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &f = _proxy->Dirs[dir->SubDirs[realIndex]];
1400*f6dc9357SAndroid Build Coastguard Worker if (!f.IsLeaf())
1401*f6dc9357SAndroid Build Coastguard Worker return -1;
1402*f6dc9357SAndroid Build Coastguard Worker return f.ArcIndex;
1403*f6dc9357SAndroid Build Coastguard Worker }
1404*f6dc9357SAndroid Build Coastguard Worker return (int)dir->SubFiles[realIndex - dir->SubDirs.Size()];
1405*f6dc9357SAndroid Build Coastguard Worker }
1406*f6dc9357SAndroid Build Coastguard Worker }
1407*f6dc9357SAndroid Build Coastguard Worker }
1408*f6dc9357SAndroid Build Coastguard Worker
GetRealIndices(const UInt32 * indices,UInt32 numItems,bool includeAltStreams,bool includeFolderSubItemsInFlatMode,CUIntVector & realIndices) const1409*f6dc9357SAndroid Build Coastguard Worker void CAgentFolder::GetRealIndices(const UInt32 *indices, UInt32 numItems, bool includeAltStreams, bool includeFolderSubItemsInFlatMode, CUIntVector &realIndices) const
1410*f6dc9357SAndroid Build Coastguard Worker {
1411*f6dc9357SAndroid Build Coastguard Worker if (!_flatMode)
1412*f6dc9357SAndroid Build Coastguard Worker {
1413*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1414*f6dc9357SAndroid Build Coastguard Worker _proxy2->GetRealIndices(_proxyDirIndex, indices, numItems, includeAltStreams, realIndices);
1415*f6dc9357SAndroid Build Coastguard Worker else
1416*f6dc9357SAndroid Build Coastguard Worker _proxy->GetRealIndices(_proxyDirIndex, indices, numItems, realIndices);
1417*f6dc9357SAndroid Build Coastguard Worker return;
1418*f6dc9357SAndroid Build Coastguard Worker }
1419*f6dc9357SAndroid Build Coastguard Worker
1420*f6dc9357SAndroid Build Coastguard Worker realIndices.Clear();
1421*f6dc9357SAndroid Build Coastguard Worker
1422*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numItems; i++)
1423*f6dc9357SAndroid Build Coastguard Worker {
1424*f6dc9357SAndroid Build Coastguard Worker const CProxyItem &item = _items[indices[i]];
1425*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1426*f6dc9357SAndroid Build Coastguard Worker {
1427*f6dc9357SAndroid Build Coastguard Worker const CProxyDir2 *dir = &_proxy2->Dirs[item.DirIndex];
1428*f6dc9357SAndroid Build Coastguard Worker _proxy2->AddRealIndices_of_ArcItem(dir->Items[item.Index], includeAltStreams, realIndices);
1429*f6dc9357SAndroid Build Coastguard Worker continue;
1430*f6dc9357SAndroid Build Coastguard Worker }
1431*f6dc9357SAndroid Build Coastguard Worker UInt32 arcIndex;
1432*f6dc9357SAndroid Build Coastguard Worker {
1433*f6dc9357SAndroid Build Coastguard Worker const CProxyDir *dir = &_proxy->Dirs[item.DirIndex];
1434*f6dc9357SAndroid Build Coastguard Worker unsigned realIndex = item.Index;
1435*f6dc9357SAndroid Build Coastguard Worker if (realIndex < dir->SubDirs.Size())
1436*f6dc9357SAndroid Build Coastguard Worker {
1437*f6dc9357SAndroid Build Coastguard Worker if (includeFolderSubItemsInFlatMode)
1438*f6dc9357SAndroid Build Coastguard Worker {
1439*f6dc9357SAndroid Build Coastguard Worker _proxy->AddRealIndices(dir->SubDirs[realIndex], realIndices);
1440*f6dc9357SAndroid Build Coastguard Worker continue;
1441*f6dc9357SAndroid Build Coastguard Worker }
1442*f6dc9357SAndroid Build Coastguard Worker const CProxyDir &f = _proxy->Dirs[dir->SubDirs[realIndex]];
1443*f6dc9357SAndroid Build Coastguard Worker if (!f.IsLeaf())
1444*f6dc9357SAndroid Build Coastguard Worker continue;
1445*f6dc9357SAndroid Build Coastguard Worker arcIndex = (unsigned)f.ArcIndex;
1446*f6dc9357SAndroid Build Coastguard Worker }
1447*f6dc9357SAndroid Build Coastguard Worker else
1448*f6dc9357SAndroid Build Coastguard Worker arcIndex = dir->SubFiles[realIndex - dir->SubDirs.Size()];
1449*f6dc9357SAndroid Build Coastguard Worker }
1450*f6dc9357SAndroid Build Coastguard Worker realIndices.Add(arcIndex);
1451*f6dc9357SAndroid Build Coastguard Worker }
1452*f6dc9357SAndroid Build Coastguard Worker
1453*f6dc9357SAndroid Build Coastguard Worker HeapSort(realIndices.NonConstData(), realIndices.Size());
1454*f6dc9357SAndroid Build Coastguard Worker }
1455*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgentFolder::Extract (const UInt32 * indices,UInt32 numItems,Int32 includeAltStreams,Int32 replaceAltStreamColon,NExtract::NPathMode::EEnum pathMode,NExtract::NOverwriteMode::EEnum overwriteMode,const wchar_t * path,Int32 testMode,IFolderArchiveExtractCallback * extractCallback2))1456*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgentFolder::Extract(const UInt32 *indices,
1457*f6dc9357SAndroid Build Coastguard Worker UInt32 numItems,
1458*f6dc9357SAndroid Build Coastguard Worker Int32 includeAltStreams,
1459*f6dc9357SAndroid Build Coastguard Worker Int32 replaceAltStreamColon,
1460*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::EEnum pathMode,
1461*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::EEnum overwriteMode,
1462*f6dc9357SAndroid Build Coastguard Worker const wchar_t *path,
1463*f6dc9357SAndroid Build Coastguard Worker Int32 testMode,
1464*f6dc9357SAndroid Build Coastguard Worker IFolderArchiveExtractCallback *extractCallback2))
1465*f6dc9357SAndroid Build Coastguard Worker {
1466*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1467*f6dc9357SAndroid Build Coastguard Worker
1468*f6dc9357SAndroid Build Coastguard Worker if (!testMode && _agentSpec->_isHashHandler)
1469*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
1470*f6dc9357SAndroid Build Coastguard Worker
1471*f6dc9357SAndroid Build Coastguard Worker CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;
1472*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec;
1473*f6dc9357SAndroid Build Coastguard Worker UStringVector pathParts;
1474*f6dc9357SAndroid Build Coastguard Worker bool isAltStreamFolder = false;
1475*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1476*f6dc9357SAndroid Build Coastguard Worker _proxy2->GetDirPathParts(_proxyDirIndex, pathParts, isAltStreamFolder);
1477*f6dc9357SAndroid Build Coastguard Worker else
1478*f6dc9357SAndroid Build Coastguard Worker _proxy->GetDirPathParts(_proxyDirIndex, pathParts);
1479*f6dc9357SAndroid Build Coastguard Worker
1480*f6dc9357SAndroid Build Coastguard Worker /*
1481*f6dc9357SAndroid Build Coastguard Worker if (_flatMode)
1482*f6dc9357SAndroid Build Coastguard Worker pathMode = NExtract::NPathMode::kNoPathnames;
1483*f6dc9357SAndroid Build Coastguard Worker */
1484*f6dc9357SAndroid Build Coastguard Worker
1485*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->InitForMulti(
1486*f6dc9357SAndroid Build Coastguard Worker false, // multiArchives
1487*f6dc9357SAndroid Build Coastguard Worker pathMode,
1488*f6dc9357SAndroid Build Coastguard Worker overwriteMode,
1489*f6dc9357SAndroid Build Coastguard Worker _zoneMode,
1490*f6dc9357SAndroid Build Coastguard Worker k_keepEmptyDirPrefixes);
1491*f6dc9357SAndroid Build Coastguard Worker
1492*f6dc9357SAndroid Build Coastguard Worker if (extractCallback2)
1493*f6dc9357SAndroid Build Coastguard Worker extractCallback2->SetTotal(_agentSpec->GetArc().GetEstmatedPhySize());
1494*f6dc9357SAndroid Build Coastguard Worker
1495*f6dc9357SAndroid Build Coastguard Worker FString pathU;
1496*f6dc9357SAndroid Build Coastguard Worker if (path)
1497*f6dc9357SAndroid Build Coastguard Worker {
1498*f6dc9357SAndroid Build Coastguard Worker pathU = us2fs(path);
1499*f6dc9357SAndroid Build Coastguard Worker if (!pathU.IsEmpty()
1500*f6dc9357SAndroid Build Coastguard Worker && !NFile::NName::IsAltStreamPrefixWithColon(path))
1501*f6dc9357SAndroid Build Coastguard Worker {
1502*f6dc9357SAndroid Build Coastguard Worker NFile::NName::NormalizeDirPathPrefix(pathU);
1503*f6dc9357SAndroid Build Coastguard Worker NFile::NDir::CreateComplexDir(pathU);
1504*f6dc9357SAndroid Build Coastguard Worker }
1505*f6dc9357SAndroid Build Coastguard Worker }
1506*f6dc9357SAndroid Build Coastguard Worker
1507*f6dc9357SAndroid Build Coastguard Worker CExtractNtOptions extractNtOptions;
1508*f6dc9357SAndroid Build Coastguard Worker extractNtOptions.AltStreams.Val = IntToBool(includeAltStreams); // change it!!!
1509*f6dc9357SAndroid Build Coastguard Worker extractNtOptions.AltStreams.Def = true;
1510*f6dc9357SAndroid Build Coastguard Worker
1511*f6dc9357SAndroid Build Coastguard Worker extractNtOptions.ReplaceColonForAltStream = IntToBool(replaceAltStreamColon);
1512*f6dc9357SAndroid Build Coastguard Worker
1513*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->InitBeforeNewArchive();
1514*f6dc9357SAndroid Build Coastguard Worker
1515*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
1516*f6dc9357SAndroid Build Coastguard Worker if (_zoneMode != NExtract::NZoneIdMode::kNone)
1517*f6dc9357SAndroid Build Coastguard Worker {
1518*f6dc9357SAndroid Build Coastguard Worker ReadZoneFile_Of_BaseFile(us2fs(_agentSpec->_archiveFilePath), extractCallbackSpec->ZoneBuf);
1519*f6dc9357SAndroid Build Coastguard Worker if (_zoneBuf.Size() != 0)
1520*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->ZoneBuf = _zoneBuf;
1521*f6dc9357SAndroid Build Coastguard Worker }
1522*f6dc9357SAndroid Build Coastguard Worker #endif
1523*f6dc9357SAndroid Build Coastguard Worker
1524*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->Init(
1525*f6dc9357SAndroid Build Coastguard Worker extractNtOptions,
1526*f6dc9357SAndroid Build Coastguard Worker NULL, &_agentSpec->GetArc(),
1527*f6dc9357SAndroid Build Coastguard Worker extractCallback2,
1528*f6dc9357SAndroid Build Coastguard Worker false, // stdOutMode
1529*f6dc9357SAndroid Build Coastguard Worker IntToBool(testMode),
1530*f6dc9357SAndroid Build Coastguard Worker pathU,
1531*f6dc9357SAndroid Build Coastguard Worker pathParts, isAltStreamFolder,
1532*f6dc9357SAndroid Build Coastguard Worker (UInt64)(Int64)-1);
1533*f6dc9357SAndroid Build Coastguard Worker
1534*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1535*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->SetBaseParentFolderIndex((unsigned)_proxy2->Dirs[_proxyDirIndex].ArcIndex);
1536*f6dc9357SAndroid Build Coastguard Worker
1537*f6dc9357SAndroid Build Coastguard Worker // do we need another base folder for subfolders ?
1538*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->DirPathPrefix_for_HashFiles = _agentSpec->_hashBaseFolderPrefix;
1539*f6dc9357SAndroid Build Coastguard Worker
1540*f6dc9357SAndroid Build Coastguard Worker CUIntVector realIndices;
1541*f6dc9357SAndroid Build Coastguard Worker GetRealIndices(indices, numItems, IntToBool(includeAltStreams),
1542*f6dc9357SAndroid Build Coastguard Worker false, // includeFolderSubItemsInFlatMode
1543*f6dc9357SAndroid Build Coastguard Worker realIndices); //
1544*f6dc9357SAndroid Build Coastguard Worker
1545*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_LINKS
1546*f6dc9357SAndroid Build Coastguard Worker
1547*f6dc9357SAndroid Build Coastguard Worker if (!testMode)
1548*f6dc9357SAndroid Build Coastguard Worker {
1549*f6dc9357SAndroid Build Coastguard Worker RINOK(extractCallbackSpec->PrepareHardLinks(&realIndices))
1550*f6dc9357SAndroid Build Coastguard Worker }
1551*f6dc9357SAndroid Build Coastguard Worker
1552*f6dc9357SAndroid Build Coastguard Worker #endif
1553*f6dc9357SAndroid Build Coastguard Worker
1554*f6dc9357SAndroid Build Coastguard Worker {
1555*f6dc9357SAndroid Build Coastguard Worker CArchiveExtractCallback_Closer ecsCloser(extractCallbackSpec);
1556*f6dc9357SAndroid Build Coastguard Worker
1557*f6dc9357SAndroid Build Coastguard Worker HRESULT res = _agentSpec->GetArchive()->Extract(realIndices.ConstData(),
1558*f6dc9357SAndroid Build Coastguard Worker realIndices.Size(), testMode, extractCallback);
1559*f6dc9357SAndroid Build Coastguard Worker
1560*f6dc9357SAndroid Build Coastguard Worker const HRESULT res2 = ecsCloser.Close();
1561*f6dc9357SAndroid Build Coastguard Worker if (res == S_OK)
1562*f6dc9357SAndroid Build Coastguard Worker res = res2;
1563*f6dc9357SAndroid Build Coastguard Worker return res;
1564*f6dc9357SAndroid Build Coastguard Worker }
1565*f6dc9357SAndroid Build Coastguard Worker
1566*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1567*f6dc9357SAndroid Build Coastguard Worker }
1568*f6dc9357SAndroid Build Coastguard Worker
1569*f6dc9357SAndroid Build Coastguard Worker /////////////////////////////////////////
1570*f6dc9357SAndroid Build Coastguard Worker // CAgent
1571*f6dc9357SAndroid Build Coastguard Worker
CAgent()1572*f6dc9357SAndroid Build Coastguard Worker CAgent::CAgent():
1573*f6dc9357SAndroid Build Coastguard Worker _proxy(NULL),
1574*f6dc9357SAndroid Build Coastguard Worker _proxy2(NULL),
1575*f6dc9357SAndroid Build Coastguard Worker _updatePathPrefix_is_AltFolder(false),
1576*f6dc9357SAndroid Build Coastguard Worker _isDeviceFile(false),
1577*f6dc9357SAndroid Build Coastguard Worker _isHashHandler(false)
1578*f6dc9357SAndroid Build Coastguard Worker {
1579*f6dc9357SAndroid Build Coastguard Worker }
1580*f6dc9357SAndroid Build Coastguard Worker
~CAgent()1581*f6dc9357SAndroid Build Coastguard Worker CAgent::~CAgent()
1582*f6dc9357SAndroid Build Coastguard Worker {
1583*f6dc9357SAndroid Build Coastguard Worker if (_proxy)
1584*f6dc9357SAndroid Build Coastguard Worker delete _proxy;
1585*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1586*f6dc9357SAndroid Build Coastguard Worker delete _proxy2;
1587*f6dc9357SAndroid Build Coastguard Worker }
1588*f6dc9357SAndroid Build Coastguard Worker
CanUpdate() const1589*f6dc9357SAndroid Build Coastguard Worker bool CAgent::CanUpdate() const
1590*f6dc9357SAndroid Build Coastguard Worker {
1591*f6dc9357SAndroid Build Coastguard Worker // FAR plugin uses empty agent to create new archive !!!
1592*f6dc9357SAndroid Build Coastguard Worker if (_archiveLink.Arcs.Size() == 0)
1593*f6dc9357SAndroid Build Coastguard Worker return true;
1594*f6dc9357SAndroid Build Coastguard Worker if (_isDeviceFile)
1595*f6dc9357SAndroid Build Coastguard Worker return false;
1596*f6dc9357SAndroid Build Coastguard Worker if (_archiveLink.Arcs.Size() != 1)
1597*f6dc9357SAndroid Build Coastguard Worker return false;
1598*f6dc9357SAndroid Build Coastguard Worker if (_archiveLink.Arcs[0].ErrorInfo.ThereIsTail)
1599*f6dc9357SAndroid Build Coastguard Worker return false;
1600*f6dc9357SAndroid Build Coastguard Worker return true;
1601*f6dc9357SAndroid Build Coastguard Worker }
1602*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::Open (IInStream * inStream,const wchar_t * filePath,const wchar_t * arcFormat,BSTR * archiveType,IArchiveOpenCallback * openArchiveCallback))1603*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::Open(
1604*f6dc9357SAndroid Build Coastguard Worker IInStream *inStream,
1605*f6dc9357SAndroid Build Coastguard Worker const wchar_t *filePath,
1606*f6dc9357SAndroid Build Coastguard Worker const wchar_t *arcFormat,
1607*f6dc9357SAndroid Build Coastguard Worker BSTR *archiveType,
1608*f6dc9357SAndroid Build Coastguard Worker IArchiveOpenCallback *openArchiveCallback))
1609*f6dc9357SAndroid Build Coastguard Worker {
1610*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1611*f6dc9357SAndroid Build Coastguard Worker _archiveFilePath = filePath;
1612*f6dc9357SAndroid Build Coastguard Worker _hashBaseFolderPrefix.Empty();
1613*f6dc9357SAndroid Build Coastguard Worker _attrib = 0;
1614*f6dc9357SAndroid Build Coastguard Worker _isDeviceFile = false;
1615*f6dc9357SAndroid Build Coastguard Worker _isHashHandler = false;
1616*f6dc9357SAndroid Build Coastguard Worker NFile::NFind::CFileInfo fi;
1617*f6dc9357SAndroid Build Coastguard Worker if (!inStream)
1618*f6dc9357SAndroid Build Coastguard Worker {
1619*f6dc9357SAndroid Build Coastguard Worker if (!fi.Find(us2fs(_archiveFilePath)))
1620*f6dc9357SAndroid Build Coastguard Worker return GetLastError_noZero_HRESULT();
1621*f6dc9357SAndroid Build Coastguard Worker if (fi.IsDir())
1622*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
1623*f6dc9357SAndroid Build Coastguard Worker _attrib = fi.Attrib;
1624*f6dc9357SAndroid Build Coastguard Worker _isDeviceFile = fi.IsDevice;
1625*f6dc9357SAndroid Build Coastguard Worker FString dirPrefix, fileName;
1626*f6dc9357SAndroid Build Coastguard Worker if (NFile::NDir::GetFullPathAndSplit(us2fs(_archiveFilePath), dirPrefix, fileName))
1627*f6dc9357SAndroid Build Coastguard Worker {
1628*f6dc9357SAndroid Build Coastguard Worker NFile::NName::NormalizeDirPathPrefix(dirPrefix);
1629*f6dc9357SAndroid Build Coastguard Worker _hashBaseFolderPrefix = dirPrefix;
1630*f6dc9357SAndroid Build Coastguard Worker }
1631*f6dc9357SAndroid Build Coastguard Worker }
1632*f6dc9357SAndroid Build Coastguard Worker CArcInfoEx archiverInfo0, archiverInfo1;
1633*f6dc9357SAndroid Build Coastguard Worker
1634*f6dc9357SAndroid Build Coastguard Worker RINOK(LoadGlobalCodecs())
1635*f6dc9357SAndroid Build Coastguard Worker
1636*f6dc9357SAndroid Build Coastguard Worker CObjectVector<COpenType> types;
1637*f6dc9357SAndroid Build Coastguard Worker if (!ParseOpenTypes(*g_CodecsObj, arcFormat, types))
1638*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
1639*f6dc9357SAndroid Build Coastguard Worker
1640*f6dc9357SAndroid Build Coastguard Worker /*
1641*f6dc9357SAndroid Build Coastguard Worker CObjectVector<COptionalOpenProperties> optProps;
1642*f6dc9357SAndroid Build Coastguard Worker if (Read_ShowDeleted())
1643*f6dc9357SAndroid Build Coastguard Worker {
1644*f6dc9357SAndroid Build Coastguard Worker COptionalOpenProperties &optPair = optProps.AddNew();
1645*f6dc9357SAndroid Build Coastguard Worker optPair.FormatName = "ntfs";
1646*f6dc9357SAndroid Build Coastguard Worker // optPair.Props.AddNew().Name = "LS";
1647*f6dc9357SAndroid Build Coastguard Worker optPair.Props.AddNew().Name = "LD";
1648*f6dc9357SAndroid Build Coastguard Worker }
1649*f6dc9357SAndroid Build Coastguard Worker */
1650*f6dc9357SAndroid Build Coastguard Worker
1651*f6dc9357SAndroid Build Coastguard Worker COpenOptions options;
1652*f6dc9357SAndroid Build Coastguard Worker options.props = NULL;
1653*f6dc9357SAndroid Build Coastguard Worker options.codecs = g_CodecsObj;
1654*f6dc9357SAndroid Build Coastguard Worker options.types = &types;
1655*f6dc9357SAndroid Build Coastguard Worker CIntVector exl;
1656*f6dc9357SAndroid Build Coastguard Worker options.excludedFormats = &exl;
1657*f6dc9357SAndroid Build Coastguard Worker options.stdInMode = false;
1658*f6dc9357SAndroid Build Coastguard Worker options.stream = inStream;
1659*f6dc9357SAndroid Build Coastguard Worker options.filePath = _archiveFilePath;
1660*f6dc9357SAndroid Build Coastguard Worker options.callback = openArchiveCallback;
1661*f6dc9357SAndroid Build Coastguard Worker
1662*f6dc9357SAndroid Build Coastguard Worker HRESULT res = _archiveLink.Open(options);
1663*f6dc9357SAndroid Build Coastguard Worker
1664*f6dc9357SAndroid Build Coastguard Worker if (!_archiveLink.Arcs.IsEmpty())
1665*f6dc9357SAndroid Build Coastguard Worker {
1666*f6dc9357SAndroid Build Coastguard Worker CArc &arc = _archiveLink.Arcs.Back();
1667*f6dc9357SAndroid Build Coastguard Worker if (!inStream)
1668*f6dc9357SAndroid Build Coastguard Worker {
1669*f6dc9357SAndroid Build Coastguard Worker arc.MTime.Set_From_FiTime(fi.MTime);
1670*f6dc9357SAndroid Build Coastguard Worker arc.MTime.Def = !fi.IsDevice;
1671*f6dc9357SAndroid Build Coastguard Worker }
1672*f6dc9357SAndroid Build Coastguard Worker
1673*f6dc9357SAndroid Build Coastguard Worker ArchiveType = GetTypeOfArc(arc);
1674*f6dc9357SAndroid Build Coastguard Worker if (archiveType)
1675*f6dc9357SAndroid Build Coastguard Worker {
1676*f6dc9357SAndroid Build Coastguard Worker RINOK(StringToBstr(ArchiveType, archiveType))
1677*f6dc9357SAndroid Build Coastguard Worker }
1678*f6dc9357SAndroid Build Coastguard Worker
1679*f6dc9357SAndroid Build Coastguard Worker if (arc.IsHashHandler(options))
1680*f6dc9357SAndroid Build Coastguard Worker _isHashHandler = true;
1681*f6dc9357SAndroid Build Coastguard Worker }
1682*f6dc9357SAndroid Build Coastguard Worker
1683*f6dc9357SAndroid Build Coastguard Worker return res;
1684*f6dc9357SAndroid Build Coastguard Worker
1685*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1686*f6dc9357SAndroid Build Coastguard Worker }
1687*f6dc9357SAndroid Build Coastguard Worker
1688*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::ReOpen (IArchiveOpenCallback * openArchiveCallback))1689*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::ReOpen(IArchiveOpenCallback *openArchiveCallback))
1690*f6dc9357SAndroid Build Coastguard Worker {
1691*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1692*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1693*f6dc9357SAndroid Build Coastguard Worker {
1694*f6dc9357SAndroid Build Coastguard Worker delete _proxy2;
1695*f6dc9357SAndroid Build Coastguard Worker _proxy2 = NULL;
1696*f6dc9357SAndroid Build Coastguard Worker }
1697*f6dc9357SAndroid Build Coastguard Worker if (_proxy)
1698*f6dc9357SAndroid Build Coastguard Worker {
1699*f6dc9357SAndroid Build Coastguard Worker delete _proxy;
1700*f6dc9357SAndroid Build Coastguard Worker _proxy = NULL;
1701*f6dc9357SAndroid Build Coastguard Worker }
1702*f6dc9357SAndroid Build Coastguard Worker
1703*f6dc9357SAndroid Build Coastguard Worker CObjectVector<COpenType> incl;
1704*f6dc9357SAndroid Build Coastguard Worker CIntVector exl;
1705*f6dc9357SAndroid Build Coastguard Worker
1706*f6dc9357SAndroid Build Coastguard Worker COpenOptions options;
1707*f6dc9357SAndroid Build Coastguard Worker options.props = NULL;
1708*f6dc9357SAndroid Build Coastguard Worker options.codecs = g_CodecsObj;
1709*f6dc9357SAndroid Build Coastguard Worker options.types = &incl;
1710*f6dc9357SAndroid Build Coastguard Worker options.excludedFormats = &exl;
1711*f6dc9357SAndroid Build Coastguard Worker options.stdInMode = false;
1712*f6dc9357SAndroid Build Coastguard Worker options.filePath = _archiveFilePath;
1713*f6dc9357SAndroid Build Coastguard Worker options.callback = openArchiveCallback;
1714*f6dc9357SAndroid Build Coastguard Worker
1715*f6dc9357SAndroid Build Coastguard Worker RINOK(_archiveLink.ReOpen(options))
1716*f6dc9357SAndroid Build Coastguard Worker return ReadItems();
1717*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1718*f6dc9357SAndroid Build Coastguard Worker }
1719*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::Close ())1720*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::Close())
1721*f6dc9357SAndroid Build Coastguard Worker {
1722*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1723*f6dc9357SAndroid Build Coastguard Worker return _archiveLink.Close();
1724*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1725*f6dc9357SAndroid Build Coastguard Worker }
1726*f6dc9357SAndroid Build Coastguard Worker
1727*f6dc9357SAndroid Build Coastguard Worker /*
1728*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::EnumProperties(IEnumSTATPROPSTG **EnumProperties)
1729*f6dc9357SAndroid Build Coastguard Worker {
1730*f6dc9357SAndroid Build Coastguard Worker return _archive->EnumProperties(EnumProperties);
1731*f6dc9357SAndroid Build Coastguard Worker }
1732*f6dc9357SAndroid Build Coastguard Worker */
1733*f6dc9357SAndroid Build Coastguard Worker
ReadItems()1734*f6dc9357SAndroid Build Coastguard Worker HRESULT CAgent::ReadItems()
1735*f6dc9357SAndroid Build Coastguard Worker {
1736*f6dc9357SAndroid Build Coastguard Worker if (_proxy || _proxy2)
1737*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1738*f6dc9357SAndroid Build Coastguard Worker
1739*f6dc9357SAndroid Build Coastguard Worker const CArc &arc = GetArc();
1740*f6dc9357SAndroid Build Coastguard Worker bool useProxy2 = (arc.GetRawProps && arc.IsTree);
1741*f6dc9357SAndroid Build Coastguard Worker
1742*f6dc9357SAndroid Build Coastguard Worker // useProxy2 = false;
1743*f6dc9357SAndroid Build Coastguard Worker
1744*f6dc9357SAndroid Build Coastguard Worker if (useProxy2)
1745*f6dc9357SAndroid Build Coastguard Worker _proxy2 = new CProxyArc2();
1746*f6dc9357SAndroid Build Coastguard Worker else
1747*f6dc9357SAndroid Build Coastguard Worker _proxy = new CProxyArc();
1748*f6dc9357SAndroid Build Coastguard Worker
1749*f6dc9357SAndroid Build Coastguard Worker {
1750*f6dc9357SAndroid Build Coastguard Worker ThereIsPathProp = false;
1751*f6dc9357SAndroid Build Coastguard Worker // ThereIsAltStreamProp = false;
1752*f6dc9357SAndroid Build Coastguard Worker UInt32 numProps;
1753*f6dc9357SAndroid Build Coastguard Worker arc.Archive->GetNumberOfProperties(&numProps);
1754*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numProps; i++)
1755*f6dc9357SAndroid Build Coastguard Worker {
1756*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR name;
1757*f6dc9357SAndroid Build Coastguard Worker PROPID propID;
1758*f6dc9357SAndroid Build Coastguard Worker VARTYPE varType;
1759*f6dc9357SAndroid Build Coastguard Worker RINOK(arc.Archive->GetPropertyInfo(i, &name, &propID, &varType))
1760*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidPath)
1761*f6dc9357SAndroid Build Coastguard Worker ThereIsPathProp = true;
1762*f6dc9357SAndroid Build Coastguard Worker /*
1763*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidIsAltStream)
1764*f6dc9357SAndroid Build Coastguard Worker ThereIsAltStreamProp = true;
1765*f6dc9357SAndroid Build Coastguard Worker */
1766*f6dc9357SAndroid Build Coastguard Worker }
1767*f6dc9357SAndroid Build Coastguard Worker }
1768*f6dc9357SAndroid Build Coastguard Worker
1769*f6dc9357SAndroid Build Coastguard Worker if (_proxy2)
1770*f6dc9357SAndroid Build Coastguard Worker return _proxy2->Load(GetArc(), NULL);
1771*f6dc9357SAndroid Build Coastguard Worker return _proxy->Load(GetArc(), NULL);
1772*f6dc9357SAndroid Build Coastguard Worker }
1773*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::BindToRootFolder (IFolderFolder ** resultFolder))1774*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::BindToRootFolder(IFolderFolder **resultFolder))
1775*f6dc9357SAndroid Build Coastguard Worker {
1776*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1777*f6dc9357SAndroid Build Coastguard Worker if (!_archiveLink.Arcs.IsEmpty())
1778*f6dc9357SAndroid Build Coastguard Worker {
1779*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadItems())
1780*f6dc9357SAndroid Build Coastguard Worker }
1781*f6dc9357SAndroid Build Coastguard Worker CAgentFolder *folderSpec = new CAgentFolder;
1782*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> rootFolder = folderSpec;
1783*f6dc9357SAndroid Build Coastguard Worker folderSpec->Init(_proxy, _proxy2, k_Proxy_RootDirIndex, /* NULL, */ this);
1784*f6dc9357SAndroid Build Coastguard Worker *resultFolder = rootFolder.Detach();
1785*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1786*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1787*f6dc9357SAndroid Build Coastguard Worker }
1788*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::Extract (NExtract::NPathMode::EEnum pathMode,NExtract::NOverwriteMode::EEnum overwriteMode,const wchar_t * path,Int32 testMode,IFolderArchiveExtractCallback * extractCallback2))1789*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::Extract(
1790*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::EEnum pathMode,
1791*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::EEnum overwriteMode,
1792*f6dc9357SAndroid Build Coastguard Worker const wchar_t *path,
1793*f6dc9357SAndroid Build Coastguard Worker Int32 testMode,
1794*f6dc9357SAndroid Build Coastguard Worker IFolderArchiveExtractCallback *extractCallback2))
1795*f6dc9357SAndroid Build Coastguard Worker {
1796*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1797*f6dc9357SAndroid Build Coastguard Worker
1798*f6dc9357SAndroid Build Coastguard Worker if (!testMode && _isHashHandler)
1799*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
1800*f6dc9357SAndroid Build Coastguard Worker
1801*f6dc9357SAndroid Build Coastguard Worker CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;
1802*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec;
1803*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->InitForMulti(
1804*f6dc9357SAndroid Build Coastguard Worker false, // multiArchives
1805*f6dc9357SAndroid Build Coastguard Worker pathMode,
1806*f6dc9357SAndroid Build Coastguard Worker overwriteMode,
1807*f6dc9357SAndroid Build Coastguard Worker NExtract::NZoneIdMode::kNone,
1808*f6dc9357SAndroid Build Coastguard Worker k_keepEmptyDirPrefixes);
1809*f6dc9357SAndroid Build Coastguard Worker
1810*f6dc9357SAndroid Build Coastguard Worker CExtractNtOptions extractNtOptions;
1811*f6dc9357SAndroid Build Coastguard Worker extractNtOptions.AltStreams.Val = true; // change it!!!
1812*f6dc9357SAndroid Build Coastguard Worker extractNtOptions.AltStreams.Def = true; // change it!!!
1813*f6dc9357SAndroid Build Coastguard Worker extractNtOptions.ReplaceColonForAltStream = false; // change it!!!
1814*f6dc9357SAndroid Build Coastguard Worker
1815*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->Init(
1816*f6dc9357SAndroid Build Coastguard Worker extractNtOptions,
1817*f6dc9357SAndroid Build Coastguard Worker NULL, &GetArc(),
1818*f6dc9357SAndroid Build Coastguard Worker extractCallback2,
1819*f6dc9357SAndroid Build Coastguard Worker false, // stdOutMode
1820*f6dc9357SAndroid Build Coastguard Worker IntToBool(testMode),
1821*f6dc9357SAndroid Build Coastguard Worker us2fs(path),
1822*f6dc9357SAndroid Build Coastguard Worker UStringVector(), false,
1823*f6dc9357SAndroid Build Coastguard Worker (UInt64)(Int64)-1);
1824*f6dc9357SAndroid Build Coastguard Worker
1825*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->DirPathPrefix_for_HashFiles = _hashBaseFolderPrefix;
1826*f6dc9357SAndroid Build Coastguard Worker
1827*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_LINKS
1828*f6dc9357SAndroid Build Coastguard Worker
1829*f6dc9357SAndroid Build Coastguard Worker if (!testMode)
1830*f6dc9357SAndroid Build Coastguard Worker {
1831*f6dc9357SAndroid Build Coastguard Worker RINOK(extractCallbackSpec->PrepareHardLinks(NULL)) // NULL means all items
1832*f6dc9357SAndroid Build Coastguard Worker }
1833*f6dc9357SAndroid Build Coastguard Worker
1834*f6dc9357SAndroid Build Coastguard Worker #endif
1835*f6dc9357SAndroid Build Coastguard Worker
1836*f6dc9357SAndroid Build Coastguard Worker return GetArchive()->Extract(NULL, (UInt32)(Int32)-1, testMode, extractCallback);
1837*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1838*f6dc9357SAndroid Build Coastguard Worker }
1839*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetNumberOfProperties (UInt32 * numProps))1840*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetNumberOfProperties(UInt32 *numProps))
1841*f6dc9357SAndroid Build Coastguard Worker {
1842*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1843*f6dc9357SAndroid Build Coastguard Worker return GetArchive()->GetNumberOfProperties(numProps);
1844*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1845*f6dc9357SAndroid Build Coastguard Worker }
1846*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetPropertyInfo (UInt32 index,BSTR * name,PROPID * propID,VARTYPE * varType))1847*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetPropertyInfo(UInt32 index,
1848*f6dc9357SAndroid Build Coastguard Worker BSTR *name, PROPID *propID, VARTYPE *varType))
1849*f6dc9357SAndroid Build Coastguard Worker {
1850*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1851*f6dc9357SAndroid Build Coastguard Worker RINOK(GetArchive()->GetPropertyInfo(index, name, propID, varType))
1852*f6dc9357SAndroid Build Coastguard Worker if (*propID == kpidPath)
1853*f6dc9357SAndroid Build Coastguard Worker *propID = kpidName;
1854*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1855*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1856*f6dc9357SAndroid Build Coastguard Worker }
1857*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetArcNumLevels (UInt32 * numLevels))1858*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetArcNumLevels(UInt32 *numLevels))
1859*f6dc9357SAndroid Build Coastguard Worker {
1860*f6dc9357SAndroid Build Coastguard Worker *numLevels = _archiveLink.Arcs.Size();
1861*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1862*f6dc9357SAndroid Build Coastguard Worker }
1863*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetArcProp (UInt32 level,PROPID propID,PROPVARIANT * value))1864*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetArcProp(UInt32 level, PROPID propID, PROPVARIANT *value))
1865*f6dc9357SAndroid Build Coastguard Worker {
1866*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
1867*f6dc9357SAndroid Build Coastguard Worker NWindows::NCOM::CPropVariant prop;
1868*f6dc9357SAndroid Build Coastguard Worker if (level > (UInt32)_archiveLink.Arcs.Size())
1869*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
1870*f6dc9357SAndroid Build Coastguard Worker if (level == (UInt32)_archiveLink.Arcs.Size())
1871*f6dc9357SAndroid Build Coastguard Worker {
1872*f6dc9357SAndroid Build Coastguard Worker switch (propID)
1873*f6dc9357SAndroid Build Coastguard Worker {
1874*f6dc9357SAndroid Build Coastguard Worker case kpidPath:
1875*f6dc9357SAndroid Build Coastguard Worker if (!_archiveLink.NonOpen_ArcPath.IsEmpty())
1876*f6dc9357SAndroid Build Coastguard Worker prop = _archiveLink.NonOpen_ArcPath;
1877*f6dc9357SAndroid Build Coastguard Worker break;
1878*f6dc9357SAndroid Build Coastguard Worker case kpidErrorType:
1879*f6dc9357SAndroid Build Coastguard Worker if (_archiveLink.NonOpen_ErrorInfo.ErrorFormatIndex >= 0)
1880*f6dc9357SAndroid Build Coastguard Worker prop = g_CodecsObj->Formats[_archiveLink.NonOpen_ErrorInfo.ErrorFormatIndex].Name;
1881*f6dc9357SAndroid Build Coastguard Worker break;
1882*f6dc9357SAndroid Build Coastguard Worker case kpidErrorFlags:
1883*f6dc9357SAndroid Build Coastguard Worker {
1884*f6dc9357SAndroid Build Coastguard Worker UInt32 flags = _archiveLink.NonOpen_ErrorInfo.GetErrorFlags();
1885*f6dc9357SAndroid Build Coastguard Worker if (flags != 0)
1886*f6dc9357SAndroid Build Coastguard Worker prop = flags;
1887*f6dc9357SAndroid Build Coastguard Worker break;
1888*f6dc9357SAndroid Build Coastguard Worker }
1889*f6dc9357SAndroid Build Coastguard Worker case kpidWarningFlags:
1890*f6dc9357SAndroid Build Coastguard Worker {
1891*f6dc9357SAndroid Build Coastguard Worker UInt32 flags = _archiveLink.NonOpen_ErrorInfo.GetWarningFlags();
1892*f6dc9357SAndroid Build Coastguard Worker if (flags != 0)
1893*f6dc9357SAndroid Build Coastguard Worker prop = flags;
1894*f6dc9357SAndroid Build Coastguard Worker break;
1895*f6dc9357SAndroid Build Coastguard Worker }
1896*f6dc9357SAndroid Build Coastguard Worker }
1897*f6dc9357SAndroid Build Coastguard Worker }
1898*f6dc9357SAndroid Build Coastguard Worker else
1899*f6dc9357SAndroid Build Coastguard Worker {
1900*f6dc9357SAndroid Build Coastguard Worker const CArc &arc = _archiveLink.Arcs[level];
1901*f6dc9357SAndroid Build Coastguard Worker switch (propID)
1902*f6dc9357SAndroid Build Coastguard Worker {
1903*f6dc9357SAndroid Build Coastguard Worker case kpidType: prop = GetTypeOfArc(arc); break;
1904*f6dc9357SAndroid Build Coastguard Worker case kpidPath: prop = arc.Path; break;
1905*f6dc9357SAndroid Build Coastguard Worker case kpidErrorType:
1906*f6dc9357SAndroid Build Coastguard Worker if (arc.ErrorInfo.ErrorFormatIndex >= 0)
1907*f6dc9357SAndroid Build Coastguard Worker prop = g_CodecsObj->Formats[arc.ErrorInfo.ErrorFormatIndex].Name;
1908*f6dc9357SAndroid Build Coastguard Worker break;
1909*f6dc9357SAndroid Build Coastguard Worker case kpidErrorFlags:
1910*f6dc9357SAndroid Build Coastguard Worker {
1911*f6dc9357SAndroid Build Coastguard Worker const UInt32 flags = arc.ErrorInfo.GetErrorFlags();
1912*f6dc9357SAndroid Build Coastguard Worker if (flags != 0)
1913*f6dc9357SAndroid Build Coastguard Worker prop = flags;
1914*f6dc9357SAndroid Build Coastguard Worker break;
1915*f6dc9357SAndroid Build Coastguard Worker }
1916*f6dc9357SAndroid Build Coastguard Worker case kpidWarningFlags:
1917*f6dc9357SAndroid Build Coastguard Worker {
1918*f6dc9357SAndroid Build Coastguard Worker const UInt32 flags = arc.ErrorInfo.GetWarningFlags();
1919*f6dc9357SAndroid Build Coastguard Worker if (flags != 0)
1920*f6dc9357SAndroid Build Coastguard Worker prop = flags;
1921*f6dc9357SAndroid Build Coastguard Worker break;
1922*f6dc9357SAndroid Build Coastguard Worker }
1923*f6dc9357SAndroid Build Coastguard Worker case kpidOffset:
1924*f6dc9357SAndroid Build Coastguard Worker {
1925*f6dc9357SAndroid Build Coastguard Worker const Int64 v = arc.GetGlobalOffset();
1926*f6dc9357SAndroid Build Coastguard Worker if (v != 0)
1927*f6dc9357SAndroid Build Coastguard Worker prop.Set_Int64(v);
1928*f6dc9357SAndroid Build Coastguard Worker break;
1929*f6dc9357SAndroid Build Coastguard Worker }
1930*f6dc9357SAndroid Build Coastguard Worker case kpidTailSize:
1931*f6dc9357SAndroid Build Coastguard Worker {
1932*f6dc9357SAndroid Build Coastguard Worker if (arc.ErrorInfo.TailSize != 0)
1933*f6dc9357SAndroid Build Coastguard Worker prop = arc.ErrorInfo.TailSize;
1934*f6dc9357SAndroid Build Coastguard Worker break;
1935*f6dc9357SAndroid Build Coastguard Worker }
1936*f6dc9357SAndroid Build Coastguard Worker default: return arc.Archive->GetArchiveProperty(propID, value);
1937*f6dc9357SAndroid Build Coastguard Worker }
1938*f6dc9357SAndroid Build Coastguard Worker }
1939*f6dc9357SAndroid Build Coastguard Worker prop.Detach(value);
1940*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1941*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
1942*f6dc9357SAndroid Build Coastguard Worker }
1943*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetArcNumProps (UInt32 level,UInt32 * numProps))1944*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetArcNumProps(UInt32 level, UInt32 *numProps))
1945*f6dc9357SAndroid Build Coastguard Worker {
1946*f6dc9357SAndroid Build Coastguard Worker return _archiveLink.Arcs[level].Archive->GetNumberOfArchiveProperties(numProps);
1947*f6dc9357SAndroid Build Coastguard Worker }
1948*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetArcPropInfo (UInt32 level,UInt32 index,BSTR * name,PROPID * propID,VARTYPE * varType))1949*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetArcPropInfo(UInt32 level, UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType))
1950*f6dc9357SAndroid Build Coastguard Worker {
1951*f6dc9357SAndroid Build Coastguard Worker return _archiveLink.Arcs[level].Archive->GetArchivePropertyInfo(index, name, propID, varType);
1952*f6dc9357SAndroid Build Coastguard Worker }
1953*f6dc9357SAndroid Build Coastguard Worker
1954*f6dc9357SAndroid Build Coastguard Worker // MainItemProperty
Z7_COM7F_IMF(CAgent::GetArcProp2 (UInt32 level,PROPID propID,PROPVARIANT * value))1955*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetArcProp2(UInt32 level, PROPID propID, PROPVARIANT *value))
1956*f6dc9357SAndroid Build Coastguard Worker {
1957*f6dc9357SAndroid Build Coastguard Worker return _archiveLink.Arcs[level - 1].Archive->GetProperty(_archiveLink.Arcs[level].SubfileIndex, propID, value);
1958*f6dc9357SAndroid Build Coastguard Worker }
1959*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetArcNumProps2 (UInt32 level,UInt32 * numProps))1960*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetArcNumProps2(UInt32 level, UInt32 *numProps))
1961*f6dc9357SAndroid Build Coastguard Worker {
1962*f6dc9357SAndroid Build Coastguard Worker return _archiveLink.Arcs[level - 1].Archive->GetNumberOfProperties(numProps);
1963*f6dc9357SAndroid Build Coastguard Worker }
1964*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CAgent::GetArcPropInfo2 (UInt32 level,UInt32 index,BSTR * name,PROPID * propID,VARTYPE * varType))1965*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CAgent::GetArcPropInfo2(UInt32 level, UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType))
1966*f6dc9357SAndroid Build Coastguard Worker {
1967*f6dc9357SAndroid Build Coastguard Worker return _archiveLink.Arcs[level - 1].Archive->GetPropertyInfo(index, name, propID, varType);
1968*f6dc9357SAndroid Build Coastguard Worker }
1969