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