mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 08:07:06 -06:00
118 lines
2.3 KiB
C++
Executable File
118 lines
2.3 KiB
C++
Executable File
// Archive/ComIn.h
|
|
|
|
#ifndef __ARCHIVE_COM_IN_H
|
|
#define __ARCHIVE_COM_IN_H
|
|
|
|
#include "Common/MyString.h"
|
|
#include "Common/Buffer.h"
|
|
|
|
namespace NArchive {
|
|
namespace NCom {
|
|
|
|
struct CUInt32Buf
|
|
{
|
|
UInt32 *_buf;
|
|
public:
|
|
CUInt32Buf(): _buf(0) {}
|
|
~CUInt32Buf() { Free(); }
|
|
void Free();
|
|
bool Allocate(UInt32 numItems);
|
|
operator UInt32 *() const { return _buf; };
|
|
};
|
|
|
|
namespace NFatID
|
|
{
|
|
const UInt32 kFree = 0xFFFFFFFF;
|
|
const UInt32 kEndOfChain = 0xFFFFFFFE;
|
|
const UInt32 kFatSector = 0xFFFFFFFD;
|
|
const UInt32 kMatSector = 0xFFFFFFFC;
|
|
const UInt32 kMaxValue = 0xFFFFFFFA;
|
|
}
|
|
|
|
namespace NItemType
|
|
{
|
|
const Byte kEmpty = 0;
|
|
const Byte kStorage = 1;
|
|
const Byte kStream = 2;
|
|
const Byte kLockBytes = 3;
|
|
const Byte kProperty = 4;
|
|
const Byte kRootStorage = 5;
|
|
}
|
|
|
|
const UInt32 kNameSizeMax = 64;
|
|
|
|
struct CItem
|
|
{
|
|
Byte Name[kNameSizeMax];
|
|
// UInt16 NameSize;
|
|
// UInt32 Flags;
|
|
FILETIME CTime;
|
|
FILETIME MTime;
|
|
UInt64 Size;
|
|
UInt32 LeftDid;
|
|
UInt32 RightDid;
|
|
UInt32 SonDid;
|
|
UInt32 Sid;
|
|
Byte Type;
|
|
|
|
bool IsEmpty() const { return Type == NItemType::kEmpty; }
|
|
bool IsDir() const { return Type == NItemType::kStorage || Type == NItemType::kRootStorage; }
|
|
|
|
void Parse(const Byte *p, bool mode64bit);
|
|
};
|
|
|
|
struct CRef
|
|
{
|
|
int Parent;
|
|
UInt32 Did;
|
|
};
|
|
|
|
class CDatabase
|
|
{
|
|
UInt32 NumSectorsInMiniStream;
|
|
CUInt32Buf MiniSids;
|
|
|
|
HRESULT AddNode(int parent, UInt32 did);
|
|
public:
|
|
|
|
CUInt32Buf Fat;
|
|
UInt32 FatSize;
|
|
|
|
CUInt32Buf Mat;
|
|
UInt32 MatSize;
|
|
|
|
CObjectVector<CItem> Items;
|
|
CRecordVector<CRef> Refs;
|
|
|
|
UInt32 LongStreamMinSize;
|
|
int SectorSizeBits;
|
|
int MiniSectorSizeBits;
|
|
|
|
void Clear();
|
|
bool IsLargeStream(UInt64 size) const { return size >= LongStreamMinSize; }
|
|
UString GetItemPath(UInt32 index) const;
|
|
|
|
UInt64 GetItemPackSize(UInt64 size) const
|
|
{
|
|
UInt64 mask = ((UInt64)1 << (IsLargeStream(size) ? SectorSizeBits : MiniSectorSizeBits)) - 1;
|
|
return (size + mask) & ~mask;
|
|
}
|
|
|
|
bool GetMiniCluster(UInt32 sid, UInt64 &res) const
|
|
{
|
|
int subBits = SectorSizeBits - MiniSectorSizeBits;
|
|
UInt32 fid = sid >> subBits;
|
|
if (fid >= NumSectorsInMiniStream)
|
|
return false;
|
|
res = (((UInt64)MiniSids[fid] + 1) << subBits) + (sid & ((1 << subBits) - 1));
|
|
return true;
|
|
}
|
|
|
|
HRESULT Open(IInStream *inStream);
|
|
};
|
|
|
|
|
|
}}
|
|
|
|
#endif
|