Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / Archive / Zip / ZipIn.h
1 // Archive/ZipIn.h\r
2 \r
3 #ifndef __ZIP_IN_H\r
4 #define __ZIP_IN_H\r
5 \r
6 #include "Common/MyCom.h"\r
7 \r
8 #include "../../IStream.h"\r
9 \r
10 #include "../../Common/InBuffer.h"\r
11 \r
12 #include "ZipHeader.h"\r
13 #include "ZipItemEx.h"\r
14 \r
15 namespace NArchive {\r
16 namespace NZip {\r
17   \r
18 class CInArchiveException\r
19 {\r
20 public:\r
21   enum ECauseType\r
22   {\r
23     kUnexpectedEndOfArchive = 0,\r
24     kArchiceHeaderCRCError,\r
25     kFileHeaderCRCError,\r
26     kIncorrectArchive,\r
27     kDataDescroptorsAreNotSupported,\r
28     kMultiVolumeArchiveAreNotSupported,\r
29     kReadStreamError,\r
30     kSeekStreamError\r
31   }\r
32   Cause;\r
33   CInArchiveException(ECauseType cause): Cause(cause) {}\r
34 };\r
35 \r
36 class CInArchiveInfo\r
37 {\r
38 public:\r
39   UInt64 Base;\r
40   UInt64 StartPosition;\r
41   UInt64 FinishPosition;\r
42   CByteBuffer Comment;\r
43 \r
44   CInArchiveInfo(): Base(0), StartPosition(0) {}\r
45   UInt64 GetPhySize() const { return FinishPosition - StartPosition; }\r
46   void Clear()\r
47   {\r
48     Base = 0;\r
49     StartPosition = 0;\r
50     Comment.SetCapacity(0);\r
51   }\r
52 };\r
53 \r
54 class CProgressVirt\r
55 {\r
56 public:\r
57   STDMETHOD(SetTotal)(UInt64 numFiles) PURE;\r
58   STDMETHOD(SetCompleted)(UInt64 numFiles) PURE;\r
59 };\r
60 \r
61 struct CCdInfo\r
62 {\r
63   // UInt64 NumEntries;\r
64   UInt64 Size;\r
65   UInt64 Offset;\r
66 };\r
67 \r
68 class CInArchive\r
69 {\r
70   CMyComPtr<IInStream> m_Stream;\r
71   UInt32 m_Signature;\r
72   UInt64 m_StreamStartPosition;\r
73   UInt64 m_Position;\r
74  \r
75   bool _inBufMode;\r
76   CInBuffer _inBuffer;\r
77   \r
78   HRESULT Seek(UInt64 offset);\r
79 \r
80   HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);\r
81   void ReadFileName(UInt32 nameSize, AString &dest);\r
82   \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
87   Byte ReadByte();\r
88   UInt16 ReadUInt16();\r
89   UInt32 ReadUInt32();\r
90   UInt64 ReadUInt64();\r
91   bool ReadUInt32(UInt32 &signature);\r
92   \r
93   void Skip(UInt64 num);\r
94   void IncreaseRealPosition(UInt64 addValue);\r
95  \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
106 public:\r
107   CInArchiveInfo ArcInfo;\r
108   bool IsZip64;\r
109   bool IsOkHeaders;\r
110 \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
115   void Close();\r
116   bool SeekInArchive(UInt64 position);\r
117   ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);\r
118   IInStream* CreateStream();\r
119 \r
120   bool IsOpen() const { return m_Stream != NULL; }\r
121 };\r
122   \r
123 }}\r
124   \r
125 #endif\r