1 #pragma once
2 
3 #include "Types.h"
4 #include "Stream.h"
5 
6 class CIszImageStream : public Framework::CStream
7 {
8 public:
9 	CIszImageStream(Framework::CStream*);
10 	virtual ~CIszImageStream();
11 
12 	virtual void Seek(int64, Framework::STREAM_SEEK_DIRECTION) override;
13 	virtual uint64 Tell() override;
14 	virtual uint64 Read(void*, uint64) override;
15 	virtual uint64 Write(const void*, uint64) override;
16 	virtual bool IsEOF() override;
17 
18 private:
19 #pragma pack(push, 1)
20 	struct HEADER
21 	{
22 		char signature[4];
23 		uint8 headerSize;
24 		int8 version;
25 		uint32 volumeSerialNumber;
26 
27 		uint16 sectorSize;
28 		uint32 totalSectors;
29 
30 		int8 hasPassword;
31 
32 		int64 segmentSize;
33 
34 		uint32 blockNumber;
35 		uint32 blockSize;
36 		uint8 blockPtrLength;
37 
38 		int8 segmentNumber;
39 
40 		uint32 blockPtrOffset;
41 		uint32 segmentPtrOffset;
42 		uint32 dataOffset;
43 
44 		int8 reserved;
45 	};
46 #pragma pack(pop)
47 
48 	struct BLOCKDESCRIPTOR
49 	{
50 		uint32 size;
51 		uint8 storageType;
52 	};
53 
54 	enum HASPASSWORD
55 	{
56 		ADI_PLAIN = 0,
57 		ADI_PASSWORD = 1,
58 		ADI_AES128 = 2,
59 		ADI_AES192 = 3,
60 		ADI_AES256 = 4
61 	};
62 
63 	enum STORAGETYPE
64 	{
65 		ADI_ZERO = 0,
66 		ADI_DATA = 1,
67 		ADI_ZLIB = 2,
68 		ADI_BZ2 = 3
69 	};
70 
71 	void ReadBlockDescriptorTable();
72 	uint64 GetTotalSize() const;
73 	const BLOCKDESCRIPTOR& SeekToBlock(uint64);
74 	void SyncCache();
75 
76 	void ReadZeroBlock(uint32);
77 	void ReadDataBlock(uint32);
78 	void ReadGzipBlock(uint32);
79 	void ReadBz2Block(uint32);
80 
81 	Framework::CStream* m_baseStream = nullptr;
82 	HEADER m_header;
83 	BLOCKDESCRIPTOR* m_blockDescriptorTable = nullptr;
84 	int64 m_cachedBlockNumber = -1;
85 	uint8* m_cachedBlock = nullptr;
86 	uint8* m_readBuffer = nullptr;
87 	uint64 m_position = 0;
88 };
89