// Archive/ZipIn.h #ifndef __ZIP_IN_H #define __ZIP_IN_H #include "Common/MyCom.h" #include "../../IStream.h" #include "../../Common/InBuffer.h" #include "ZipHeader.h" #include "ZipItemEx.h" namespace NArchive { namespace NZip { class CInArchiveException { public: enum ECauseType { kUnexpectedEndOfArchive = 0, kArchiceHeaderCRCError, kFileHeaderCRCError, kIncorrectArchive, kDataDescroptorsAreNotSupported, kMultiVolumeArchiveAreNotSupported, kReadStreamError, kSeekStreamError } Cause; CInArchiveException(ECauseType cause): Cause(cause) {} }; class CInArchiveInfo { public: UInt64 Base; UInt64 StartPosition; UInt64 FinishPosition; CByteBuffer Comment; CInArchiveInfo(): Base(0), StartPosition(0) {} UInt64 GetPhySize() const { return FinishPosition - StartPosition; } void Clear() { Base = 0; StartPosition = 0; Comment.SetCapacity(0); } }; class CProgressVirt { public: STDMETHOD(SetTotal)(UInt64 numFiles) PURE; STDMETHOD(SetCompleted)(UInt64 numFiles) PURE; }; struct CCdInfo { // UInt64 NumEntries; UInt64 Size; UInt64 Offset; }; class CInArchive { CMyComPtr m_Stream; UInt32 m_Signature; UInt64 m_StreamStartPosition; UInt64 m_Position; bool _inBufMode; CInBuffer _inBuffer; HRESULT Seek(UInt64 offset); HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit); void ReadFileName(UInt32 nameSize, AString &dest); HRESULT ReadBytes(void *data, UInt32 size, UInt32 *processedSize); bool ReadBytesAndTestSize(void *data, UInt32 size); void SafeReadBytes(void *data, UInt32 size); void ReadBuffer(CByteBuffer &buffer, UInt32 size); Byte ReadByte(); UInt16 ReadUInt16(); UInt32 ReadUInt32(); UInt64 ReadUInt64(); bool ReadUInt32(UInt32 &signature); void Skip(UInt64 num); void IncreaseRealPosition(UInt64 addValue); void ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock, UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber); HRESULT ReadLocalItem(CItemEx &item); HRESULT ReadLocalItemDescriptor(CItemEx &item); HRESULT ReadCdItem(CItemEx &item); HRESULT TryEcd64(UInt64 offset, CCdInfo &cdInfo); HRESULT FindCd(CCdInfo &cdInfo); HRESULT TryReadCd(CObjectVector &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress); HRESULT ReadCd(CObjectVector &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress); HRESULT ReadLocalsAndCd(CObjectVector &items, CProgressVirt *progress, UInt64 &cdOffset, int &numCdItems); public: CInArchiveInfo ArcInfo; bool IsZip64; bool IsOkHeaders; HRESULT ReadHeaders(CObjectVector &items, CProgressVirt *progress); HRESULT ReadLocalItemAfterCdItem(CItemEx &item); HRESULT ReadLocalItemAfterCdItemFull(CItemEx &item); HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); void Close(); bool SeekInArchive(UInt64 position); ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size); IInStream* CreateStream(); bool IsOpen() const { return m_Stream != NULL; } }; }} #endif