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
|