annotate src/win32/7zip/7z/CPP/7zip/Archive/Rar/RarIn.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 // RarIn.h
rlm@1 2
rlm@1 3 #ifndef __ARCHIVE_RAR_IN_H
rlm@1 4 #define __ARCHIVE_RAR_IN_H
rlm@1 5
rlm@1 6 #include "Common/DynamicBuffer.h"
rlm@1 7 #include "Common/MyCom.h"
rlm@1 8
rlm@1 9 #include "../../ICoder.h"
rlm@1 10 #include "../../IStream.h"
rlm@1 11
rlm@1 12 #include "../../Common/StreamObjects.h"
rlm@1 13
rlm@1 14 #include "../../Crypto/RarAes.h"
rlm@1 15
rlm@1 16 #include "RarHeader.h"
rlm@1 17 #include "RarItem.h"
rlm@1 18
rlm@1 19 namespace NArchive {
rlm@1 20 namespace NRar {
rlm@1 21
rlm@1 22 class CInArchiveException
rlm@1 23 {
rlm@1 24 public:
rlm@1 25 enum CCauseType
rlm@1 26 {
rlm@1 27 kUnexpectedEndOfArchive = 0,
rlm@1 28 kArchiveHeaderCRCError,
rlm@1 29 kFileHeaderCRCError,
rlm@1 30 kIncorrectArchive
rlm@1 31 }
rlm@1 32 Cause;
rlm@1 33 CInArchiveException(CCauseType cause) : Cause(cause) {}
rlm@1 34 };
rlm@1 35
rlm@1 36 class CInArchiveInfo
rlm@1 37 {
rlm@1 38 public:
rlm@1 39 UInt64 StartPosition;
rlm@1 40 UInt16 Flags;
rlm@1 41 UInt64 CommentPosition;
rlm@1 42 UInt16 CommentSize;
rlm@1 43 bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; }
rlm@1 44 bool IsCommented() const { return (Flags & NHeader::NArchive::kComment) != 0; }
rlm@1 45 bool IsVolume() const { return (Flags & NHeader::NArchive::kVolume) != 0; }
rlm@1 46 bool HaveNewVolumeName() const { return (Flags & NHeader::NArchive::kNewVolName) != 0; }
rlm@1 47 bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }
rlm@1 48 };
rlm@1 49
rlm@1 50 class CInArchive
rlm@1 51 {
rlm@1 52 CMyComPtr<IInStream> m_Stream;
rlm@1 53
rlm@1 54 UInt64 m_StreamStartPosition;
rlm@1 55 UInt64 m_Position;
rlm@1 56 UInt64 m_ArchiveStartPosition;
rlm@1 57
rlm@1 58 NHeader::NArchive::CHeader360 m_ArchiveHeader;
rlm@1 59 CDynamicBuffer<char> m_NameBuffer;
rlm@1 60 CDynamicBuffer<wchar_t> _unicodeNameBuffer;
rlm@1 61 bool m_SeekOnArchiveComment;
rlm@1 62 UInt64 m_ArchiveCommentPosition;
rlm@1 63
rlm@1 64 void ReadName(CItemEx &item, int nameSize);
rlm@1 65 void ReadHeaderReal(CItemEx &item);
rlm@1 66
rlm@1 67 HRESULT ReadBytes(void *data, UInt32 size, UInt32 *aProcessedSize);
rlm@1 68 bool ReadBytesAndTestSize(void *data, UInt32 size);
rlm@1 69 void ReadBytesAndTestResult(void *data, UInt32 size);
rlm@1 70
rlm@1 71 HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
rlm@1 72 HRESULT Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
rlm@1 73
rlm@1 74 void ThrowExceptionWithCode(CInArchiveException::CCauseType cause);
rlm@1 75 void ThrowUnexpectedEndOfArchiveException();
rlm@1 76
rlm@1 77 void AddToSeekValue(UInt64 addValue);
rlm@1 78
rlm@1 79 protected:
rlm@1 80
rlm@1 81 CDynamicBuffer<Byte> m_FileHeaderData;
rlm@1 82
rlm@1 83 NHeader::NBlock::CBlock m_BlockHeader;
rlm@1 84
rlm@1 85 NCrypto::NRar29::CDecoder *m_RarAESSpec;
rlm@1 86 CMyComPtr<ICompressFilter> m_RarAES;
rlm@1 87
rlm@1 88 Byte *m_CurData; // it must point to start of Rar::Block
rlm@1 89 UInt32 m_CurPos;
rlm@1 90 UInt32 m_PosLimit;
rlm@1 91 Byte ReadByte();
rlm@1 92 UInt16 ReadUInt16();
rlm@1 93 UInt32 ReadUInt32();
rlm@1 94 void ReadTime(Byte mask, CRarTime &rarTime);
rlm@1 95
rlm@1 96 CBuffer<Byte> m_DecryptedData;
rlm@1 97 UInt32 m_DecryptedDataSize;
rlm@1 98
rlm@1 99 bool m_CryptoMode;
rlm@1 100 UInt32 m_CryptoPos;
rlm@1 101 void FinishCryptoBlock()
rlm@1 102 {
rlm@1 103 if (m_CryptoMode)
rlm@1 104 while ((m_CryptoPos & 0xF) != 0)
rlm@1 105 {
rlm@1 106 m_CryptoPos++;
rlm@1 107 m_Position++;
rlm@1 108 }
rlm@1 109 }
rlm@1 110
rlm@1 111 public:
rlm@1 112 HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit);
rlm@1 113 void Close();
rlm@1 114 HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword);
rlm@1 115
rlm@1 116 void SkipArchiveComment();
rlm@1 117
rlm@1 118 void GetArchiveInfo(CInArchiveInfo &archiveInfo) const;
rlm@1 119
rlm@1 120 bool SeekInArchive(UInt64 position);
rlm@1 121 ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
rlm@1 122 };
rlm@1 123
rlm@1 124 }}
rlm@1 125
rlm@1 126 #endif