cabin.h

来自「由7-zip提供的压缩、解压缩程序」· C头文件 代码 · 共 167 行

H
167
字号
// Archive/CabIn.h#ifndef __ARCHIVE_CAB_IN_H#define __ARCHIVE_CAB_IN_H#include "../../IStream.h"#include "../../Common/InBuffer.h"#include "CabHeader.h"#include "CabItem.h"namespace NArchive {namespace NCab {class CInArchiveException{public:  enum CCauseType  {    kUnexpectedEndOfArchive = 0,    kIncorrectArchive,    kUnsupported,  } Cause;  CInArchiveException(CCauseType cause) : Cause(cause) {}};struct COtherArchive{  AString FileName;  AString DiskName;};struct CArchiveInfo{  Byte  VersionMinor;	/* cabinet file format version, minor */  Byte  VersionMajor;	/* cabinet file format version, major */  UInt16  NumFolders;	/* number of CFFOLDER entries in this cabinet */  UInt16  NumFiles;	/* number of CFFILE entries in this cabinet */  UInt16  Flags;	/* cabinet file option indicators */  UInt16  SetID;	/* must be the same for all cabinets in a set */  UInt16  CabinetNumber;	/* number of this cabinet file in a set */  bool ReserveBlockPresent() const { return (Flags & NHeader::NArchive::NFlags::kReservePresent) != 0; }  bool IsTherePrev() const { return (Flags & NHeader::NArchive::NFlags::kPrevCabinet) != 0; }  bool IsThereNext() const { return (Flags & NHeader::NArchive::NFlags::kNextCabinet) != 0; }  UInt16 PerCabinetAreaSize; 	// (optional) size of per-cabinet reserved area  Byte PerFolderAreaSize; 	// (optional) size of per-folder reserved area  Byte PerDataBlockAreaSize; 	// (optional) size of per-datablock reserved area  Byte GetDataBlockReserveSize() const { return (Byte)(ReserveBlockPresent() ? PerDataBlockAreaSize : 0); }  COtherArchive PreviousArchive;  COtherArchive NextArchive;  CArchiveInfo()  {    Clear();  }  void Clear()  {    PerCabinetAreaSize = 0;    PerFolderAreaSize = 0;    PerDataBlockAreaSize = 0;   }};struct CInArchiveInfo: public CArchiveInfo{  UInt32 Size;	/* size of this cabinet file in bytes */  UInt32 FileHeadersOffset;  //offset of the first CFFILE entry};class CDatabase{public:  UInt64 StartPosition;  CInArchiveInfo ArchiveInfo;  CObjectVector<CFolder> Folders;  CObjectVector<CItem> Items;  void Clear()  {    ArchiveInfo.Clear();    Folders.Clear();    Items.Clear();  }  bool IsTherePrevFolder() const  {    for (int i = 0; i < Items.Size(); i++)      if (Items[i].ContinuedFromPrev())        return true;    return false;  }  int GetNumberOfNewFolders() const   {    int res = Folders.Size();    if (IsTherePrevFolder())      res--;    return res;  }  UInt32 GetFileOffset(int index) const { return Items[index].Offset; }  UInt32 GetFileSize(int index) const { return Items[index].Size; }};class CDatabaseEx: public CDatabase{public:  CMyComPtr<IInStream> Stream;};struct CMvItem{  int VolumeIndex;  int ItemIndex;};class CMvDatabaseEx{  bool AreItemsEqual(int i1, int i2);public:  CObjectVector<CDatabaseEx> Volumes;  CRecordVector<CMvItem> Items;  CRecordVector<int> StartFolderOfVol;  CRecordVector<int> FolderStartFileIndex;  int GetFolderIndex(const CMvItem *mvi) const   {    const CDatabaseEx &db = Volumes[mvi->VolumeIndex];    return StartFolderOfVol[mvi->VolumeIndex] +         db.Items[mvi->ItemIndex].GetFolderIndex(db.Folders.Size());  }  void Clear()  {    Volumes.Clear();    Items.Clear();    StartFolderOfVol.Clear();    FolderStartFileIndex.Clear();  }  void FillSortAndShrink();  bool Check();};class CInArchive{  CInBuffer inBuffer;  Byte ReadByte();  UInt16 ReadUInt16();  UInt32 ReadUInt32();  AString SafeReadName();  void Skeep(size_t size);  void ReadOtherArchive(COtherArchive &oa);  HRESULT Open2(IInStream *inStream,       const UInt64 *searchHeaderSizeLimit,      CDatabase &database);public:  HRESULT Open(      const UInt64 *searchHeaderSizeLimit,      CDatabaseEx &database);};  }}  #endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?