1*f6dc9357SAndroid Build Coastguard Worker // 7zProperties.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 "7zHandler.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "7zProperties.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
9*f6dc9357SAndroid Build Coastguard Worker namespace N7z {
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker struct CPropMap
12*f6dc9357SAndroid Build Coastguard Worker {
13*f6dc9357SAndroid Build Coastguard Worker Byte FilePropID;
14*f6dc9357SAndroid Build Coastguard Worker // CStatProp StatProp;
15*f6dc9357SAndroid Build Coastguard Worker VARTYPE vt;
16*f6dc9357SAndroid Build Coastguard Worker UInt32 StatPropID;
17*f6dc9357SAndroid Build Coastguard Worker };
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker // #define STAT_PROP(name, id, vt) { name, id, vt }
20*f6dc9357SAndroid Build Coastguard Worker #define STAT_PROP(name, id, vt) vt, id
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker #define STAT_PROP2(id, vt) STAT_PROP(NULL, id, vt)
23*f6dc9357SAndroid Build Coastguard Worker
24*f6dc9357SAndroid Build Coastguard Worker #define k_7z_id_Encrypted 97
25*f6dc9357SAndroid Build Coastguard Worker #define k_7z_id_Method 98
26*f6dc9357SAndroid Build Coastguard Worker #define k_7z_id_Block 99
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker static const CPropMap kPropMap[] =
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker { NID::kName, STAT_PROP2(kpidPath, VT_BSTR) },
31*f6dc9357SAndroid Build Coastguard Worker { NID::kSize, STAT_PROP2(kpidSize, VT_UI8) },
32*f6dc9357SAndroid Build Coastguard Worker { NID::kPackInfo, STAT_PROP2(kpidPackSize, VT_UI8) },
33*f6dc9357SAndroid Build Coastguard Worker
34*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_SHOW_PACK_STREAMS_SIZES
35*f6dc9357SAndroid Build Coastguard Worker #define k_7z_id_PackedSize0 100
36*f6dc9357SAndroid Build Coastguard Worker { k_7z_id_PackedSize0 + 0, STAT_PROP("Pack0", kpidPackedSize0, VT_UI8) },
37*f6dc9357SAndroid Build Coastguard Worker { k_7z_id_PackedSize0 + 1, STAT_PROP("Pack1", kpidPackedSize1, VT_UI8) },
38*f6dc9357SAndroid Build Coastguard Worker { k_7z_id_PackedSize0 + 2, STAT_PROP("Pack2", kpidPackedSize2, VT_UI8) },
39*f6dc9357SAndroid Build Coastguard Worker { k_7z_id_PackedSize0 + 3, STAT_PROP("Pack3", kpidPackedSize3, VT_UI8) },
40*f6dc9357SAndroid Build Coastguard Worker { k_7z_id_PackedSize0 + 4, STAT_PROP("Pack4", kpidPackedSize4, VT_UI8) },
41*f6dc9357SAndroid Build Coastguard Worker #endif
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker { NID::kCTime, STAT_PROP2(kpidCTime, VT_FILETIME) },
44*f6dc9357SAndroid Build Coastguard Worker { NID::kMTime, STAT_PROP2(kpidMTime, VT_FILETIME) },
45*f6dc9357SAndroid Build Coastguard Worker { NID::kATime, STAT_PROP2(kpidATime, VT_FILETIME) },
46*f6dc9357SAndroid Build Coastguard Worker { NID::kWinAttrib, STAT_PROP2(kpidAttrib, VT_UI4) },
47*f6dc9357SAndroid Build Coastguard Worker { NID::kStartPos, STAT_PROP2(kpidPosition, VT_UI8) },
48*f6dc9357SAndroid Build Coastguard Worker
49*f6dc9357SAndroid Build Coastguard Worker { NID::kCRC, STAT_PROP2(kpidCRC, VT_UI4) },
50*f6dc9357SAndroid Build Coastguard Worker // { NID::kIsAux, STAT_PROP2(kpidIsAux, VT_BOOL) },
51*f6dc9357SAndroid Build Coastguard Worker { NID::kAnti, STAT_PROP2(kpidIsAnti, VT_BOOL) }
52*f6dc9357SAndroid Build Coastguard Worker
53*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
54*f6dc9357SAndroid Build Coastguard Worker , { k_7z_id_Encrypted, STAT_PROP2(kpidEncrypted, VT_BOOL) }
55*f6dc9357SAndroid Build Coastguard Worker , { k_7z_id_Method, STAT_PROP2(kpidMethod, VT_BSTR) }
56*f6dc9357SAndroid Build Coastguard Worker , { k_7z_id_Block, STAT_PROP2(kpidBlock, VT_UI4) }
57*f6dc9357SAndroid Build Coastguard Worker #endif
58*f6dc9357SAndroid Build Coastguard Worker };
59*f6dc9357SAndroid Build Coastguard Worker
CopyOneItem(CRecordVector<UInt64> & src,CRecordVector<UInt64> & dest,const UInt32 item)60*f6dc9357SAndroid Build Coastguard Worker static void CopyOneItem(CRecordVector<UInt64> &src,
61*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> &dest, const UInt32 item)
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, src)
64*f6dc9357SAndroid Build Coastguard Worker if (src[i] == item)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker dest.Add(item);
67*f6dc9357SAndroid Build Coastguard Worker src.Delete(i);
68*f6dc9357SAndroid Build Coastguard Worker return;
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker }
71*f6dc9357SAndroid Build Coastguard Worker
RemoveOneItem(CRecordVector<UInt64> & src,const UInt32 item)72*f6dc9357SAndroid Build Coastguard Worker static void RemoveOneItem(CRecordVector<UInt64> &src, const UInt32 item)
73*f6dc9357SAndroid Build Coastguard Worker {
74*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, src)
75*f6dc9357SAndroid Build Coastguard Worker if (src[i] == item)
76*f6dc9357SAndroid Build Coastguard Worker {
77*f6dc9357SAndroid Build Coastguard Worker src.Delete(i);
78*f6dc9357SAndroid Build Coastguard Worker return;
79*f6dc9357SAndroid Build Coastguard Worker }
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker
InsertToHead(CRecordVector<UInt64> & dest,const UInt32 item)82*f6dc9357SAndroid Build Coastguard Worker static void InsertToHead(CRecordVector<UInt64> &dest, const UInt32 item)
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, dest)
85*f6dc9357SAndroid Build Coastguard Worker if (dest[i] == item)
86*f6dc9357SAndroid Build Coastguard Worker {
87*f6dc9357SAndroid Build Coastguard Worker dest.Delete(i);
88*f6dc9357SAndroid Build Coastguard Worker break;
89*f6dc9357SAndroid Build Coastguard Worker }
90*f6dc9357SAndroid Build Coastguard Worker dest.Insert(0, item);
91*f6dc9357SAndroid Build Coastguard Worker }
92*f6dc9357SAndroid Build Coastguard Worker
93*f6dc9357SAndroid Build Coastguard Worker #define COPY_ONE_ITEM(id) CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::id);
94*f6dc9357SAndroid Build Coastguard Worker
FillPopIDs()95*f6dc9357SAndroid Build Coastguard Worker void CHandler::FillPopIDs()
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker _fileInfoPopIDs.Clear();
98*f6dc9357SAndroid Build Coastguard Worker
99*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_VOL
100*f6dc9357SAndroid Build Coastguard Worker if (_volumes.Size() < 1)
101*f6dc9357SAndroid Build Coastguard Worker return;
102*f6dc9357SAndroid Build Coastguard Worker const CVolume &volume = _volumes.Front();
103*f6dc9357SAndroid Build Coastguard Worker const CArchiveDatabaseEx &_db = volume.Database;
104*f6dc9357SAndroid Build Coastguard Worker #endif
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> fileInfoPopIDs = _db.ArcInfo.FileInfoPopIDs;
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream);
109*f6dc9357SAndroid Build Coastguard Worker RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile);
110*f6dc9357SAndroid Build Coastguard Worker /*
111*f6dc9357SAndroid Build Coastguard Worker RemoveOneItem(fileInfoPopIDs, NID::kParent);
112*f6dc9357SAndroid Build Coastguard Worker RemoveOneItem(fileInfoPopIDs, NID::kNtSecure);
113*f6dc9357SAndroid Build Coastguard Worker */
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kName)
116*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kAnti)
117*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kSize)
118*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kPackInfo)
119*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kCTime)
120*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kMTime)
121*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kATime)
122*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kWinAttrib)
123*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kCRC)
124*f6dc9357SAndroid Build Coastguard Worker COPY_ONE_ITEM(kComment)
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker _fileInfoPopIDs += fileInfoPopIDs;
127*f6dc9357SAndroid Build Coastguard Worker
128*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
129*f6dc9357SAndroid Build Coastguard Worker _fileInfoPopIDs.Add(k_7z_id_Encrypted);
130*f6dc9357SAndroid Build Coastguard Worker _fileInfoPopIDs.Add(k_7z_id_Method);
131*f6dc9357SAndroid Build Coastguard Worker _fileInfoPopIDs.Add(k_7z_id_Block);
132*f6dc9357SAndroid Build Coastguard Worker #endif
133*f6dc9357SAndroid Build Coastguard Worker
134*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7Z_SHOW_PACK_STREAMS_SIZES
135*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < 5; i++)
136*f6dc9357SAndroid Build Coastguard Worker _fileInfoPopIDs.Add(k_7z_id_PackedSize0 + i);
137*f6dc9357SAndroid Build Coastguard Worker #endif
138*f6dc9357SAndroid Build Coastguard Worker
139*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
140*f6dc9357SAndroid Build Coastguard Worker InsertToHead(_fileInfoPopIDs, NID::kMTime);
141*f6dc9357SAndroid Build Coastguard Worker InsertToHead(_fileInfoPopIDs, NID::kPackInfo);
142*f6dc9357SAndroid Build Coastguard Worker InsertToHead(_fileInfoPopIDs, NID::kSize);
143*f6dc9357SAndroid Build Coastguard Worker InsertToHead(_fileInfoPopIDs, NID::kName);
144*f6dc9357SAndroid Build Coastguard Worker #endif
145*f6dc9357SAndroid Build Coastguard Worker }
146*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetNumberOfProperties (UInt32 * numProps))147*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetNumberOfProperties(UInt32 *numProps))
148*f6dc9357SAndroid Build Coastguard Worker {
149*f6dc9357SAndroid Build Coastguard Worker *numProps = _fileInfoPopIDs.Size();
150*f6dc9357SAndroid Build Coastguard Worker return S_OK;
151*f6dc9357SAndroid Build Coastguard Worker }
152*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CHandler::GetPropertyInfo (UInt32 index,BSTR * name,PROPID * propID,VARTYPE * varType))153*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType))
154*f6dc9357SAndroid Build Coastguard Worker {
155*f6dc9357SAndroid Build Coastguard Worker if (index >= _fileInfoPopIDs.Size())
156*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
157*f6dc9357SAndroid Build Coastguard Worker const UInt64 id = _fileInfoPopIDs[index];
158*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < Z7_ARRAY_SIZE(kPropMap); i++)
159*f6dc9357SAndroid Build Coastguard Worker {
160*f6dc9357SAndroid Build Coastguard Worker const CPropMap &pr = kPropMap[i];
161*f6dc9357SAndroid Build Coastguard Worker if (pr.FilePropID == id)
162*f6dc9357SAndroid Build Coastguard Worker {
163*f6dc9357SAndroid Build Coastguard Worker *propID = pr.StatPropID;
164*f6dc9357SAndroid Build Coastguard Worker *varType = pr.vt;
165*f6dc9357SAndroid Build Coastguard Worker /*
166*f6dc9357SAndroid Build Coastguard Worker const CStatProp &st = pr.StatProp;
167*f6dc9357SAndroid Build Coastguard Worker *propID = st.PropID;
168*f6dc9357SAndroid Build Coastguard Worker *varType = st.vt;
169*f6dc9357SAndroid Build Coastguard Worker */
170*f6dc9357SAndroid Build Coastguard Worker /*
171*f6dc9357SAndroid Build Coastguard Worker if (st.lpwstrName)
172*f6dc9357SAndroid Build Coastguard Worker *name = ::SysAllocString(st.lpwstrName);
173*f6dc9357SAndroid Build Coastguard Worker else
174*f6dc9357SAndroid Build Coastguard Worker */
175*f6dc9357SAndroid Build Coastguard Worker *name = NULL;
176*f6dc9357SAndroid Build Coastguard Worker return S_OK;
177*f6dc9357SAndroid Build Coastguard Worker }
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
180*f6dc9357SAndroid Build Coastguard Worker }
181*f6dc9357SAndroid Build Coastguard Worker
182*f6dc9357SAndroid Build Coastguard Worker }}
183