1*f6dc9357SAndroid Build Coastguard Worker // 7zHandler.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 "../../../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/ComTry.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_7Z_SET_PROPERTIES
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/System.h"
12*f6dc9357SAndroid Build Coastguard Worker #endif
13*f6dc9357SAndroid Build Coastguard Worker
14*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ItemNameUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker #include "7zHandler.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "7zProperties.h"
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_SET_PROPERTIES
20*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTRACT_ONLY
21*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ParseProperties.h"
22*f6dc9357SAndroid Build Coastguard Worker #endif
23*f6dc9357SAndroid Build Coastguard Worker #endif
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
26*f6dc9357SAndroid Build Coastguard Worker using namespace NCOM;
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
29*f6dc9357SAndroid Build Coastguard Worker namespace N7z {
30*f6dc9357SAndroid Build Coastguard Worker
CHandler()31*f6dc9357SAndroid Build Coastguard Worker CHandler::CHandler()
32*f6dc9357SAndroid Build Coastguard Worker {
33*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
34*f6dc9357SAndroid Build Coastguard Worker _isEncrypted = false;
35*f6dc9357SAndroid Build Coastguard Worker _passwordIsDefined = false;
36*f6dc9357SAndroid Build Coastguard Worker #endif
37*f6dc9357SAndroid Build Coastguard Worker
38*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTRACT_ONLY
39*f6dc9357SAndroid Build Coastguard Worker
40*f6dc9357SAndroid Build Coastguard Worker _crcSize = 4;
41*f6dc9357SAndroid Build Coastguard Worker
42*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_SET_PROPERTIES
43*f6dc9357SAndroid Build Coastguard Worker _useMultiThreadMixer = true;
44*f6dc9357SAndroid Build Coastguard Worker #endif
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker #endif
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetNumberOfItems (UInt32 * numItems))49*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetNumberOfItems(UInt32 *numItems))
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker *numItems = _db.Files.Size();
52*f6dc9357SAndroid Build Coastguard Worker return S_OK;
53*f6dc9357SAndroid Build Coastguard Worker }
54*f6dc9357SAndroid Build Coastguard Worker
55*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SFX
56*f6dc9357SAndroid Build Coastguard Worker
57*f6dc9357SAndroid Build Coastguard Worker IMP_IInArchive_ArcProps_NO_Table
58*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetNumberOfProperties (UInt32 * numProps))59*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetNumberOfProperties(UInt32 *numProps))
60*f6dc9357SAndroid Build Coastguard Worker {
61*f6dc9357SAndroid Build Coastguard Worker *numProps = 0;
62*f6dc9357SAndroid Build Coastguard Worker return S_OK;
63*f6dc9357SAndroid Build Coastguard Worker }
64*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetPropertyInfo (UInt32,BSTR *,PROPID *,VARTYPE *))65*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetPropertyInfo(UInt32 /* index */,
66*f6dc9357SAndroid Build Coastguard Worker BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */))
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker #else
72*f6dc9357SAndroid Build Coastguard Worker
73*f6dc9357SAndroid Build Coastguard Worker static const Byte kArcProps[] =
74*f6dc9357SAndroid Build Coastguard Worker {
75*f6dc9357SAndroid Build Coastguard Worker kpidHeadersSize,
76*f6dc9357SAndroid Build Coastguard Worker kpidMethod,
77*f6dc9357SAndroid Build Coastguard Worker kpidSolid,
78*f6dc9357SAndroid Build Coastguard Worker kpidNumBlocks
79*f6dc9357SAndroid Build Coastguard Worker // , kpidIsTree
80*f6dc9357SAndroid Build Coastguard Worker };
81*f6dc9357SAndroid Build Coastguard Worker
82*f6dc9357SAndroid Build Coastguard Worker IMP_IInArchive_ArcProps
83*f6dc9357SAndroid Build Coastguard Worker
GetHex(unsigned value)84*f6dc9357SAndroid Build Coastguard Worker static inline char GetHex(unsigned value)
85*f6dc9357SAndroid Build Coastguard Worker {
86*f6dc9357SAndroid Build Coastguard Worker return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker
ConvertMethodIdToString_Back(char * s,UInt64 id)89*f6dc9357SAndroid Build Coastguard Worker static unsigned ConvertMethodIdToString_Back(char *s, UInt64 id)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker int len = 0;
92*f6dc9357SAndroid Build Coastguard Worker do
93*f6dc9357SAndroid Build Coastguard Worker {
94*f6dc9357SAndroid Build Coastguard Worker s[--len] = GetHex((unsigned)id & 0xF); id >>= 4;
95*f6dc9357SAndroid Build Coastguard Worker s[--len] = GetHex((unsigned)id & 0xF); id >>= 4;
96*f6dc9357SAndroid Build Coastguard Worker }
97*f6dc9357SAndroid Build Coastguard Worker while (id != 0);
98*f6dc9357SAndroid Build Coastguard Worker return (unsigned)-len;
99*f6dc9357SAndroid Build Coastguard Worker }
100*f6dc9357SAndroid Build Coastguard Worker
ConvertMethodIdToString(AString & res,UInt64 id)101*f6dc9357SAndroid Build Coastguard Worker static void ConvertMethodIdToString(AString &res, UInt64 id)
102*f6dc9357SAndroid Build Coastguard Worker {
103*f6dc9357SAndroid Build Coastguard Worker const unsigned kLen = 32;
104*f6dc9357SAndroid Build Coastguard Worker char s[kLen];
105*f6dc9357SAndroid Build Coastguard Worker unsigned len = kLen - 1;
106*f6dc9357SAndroid Build Coastguard Worker s[len] = 0;
107*f6dc9357SAndroid Build Coastguard Worker res += s + len - ConvertMethodIdToString_Back(s + len, id);
108*f6dc9357SAndroid Build Coastguard Worker }
109*f6dc9357SAndroid Build Coastguard Worker
110*f6dc9357SAndroid Build Coastguard Worker
GetStringForSizeValue(char * s,UInt32 val)111*f6dc9357SAndroid Build Coastguard Worker static char *GetStringForSizeValue(char *s, UInt32 val)
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < 32; i++)
114*f6dc9357SAndroid Build Coastguard Worker if (((UInt32)1 << i) == val)
115*f6dc9357SAndroid Build Coastguard Worker {
116*f6dc9357SAndroid Build Coastguard Worker if (i >= 10)
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker *s++= (char)('0' + i / 10);
119*f6dc9357SAndroid Build Coastguard Worker i %= 10;
120*f6dc9357SAndroid Build Coastguard Worker }
121*f6dc9357SAndroid Build Coastguard Worker *s++ = (char)('0' + i);
122*f6dc9357SAndroid Build Coastguard Worker *s = 0;
123*f6dc9357SAndroid Build Coastguard Worker return s;
124*f6dc9357SAndroid Build Coastguard Worker }
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker char c = 'b';
127*f6dc9357SAndroid Build Coastguard Worker if ((val & ((1 << 20) - 1)) == 0) { val >>= 20; c = 'm'; }
128*f6dc9357SAndroid Build Coastguard Worker else if ((val & ((1 << 10) - 1)) == 0) { val >>= 10; c = 'k'; }
129*f6dc9357SAndroid Build Coastguard Worker s = ConvertUInt32ToString(val, s);
130*f6dc9357SAndroid Build Coastguard Worker *s++ = c;
131*f6dc9357SAndroid Build Coastguard Worker *s = 0;
132*f6dc9357SAndroid Build Coastguard Worker return s;
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker
135*f6dc9357SAndroid Build Coastguard Worker
GetLzma2String(char * s,unsigned d)136*f6dc9357SAndroid Build Coastguard Worker static void GetLzma2String(char *s, unsigned d)
137*f6dc9357SAndroid Build Coastguard Worker {
138*f6dc9357SAndroid Build Coastguard Worker if (d > 40)
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker *s = 0;
141*f6dc9357SAndroid Build Coastguard Worker return;
142*f6dc9357SAndroid Build Coastguard Worker // s = MyStpCpy(s, "unsup");
143*f6dc9357SAndroid Build Coastguard Worker }
144*f6dc9357SAndroid Build Coastguard Worker else if ((d & 1) == 0)
145*f6dc9357SAndroid Build Coastguard Worker d = (d >> 1) + 12;
146*f6dc9357SAndroid Build Coastguard Worker else
147*f6dc9357SAndroid Build Coastguard Worker {
148*f6dc9357SAndroid Build Coastguard Worker // s = GetStringForSizeValue(s, (UInt32)3 << ((d >> 1) + 11));
149*f6dc9357SAndroid Build Coastguard Worker d = (d >> 1) + 1;
150*f6dc9357SAndroid Build Coastguard Worker char c = 'k';
151*f6dc9357SAndroid Build Coastguard Worker if (d >= 10)
152*f6dc9357SAndroid Build Coastguard Worker {
153*f6dc9357SAndroid Build Coastguard Worker c = 'm';
154*f6dc9357SAndroid Build Coastguard Worker d -= 10;
155*f6dc9357SAndroid Build Coastguard Worker }
156*f6dc9357SAndroid Build Coastguard Worker s = ConvertUInt32ToString((UInt32)3 << d, s);
157*f6dc9357SAndroid Build Coastguard Worker *s++ = c;
158*f6dc9357SAndroid Build Coastguard Worker *s = 0;
159*f6dc9357SAndroid Build Coastguard Worker return;
160*f6dc9357SAndroid Build Coastguard Worker }
161*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(d, s);
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker
164*f6dc9357SAndroid Build Coastguard Worker
165*f6dc9357SAndroid Build Coastguard Worker /*
166*f6dc9357SAndroid Build Coastguard Worker static inline void AddHexToString(UString &res, Byte value)
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker res += GetHex((Byte)(value >> 4));
169*f6dc9357SAndroid Build Coastguard Worker res += GetHex((Byte)(value & 0xF));
170*f6dc9357SAndroid Build Coastguard Worker }
171*f6dc9357SAndroid Build Coastguard Worker */
172*f6dc9357SAndroid Build Coastguard Worker
AddProp32(char * s,const char * name,UInt32 v)173*f6dc9357SAndroid Build Coastguard Worker static char *AddProp32(char *s, const char *name, UInt32 v)
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker *s++ = ':';
176*f6dc9357SAndroid Build Coastguard Worker s = MyStpCpy(s, name);
177*f6dc9357SAndroid Build Coastguard Worker return ConvertUInt32ToString(v, s);
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker
AddMethodName(AString & s,UInt64 id)180*f6dc9357SAndroid Build Coastguard Worker void CHandler::AddMethodName(AString &s, UInt64 id)
181*f6dc9357SAndroid Build Coastguard Worker {
182*f6dc9357SAndroid Build Coastguard Worker AString name;
183*f6dc9357SAndroid Build Coastguard Worker FindMethod(EXTERNAL_CODECS_VARS id, name);
184*f6dc9357SAndroid Build Coastguard Worker if (name.IsEmpty())
185*f6dc9357SAndroid Build Coastguard Worker ConvertMethodIdToString(s, id);
186*f6dc9357SAndroid Build Coastguard Worker else
187*f6dc9357SAndroid Build Coastguard Worker s += name;
188*f6dc9357SAndroid Build Coastguard Worker }
189*f6dc9357SAndroid Build Coastguard Worker
190*f6dc9357SAndroid Build Coastguard Worker #endif
191*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetArchiveProperty (PROPID propID,PROPVARIANT * value))192*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value))
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
195*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
196*f6dc9357SAndroid Build Coastguard Worker #endif
197*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
198*f6dc9357SAndroid Build Coastguard Worker switch (propID)
199*f6dc9357SAndroid Build Coastguard Worker {
200*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
201*f6dc9357SAndroid Build Coastguard Worker case kpidMethod:
202*f6dc9357SAndroid Build Coastguard Worker {
203*f6dc9357SAndroid Build Coastguard Worker AString s;
204*f6dc9357SAndroid Build Coastguard Worker const CParsedMethods &pm = _db.ParsedMethods;
205*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, pm.IDs)
206*f6dc9357SAndroid Build Coastguard Worker {
207*f6dc9357SAndroid Build Coastguard Worker UInt64 id = pm.IDs[i];
208*f6dc9357SAndroid Build Coastguard Worker s.Add_Space_if_NotEmpty();
209*f6dc9357SAndroid Build Coastguard Worker char temp[16];
210*f6dc9357SAndroid Build Coastguard Worker if (id == k_LZMA2)
211*f6dc9357SAndroid Build Coastguard Worker {
212*f6dc9357SAndroid Build Coastguard Worker s += "LZMA2:";
213*f6dc9357SAndroid Build Coastguard Worker GetLzma2String(temp, pm.Lzma2Prop);
214*f6dc9357SAndroid Build Coastguard Worker s += temp;
215*f6dc9357SAndroid Build Coastguard Worker }
216*f6dc9357SAndroid Build Coastguard Worker else if (id == k_LZMA)
217*f6dc9357SAndroid Build Coastguard Worker {
218*f6dc9357SAndroid Build Coastguard Worker s += "LZMA:";
219*f6dc9357SAndroid Build Coastguard Worker GetStringForSizeValue(temp, pm.LzmaDic);
220*f6dc9357SAndroid Build Coastguard Worker s += temp;
221*f6dc9357SAndroid Build Coastguard Worker }
222*f6dc9357SAndroid Build Coastguard Worker /*
223*f6dc9357SAndroid Build Coastguard Worker else if (id == k_ZSTD)
224*f6dc9357SAndroid Build Coastguard Worker {
225*f6dc9357SAndroid Build Coastguard Worker s += "ZSTD";
226*f6dc9357SAndroid Build Coastguard Worker }
227*f6dc9357SAndroid Build Coastguard Worker */
228*f6dc9357SAndroid Build Coastguard Worker else
229*f6dc9357SAndroid Build Coastguard Worker AddMethodName(s, id);
230*f6dc9357SAndroid Build Coastguard Worker }
231*f6dc9357SAndroid Build Coastguard Worker prop = s;
232*f6dc9357SAndroid Build Coastguard Worker break;
233*f6dc9357SAndroid Build Coastguard Worker }
234*f6dc9357SAndroid Build Coastguard Worker case kpidSolid: prop = _db.IsSolid(); break;
235*f6dc9357SAndroid Build Coastguard Worker case kpidNumBlocks: prop = (UInt32)_db.NumFolders; break;
236*f6dc9357SAndroid Build Coastguard Worker case kpidHeadersSize: prop = _db.HeadersSize; break;
237*f6dc9357SAndroid Build Coastguard Worker case kpidPhySize: prop = _db.PhySize; break;
238*f6dc9357SAndroid Build Coastguard Worker case kpidOffset: if (_db.ArcInfo.StartPosition != 0) prop = _db.ArcInfo.StartPosition; break;
239*f6dc9357SAndroid Build Coastguard Worker /*
240*f6dc9357SAndroid Build Coastguard Worker case kpidIsTree: if (_db.IsTree) prop = true; break;
241*f6dc9357SAndroid Build Coastguard Worker case kpidIsAltStream: if (_db.ThereAreAltStreams) prop = true; break;
242*f6dc9357SAndroid Build Coastguard Worker case kpidIsAux: if (_db.IsTree) prop = true; break;
243*f6dc9357SAndroid Build Coastguard Worker */
244*f6dc9357SAndroid Build Coastguard Worker // case kpidError: if (_db.ThereIsHeaderError) prop = "Header error"; break;
245*f6dc9357SAndroid Build Coastguard Worker #endif
246*f6dc9357SAndroid Build Coastguard Worker
247*f6dc9357SAndroid Build Coastguard Worker case kpidWarningFlags:
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker UInt32 v = 0;
250*f6dc9357SAndroid Build Coastguard Worker if (_db.StartHeaderWasRecovered) v |= kpv_ErrorFlags_HeadersError;
251*f6dc9357SAndroid Build Coastguard Worker if (_db.UnsupportedFeatureWarning) v |= kpv_ErrorFlags_UnsupportedFeature;
252*f6dc9357SAndroid Build Coastguard Worker if (v != 0)
253*f6dc9357SAndroid Build Coastguard Worker prop = v;
254*f6dc9357SAndroid Build Coastguard Worker break;
255*f6dc9357SAndroid Build Coastguard Worker }
256*f6dc9357SAndroid Build Coastguard Worker
257*f6dc9357SAndroid Build Coastguard Worker case kpidErrorFlags:
258*f6dc9357SAndroid Build Coastguard Worker {
259*f6dc9357SAndroid Build Coastguard Worker UInt32 v = 0;
260*f6dc9357SAndroid Build Coastguard Worker if (!_db.IsArc) v |= kpv_ErrorFlags_IsNotArc;
261*f6dc9357SAndroid Build Coastguard Worker if (_db.ThereIsHeaderError) v |= kpv_ErrorFlags_HeadersError;
262*f6dc9357SAndroid Build Coastguard Worker if (_db.UnexpectedEnd) v |= kpv_ErrorFlags_UnexpectedEnd;
263*f6dc9357SAndroid Build Coastguard Worker // if (_db.UnsupportedVersion) v |= kpv_ErrorFlags_Unsupported;
264*f6dc9357SAndroid Build Coastguard Worker if (_db.UnsupportedFeatureError) v |= kpv_ErrorFlags_UnsupportedFeature;
265*f6dc9357SAndroid Build Coastguard Worker prop = v;
266*f6dc9357SAndroid Build Coastguard Worker break;
267*f6dc9357SAndroid Build Coastguard Worker }
268*f6dc9357SAndroid Build Coastguard Worker
269*f6dc9357SAndroid Build Coastguard Worker case kpidReadOnly:
270*f6dc9357SAndroid Build Coastguard Worker {
271*f6dc9357SAndroid Build Coastguard Worker if (!_db.CanUpdate())
272*f6dc9357SAndroid Build Coastguard Worker prop = true;
273*f6dc9357SAndroid Build Coastguard Worker break;
274*f6dc9357SAndroid Build Coastguard Worker }
275*f6dc9357SAndroid Build Coastguard Worker default: break;
276*f6dc9357SAndroid Build Coastguard Worker }
277*f6dc9357SAndroid Build Coastguard Worker return prop.Detach(value);
278*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
279*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
280*f6dc9357SAndroid Build Coastguard Worker #endif
281*f6dc9357SAndroid Build Coastguard Worker }
282*f6dc9357SAndroid Build Coastguard Worker
SetFileTimeProp_From_UInt64Def(PROPVARIANT * prop,const CUInt64DefVector & v,unsigned index)283*f6dc9357SAndroid Build Coastguard Worker static void SetFileTimeProp_From_UInt64Def(PROPVARIANT *prop, const CUInt64DefVector &v, unsigned index)
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker UInt64 value;
286*f6dc9357SAndroid Build Coastguard Worker if (v.GetItem(index, value))
287*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_FileTime64_Prec(prop, value, k_PropVar_TimePrec_100ns);
288*f6dc9357SAndroid Build Coastguard Worker }
289*f6dc9357SAndroid Build Coastguard Worker
IsFolderEncrypted(CNum folderIndex) const290*f6dc9357SAndroid Build Coastguard Worker bool CHandler::IsFolderEncrypted(CNum folderIndex) const
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker if (folderIndex == kNumNoIndex)
293*f6dc9357SAndroid Build Coastguard Worker return false;
294*f6dc9357SAndroid Build Coastguard Worker const size_t startPos = _db.FoCodersDataOffset[folderIndex];
295*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _db.CodersData.ConstData() + startPos;
296*f6dc9357SAndroid Build Coastguard Worker const size_t size = _db.FoCodersDataOffset[folderIndex + 1] - startPos;
297*f6dc9357SAndroid Build Coastguard Worker CInByte2 inByte;
298*f6dc9357SAndroid Build Coastguard Worker inByte.Init(p, size);
299*f6dc9357SAndroid Build Coastguard Worker
300*f6dc9357SAndroid Build Coastguard Worker CNum numCoders = inByte.ReadNum();
301*f6dc9357SAndroid Build Coastguard Worker for (; numCoders != 0; numCoders--)
302*f6dc9357SAndroid Build Coastguard Worker {
303*f6dc9357SAndroid Build Coastguard Worker const Byte mainByte = inByte.ReadByte();
304*f6dc9357SAndroid Build Coastguard Worker const unsigned idSize = (mainByte & 0xF);
305*f6dc9357SAndroid Build Coastguard Worker const Byte *longID = inByte.GetPtr();
306*f6dc9357SAndroid Build Coastguard Worker UInt64 id64 = 0;
307*f6dc9357SAndroid Build Coastguard Worker for (unsigned j = 0; j < idSize; j++)
308*f6dc9357SAndroid Build Coastguard Worker id64 = ((id64 << 8) | longID[j]);
309*f6dc9357SAndroid Build Coastguard Worker inByte.SkipDataNoCheck(idSize);
310*f6dc9357SAndroid Build Coastguard Worker if (id64 == k_AES)
311*f6dc9357SAndroid Build Coastguard Worker return true;
312*f6dc9357SAndroid Build Coastguard Worker if ((mainByte & 0x20) != 0)
313*f6dc9357SAndroid Build Coastguard Worker inByte.SkipDataNoCheck(inByte.ReadNum());
314*f6dc9357SAndroid Build Coastguard Worker }
315*f6dc9357SAndroid Build Coastguard Worker return false;
316*f6dc9357SAndroid Build Coastguard Worker }
317*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetNumRawProps (UInt32 * numProps))318*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetNumRawProps(UInt32 *numProps))
319*f6dc9357SAndroid Build Coastguard Worker {
320*f6dc9357SAndroid Build Coastguard Worker *numProps = 0;
321*f6dc9357SAndroid Build Coastguard Worker return S_OK;
322*f6dc9357SAndroid Build Coastguard Worker }
323*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetRawPropInfo (UInt32,BSTR * name,PROPID * propID))324*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID))
325*f6dc9357SAndroid Build Coastguard Worker {
326*f6dc9357SAndroid Build Coastguard Worker *name = NULL;
327*f6dc9357SAndroid Build Coastguard Worker *propID = kpidNtSecure;
328*f6dc9357SAndroid Build Coastguard Worker return S_OK;
329*f6dc9357SAndroid Build Coastguard Worker }
330*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetParent (UInt32,UInt32 * parent,UInt32 * parentType))331*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetParent(UInt32 /* index */, UInt32 *parent, UInt32 *parentType))
332*f6dc9357SAndroid Build Coastguard Worker {
333*f6dc9357SAndroid Build Coastguard Worker /*
334*f6dc9357SAndroid Build Coastguard Worker const CFileItem &file = _db.Files[index];
335*f6dc9357SAndroid Build Coastguard Worker *parentType = (file.IsAltStream ? NParentType::kAltStream : NParentType::kDir);
336*f6dc9357SAndroid Build Coastguard Worker *parent = (UInt32)(Int32)file.Parent;
337*f6dc9357SAndroid Build Coastguard Worker */
338*f6dc9357SAndroid Build Coastguard Worker *parentType = NParentType::kDir;
339*f6dc9357SAndroid Build Coastguard Worker *parent = (UInt32)(Int32)-1;
340*f6dc9357SAndroid Build Coastguard Worker return S_OK;
341*f6dc9357SAndroid Build Coastguard Worker }
342*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetRawProp (UInt32 index,PROPID propID,const void ** data,UInt32 * dataSize,UInt32 * propType))343*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType))
344*f6dc9357SAndroid Build Coastguard Worker {
345*f6dc9357SAndroid Build Coastguard Worker *data = NULL;
346*f6dc9357SAndroid Build Coastguard Worker *dataSize = 0;
347*f6dc9357SAndroid Build Coastguard Worker *propType = 0;
348*f6dc9357SAndroid Build Coastguard Worker
349*f6dc9357SAndroid Build Coastguard Worker if (/* _db.IsTree && propID == kpidName ||
350*f6dc9357SAndroid Build Coastguard Worker !_db.IsTree && */ propID == kpidPath)
351*f6dc9357SAndroid Build Coastguard Worker {
352*f6dc9357SAndroid Build Coastguard Worker if (_db.NameOffsets && _db.NamesBuf)
353*f6dc9357SAndroid Build Coastguard Worker {
354*f6dc9357SAndroid Build Coastguard Worker const size_t offset = _db.NameOffsets[index];
355*f6dc9357SAndroid Build Coastguard Worker const size_t size = (_db.NameOffsets[index + 1] - offset) * 2;
356*f6dc9357SAndroid Build Coastguard Worker if (size < ((UInt32)1 << 31))
357*f6dc9357SAndroid Build Coastguard Worker {
358*f6dc9357SAndroid Build Coastguard Worker *data = (const void *)(_db.NamesBuf.ConstData() + offset * 2);
359*f6dc9357SAndroid Build Coastguard Worker *dataSize = (UInt32)size;
360*f6dc9357SAndroid Build Coastguard Worker *propType = NPropDataType::kUtf16z;
361*f6dc9357SAndroid Build Coastguard Worker }
362*f6dc9357SAndroid Build Coastguard Worker }
363*f6dc9357SAndroid Build Coastguard Worker return S_OK;
364*f6dc9357SAndroid Build Coastguard Worker }
365*f6dc9357SAndroid Build Coastguard Worker /*
366*f6dc9357SAndroid Build Coastguard Worker if (propID == kpidNtSecure)
367*f6dc9357SAndroid Build Coastguard Worker {
368*f6dc9357SAndroid Build Coastguard Worker if (index < (UInt32)_db.SecureIDs.Size())
369*f6dc9357SAndroid Build Coastguard Worker {
370*f6dc9357SAndroid Build Coastguard Worker int id = _db.SecureIDs[index];
371*f6dc9357SAndroid Build Coastguard Worker size_t offs = _db.SecureOffsets[id];
372*f6dc9357SAndroid Build Coastguard Worker size_t size = _db.SecureOffsets[id + 1] - offs;
373*f6dc9357SAndroid Build Coastguard Worker if (size >= 0)
374*f6dc9357SAndroid Build Coastguard Worker {
375*f6dc9357SAndroid Build Coastguard Worker *data = _db.SecureBuf + offs;
376*f6dc9357SAndroid Build Coastguard Worker *dataSize = (UInt32)size;
377*f6dc9357SAndroid Build Coastguard Worker *propType = NPropDataType::kRaw;
378*f6dc9357SAndroid Build Coastguard Worker }
379*f6dc9357SAndroid Build Coastguard Worker }
380*f6dc9357SAndroid Build Coastguard Worker }
381*f6dc9357SAndroid Build Coastguard Worker */
382*f6dc9357SAndroid Build Coastguard Worker return S_OK;
383*f6dc9357SAndroid Build Coastguard Worker }
384*f6dc9357SAndroid Build Coastguard Worker
385*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
386*f6dc9357SAndroid Build Coastguard Worker
SetMethodToProp(CNum folderIndex,PROPVARIANT * prop) const387*f6dc9357SAndroid Build Coastguard Worker HRESULT CHandler::SetMethodToProp(CNum folderIndex, PROPVARIANT *prop) const
388*f6dc9357SAndroid Build Coastguard Worker {
389*f6dc9357SAndroid Build Coastguard Worker PropVariant_Clear(prop);
390*f6dc9357SAndroid Build Coastguard Worker if (folderIndex == kNumNoIndex)
391*f6dc9357SAndroid Build Coastguard Worker return S_OK;
392*f6dc9357SAndroid Build Coastguard Worker // for (int ttt = 0; ttt < 1; ttt++) {
393*f6dc9357SAndroid Build Coastguard Worker const unsigned kTempSize = 256;
394*f6dc9357SAndroid Build Coastguard Worker char temp[kTempSize];
395*f6dc9357SAndroid Build Coastguard Worker unsigned pos = kTempSize;
396*f6dc9357SAndroid Build Coastguard Worker temp[--pos] = 0;
397*f6dc9357SAndroid Build Coastguard Worker
398*f6dc9357SAndroid Build Coastguard Worker const size_t startPos = _db.FoCodersDataOffset[folderIndex];
399*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _db.CodersData.ConstData() + startPos;
400*f6dc9357SAndroid Build Coastguard Worker const size_t size = _db.FoCodersDataOffset[folderIndex + 1] - startPos;
401*f6dc9357SAndroid Build Coastguard Worker CInByte2 inByte;
402*f6dc9357SAndroid Build Coastguard Worker inByte.Init(p, size);
403*f6dc9357SAndroid Build Coastguard Worker
404*f6dc9357SAndroid Build Coastguard Worker // numCoders == 0 ???
405*f6dc9357SAndroid Build Coastguard Worker CNum numCoders = inByte.ReadNum();
406*f6dc9357SAndroid Build Coastguard Worker bool needSpace = false;
407*f6dc9357SAndroid Build Coastguard Worker
408*f6dc9357SAndroid Build Coastguard Worker for (; numCoders != 0; numCoders--, needSpace = true)
409*f6dc9357SAndroid Build Coastguard Worker {
410*f6dc9357SAndroid Build Coastguard Worker if (pos < 32) // max size of property
411*f6dc9357SAndroid Build Coastguard Worker break;
412*f6dc9357SAndroid Build Coastguard Worker const Byte mainByte = inByte.ReadByte();
413*f6dc9357SAndroid Build Coastguard Worker UInt64 id64 = 0;
414*f6dc9357SAndroid Build Coastguard Worker const unsigned idSize = (mainByte & 0xF);
415*f6dc9357SAndroid Build Coastguard Worker const Byte *longID = inByte.GetPtr();
416*f6dc9357SAndroid Build Coastguard Worker for (unsigned j = 0; j < idSize; j++)
417*f6dc9357SAndroid Build Coastguard Worker id64 = ((id64 << 8) | longID[j]);
418*f6dc9357SAndroid Build Coastguard Worker inByte.SkipDataNoCheck(idSize);
419*f6dc9357SAndroid Build Coastguard Worker
420*f6dc9357SAndroid Build Coastguard Worker if ((mainByte & 0x10) != 0)
421*f6dc9357SAndroid Build Coastguard Worker {
422*f6dc9357SAndroid Build Coastguard Worker inByte.ReadNum(); // NumInStreams
423*f6dc9357SAndroid Build Coastguard Worker inByte.ReadNum(); // NumOutStreams
424*f6dc9357SAndroid Build Coastguard Worker }
425*f6dc9357SAndroid Build Coastguard Worker
426*f6dc9357SAndroid Build Coastguard Worker CNum propsSize = 0;
427*f6dc9357SAndroid Build Coastguard Worker const Byte *props = NULL;
428*f6dc9357SAndroid Build Coastguard Worker if ((mainByte & 0x20) != 0)
429*f6dc9357SAndroid Build Coastguard Worker {
430*f6dc9357SAndroid Build Coastguard Worker propsSize = inByte.ReadNum();
431*f6dc9357SAndroid Build Coastguard Worker props = inByte.GetPtr();
432*f6dc9357SAndroid Build Coastguard Worker inByte.SkipDataNoCheck(propsSize);
433*f6dc9357SAndroid Build Coastguard Worker }
434*f6dc9357SAndroid Build Coastguard Worker
435*f6dc9357SAndroid Build Coastguard Worker const char *name = NULL;
436*f6dc9357SAndroid Build Coastguard Worker char s[32];
437*f6dc9357SAndroid Build Coastguard Worker s[0] = 0;
438*f6dc9357SAndroid Build Coastguard Worker
439*f6dc9357SAndroid Build Coastguard Worker if (id64 <= (UInt32)0xFFFFFFFF)
440*f6dc9357SAndroid Build Coastguard Worker {
441*f6dc9357SAndroid Build Coastguard Worker const UInt32 id = (UInt32)id64;
442*f6dc9357SAndroid Build Coastguard Worker if (id == k_LZMA)
443*f6dc9357SAndroid Build Coastguard Worker {
444*f6dc9357SAndroid Build Coastguard Worker name = "LZMA";
445*f6dc9357SAndroid Build Coastguard Worker if (propsSize == 5)
446*f6dc9357SAndroid Build Coastguard Worker {
447*f6dc9357SAndroid Build Coastguard Worker const UInt32 dicSize = GetUi32((const Byte *)props + 1);
448*f6dc9357SAndroid Build Coastguard Worker char *dest = GetStringForSizeValue(s, dicSize);
449*f6dc9357SAndroid Build Coastguard Worker UInt32 d = props[0];
450*f6dc9357SAndroid Build Coastguard Worker if (d != 0x5D)
451*f6dc9357SAndroid Build Coastguard Worker {
452*f6dc9357SAndroid Build Coastguard Worker const UInt32 lc = d % 9;
453*f6dc9357SAndroid Build Coastguard Worker d /= 9;
454*f6dc9357SAndroid Build Coastguard Worker const UInt32 pb = d / 5;
455*f6dc9357SAndroid Build Coastguard Worker const UInt32 lp = d % 5;
456*f6dc9357SAndroid Build Coastguard Worker if (lc != 3) dest = AddProp32(dest, "lc", lc);
457*f6dc9357SAndroid Build Coastguard Worker if (lp != 0) dest = AddProp32(dest, "lp", lp);
458*f6dc9357SAndroid Build Coastguard Worker if (pb != 2) dest = AddProp32(dest, "pb", pb);
459*f6dc9357SAndroid Build Coastguard Worker }
460*f6dc9357SAndroid Build Coastguard Worker }
461*f6dc9357SAndroid Build Coastguard Worker }
462*f6dc9357SAndroid Build Coastguard Worker else if (id == k_LZMA2)
463*f6dc9357SAndroid Build Coastguard Worker {
464*f6dc9357SAndroid Build Coastguard Worker name = "LZMA2";
465*f6dc9357SAndroid Build Coastguard Worker if (propsSize == 1)
466*f6dc9357SAndroid Build Coastguard Worker GetLzma2String(s, props[0]);
467*f6dc9357SAndroid Build Coastguard Worker }
468*f6dc9357SAndroid Build Coastguard Worker else if (id == k_PPMD)
469*f6dc9357SAndroid Build Coastguard Worker {
470*f6dc9357SAndroid Build Coastguard Worker name = "PPMD";
471*f6dc9357SAndroid Build Coastguard Worker if (propsSize == 5)
472*f6dc9357SAndroid Build Coastguard Worker {
473*f6dc9357SAndroid Build Coastguard Worker char *dest = s;
474*f6dc9357SAndroid Build Coastguard Worker *dest++ = 'o';
475*f6dc9357SAndroid Build Coastguard Worker dest = ConvertUInt32ToString(*props, dest);
476*f6dc9357SAndroid Build Coastguard Worker dest = MyStpCpy(dest, ":mem");
477*f6dc9357SAndroid Build Coastguard Worker GetStringForSizeValue(dest, GetUi32(props + 1));
478*f6dc9357SAndroid Build Coastguard Worker }
479*f6dc9357SAndroid Build Coastguard Worker }
480*f6dc9357SAndroid Build Coastguard Worker else if (id == k_Delta)
481*f6dc9357SAndroid Build Coastguard Worker {
482*f6dc9357SAndroid Build Coastguard Worker name = "Delta";
483*f6dc9357SAndroid Build Coastguard Worker if (propsSize == 1)
484*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString((UInt32)props[0] + 1, s);
485*f6dc9357SAndroid Build Coastguard Worker }
486*f6dc9357SAndroid Build Coastguard Worker else if (id == k_ARM64 || id == k_RISCV)
487*f6dc9357SAndroid Build Coastguard Worker {
488*f6dc9357SAndroid Build Coastguard Worker name = id == k_ARM64 ? "ARM64" : "RISCV";
489*f6dc9357SAndroid Build Coastguard Worker if (propsSize == 4)
490*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(GetUi32(props), s);
491*f6dc9357SAndroid Build Coastguard Worker /*
492*f6dc9357SAndroid Build Coastguard Worker else if (propsSize != 0)
493*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(s, "unsupported");
494*f6dc9357SAndroid Build Coastguard Worker */
495*f6dc9357SAndroid Build Coastguard Worker }
496*f6dc9357SAndroid Build Coastguard Worker else if (id == k_BCJ2) name = "BCJ2";
497*f6dc9357SAndroid Build Coastguard Worker else if (id == k_BCJ) name = "BCJ";
498*f6dc9357SAndroid Build Coastguard Worker else if (id == k_AES)
499*f6dc9357SAndroid Build Coastguard Worker {
500*f6dc9357SAndroid Build Coastguard Worker name = "7zAES";
501*f6dc9357SAndroid Build Coastguard Worker if (propsSize >= 1)
502*f6dc9357SAndroid Build Coastguard Worker {
503*f6dc9357SAndroid Build Coastguard Worker const Byte firstByte = props[0];
504*f6dc9357SAndroid Build Coastguard Worker const UInt32 numCyclesPower = firstByte & 0x3F;
505*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(numCyclesPower, s);
506*f6dc9357SAndroid Build Coastguard Worker }
507*f6dc9357SAndroid Build Coastguard Worker }
508*f6dc9357SAndroid Build Coastguard Worker }
509*f6dc9357SAndroid Build Coastguard Worker
510*f6dc9357SAndroid Build Coastguard Worker if (name)
511*f6dc9357SAndroid Build Coastguard Worker {
512*f6dc9357SAndroid Build Coastguard Worker const unsigned nameLen = MyStringLen(name);
513*f6dc9357SAndroid Build Coastguard Worker const unsigned propsLen = MyStringLen(s);
514*f6dc9357SAndroid Build Coastguard Worker unsigned totalLen = nameLen + propsLen;
515*f6dc9357SAndroid Build Coastguard Worker if (propsLen != 0)
516*f6dc9357SAndroid Build Coastguard Worker totalLen++;
517*f6dc9357SAndroid Build Coastguard Worker if (needSpace)
518*f6dc9357SAndroid Build Coastguard Worker totalLen++;
519*f6dc9357SAndroid Build Coastguard Worker if (totalLen + 5 >= pos)
520*f6dc9357SAndroid Build Coastguard Worker break;
521*f6dc9357SAndroid Build Coastguard Worker pos -= totalLen;
522*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(temp + pos, name);
523*f6dc9357SAndroid Build Coastguard Worker if (propsLen != 0)
524*f6dc9357SAndroid Build Coastguard Worker {
525*f6dc9357SAndroid Build Coastguard Worker char *dest = temp + pos + nameLen;
526*f6dc9357SAndroid Build Coastguard Worker *dest++ = ':';
527*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(dest, s);
528*f6dc9357SAndroid Build Coastguard Worker }
529*f6dc9357SAndroid Build Coastguard Worker if (needSpace)
530*f6dc9357SAndroid Build Coastguard Worker temp[pos + totalLen - 1] = ' ';
531*f6dc9357SAndroid Build Coastguard Worker }
532*f6dc9357SAndroid Build Coastguard Worker else
533*f6dc9357SAndroid Build Coastguard Worker {
534*f6dc9357SAndroid Build Coastguard Worker AString methodName;
535*f6dc9357SAndroid Build Coastguard Worker FindMethod(EXTERNAL_CODECS_VARS id64, methodName);
536*f6dc9357SAndroid Build Coastguard Worker if (needSpace)
537*f6dc9357SAndroid Build Coastguard Worker temp[--pos] = ' ';
538*f6dc9357SAndroid Build Coastguard Worker if (methodName.IsEmpty())
539*f6dc9357SAndroid Build Coastguard Worker pos -= ConvertMethodIdToString_Back(temp + pos, id64);
540*f6dc9357SAndroid Build Coastguard Worker else
541*f6dc9357SAndroid Build Coastguard Worker {
542*f6dc9357SAndroid Build Coastguard Worker const unsigned len = methodName.Len();
543*f6dc9357SAndroid Build Coastguard Worker if (len + 5 > pos)
544*f6dc9357SAndroid Build Coastguard Worker break;
545*f6dc9357SAndroid Build Coastguard Worker pos -= len;
546*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
547*f6dc9357SAndroid Build Coastguard Worker temp[pos + i] = methodName[i];
548*f6dc9357SAndroid Build Coastguard Worker }
549*f6dc9357SAndroid Build Coastguard Worker }
550*f6dc9357SAndroid Build Coastguard Worker }
551*f6dc9357SAndroid Build Coastguard Worker
552*f6dc9357SAndroid Build Coastguard Worker if (numCoders != 0 && pos >= 4)
553*f6dc9357SAndroid Build Coastguard Worker {
554*f6dc9357SAndroid Build Coastguard Worker temp[--pos] = ' ';
555*f6dc9357SAndroid Build Coastguard Worker temp[--pos] = '.';
556*f6dc9357SAndroid Build Coastguard Worker temp[--pos] = '.';
557*f6dc9357SAndroid Build Coastguard Worker temp[--pos] = '.';
558*f6dc9357SAndroid Build Coastguard Worker }
559*f6dc9357SAndroid Build Coastguard Worker
560*f6dc9357SAndroid Build Coastguard Worker return PropVarEm_Set_Str(prop, temp + pos);
561*f6dc9357SAndroid Build Coastguard Worker // }
562*f6dc9357SAndroid Build Coastguard Worker }
563*f6dc9357SAndroid Build Coastguard Worker
564*f6dc9357SAndroid Build Coastguard Worker #endif
565*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetProperty (UInt32 index,PROPID propID,PROPVARIANT * value))566*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value))
567*f6dc9357SAndroid Build Coastguard Worker {
568*f6dc9357SAndroid Build Coastguard Worker RINOK(PropVariant_Clear(value))
569*f6dc9357SAndroid Build Coastguard Worker // COM_TRY_BEGIN
570*f6dc9357SAndroid Build Coastguard Worker // NCOM::CPropVariant prop;
571*f6dc9357SAndroid Build Coastguard Worker
572*f6dc9357SAndroid Build Coastguard Worker /*
573*f6dc9357SAndroid Build Coastguard Worker const CRef2 &ref2 = _refs[index];
574*f6dc9357SAndroid Build Coastguard Worker if (ref2.Refs.IsEmpty())
575*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
576*f6dc9357SAndroid Build Coastguard Worker const CRef &ref = ref2.Refs.Front();
577*f6dc9357SAndroid Build Coastguard Worker */
578*f6dc9357SAndroid Build Coastguard Worker
579*f6dc9357SAndroid Build Coastguard Worker const CFileItem &item = _db.Files[index];
580*f6dc9357SAndroid Build Coastguard Worker const UInt32 index2 = index;
581*f6dc9357SAndroid Build Coastguard Worker
582*f6dc9357SAndroid Build Coastguard Worker switch (propID)
583*f6dc9357SAndroid Build Coastguard Worker {
584*f6dc9357SAndroid Build Coastguard Worker case kpidIsDir: PropVarEm_Set_Bool(value, item.IsDir); break;
585*f6dc9357SAndroid Build Coastguard Worker case kpidSize:
586*f6dc9357SAndroid Build Coastguard Worker {
587*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_UInt64(value, item.Size);
588*f6dc9357SAndroid Build Coastguard Worker // prop = ref2.Size;
589*f6dc9357SAndroid Build Coastguard Worker break;
590*f6dc9357SAndroid Build Coastguard Worker }
591*f6dc9357SAndroid Build Coastguard Worker case kpidPackSize:
592*f6dc9357SAndroid Build Coastguard Worker {
593*f6dc9357SAndroid Build Coastguard Worker // prop = ref2.PackSize;
594*f6dc9357SAndroid Build Coastguard Worker {
595*f6dc9357SAndroid Build Coastguard Worker const CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
596*f6dc9357SAndroid Build Coastguard Worker if (folderIndex != kNumNoIndex)
597*f6dc9357SAndroid Build Coastguard Worker {
598*f6dc9357SAndroid Build Coastguard Worker if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2)
599*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_UInt64(value, _db.GetFolderFullPackSize(folderIndex));
600*f6dc9357SAndroid Build Coastguard Worker /*
601*f6dc9357SAndroid Build Coastguard Worker else
602*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_UInt64(value, 0);
603*f6dc9357SAndroid Build Coastguard Worker */
604*f6dc9357SAndroid Build Coastguard Worker }
605*f6dc9357SAndroid Build Coastguard Worker else
606*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_UInt64(value, 0);
607*f6dc9357SAndroid Build Coastguard Worker }
608*f6dc9357SAndroid Build Coastguard Worker break;
609*f6dc9357SAndroid Build Coastguard Worker }
610*f6dc9357SAndroid Build Coastguard Worker // case kpidIsAux: prop = _db.IsItemAux(index2); break;
611*f6dc9357SAndroid Build Coastguard Worker case kpidPosition: { UInt64 v; if (_db.StartPos.GetItem(index2, v)) PropVarEm_Set_UInt64(value, v); break; }
612*f6dc9357SAndroid Build Coastguard Worker case kpidCTime: SetFileTimeProp_From_UInt64Def(value, _db.CTime, index2); break;
613*f6dc9357SAndroid Build Coastguard Worker case kpidATime: SetFileTimeProp_From_UInt64Def(value, _db.ATime, index2); break;
614*f6dc9357SAndroid Build Coastguard Worker case kpidMTime: SetFileTimeProp_From_UInt64Def(value, _db.MTime, index2); break;
615*f6dc9357SAndroid Build Coastguard Worker case kpidAttrib: if (_db.Attrib.ValidAndDefined(index2)) PropVarEm_Set_UInt32(value, _db.Attrib.Vals[index2]); break;
616*f6dc9357SAndroid Build Coastguard Worker case kpidCRC: if (item.CrcDefined) PropVarEm_Set_UInt32(value, item.Crc); break;
617*f6dc9357SAndroid Build Coastguard Worker case kpidEncrypted: PropVarEm_Set_Bool(value, IsFolderEncrypted(_db.FileIndexToFolderIndexMap[index2])); break;
618*f6dc9357SAndroid Build Coastguard Worker case kpidIsAnti: PropVarEm_Set_Bool(value, _db.IsItemAnti(index2)); break;
619*f6dc9357SAndroid Build Coastguard Worker /*
620*f6dc9357SAndroid Build Coastguard Worker case kpidIsAltStream: prop = item.IsAltStream; break;
621*f6dc9357SAndroid Build Coastguard Worker case kpidNtSecure:
622*f6dc9357SAndroid Build Coastguard Worker {
623*f6dc9357SAndroid Build Coastguard Worker int id = _db.SecureIDs[index];
624*f6dc9357SAndroid Build Coastguard Worker size_t offs = _db.SecureOffsets[id];
625*f6dc9357SAndroid Build Coastguard Worker size_t size = _db.SecureOffsets[id + 1] - offs;
626*f6dc9357SAndroid Build Coastguard Worker if (size >= 0)
627*f6dc9357SAndroid Build Coastguard Worker {
628*f6dc9357SAndroid Build Coastguard Worker prop.SetBlob(_db.SecureBuf + offs, (ULONG)size);
629*f6dc9357SAndroid Build Coastguard Worker }
630*f6dc9357SAndroid Build Coastguard Worker break;
631*f6dc9357SAndroid Build Coastguard Worker }
632*f6dc9357SAndroid Build Coastguard Worker */
633*f6dc9357SAndroid Build Coastguard Worker
634*f6dc9357SAndroid Build Coastguard Worker case kpidPath: return _db.GetPath_Prop(index, value);
635*f6dc9357SAndroid Build Coastguard Worker
636*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
637*f6dc9357SAndroid Build Coastguard Worker
638*f6dc9357SAndroid Build Coastguard Worker case kpidMethod: return SetMethodToProp(_db.FileIndexToFolderIndexMap[index2], value);
639*f6dc9357SAndroid Build Coastguard Worker case kpidBlock:
640*f6dc9357SAndroid Build Coastguard Worker {
641*f6dc9357SAndroid Build Coastguard Worker const CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
642*f6dc9357SAndroid Build Coastguard Worker if (folderIndex != kNumNoIndex)
643*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_UInt32(value, (UInt32)folderIndex);
644*f6dc9357SAndroid Build Coastguard Worker }
645*f6dc9357SAndroid Build Coastguard Worker break;
646*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_SHOW_PACK_STREAMS_SIZES
647*f6dc9357SAndroid Build Coastguard Worker case kpidPackedSize0:
648*f6dc9357SAndroid Build Coastguard Worker case kpidPackedSize1:
649*f6dc9357SAndroid Build Coastguard Worker case kpidPackedSize2:
650*f6dc9357SAndroid Build Coastguard Worker case kpidPackedSize3:
651*f6dc9357SAndroid Build Coastguard Worker case kpidPackedSize4:
652*f6dc9357SAndroid Build Coastguard Worker {
653*f6dc9357SAndroid Build Coastguard Worker const CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
654*f6dc9357SAndroid Build Coastguard Worker if (folderIndex != kNumNoIndex)
655*f6dc9357SAndroid Build Coastguard Worker {
656*f6dc9357SAndroid Build Coastguard Worker if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2 &&
657*f6dc9357SAndroid Build Coastguard Worker _db.FoStartPackStreamIndex[folderIndex + 1] -
658*f6dc9357SAndroid Build Coastguard Worker _db.FoStartPackStreamIndex[folderIndex] > (propID - kpidPackedSize0))
659*f6dc9357SAndroid Build Coastguard Worker {
660*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_UInt64(value, _db.GetFolderPackStreamSize(folderIndex, propID - kpidPackedSize0));
661*f6dc9357SAndroid Build Coastguard Worker }
662*f6dc9357SAndroid Build Coastguard Worker }
663*f6dc9357SAndroid Build Coastguard Worker else
664*f6dc9357SAndroid Build Coastguard Worker PropVarEm_Set_UInt64(value, 0);
665*f6dc9357SAndroid Build Coastguard Worker }
666*f6dc9357SAndroid Build Coastguard Worker break;
667*f6dc9357SAndroid Build Coastguard Worker #endif
668*f6dc9357SAndroid Build Coastguard Worker
669*f6dc9357SAndroid Build Coastguard Worker #endif
670*f6dc9357SAndroid Build Coastguard Worker default: break;
671*f6dc9357SAndroid Build Coastguard Worker }
672*f6dc9357SAndroid Build Coastguard Worker // return prop.Detach(value);
673*f6dc9357SAndroid Build Coastguard Worker return S_OK;
674*f6dc9357SAndroid Build Coastguard Worker // COM_TRY_END
675*f6dc9357SAndroid Build Coastguard Worker }
676*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::Open (IInStream * stream,const UInt64 * maxCheckStartPosition,IArchiveOpenCallback * openArchiveCallback))677*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::Open(IInStream *stream,
678*f6dc9357SAndroid Build Coastguard Worker const UInt64 *maxCheckStartPosition,
679*f6dc9357SAndroid Build Coastguard Worker IArchiveOpenCallback *openArchiveCallback))
680*f6dc9357SAndroid Build Coastguard Worker {
681*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
682*f6dc9357SAndroid Build Coastguard Worker Close();
683*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
684*f6dc9357SAndroid Build Coastguard Worker _fileInfoPopIDs.Clear();
685*f6dc9357SAndroid Build Coastguard Worker #endif
686*f6dc9357SAndroid Build Coastguard Worker
687*f6dc9357SAndroid Build Coastguard Worker try
688*f6dc9357SAndroid Build Coastguard Worker {
689*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveOpenCallback> openArchiveCallbackTemp = openArchiveCallback;
690*f6dc9357SAndroid Build Coastguard Worker
691*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
692*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICryptoGetTextPassword> getTextPassword;
693*f6dc9357SAndroid Build Coastguard Worker if (openArchiveCallback)
694*f6dc9357SAndroid Build Coastguard Worker openArchiveCallbackTemp.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);
695*f6dc9357SAndroid Build Coastguard Worker #endif
696*f6dc9357SAndroid Build Coastguard Worker
697*f6dc9357SAndroid Build Coastguard Worker CInArchive archive(
698*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_SET_PROPERTIES
699*f6dc9357SAndroid Build Coastguard Worker _useMultiThreadMixer
700*f6dc9357SAndroid Build Coastguard Worker #else
701*f6dc9357SAndroid Build Coastguard Worker true
702*f6dc9357SAndroid Build Coastguard Worker #endif
703*f6dc9357SAndroid Build Coastguard Worker );
704*f6dc9357SAndroid Build Coastguard Worker _db.IsArc = false;
705*f6dc9357SAndroid Build Coastguard Worker RINOK(archive.Open(stream, maxCheckStartPosition))
706*f6dc9357SAndroid Build Coastguard Worker _db.IsArc = true;
707*f6dc9357SAndroid Build Coastguard Worker
708*f6dc9357SAndroid Build Coastguard Worker HRESULT result = archive.ReadDatabase(
709*f6dc9357SAndroid Build Coastguard Worker EXTERNAL_CODECS_VARS
710*f6dc9357SAndroid Build Coastguard Worker _db
711*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
712*f6dc9357SAndroid Build Coastguard Worker , getTextPassword, _isEncrypted, _passwordIsDefined, _password
713*f6dc9357SAndroid Build Coastguard Worker #endif
714*f6dc9357SAndroid Build Coastguard Worker );
715*f6dc9357SAndroid Build Coastguard Worker RINOK(result)
716*f6dc9357SAndroid Build Coastguard Worker
717*f6dc9357SAndroid Build Coastguard Worker _inStream = stream;
718*f6dc9357SAndroid Build Coastguard Worker }
719*f6dc9357SAndroid Build Coastguard Worker catch(...)
720*f6dc9357SAndroid Build Coastguard Worker {
721*f6dc9357SAndroid Build Coastguard Worker Close();
722*f6dc9357SAndroid Build Coastguard Worker // return E_INVALIDARG;
723*f6dc9357SAndroid Build Coastguard Worker // return S_FALSE;
724*f6dc9357SAndroid Build Coastguard Worker // we must return out_of_memory here
725*f6dc9357SAndroid Build Coastguard Worker return E_OUTOFMEMORY;
726*f6dc9357SAndroid Build Coastguard Worker }
727*f6dc9357SAndroid Build Coastguard Worker // _inStream = stream;
728*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
729*f6dc9357SAndroid Build Coastguard Worker FillPopIDs();
730*f6dc9357SAndroid Build Coastguard Worker #endif
731*f6dc9357SAndroid Build Coastguard Worker return S_OK;
732*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
733*f6dc9357SAndroid Build Coastguard Worker }
734*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::Close ())735*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::Close())
736*f6dc9357SAndroid Build Coastguard Worker {
737*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
738*f6dc9357SAndroid Build Coastguard Worker _inStream.Release();
739*f6dc9357SAndroid Build Coastguard Worker _db.Clear();
740*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
741*f6dc9357SAndroid Build Coastguard Worker _isEncrypted = false;
742*f6dc9357SAndroid Build Coastguard Worker _passwordIsDefined = false;
743*f6dc9357SAndroid Build Coastguard Worker _password.Wipe_and_Empty();
744*f6dc9357SAndroid Build Coastguard Worker #endif
745*f6dc9357SAndroid Build Coastguard Worker return S_OK;
746*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
747*f6dc9357SAndroid Build Coastguard Worker }
748*f6dc9357SAndroid Build Coastguard Worker
749*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_SET_PROPERTIES
750*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTRACT_ONLY
751*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::SetProperties (const wchar_t * const * names,const PROPVARIANT * values,UInt32 numProps))752*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps))
753*f6dc9357SAndroid Build Coastguard Worker {
754*f6dc9357SAndroid Build Coastguard Worker COM_TRY_BEGIN
755*f6dc9357SAndroid Build Coastguard Worker
756*f6dc9357SAndroid Build Coastguard Worker InitCommon();
757*f6dc9357SAndroid Build Coastguard Worker _useMultiThreadMixer = true;
758*f6dc9357SAndroid Build Coastguard Worker
759*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numProps; i++)
760*f6dc9357SAndroid Build Coastguard Worker {
761*f6dc9357SAndroid Build Coastguard Worker UString name = names[i];
762*f6dc9357SAndroid Build Coastguard Worker name.MakeLower_Ascii();
763*f6dc9357SAndroid Build Coastguard Worker if (name.IsEmpty())
764*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
765*f6dc9357SAndroid Build Coastguard Worker const PROPVARIANT &value = values[i];
766*f6dc9357SAndroid Build Coastguard Worker UInt32 number;
767*f6dc9357SAndroid Build Coastguard Worker const unsigned index = ParseStringToUInt32(name, number);
768*f6dc9357SAndroid Build Coastguard Worker if (index == 0)
769*f6dc9357SAndroid Build Coastguard Worker {
770*f6dc9357SAndroid Build Coastguard Worker if (name.IsEqualTo("mtf"))
771*f6dc9357SAndroid Build Coastguard Worker {
772*f6dc9357SAndroid Build Coastguard Worker RINOK(PROPVARIANT_to_bool(value, _useMultiThreadMixer))
773*f6dc9357SAndroid Build Coastguard Worker continue;
774*f6dc9357SAndroid Build Coastguard Worker }
775*f6dc9357SAndroid Build Coastguard Worker {
776*f6dc9357SAndroid Build Coastguard Worker HRESULT hres;
777*f6dc9357SAndroid Build Coastguard Worker if (SetCommonProperty(name, value, hres))
778*f6dc9357SAndroid Build Coastguard Worker {
779*f6dc9357SAndroid Build Coastguard Worker RINOK(hres)
780*f6dc9357SAndroid Build Coastguard Worker continue;
781*f6dc9357SAndroid Build Coastguard Worker }
782*f6dc9357SAndroid Build Coastguard Worker }
783*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
784*f6dc9357SAndroid Build Coastguard Worker }
785*f6dc9357SAndroid Build Coastguard Worker }
786*f6dc9357SAndroid Build Coastguard Worker return S_OK;
787*f6dc9357SAndroid Build Coastguard Worker COM_TRY_END
788*f6dc9357SAndroid Build Coastguard Worker }
789*f6dc9357SAndroid Build Coastguard Worker
790*f6dc9357SAndroid Build Coastguard Worker #endif
791*f6dc9357SAndroid Build Coastguard Worker #endif
792*f6dc9357SAndroid Build Coastguard Worker
793*f6dc9357SAndroid Build Coastguard Worker IMPL_ISetCompressCodecsInfo
794*f6dc9357SAndroid Build Coastguard Worker
795*f6dc9357SAndroid Build Coastguard Worker }}
796