rarin.h
来自「由7-zip提供的压缩、解压缩程序」· C头文件 代码 · 共 125 行
H
125 行
// RarIn.h#ifndef __ARCHIVE_RAR_IN_H#define __ARCHIVE_RAR_IN_H#include "Common/DynamicBuffer.h"#include "Common/Exception.h"#include "Common/MyCom.h"#include "../../IStream.h"#include "../../ICoder.h"#include "../../Common/StreamObjects.h"#include "../../Crypto/RarAES/RarAES.h"#include "RarHeader.h"#include "RarItem.h"namespace NArchive {namespace NRar {class CInArchiveException{public: enum CCauseType { kUnexpectedEndOfArchive = 0, kArchiveHeaderCRCError, kFileHeaderCRCError, kIncorrectArchive, } Cause; CInArchiveException(CCauseType cause) : Cause(cause) {}};class CInArchiveInfo{public: UInt64 StartPosition; WORD Flags; UInt64 CommentPosition; WORD CommentSize; bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; } bool IsCommented() const { return (Flags & NHeader::NArchive::kComment) != 0; } bool IsVolume() const { return (Flags & NHeader::NArchive::kVolume) != 0; } bool HaveNewVolumeName() const { return (Flags & NHeader::NArchive::kNewVolName) != 0; } bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }};class CInArchive{ CMyComPtr<IInStream> m_Stream; UInt64 m_StreamStartPosition; UInt64 m_Position; UInt64 m_ArchiveStartPosition; NHeader::NArchive::CHeader360 m_ArchiveHeader; CDynamicBuffer<char> m_NameBuffer; CDynamicBuffer<wchar_t> _unicodeNameBuffer; bool m_SeekOnArchiveComment; UInt64 m_ArchiveCommentPosition; void ReadName(CItemEx &item, int nameSize); void ReadHeaderReal(CItemEx &item); HRESULT ReadBytes(void *data, UInt32 size, UInt32 *aProcessedSize); bool ReadBytesAndTestSize(void *data, UInt32 size); void ReadBytesAndTestResult(void *data, UInt32 size); bool FindAndReadMarker(const UInt64 *searchHeaderSizeLimit); void ThrowExceptionWithCode(CInArchiveException::CCauseType cause); void ThrowUnexpectedEndOfArchiveException(); void AddToSeekValue(UInt64 addValue); protected: CDynamicBuffer<Byte> m_FileHeaderData; NHeader::NBlock::CBlock m_BlockHeader; NCrypto::NRar29::CDecoder *m_RarAESSpec; CMyComPtr<ICompressFilter> m_RarAES; Byte *m_CurData; // it must point to start of Rar::Block UInt32 m_CurPos; UInt32 m_PosLimit; Byte ReadByte(); UInt16 ReadUInt16(); UInt32 ReadUInt32(); void ReadTime(Byte mask, CRarTime &rarTime); CBuffer<Byte> m_DecryptedData; UInt32 m_DecryptedDataSize; bool m_CryptoMode; UInt32 m_CryptoPos; void FinishCryptoBlock() { if (m_CryptoMode) while ((m_CryptoPos & 0xF) != 0) { m_CryptoPos++; m_Position++; } } bool ReadMarkerAndArchiveHeader(const UInt64 *searchHeaderSizeLimit);public: bool Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit); void Close(); HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword); void SkipArchiveComment(); void GetArchiveInfo(CInArchiveInfo &archiveInfo) const; void DirectGetBytes(void *data, UInt32 size); bool SeekInArchive(UInt64 position); ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);}; }} #endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?