annotate src/win32/7zip/7z/CPP/7zip/Archive/7z/7zIn.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 // 7zIn.h
rlm@1 2
rlm@1 3 #ifndef __7Z_IN_H
rlm@1 4 #define __7Z_IN_H
rlm@1 5
rlm@1 6 #include "../../../Common/MyCom.h"
rlm@1 7
rlm@1 8 #include "../../IPassword.h"
rlm@1 9 #include "../../IStream.h"
rlm@1 10
rlm@1 11 #include "../../Common/CreateCoder.h"
rlm@1 12 #include "../../Common/InBuffer.h"
rlm@1 13
rlm@1 14 #include "7zItem.h"
rlm@1 15
rlm@1 16 namespace NArchive {
rlm@1 17 namespace N7z {
rlm@1 18
rlm@1 19 struct CInArchiveInfo
rlm@1 20 {
rlm@1 21 CArchiveVersion Version;
rlm@1 22 UInt64 StartPosition;
rlm@1 23 UInt64 StartPositionAfterHeader;
rlm@1 24 UInt64 DataStartPosition;
rlm@1 25 UInt64 DataStartPosition2;
rlm@1 26 CRecordVector<UInt64> FileInfoPopIDs;
rlm@1 27 void Clear()
rlm@1 28 {
rlm@1 29 FileInfoPopIDs.Clear();
rlm@1 30 }
rlm@1 31 };
rlm@1 32
rlm@1 33 struct CArchiveDatabaseEx: public CArchiveDatabase
rlm@1 34 {
rlm@1 35 CInArchiveInfo ArchiveInfo;
rlm@1 36 CRecordVector<UInt64> PackStreamStartPositions;
rlm@1 37 CRecordVector<CNum> FolderStartPackStreamIndex;
rlm@1 38 CRecordVector<CNum> FolderStartFileIndex;
rlm@1 39 CRecordVector<CNum> FileIndexToFolderIndexMap;
rlm@1 40
rlm@1 41 UInt64 HeadersSize;
rlm@1 42 UInt64 PhySize;
rlm@1 43
rlm@1 44 void Clear()
rlm@1 45 {
rlm@1 46 CArchiveDatabase::Clear();
rlm@1 47 ArchiveInfo.Clear();
rlm@1 48 PackStreamStartPositions.Clear();
rlm@1 49 FolderStartPackStreamIndex.Clear();
rlm@1 50 FolderStartFileIndex.Clear();
rlm@1 51 FileIndexToFolderIndexMap.Clear();
rlm@1 52
rlm@1 53 HeadersSize = 0;
rlm@1 54 PhySize = 0;
rlm@1 55 }
rlm@1 56
rlm@1 57 void FillFolderStartPackStream();
rlm@1 58 void FillStartPos();
rlm@1 59 void FillFolderStartFileIndex();
rlm@1 60
rlm@1 61 void Fill()
rlm@1 62 {
rlm@1 63 FillFolderStartPackStream();
rlm@1 64 FillStartPos();
rlm@1 65 FillFolderStartFileIndex();
rlm@1 66 }
rlm@1 67
rlm@1 68 UInt64 GetFolderStreamPos(int folderIndex, int indexInFolder) const
rlm@1 69 {
rlm@1 70 return ArchiveInfo.DataStartPosition +
rlm@1 71 PackStreamStartPositions[FolderStartPackStreamIndex[folderIndex] + indexInFolder];
rlm@1 72 }
rlm@1 73
rlm@1 74 UInt64 GetFolderFullPackSize(int folderIndex) const
rlm@1 75 {
rlm@1 76 CNum packStreamIndex = FolderStartPackStreamIndex[folderIndex];
rlm@1 77 const CFolder &folder = Folders[folderIndex];
rlm@1 78 UInt64 size = 0;
rlm@1 79 for (int i = 0; i < folder.PackStreams.Size(); i++)
rlm@1 80 size += PackSizes[packStreamIndex + i];
rlm@1 81 return size;
rlm@1 82 }
rlm@1 83
rlm@1 84 UInt64 GetFolderPackStreamSize(int folderIndex, int streamIndex) const
rlm@1 85 {
rlm@1 86 return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex];
rlm@1 87 }
rlm@1 88
rlm@1 89 UInt64 GetFilePackSize(CNum fileIndex) const
rlm@1 90 {
rlm@1 91 CNum folderIndex = FileIndexToFolderIndexMap[fileIndex];
rlm@1 92 if (folderIndex != kNumNoIndex)
rlm@1 93 if (FolderStartFileIndex[folderIndex] == fileIndex)
rlm@1 94 return GetFolderFullPackSize(folderIndex);
rlm@1 95 return 0;
rlm@1 96 }
rlm@1 97 };
rlm@1 98
rlm@1 99 class CInByte2
rlm@1 100 {
rlm@1 101 const Byte *_buffer;
rlm@1 102 size_t _size;
rlm@1 103 public:
rlm@1 104 size_t _pos;
rlm@1 105 void Init(const Byte *buffer, size_t size)
rlm@1 106 {
rlm@1 107 _buffer = buffer;
rlm@1 108 _size = size;
rlm@1 109 _pos = 0;
rlm@1 110 }
rlm@1 111 Byte ReadByte();
rlm@1 112 void ReadBytes(Byte *data, size_t size);
rlm@1 113 void SkeepData(UInt64 size);
rlm@1 114 void SkeepData();
rlm@1 115 UInt64 ReadNumber();
rlm@1 116 CNum ReadNum();
rlm@1 117 UInt32 ReadUInt32();
rlm@1 118 UInt64 ReadUInt64();
rlm@1 119 void ReadString(UString &s);
rlm@1 120 };
rlm@1 121
rlm@1 122 class CStreamSwitch;
rlm@1 123
rlm@1 124 const UInt32 kHeaderSize = 32;
rlm@1 125
rlm@1 126 class CInArchive
rlm@1 127 {
rlm@1 128 friend class CStreamSwitch;
rlm@1 129
rlm@1 130 CMyComPtr<IInStream> _stream;
rlm@1 131
rlm@1 132 CObjectVector<CInByte2> _inByteVector;
rlm@1 133 CInByte2 *_inByteBack;
rlm@1 134
rlm@1 135 UInt64 _arhiveBeginStreamPosition;
rlm@1 136
rlm@1 137 Byte _header[kHeaderSize];
rlm@1 138
rlm@1 139 UInt64 HeadersSize;
rlm@1 140
rlm@1 141 void AddByteStream(const Byte *buffer, size_t size)
rlm@1 142 {
rlm@1 143 _inByteVector.Add(CInByte2());
rlm@1 144 _inByteBack = &_inByteVector.Back();
rlm@1 145 _inByteBack->Init(buffer, size);
rlm@1 146 }
rlm@1 147
rlm@1 148 void DeleteByteStream()
rlm@1 149 {
rlm@1 150 _inByteVector.DeleteBack();
rlm@1 151 if (!_inByteVector.IsEmpty())
rlm@1 152 _inByteBack = &_inByteVector.Back();
rlm@1 153 }
rlm@1 154
rlm@1 155 private:
rlm@1 156 HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
rlm@1 157
rlm@1 158 void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); }
rlm@1 159 Byte ReadByte() { return _inByteBack->ReadByte(); }
rlm@1 160 UInt64 ReadNumber() { return _inByteBack->ReadNumber(); }
rlm@1 161 CNum ReadNum() { return _inByteBack->ReadNum(); }
rlm@1 162 UInt64 ReadID() { return _inByteBack->ReadNumber(); }
rlm@1 163 UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); }
rlm@1 164 UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); }
rlm@1 165 void SkeepData(UInt64 size) { _inByteBack->SkeepData(size); }
rlm@1 166 void SkeepData() { _inByteBack->SkeepData(); }
rlm@1 167 void WaitAttribute(UInt64 attribute);
rlm@1 168
rlm@1 169 void ReadArchiveProperties(CInArchiveInfo &archiveInfo);
rlm@1 170 void GetNextFolderItem(CFolder &itemInfo);
rlm@1 171 void ReadHashDigests(int numItems,
rlm@1 172 CBoolVector &digestsDefined, CRecordVector<UInt32> &digests);
rlm@1 173
rlm@1 174 void ReadPackInfo(
rlm@1 175 UInt64 &dataOffset,
rlm@1 176 CRecordVector<UInt64> &packSizes,
rlm@1 177 CBoolVector &packCRCsDefined,
rlm@1 178 CRecordVector<UInt32> &packCRCs);
rlm@1 179
rlm@1 180 void ReadUnpackInfo(
rlm@1 181 const CObjectVector<CByteBuffer> *dataVector,
rlm@1 182 CObjectVector<CFolder> &folders);
rlm@1 183
rlm@1 184 void ReadSubStreamsInfo(
rlm@1 185 const CObjectVector<CFolder> &folders,
rlm@1 186 CRecordVector<CNum> &numUnpackStreamsInFolders,
rlm@1 187 CRecordVector<UInt64> &unpackSizes,
rlm@1 188 CBoolVector &digestsDefined,
rlm@1 189 CRecordVector<UInt32> &digests);
rlm@1 190
rlm@1 191 void ReadStreamsInfo(
rlm@1 192 const CObjectVector<CByteBuffer> *dataVector,
rlm@1 193 UInt64 &dataOffset,
rlm@1 194 CRecordVector<UInt64> &packSizes,
rlm@1 195 CBoolVector &packCRCsDefined,
rlm@1 196 CRecordVector<UInt32> &packCRCs,
rlm@1 197 CObjectVector<CFolder> &folders,
rlm@1 198 CRecordVector<CNum> &numUnpackStreamsInFolders,
rlm@1 199 CRecordVector<UInt64> &unpackSizes,
rlm@1 200 CBoolVector &digestsDefined,
rlm@1 201 CRecordVector<UInt32> &digests);
rlm@1 202
rlm@1 203
rlm@1 204 void ReadBoolVector(int numItems, CBoolVector &v);
rlm@1 205 void ReadBoolVector2(int numItems, CBoolVector &v);
rlm@1 206 void ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector,
rlm@1 207 CUInt64DefVector &v, int numFiles);
rlm@1 208 HRESULT ReadAndDecodePackedStreams(
rlm@1 209 DECL_EXTERNAL_CODECS_LOC_VARS
rlm@1 210 UInt64 baseOffset, UInt64 &dataOffset,
rlm@1 211 CObjectVector<CByteBuffer> &dataVector
rlm@1 212 #ifndef _NO_CRYPTO
rlm@1 213 , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
rlm@1 214 #endif
rlm@1 215 );
rlm@1 216 HRESULT ReadHeader(
rlm@1 217 DECL_EXTERNAL_CODECS_LOC_VARS
rlm@1 218 CArchiveDatabaseEx &db
rlm@1 219 #ifndef _NO_CRYPTO
rlm@1 220 ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
rlm@1 221 #endif
rlm@1 222 );
rlm@1 223 HRESULT ReadDatabase2(
rlm@1 224 DECL_EXTERNAL_CODECS_LOC_VARS
rlm@1 225 CArchiveDatabaseEx &db
rlm@1 226 #ifndef _NO_CRYPTO
rlm@1 227 ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
rlm@1 228 #endif
rlm@1 229 );
rlm@1 230 public:
rlm@1 231 HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
rlm@1 232 void Close();
rlm@1 233
rlm@1 234 HRESULT ReadDatabase(
rlm@1 235 DECL_EXTERNAL_CODECS_LOC_VARS
rlm@1 236 CArchiveDatabaseEx &db
rlm@1 237 #ifndef _NO_CRYPTO
rlm@1 238 ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
rlm@1 239 #endif
rlm@1 240 );
rlm@1 241 };
rlm@1 242
rlm@1 243 }}
rlm@1 244
rlm@1 245 #endif