blob: c195390578db05206d0b6cafdf3825c6bb0afd39 [file] [log] [blame]
// HfsIn.h
#ifndef __ARCHIVE_HFS_IN_H
#define __ARCHIVE_HFS_IN_H
#include "Common/MyString.h"
#include "Common/Buffer.h"
namespace NArchive {
namespace NHfs {
struct CExtent
{
UInt32 Pos;
UInt32 NumBlocks;
};
struct CFork
{
UInt64 Size;
// UInt32 ClumpSize;
UInt32 NumBlocks;
CExtent Extents[8];
void Parse(const Byte *p);
};
struct CVolHeader
{
Byte Header[2];
UInt16 Version;
// UInt32 Attr;
// UInt32 LastMountedVersion;
// UInt32 JournalInfoBlock;
UInt32 CTime;
UInt32 MTime;
// UInt32 BackupTime;
// UInt32 CheckedTime;
// UInt32 NumFiles;
// UInt32 NumFolders;
int BlockSizeLog;
UInt32 NumBlocks;
UInt32 NumFreeBlocks;
// UInt32 WriteCount;
// UInt32 FinderInfo[8];
// UInt64 VolID;
// CFork AllocationFile;
CFork ExtentsFile;
CFork CatalogFile;
// CFork AttributesFile;
// CFork StartupFile;
bool IsHfsX() const { return Version > 4; }
};
inline void HfsTimeToFileTime(UInt32 hfsTime, FILETIME &ft)
{
UInt64 v = ((UInt64)3600 * 24 * (365 * 303 + 24 * 3) + hfsTime) * 10000000;
ft.dwLowDateTime = (DWORD)v;
ft.dwHighDateTime = (DWORD)(v >> 32);
}
enum ERecordType
{
RECORD_TYPE_FOLDER = 1,
RECORD_TYPE_FILE = 2,
RECORD_TYPE_FOLDER_THREAD = 3,
RECORD_TYPE_FILE_THREAD = 4
};
struct CItem
{
UString Name;
UInt32 ParentID;
UInt16 Type;
// UInt16 Flags;
// UInt32 Valence;
UInt32 ID;
UInt32 CTime;
UInt32 MTime;
// UInt32 AttrMTime;
UInt32 ATime;
// UInt32 BackupDate;
/*
UInt32 OwnerID;
UInt32 GroupID;
Byte AdminFlags;
Byte OwnerFlags;
UInt16 FileMode;
union
{
UInt32 iNodeNum;
UInt32 LinkCount;
UInt32 RawDevice;
} special;
*/
UInt64 Size;
UInt32 NumBlocks;
CRecordVector<CExtent> Extents;
bool IsDir() const { return Type == RECORD_TYPE_FOLDER; }
CItem(): Size(0), NumBlocks(0) {}
};
struct CIdIndexPair
{
UInt32 ID;
int Index;
};
struct CProgressVirt
{
virtual HRESULT SetTotal(UInt64 numFiles) PURE;
virtual HRESULT SetCompleted(UInt64 numFiles) PURE;
};
class CDatabase
{
// CObjectVector<CIdExtents> FileExtents;
// CObjectVector<CIdExtents> ResExtents;
CRecordVector<CIdIndexPair> IdToIndexMap;
HRESULT LoadExtentFile(IInStream *inStream);
HRESULT LoadCatalog(IInStream *inStream, CProgressVirt *progress);
HRESULT ReadFile(const CFork &fork, CByteBuffer &buf, IInStream *inStream);
public:
CVolHeader Header;
CObjectVector<CItem> Items;
// bool CaseSensetive;
void Clear()
{
// CaseSensetive = false;
Items.Clear();
// FileExtents.Clear();
// ResExtents.Clear();
IdToIndexMap.Clear();
}
UString GetItemPath(int index) const;
HRESULT Open(IInStream *inStream, CProgressVirt *progress);
};
}}
#endif