rlm@1
|
1 // Archive/ZipIn.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __ZIP_IN_H
|
rlm@1
|
4 #define __ZIP_IN_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "../../../Common/MyCom.h"
|
rlm@1
|
7 #include "../../IStream.h"
|
rlm@1
|
8
|
rlm@1
|
9 #include "ZipHeader.h"
|
rlm@1
|
10 #include "ZipItemEx.h"
|
rlm@1
|
11
|
rlm@1
|
12 namespace NArchive {
|
rlm@1
|
13 namespace NZip {
|
rlm@1
|
14
|
rlm@1
|
15 class CInArchiveException
|
rlm@1
|
16 {
|
rlm@1
|
17 public:
|
rlm@1
|
18 enum ECauseType
|
rlm@1
|
19 {
|
rlm@1
|
20 kUnexpectedEndOfArchive = 0,
|
rlm@1
|
21 kArchiceHeaderCRCError,
|
rlm@1
|
22 kFileHeaderCRCError,
|
rlm@1
|
23 kIncorrectArchive,
|
rlm@1
|
24 kDataDescroptorsAreNotSupported,
|
rlm@1
|
25 kMultiVolumeArchiveAreNotSupported,
|
rlm@1
|
26 kReadStreamError,
|
rlm@1
|
27 kSeekStreamError
|
rlm@1
|
28 }
|
rlm@1
|
29 Cause;
|
rlm@1
|
30 CInArchiveException(ECauseType cause): Cause(cause) {}
|
rlm@1
|
31 };
|
rlm@1
|
32
|
rlm@1
|
33 class CInArchiveInfo
|
rlm@1
|
34 {
|
rlm@1
|
35 public:
|
rlm@1
|
36 UInt64 Base;
|
rlm@1
|
37 UInt64 StartPosition;
|
rlm@1
|
38 CByteBuffer Comment;
|
rlm@1
|
39 CInArchiveInfo(): Base(0), StartPosition(0) {}
|
rlm@1
|
40 void Clear()
|
rlm@1
|
41 {
|
rlm@1
|
42 Base = 0;
|
rlm@1
|
43 StartPosition = 0;
|
rlm@1
|
44 Comment.SetCapacity(0);
|
rlm@1
|
45 }
|
rlm@1
|
46 };
|
rlm@1
|
47
|
rlm@1
|
48 class CProgressVirt
|
rlm@1
|
49 {
|
rlm@1
|
50 public:
|
rlm@1
|
51 STDMETHOD(SetTotal)(UInt64 numFiles) PURE;
|
rlm@1
|
52 STDMETHOD(SetCompleted)(UInt64 numFiles) PURE;
|
rlm@1
|
53 };
|
rlm@1
|
54
|
rlm@1
|
55 struct CCdInfo
|
rlm@1
|
56 {
|
rlm@1
|
57 // UInt64 NumEntries;
|
rlm@1
|
58 UInt64 Size;
|
rlm@1
|
59 UInt64 Offset;
|
rlm@1
|
60 };
|
rlm@1
|
61
|
rlm@1
|
62 class CInArchive
|
rlm@1
|
63 {
|
rlm@1
|
64 CMyComPtr<IInStream> m_Stream;
|
rlm@1
|
65 UInt32 m_Signature;
|
rlm@1
|
66 UInt64 m_StreamStartPosition;
|
rlm@1
|
67 UInt64 m_Position;
|
rlm@1
|
68 AString m_NameBuffer;
|
rlm@1
|
69
|
rlm@1
|
70 HRESULT Seek(UInt64 offset);
|
rlm@1
|
71
|
rlm@1
|
72 HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
|
rlm@1
|
73 bool ReadUInt32(UInt32 &signature);
|
rlm@1
|
74 AString ReadFileName(UInt32 nameSize);
|
rlm@1
|
75
|
rlm@1
|
76 HRESULT ReadBytes(void *data, UInt32 size, UInt32 *processedSize);
|
rlm@1
|
77 bool ReadBytesAndTestSize(void *data, UInt32 size);
|
rlm@1
|
78 void SafeReadBytes(void *data, UInt32 size);
|
rlm@1
|
79 void ReadBuffer(CByteBuffer &buffer, UInt32 size);
|
rlm@1
|
80 Byte ReadByte();
|
rlm@1
|
81 UInt16 ReadUInt16();
|
rlm@1
|
82 UInt32 ReadUInt32();
|
rlm@1
|
83 UInt64 ReadUInt64();
|
rlm@1
|
84
|
rlm@1
|
85 void IncreaseRealPosition(UInt64 addValue);
|
rlm@1
|
86
|
rlm@1
|
87 void ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,
|
rlm@1
|
88 UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber);
|
rlm@1
|
89 HRESULT ReadLocalItem(CItemEx &item);
|
rlm@1
|
90 HRESULT ReadLocalItemDescriptor(CItemEx &item);
|
rlm@1
|
91 HRESULT ReadCdItem(CItemEx &item);
|
rlm@1
|
92 HRESULT TryEcd64(UInt64 offset, CCdInfo &cdInfo);
|
rlm@1
|
93 HRESULT FindCd(CCdInfo &cdInfo);
|
rlm@1
|
94 HRESULT TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress);
|
rlm@1
|
95 HRESULT ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress);
|
rlm@1
|
96 HRESULT ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset);
|
rlm@1
|
97 public:
|
rlm@1
|
98 CInArchiveInfo m_ArchiveInfo;
|
rlm@1
|
99 bool IsZip64;
|
rlm@1
|
100
|
rlm@1
|
101 HRESULT ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress);
|
rlm@1
|
102 HRESULT ReadLocalItemAfterCdItem(CItemEx &item);
|
rlm@1
|
103 HRESULT ReadLocalItemAfterCdItemFull(CItemEx &item);
|
rlm@1
|
104 HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
|
rlm@1
|
105 void Close();
|
rlm@1
|
106 void GetArchiveInfo(CInArchiveInfo &archiveInfo) const;
|
rlm@1
|
107 bool SeekInArchive(UInt64 position);
|
rlm@1
|
108 ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
|
rlm@1
|
109 IInStream* CreateStream();
|
rlm@1
|
110
|
rlm@1
|
111 bool IsOpen() const { return m_Stream != NULL; }
|
rlm@1
|
112 };
|
rlm@1
|
113
|
rlm@1
|
114 }}
|
rlm@1
|
115
|
rlm@1
|
116 #endif
|