rlm@1
|
1 // 7zProperties.cpp
|
rlm@1
|
2
|
rlm@1
|
3 #include "StdAfx.h"
|
rlm@1
|
4
|
rlm@1
|
5 #include "7zProperties.h"
|
rlm@1
|
6 #include "7zHeader.h"
|
rlm@1
|
7 #include "7zHandler.h"
|
rlm@1
|
8
|
rlm@1
|
9 // #define _MULTI_PACK
|
rlm@1
|
10
|
rlm@1
|
11 namespace NArchive {
|
rlm@1
|
12 namespace N7z {
|
rlm@1
|
13
|
rlm@1
|
14 struct CPropMap
|
rlm@1
|
15 {
|
rlm@1
|
16 UInt64 FilePropID;
|
rlm@1
|
17 STATPROPSTG StatPROPSTG;
|
rlm@1
|
18 };
|
rlm@1
|
19
|
rlm@1
|
20 CPropMap kPropMap[] =
|
rlm@1
|
21 {
|
rlm@1
|
22 { NID::kName, NULL, kpidPath, VT_BSTR},
|
rlm@1
|
23 { NID::kSize, NULL, kpidSize, VT_UI8},
|
rlm@1
|
24 { NID::kPackInfo, NULL, kpidPackSize, VT_UI8},
|
rlm@1
|
25
|
rlm@1
|
26 #ifdef _MULTI_PACK
|
rlm@1
|
27 { 100, L"Pack0", kpidPackedSize0, VT_UI8},
|
rlm@1
|
28 { 101, L"Pack1", kpidPackedSize1, VT_UI8},
|
rlm@1
|
29 { 102, L"Pack2", kpidPackedSize2, VT_UI8},
|
rlm@1
|
30 { 103, L"Pack3", kpidPackedSize3, VT_UI8},
|
rlm@1
|
31 { 104, L"Pack4", kpidPackedSize4, VT_UI8},
|
rlm@1
|
32 #endif
|
rlm@1
|
33
|
rlm@1
|
34 { NID::kCTime, NULL, kpidCTime, VT_FILETIME},
|
rlm@1
|
35 { NID::kMTime, NULL, kpidMTime, VT_FILETIME},
|
rlm@1
|
36 { NID::kATime, NULL, kpidATime, VT_FILETIME},
|
rlm@1
|
37 { NID::kWinAttributes, NULL, kpidAttrib, VT_UI4},
|
rlm@1
|
38 { NID::kStartPos, NULL, kpidPosition, VT_UI4},
|
rlm@1
|
39
|
rlm@1
|
40 { NID::kCRC, NULL, kpidCRC, VT_UI4},
|
rlm@1
|
41
|
rlm@1
|
42 { NID::kAnti, NULL, kpidIsAnti, VT_BOOL},
|
rlm@1
|
43
|
rlm@1
|
44 #ifndef _SFX
|
rlm@1
|
45 { 97, NULL, kpidEncrypted, VT_BOOL},
|
rlm@1
|
46 { 98, NULL, kpidMethod, VT_BSTR},
|
rlm@1
|
47 { 99, NULL, kpidBlock, VT_UI4}
|
rlm@1
|
48 #endif
|
rlm@1
|
49 };
|
rlm@1
|
50
|
rlm@1
|
51 static const int kPropMapSize = sizeof(kPropMap) / sizeof(kPropMap[0]);
|
rlm@1
|
52
|
rlm@1
|
53 static int FindPropInMap(UInt64 filePropID)
|
rlm@1
|
54 {
|
rlm@1
|
55 for (int i = 0; i < kPropMapSize; i++)
|
rlm@1
|
56 if (kPropMap[i].FilePropID == filePropID)
|
rlm@1
|
57 return i;
|
rlm@1
|
58 return -1;
|
rlm@1
|
59 }
|
rlm@1
|
60
|
rlm@1
|
61 static void CopyOneItem(CRecordVector<UInt64> &src,
|
rlm@1
|
62 CRecordVector<UInt64> &dest, UInt32 item)
|
rlm@1
|
63 {
|
rlm@1
|
64 for (int i = 0; i < src.Size(); i++)
|
rlm@1
|
65 if (src[i] == item)
|
rlm@1
|
66 {
|
rlm@1
|
67 dest.Add(item);
|
rlm@1
|
68 src.Delete(i);
|
rlm@1
|
69 return;
|
rlm@1
|
70 }
|
rlm@1
|
71 }
|
rlm@1
|
72
|
rlm@1
|
73 static void RemoveOneItem(CRecordVector<UInt64> &src, UInt32 item)
|
rlm@1
|
74 {
|
rlm@1
|
75 for (int i = 0; i < src.Size(); i++)
|
rlm@1
|
76 if (src[i] == item)
|
rlm@1
|
77 {
|
rlm@1
|
78 src.Delete(i);
|
rlm@1
|
79 return;
|
rlm@1
|
80 }
|
rlm@1
|
81 }
|
rlm@1
|
82
|
rlm@1
|
83 static void InsertToHead(CRecordVector<UInt64> &dest, UInt32 item)
|
rlm@1
|
84 {
|
rlm@1
|
85 for (int i = 0; i < dest.Size(); i++)
|
rlm@1
|
86 if (dest[i] == item)
|
rlm@1
|
87 {
|
rlm@1
|
88 dest.Delete(i);
|
rlm@1
|
89 break;
|
rlm@1
|
90 }
|
rlm@1
|
91 dest.Insert(0, item);
|
rlm@1
|
92 }
|
rlm@1
|
93
|
rlm@1
|
94 void CHandler::FillPopIDs()
|
rlm@1
|
95 {
|
rlm@1
|
96 _fileInfoPopIDs.Clear();
|
rlm@1
|
97
|
rlm@1
|
98 #ifdef _7Z_VOL
|
rlm@1
|
99 if(_volumes.Size() < 1)
|
rlm@1
|
100 return;
|
rlm@1
|
101 const CVolume &volume = _volumes.Front();
|
rlm@1
|
102 const CArchiveDatabaseEx &_db = volume.Database;
|
rlm@1
|
103 #endif
|
rlm@1
|
104
|
rlm@1
|
105 CRecordVector<UInt64> fileInfoPopIDs = _db.ArchiveInfo.FileInfoPopIDs;
|
rlm@1
|
106
|
rlm@1
|
107 RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream);
|
rlm@1
|
108 RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile);
|
rlm@1
|
109
|
rlm@1
|
110 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kName);
|
rlm@1
|
111 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kAnti);
|
rlm@1
|
112 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kSize);
|
rlm@1
|
113 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kPackInfo);
|
rlm@1
|
114 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCTime);
|
rlm@1
|
115 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kMTime);
|
rlm@1
|
116 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kATime);
|
rlm@1
|
117 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kWinAttributes);
|
rlm@1
|
118 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCRC);
|
rlm@1
|
119 CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kComment);
|
rlm@1
|
120 _fileInfoPopIDs += fileInfoPopIDs;
|
rlm@1
|
121
|
rlm@1
|
122 #ifndef _SFX
|
rlm@1
|
123 _fileInfoPopIDs.Add(97);
|
rlm@1
|
124 _fileInfoPopIDs.Add(98);
|
rlm@1
|
125 _fileInfoPopIDs.Add(99);
|
rlm@1
|
126 #endif
|
rlm@1
|
127 #ifdef _MULTI_PACK
|
rlm@1
|
128 _fileInfoPopIDs.Add(100);
|
rlm@1
|
129 _fileInfoPopIDs.Add(101);
|
rlm@1
|
130 _fileInfoPopIDs.Add(102);
|
rlm@1
|
131 _fileInfoPopIDs.Add(103);
|
rlm@1
|
132 _fileInfoPopIDs.Add(104);
|
rlm@1
|
133 #endif
|
rlm@1
|
134
|
rlm@1
|
135 #ifndef _SFX
|
rlm@1
|
136 InsertToHead(_fileInfoPopIDs, NID::kMTime);
|
rlm@1
|
137 InsertToHead(_fileInfoPopIDs, NID::kPackInfo);
|
rlm@1
|
138 InsertToHead(_fileInfoPopIDs, NID::kSize);
|
rlm@1
|
139 InsertToHead(_fileInfoPopIDs, NID::kName);
|
rlm@1
|
140 #endif
|
rlm@1
|
141 }
|
rlm@1
|
142
|
rlm@1
|
143 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties)
|
rlm@1
|
144 {
|
rlm@1
|
145 *numProperties = _fileInfoPopIDs.Size();
|
rlm@1
|
146 return S_OK;
|
rlm@1
|
147 }
|
rlm@1
|
148
|
rlm@1
|
149 STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)
|
rlm@1
|
150 {
|
rlm@1
|
151 if ((int)index >= _fileInfoPopIDs.Size())
|
rlm@1
|
152 return E_INVALIDARG;
|
rlm@1
|
153 int indexInMap = FindPropInMap(_fileInfoPopIDs[index]);
|
rlm@1
|
154 if (indexInMap == -1)
|
rlm@1
|
155 return E_INVALIDARG;
|
rlm@1
|
156 const STATPROPSTG &srcItem = kPropMap[indexInMap].StatPROPSTG;
|
rlm@1
|
157 *propID = srcItem.propid;
|
rlm@1
|
158 *varType = srcItem.vt;
|
rlm@1
|
159 *name = 0;
|
rlm@1
|
160 return S_OK;
|
rlm@1
|
161 }
|
rlm@1
|
162
|
rlm@1
|
163 }}
|