6 #include "Common/MyCom.h"
\r
8 #include "../../IStream.h"
\r
10 #include "../../Common/InBuffer.h"
\r
12 #include "ZipHeader.h"
\r
13 #include "ZipItemEx.h"
\r
15 namespace NArchive {
\r
18 class CInArchiveException
\r
23 kUnexpectedEndOfArchive = 0,
\r
24 kArchiceHeaderCRCError,
\r
25 kFileHeaderCRCError,
\r
27 kDataDescroptorsAreNotSupported,
\r
28 kMultiVolumeArchiveAreNotSupported,
\r
33 CInArchiveException(ECauseType cause): Cause(cause) {}
\r
36 class CInArchiveInfo
\r
40 UInt64 StartPosition;
\r
41 UInt64 FinishPosition;
\r
42 CByteBuffer Comment;
\r
44 CInArchiveInfo(): Base(0), StartPosition(0) {}
\r
45 UInt64 GetPhySize() const { return FinishPosition - StartPosition; }
\r
50 Comment.SetCapacity(0);
\r
57 STDMETHOD(SetTotal)(UInt64 numFiles) PURE;
\r
58 STDMETHOD(SetCompleted)(UInt64 numFiles) PURE;
\r
63 // UInt64 NumEntries;
\r
70 CMyComPtr<IInStream> m_Stream;
\r
72 UInt64 m_StreamStartPosition;
\r
76 CInBuffer _inBuffer;
\r
78 HRESULT Seek(UInt64 offset);
\r
80 HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
\r
81 void ReadFileName(UInt32 nameSize, AString &dest);
\r
83 HRESULT ReadBytes(void *data, UInt32 size, UInt32 *processedSize);
\r
84 bool ReadBytesAndTestSize(void *data, UInt32 size);
\r
85 void SafeReadBytes(void *data, UInt32 size);
\r
86 void ReadBuffer(CByteBuffer &buffer, UInt32 size);
\r
88 UInt16 ReadUInt16();
\r
89 UInt32 ReadUInt32();
\r
90 UInt64 ReadUInt64();
\r
91 bool ReadUInt32(UInt32 &signature);
\r
93 void Skip(UInt64 num);
\r
94 void IncreaseRealPosition(UInt64 addValue);
\r
96 void ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,
\r
97 UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber);
\r
98 HRESULT ReadLocalItem(CItemEx &item);
\r
99 HRESULT ReadLocalItemDescriptor(CItemEx &item);
\r
100 HRESULT ReadCdItem(CItemEx &item);
\r
101 HRESULT TryEcd64(UInt64 offset, CCdInfo &cdInfo);
\r
102 HRESULT FindCd(CCdInfo &cdInfo);
\r
103 HRESULT TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress);
\r
104 HRESULT ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress);
\r
105 HRESULT ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset, int &numCdItems);
\r
107 CInArchiveInfo ArcInfo;
\r
111 HRESULT ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress);
\r
112 HRESULT ReadLocalItemAfterCdItem(CItemEx &item);
\r
113 HRESULT ReadLocalItemAfterCdItemFull(CItemEx &item);
\r
114 HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
\r
116 bool SeekInArchive(UInt64 position);
\r
117 ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
\r
118 IInStream* CreateStream();
\r
120 bool IsOpen() const { return m_Stream != NULL; }
\r