annotate src/win32/7zip/7z/CPP/7zip/Archive/7z/7zProperties.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
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 }}