annotate src/win32/7zip/7z/CPP/7zip/Archive/7z/7zItem.h @ 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 // 7zItem.h
rlm@1 2
rlm@1 3 #ifndef __7Z_ITEM_H
rlm@1 4 #define __7Z_ITEM_H
rlm@1 5
rlm@1 6 #include "../../../Common/Buffer.h"
rlm@1 7 #include "../../../Common/MyString.h"
rlm@1 8
rlm@1 9 #include "../../Common/MethodId.h"
rlm@1 10
rlm@1 11 #include "7zHeader.h"
rlm@1 12
rlm@1 13 namespace NArchive {
rlm@1 14 namespace N7z {
rlm@1 15
rlm@1 16 typedef UInt32 CNum;
rlm@1 17 const CNum kNumMax = 0x7FFFFFFF;
rlm@1 18 const CNum kNumNoIndex = 0xFFFFFFFF;
rlm@1 19
rlm@1 20 struct CCoderInfo
rlm@1 21 {
rlm@1 22 CMethodId MethodID;
rlm@1 23 CByteBuffer Props;
rlm@1 24 CNum NumInStreams;
rlm@1 25 CNum NumOutStreams;
rlm@1 26 bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); }
rlm@1 27 };
rlm@1 28
rlm@1 29 struct CBindPair
rlm@1 30 {
rlm@1 31 CNum InIndex;
rlm@1 32 CNum OutIndex;
rlm@1 33 };
rlm@1 34
rlm@1 35 struct CFolder
rlm@1 36 {
rlm@1 37 CObjectVector<CCoderInfo> Coders;
rlm@1 38 CRecordVector<CBindPair> BindPairs;
rlm@1 39 CRecordVector<CNum> PackStreams;
rlm@1 40 CRecordVector<UInt64> UnpackSizes;
rlm@1 41 UInt32 UnpackCRC;
rlm@1 42 bool UnpackCRCDefined;
rlm@1 43
rlm@1 44 CFolder(): UnpackCRCDefined(false) {}
rlm@1 45
rlm@1 46 UInt64 GetUnpackSize() const // test it
rlm@1 47 {
rlm@1 48 if (UnpackSizes.IsEmpty())
rlm@1 49 return 0;
rlm@1 50 for (int i = UnpackSizes.Size() - 1; i >= 0; i--)
rlm@1 51 if (FindBindPairForOutStream(i) < 0)
rlm@1 52 return UnpackSizes[i];
rlm@1 53 throw 1;
rlm@1 54 }
rlm@1 55
rlm@1 56 CNum GetNumOutStreams() const
rlm@1 57 {
rlm@1 58 CNum result = 0;
rlm@1 59 for (int i = 0; i < Coders.Size(); i++)
rlm@1 60 result += Coders[i].NumOutStreams;
rlm@1 61 return result;
rlm@1 62 }
rlm@1 63
rlm@1 64 int FindBindPairForInStream(CNum inStreamIndex) const
rlm@1 65 {
rlm@1 66 for(int i = 0; i < BindPairs.Size(); i++)
rlm@1 67 if (BindPairs[i].InIndex == inStreamIndex)
rlm@1 68 return i;
rlm@1 69 return -1;
rlm@1 70 }
rlm@1 71 int FindBindPairForOutStream(CNum outStreamIndex) const
rlm@1 72 {
rlm@1 73 for(int i = 0; i < BindPairs.Size(); i++)
rlm@1 74 if (BindPairs[i].OutIndex == outStreamIndex)
rlm@1 75 return i;
rlm@1 76 return -1;
rlm@1 77 }
rlm@1 78 int FindPackStreamArrayIndex(CNum inStreamIndex) const
rlm@1 79 {
rlm@1 80 for(int i = 0; i < PackStreams.Size(); i++)
rlm@1 81 if (PackStreams[i] == inStreamIndex)
rlm@1 82 return i;
rlm@1 83 return -1;
rlm@1 84 }
rlm@1 85
rlm@1 86 bool CheckStructure() const;
rlm@1 87 };
rlm@1 88
rlm@1 89 struct CUInt64DefVector
rlm@1 90 {
rlm@1 91 CRecordVector<UInt64> Values;
rlm@1 92 CRecordVector<bool> Defined;
rlm@1 93
rlm@1 94 void Clear()
rlm@1 95 {
rlm@1 96 Values.Clear();
rlm@1 97 Defined.Clear();
rlm@1 98 }
rlm@1 99
rlm@1 100 void ReserveDown()
rlm@1 101 {
rlm@1 102 Values.ReserveDown();
rlm@1 103 Values.ReserveDown();
rlm@1 104 }
rlm@1 105
rlm@1 106 bool GetItem(int index, UInt64 &value) const
rlm@1 107 {
rlm@1 108 if (index < Defined.Size() && Defined[index])
rlm@1 109 {
rlm@1 110 value = Values[index];
rlm@1 111 return true;
rlm@1 112 }
rlm@1 113 value = 0;
rlm@1 114 return false;
rlm@1 115 }
rlm@1 116
rlm@1 117 void SetItem(int index, bool defined, UInt64 value)
rlm@1 118 {
rlm@1 119 while (index >= Defined.Size())
rlm@1 120 Defined.Add(false);
rlm@1 121 Defined[index] = defined;
rlm@1 122 if (!defined)
rlm@1 123 return;
rlm@1 124 while (index >= Values.Size())
rlm@1 125 Values.Add(0);
rlm@1 126 Values[index] = value;
rlm@1 127 }
rlm@1 128
rlm@1 129 bool CheckSize(int size) const { return Defined.Size() == size || Defined.Size() == 0; }
rlm@1 130 };
rlm@1 131
rlm@1 132 struct CFileItem
rlm@1 133 {
rlm@1 134 UInt64 Size;
rlm@1 135 UInt32 Attrib;
rlm@1 136 UInt32 Crc;
rlm@1 137 UString Name;
rlm@1 138
rlm@1 139 bool HasStream; // Test it !!! it means that there is
rlm@1 140 // stream in some folder. It can be empty stream
rlm@1 141 bool IsDir;
rlm@1 142 bool CrcDefined;
rlm@1 143 bool AttribDefined;
rlm@1 144
rlm@1 145 CFileItem():
rlm@1 146 HasStream(true),
rlm@1 147 IsDir(false),
rlm@1 148 CrcDefined(false),
rlm@1 149 AttribDefined(false)
rlm@1 150 {}
rlm@1 151 void SetAttrib(UInt32 attrib)
rlm@1 152 {
rlm@1 153 AttribDefined = true;
rlm@1 154 Attrib = attrib;
rlm@1 155 }
rlm@1 156 };
rlm@1 157
rlm@1 158 struct CFileItem2
rlm@1 159 {
rlm@1 160 UInt64 CTime;
rlm@1 161 UInt64 ATime;
rlm@1 162 UInt64 MTime;
rlm@1 163 UInt64 StartPos;
rlm@1 164 bool CTimeDefined;
rlm@1 165 bool ATimeDefined;
rlm@1 166 bool MTimeDefined;
rlm@1 167 bool StartPosDefined;
rlm@1 168 bool IsAnti;
rlm@1 169 };
rlm@1 170
rlm@1 171 struct CArchiveDatabase
rlm@1 172 {
rlm@1 173 CRecordVector<UInt64> PackSizes;
rlm@1 174 CRecordVector<bool> PackCRCsDefined;
rlm@1 175 CRecordVector<UInt32> PackCRCs;
rlm@1 176 CObjectVector<CFolder> Folders;
rlm@1 177 CRecordVector<CNum> NumUnpackStreamsVector;
rlm@1 178 CObjectVector<CFileItem> Files;
rlm@1 179
rlm@1 180 CUInt64DefVector CTime;
rlm@1 181 CUInt64DefVector ATime;
rlm@1 182 CUInt64DefVector MTime;
rlm@1 183 CUInt64DefVector StartPos;
rlm@1 184 CRecordVector<bool> IsAnti;
rlm@1 185
rlm@1 186 void Clear()
rlm@1 187 {
rlm@1 188 PackSizes.Clear();
rlm@1 189 PackCRCsDefined.Clear();
rlm@1 190 PackCRCs.Clear();
rlm@1 191 Folders.Clear();
rlm@1 192 NumUnpackStreamsVector.Clear();
rlm@1 193 Files.Clear();
rlm@1 194 CTime.Clear();
rlm@1 195 ATime.Clear();
rlm@1 196 MTime.Clear();
rlm@1 197 StartPos.Clear();
rlm@1 198 IsAnti.Clear();
rlm@1 199 }
rlm@1 200
rlm@1 201 void ReserveDown()
rlm@1 202 {
rlm@1 203 PackSizes.ReserveDown();
rlm@1 204 PackCRCsDefined.ReserveDown();
rlm@1 205 PackCRCs.ReserveDown();
rlm@1 206 Folders.ReserveDown();
rlm@1 207 NumUnpackStreamsVector.ReserveDown();
rlm@1 208 Files.ReserveDown();
rlm@1 209 CTime.ReserveDown();
rlm@1 210 ATime.ReserveDown();
rlm@1 211 MTime.ReserveDown();
rlm@1 212 StartPos.ReserveDown();
rlm@1 213 IsAnti.ReserveDown();
rlm@1 214 }
rlm@1 215
rlm@1 216 bool IsEmpty() const
rlm@1 217 {
rlm@1 218 return (PackSizes.IsEmpty() &&
rlm@1 219 PackCRCsDefined.IsEmpty() &&
rlm@1 220 PackCRCs.IsEmpty() &&
rlm@1 221 Folders.IsEmpty() &&
rlm@1 222 NumUnpackStreamsVector.IsEmpty() &&
rlm@1 223 Files.IsEmpty());
rlm@1 224 }
rlm@1 225
rlm@1 226 bool CheckNumFiles() const
rlm@1 227 {
rlm@1 228 int size = Files.Size();
rlm@1 229 return (
rlm@1 230 CTime.CheckSize(size) &&
rlm@1 231 ATime.CheckSize(size) &&
rlm@1 232 MTime.CheckSize(size) &&
rlm@1 233 StartPos.CheckSize(size) &&
rlm@1 234 (size == IsAnti.Size() || IsAnti.Size() == 0));
rlm@1 235 }
rlm@1 236
rlm@1 237 bool IsSolid() const
rlm@1 238 {
rlm@1 239 for (int i = 0; i < NumUnpackStreamsVector.Size(); i++)
rlm@1 240 if (NumUnpackStreamsVector[i] > 1)
rlm@1 241 return true;
rlm@1 242 return false;
rlm@1 243 }
rlm@1 244 bool IsItemAnti(int index) const { return (index < IsAnti.Size() && IsAnti[index]); }
rlm@1 245 void SetItemAnti(int index, bool isAnti)
rlm@1 246 {
rlm@1 247 while (index >= IsAnti.Size())
rlm@1 248 IsAnti.Add(false);
rlm@1 249 IsAnti[index] = isAnti;
rlm@1 250 }
rlm@1 251
rlm@1 252 void GetFile(int index, CFileItem &file, CFileItem2 &file2) const;
rlm@1 253 void AddFile(const CFileItem &file, const CFileItem2 &file2);
rlm@1 254 };
rlm@1 255
rlm@1 256 }}
rlm@1 257
rlm@1 258 #endif