2
0

7zIn.h 6.2 KB

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