Play-/Source/IszImageStream.h

89 lines
1.7 KiB
C
Raw Normal View History

2015-04-14 03:48:55 -04:00
#pragma once
#include "Types.h"
#include "Stream.h"
class CIszImageStream : public Framework::CStream
{
public:
2018-04-30 21:01:23 +01:00
CIszImageStream(Framework::CStream*);
virtual ~CIszImageStream();
2018-04-30 21:01:23 +01:00
virtual void Seek(int64, Framework::STREAM_SEEK_DIRECTION) override;
virtual uint64 Tell() override;
virtual uint64 Read(void*, uint64) override;
virtual uint64 Write(const void*, uint64) override;
virtual bool IsEOF() override;
private:
#pragma pack(push, 1)
2015-04-14 03:48:55 -04:00
struct HEADER
{
2018-04-30 21:01:23 +01:00
char signature[4];
uint8 headerSize;
int8 version;
uint32 volumeSerialNumber;
2018-04-30 21:01:23 +01:00
uint16 sectorSize;
uint32 totalSectors;
2018-04-30 21:01:23 +01:00
int8 hasPassword;
2018-04-30 21:01:23 +01:00
int64 segmentSize;
2018-04-30 21:01:23 +01:00
uint32 blockNumber;
uint32 blockSize;
uint8 blockPtrLength;
2018-04-30 21:01:23 +01:00
int8 segmentNumber;
2018-04-30 21:01:23 +01:00
uint32 blockPtrOffset;
uint32 segmentPtrOffset;
uint32 dataOffset;
2018-04-30 21:01:23 +01:00
int8 reserved;
2015-04-14 03:48:55 -04:00
};
#pragma pack(pop)
2015-04-14 03:48:55 -04:00
struct BLOCKDESCRIPTOR
{
2018-04-30 21:01:23 +01:00
uint32 size;
uint8 storageType;
2015-04-14 03:48:55 -04:00
};
enum HASPASSWORD
{
ADI_PLAIN = 0,
ADI_PASSWORD = 1,
ADI_AES128 = 2,
ADI_AES192 = 3,
ADI_AES256 = 4
};
enum STORAGETYPE
{
ADI_ZERO = 0,
ADI_DATA = 1,
ADI_ZLIB = 2,
ADI_BZ2 = 3
};
2018-04-30 21:01:23 +01:00
void ReadBlockDescriptorTable();
uint64 GetTotalSize() const;
const BLOCKDESCRIPTOR& SeekToBlock(uint64);
void SyncCache();
void ReadZeroBlock(uint32);
void ReadDataBlock(uint32);
void ReadGzipBlock(uint32);
void ReadBz2Block(uint32);
Framework::CStream* m_baseStream = nullptr;
HEADER m_header;
BLOCKDESCRIPTOR* m_blockDescriptorTable = nullptr;
int64 m_cachedBlockNumber = -1;
uint8* m_cachedBlock = nullptr;
uint8* m_readBuffer = nullptr;
uint64 m_position = 0;
};