annotate src/win32/7zip/7z/CPP/7zip/Archive/Zip/ZipIn.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
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