2731 lines
83 KiB
C++
2731 lines
83 KiB
C++
/*
|
|
* HLLib
|
|
* Copyright (C) 2006-2013 Ryan Gregg
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later
|
|
* version.
|
|
*/
|
|
|
|
#ifndef HLLIB_H
|
|
#define HLLIB_H
|
|
|
|
#ifdef _MSC_VER
|
|
# ifdef HLLIB_EXPORTS
|
|
# define HLLIB_API __declspec(dllexport)
|
|
# else
|
|
# define HLLIB_API __declspec(dllimport)
|
|
# endif
|
|
#else
|
|
# if defined(HAVE_GCCVISIBILITYPATCH) || __GNUC__ >= 4
|
|
# define HLLIB_API __attribute__ ((visibility("default")))
|
|
# else
|
|
# define HLLIB_API
|
|
# endif
|
|
#endif
|
|
|
|
typedef unsigned char hlBool;
|
|
typedef char hlChar;
|
|
#ifdef __cplusplus
|
|
typedef wchar_t hlWChar;
|
|
#else
|
|
typedef unsigned short hlWChar;
|
|
#endif
|
|
typedef unsigned char hlByte;
|
|
typedef signed short hlShort;
|
|
typedef unsigned short hlUShort;
|
|
typedef signed int hlInt;
|
|
typedef unsigned int hlUInt;
|
|
typedef signed long hlLong;
|
|
typedef unsigned long hlULong;
|
|
typedef signed long long hlLongLong;
|
|
typedef unsigned long long hlULongLong;
|
|
typedef float hlSingle;
|
|
typedef double hlDouble;
|
|
typedef void hlVoid;
|
|
|
|
#ifdef _MSC_VER
|
|
typedef unsigned __int8 hlUInt8;
|
|
typedef unsigned __int16 hlUInt16;
|
|
typedef unsigned __int32 hlUInt32;
|
|
typedef unsigned __int64 hlUInt64;
|
|
#else
|
|
# include <stdint.h>
|
|
|
|
typedef uint8_t hlUInt8;
|
|
typedef uint16_t hlUInt16;
|
|
typedef uint32_t hlUInt32;
|
|
typedef uint64_t hlUInt64;
|
|
#endif
|
|
|
|
typedef hlSingle hlFloat;
|
|
|
|
#define hlFalse 0
|
|
#define hlTrue 1
|
|
|
|
#define HL_VERSION_NUMBER ((2 << 24) | (4 << 16) | (6 << 8) | 0)
|
|
#define HL_VERSION_STRING "2.4.6"
|
|
|
|
#define HL_ID_INVALID 0xffffffff
|
|
|
|
#define HL_DEFAULT_PACKAGE_TEST_BUFFER_SIZE 8
|
|
#define HL_DEFAULT_VIEW_SIZE 131072
|
|
#define HL_DEFAULT_COPY_BUFFER_SIZE 131072
|
|
|
|
//
|
|
// C data types.
|
|
//
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef enum
|
|
{
|
|
HL_VERSION = 0,
|
|
HL_ERROR,
|
|
HL_ERROR_SYSTEM,
|
|
HL_ERROR_SHORT_FORMATED,
|
|
HL_ERROR_LONG_FORMATED,
|
|
HL_PROC_OPEN,
|
|
HL_PROC_CLOSE,
|
|
HL_PROC_READ,
|
|
HL_PROC_WRITE,
|
|
HL_PROC_SEEK,
|
|
HL_PROC_TELL,
|
|
HL_PROC_SIZE,
|
|
HL_PROC_EXTRACT_ITEM_START,
|
|
HL_PROC_EXTRACT_ITEM_END,
|
|
HL_PROC_EXTRACT_FILE_PROGRESS,
|
|
HL_PROC_VALIDATE_FILE_PROGRESS,
|
|
HL_OVERWRITE_FILES,
|
|
HL_PACKAGE_BOUND,
|
|
HL_PACKAGE_ID,
|
|
HL_PACKAGE_SIZE,
|
|
HL_PACKAGE_TOTAL_ALLOCATIONS,
|
|
HL_PACKAGE_TOTAL_MEMORY_ALLOCATED,
|
|
HL_PACKAGE_TOTAL_MEMORY_USED,
|
|
HL_READ_ENCRYPTED,
|
|
HL_FORCE_DEFRAGMENT,
|
|
HL_PROC_DEFRAGMENT_PROGRESS,
|
|
HL_PROC_DEFRAGMENT_PROGRESS_EX,
|
|
HL_PROC_SEEK_EX,
|
|
HL_PROC_TELL_EX,
|
|
HL_PROC_SIZE_EX
|
|
} HLOption;
|
|
|
|
typedef enum
|
|
{
|
|
HL_MODE_INVALID = 0x00,
|
|
HL_MODE_READ = 0x01,
|
|
HL_MODE_WRITE = 0x02,
|
|
HL_MODE_CREATE = 0x04,
|
|
HL_MODE_VOLATILE = 0x08,
|
|
HL_MODE_NO_FILEMAPPING = 0x10,
|
|
HL_MODE_QUICK_FILEMAPPING = 0x20
|
|
} HLFileMode;
|
|
|
|
typedef enum
|
|
{
|
|
HL_SEEK_BEGINNING = 0,
|
|
HL_SEEK_CURRENT,
|
|
HL_SEEK_END
|
|
} HLSeekMode;
|
|
|
|
typedef enum
|
|
{
|
|
HL_ITEM_NONE = 0,
|
|
HL_ITEM_FOLDER,
|
|
HL_ITEM_FILE
|
|
} HLDirectoryItemType;
|
|
|
|
typedef enum
|
|
{
|
|
HL_ORDER_ASCENDING = 0,
|
|
HL_ORDER_DESCENDING
|
|
} HLSortOrder;
|
|
|
|
typedef enum
|
|
{
|
|
HL_FIELD_NAME = 0,
|
|
HL_FIELD_SIZE
|
|
} HLSortField;
|
|
|
|
typedef enum
|
|
{
|
|
HL_FIND_FILES = 0x01,
|
|
HL_FIND_FOLDERS = 0x02,
|
|
HL_FIND_NO_RECURSE = 0x04,
|
|
HL_FIND_CASE_SENSITIVE = 0x08,
|
|
HL_FIND_MODE_STRING = 0x10,
|
|
HL_FIND_MODE_SUBSTRING = 0x20,
|
|
HL_FIND_MODE_WILDCARD = 0x00,
|
|
HL_FIND_ALL = HL_FIND_FILES | HL_FIND_FOLDERS
|
|
} HLFindType;
|
|
|
|
typedef enum
|
|
{
|
|
HL_STREAM_NONE = 0,
|
|
HL_STREAM_FILE,
|
|
HL_STREAM_GCF,
|
|
HL_STREAM_MAPPING,
|
|
HL_STREAM_MEMORY,
|
|
HL_STREAM_PROC,
|
|
HL_STREAM_NULL
|
|
} HLStreamType;
|
|
|
|
typedef enum
|
|
{
|
|
HL_MAPPING_NONE = 0,
|
|
HL_MAPPING_FILE,
|
|
HL_MAPPING_MEMORY,
|
|
HL_MAPPING_STREAM
|
|
} HLMappingType;
|
|
|
|
typedef enum
|
|
{
|
|
HL_PACKAGE_NONE = 0,
|
|
HL_PACKAGE_BSP,
|
|
HL_PACKAGE_GCF,
|
|
HL_PACKAGE_PAK,
|
|
HL_PACKAGE_VBSP,
|
|
HL_PACKAGE_WAD,
|
|
HL_PACKAGE_XZP,
|
|
HL_PACKAGE_ZIP,
|
|
HL_PACKAGE_NCF,
|
|
HL_PACKAGE_VPK,
|
|
HL_PACKAGE_SGA
|
|
} HLPackageType;
|
|
|
|
typedef enum
|
|
{
|
|
HL_ATTRIBUTE_INVALID = 0,
|
|
HL_ATTRIBUTE_BOOLEAN,
|
|
HL_ATTRIBUTE_INTEGER,
|
|
HL_ATTRIBUTE_UNSIGNED_INTEGER,
|
|
HL_ATTRIBUTE_FLOAT,
|
|
HL_ATTRIBUTE_STRING
|
|
} HLAttributeType;
|
|
|
|
typedef enum
|
|
{
|
|
HL_BSP_PACKAGE_VERSION = 0,
|
|
HL_BSP_PACKAGE_COUNT,
|
|
HL_BSP_ITEM_WIDTH = 0,
|
|
HL_BSP_ITEM_HEIGHT,
|
|
HL_BSP_ITEM_PALETTE_ENTRIES,
|
|
HL_BSP_ITEM_COUNT,
|
|
|
|
HL_GCF_PACKAGE_VERSION = 0,
|
|
HL_GCF_PACKAGE_ID,
|
|
HL_GCF_PACKAGE_ALLOCATED_BLOCKS,
|
|
HL_GCF_PACKAGE_USED_BLOCKS,
|
|
HL_GCF_PACKAGE_BLOCK_LENGTH,
|
|
HL_GCF_PACKAGE_LAST_VERSION_PLAYED,
|
|
HL_GCF_PACKAGE_COUNT,
|
|
HL_GCF_ITEM_ENCRYPTED = 0,
|
|
HL_GCF_ITEM_COPY_LOCAL,
|
|
HL_GCF_ITEM_OVERWRITE_LOCAL,
|
|
HL_GCF_ITEM_BACKUP_LOCAL,
|
|
HL_GCF_ITEM_FLAGS,
|
|
HL_GCF_ITEM_FRAGMENTATION,
|
|
HL_GCF_ITEM_COUNT,
|
|
|
|
HL_NCF_PACKAGE_VERSION = 0,
|
|
HL_NCF_PACKAGE_ID,
|
|
HL_NCF_PACKAGE_LAST_VERSION_PLAYED,
|
|
HL_NCF_PACKAGE_COUNT,
|
|
HL_NCF_ITEM_ENCRYPTED = 0,
|
|
HL_NCF_ITEM_COPY_LOCAL,
|
|
HL_NCF_ITEM_OVERWRITE_LOCAL,
|
|
HL_NCF_ITEM_BACKUP_LOCAL,
|
|
HL_NCF_ITEM_FLAGS,
|
|
HL_NCF_ITEM_COUNT,
|
|
|
|
HL_PAK_PACKAGE_COUNT = 0,
|
|
HL_PAK_ITEM_COUNT = 0,
|
|
|
|
HL_SGA_PACKAGE_VERSION_MAJOR = 0,
|
|
HL_SGA_PACKAGE_VERSION_MINOR,
|
|
HL_SGA_PACKAGE_MD5_FILE,
|
|
HL_SGA_PACKAGE_NAME,
|
|
HL_SGA_PACKAGE_MD5_HEADER,
|
|
HL_SGA_PACKAGE_COUNT,
|
|
HL_SGA_ITEM_SECTION_ALIAS = 0,
|
|
HL_SGA_ITEM_SECTION_NAME,
|
|
HL_SGA_ITEM_MODIFIED,
|
|
HL_SGA_ITEM_TYPE,
|
|
HL_SGA_ITEM_CRC,
|
|
HL_SGA_ITEM_VERIFICATION,
|
|
HL_SGA_ITEM_COUNT,
|
|
|
|
HL_VBSP_PACKAGE_VERSION = 0,
|
|
HL_VBSP_PACKAGE_MAP_REVISION,
|
|
HL_VBSP_PACKAGE_COUNT,
|
|
HL_VBSP_ITEM_VERSION = 0,
|
|
HL_VBSP_ITEM_FOUR_CC,
|
|
HL_VBSP_ZIP_PACKAGE_DISK,
|
|
HL_VBSP_ZIP_PACKAGE_COMMENT,
|
|
HL_VBSP_ZIP_ITEM_CREATE_VERSION,
|
|
HL_VBSP_ZIP_ITEM_EXTRACT_VERSION,
|
|
HL_VBSP_ZIP_ITEM_FLAGS,
|
|
HL_VBSP_ZIP_ITEM_COMPRESSION_METHOD,
|
|
HL_VBSP_ZIP_ITEM_CRC,
|
|
HL_VBSP_ZIP_ITEM_DISK,
|
|
HL_VBSP_ZIP_ITEM_COMMENT,
|
|
HL_VBSP_ITEM_COUNT,
|
|
|
|
HL_VPK_PACKAGE_Archives = 0,
|
|
HL_VPK_PACKAGE_Version,
|
|
HL_VPK_PACKAGE_COUNT,
|
|
HL_VPK_ITEM_PRELOAD_BYTES = 0,
|
|
HL_VPK_ITEM_ARCHIVE,
|
|
HL_VPK_ITEM_CRC,
|
|
HL_VPK_ITEM_COUNT,
|
|
|
|
HL_WAD_PACKAGE_VERSION = 0,
|
|
HL_WAD_PACKAGE_COUNT,
|
|
HL_WAD_ITEM_WIDTH = 0,
|
|
HL_WAD_ITEM_HEIGHT,
|
|
HL_WAD_ITEM_PALETTE_ENTRIES,
|
|
HL_WAD_ITEM_MIPMAPS,
|
|
HL_WAD_ITEM_COMPRESSED,
|
|
HL_WAD_ITEM_TYPE,
|
|
HL_WAD_ITEM_COUNT,
|
|
|
|
HL_XZP_PACKAGE_VERSION = 0,
|
|
HL_XZP_PACKAGE_PRELOAD_BYTES,
|
|
HL_XZP_PACKAGE_COUNT,
|
|
HL_XZP_ITEM_CREATED = 0,
|
|
HL_XZP_ITEM_PRELOAD_BYTES,
|
|
HL_XZP_ITEM_COUNT,
|
|
|
|
HL_ZIP_PACKAGE_DISK = 0,
|
|
HL_ZIP_PACKAGE_COMMENT,
|
|
HL_ZIP_PACKAGE_COUNT,
|
|
HL_ZIP_ITEM_CREATE_VERSION = 0,
|
|
HL_ZIP_ITEM_EXTRACT_VERSION,
|
|
HL_ZIP_ITEM_FLAGS,
|
|
HL_ZIP_ITEM_COMPRESSION_METHOD,
|
|
HL_ZIP_ITEM_CRC,
|
|
HL_ZIP_ITEM_DISK,
|
|
HL_ZIP_ITEM_COMMENT,
|
|
HL_ZIP_ITEM_COUNT
|
|
} HLPackageAttribute;
|
|
|
|
typedef enum
|
|
{
|
|
HL_VALIDATES_OK = 0,
|
|
HL_VALIDATES_ASSUMED_OK,
|
|
HL_VALIDATES_INCOMPLETE,
|
|
HL_VALIDATES_CORRUPT,
|
|
HL_VALIDATES_CANCELED,
|
|
HL_VALIDATES_ERROR
|
|
} HLValidation;
|
|
|
|
typedef struct
|
|
{
|
|
HLAttributeType eAttributeType;
|
|
hlChar lpName[252];
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
hlBool bValue;
|
|
} Boolean;
|
|
struct
|
|
{
|
|
hlInt iValue;
|
|
} Integer;
|
|
struct
|
|
{
|
|
hlUInt uiValue;
|
|
hlBool bHexadecimal;
|
|
} UnsignedInteger;
|
|
struct
|
|
{
|
|
hlFloat fValue;
|
|
} Float;
|
|
struct
|
|
{
|
|
hlChar lpValue[256];
|
|
} String;
|
|
} Value;
|
|
} HLAttribute;
|
|
|
|
typedef hlVoid HLDirectoryItem;
|
|
typedef hlVoid HLStream;
|
|
|
|
typedef hlBool (*POpenProc) (hlUInt, hlVoid *);
|
|
typedef hlVoid (*PCloseProc)(hlVoid *);
|
|
typedef hlUInt (*PReadProc) (hlVoid *, hlUInt, hlVoid *);
|
|
typedef hlUInt (*PWriteProc) (const hlVoid *, hlUInt, hlVoid *);
|
|
typedef hlULongLong (*PSeekExProc) (hlLongLong, HLSeekMode, hlVoid *);
|
|
typedef hlUInt (*PTellProc) (hlVoid *);
|
|
typedef hlULongLong (*PTellExProc) (hlVoid *);
|
|
typedef hlUInt (*PSizeProc) (hlVoid *);
|
|
typedef hlULongLong (*PSizeExProc) (hlVoid *);
|
|
|
|
typedef hlVoid (*PExtractItemStartProc) (const HLDirectoryItem *pItem);
|
|
typedef hlVoid (*PExtractItemEndProc) (const HLDirectoryItem *pItem, hlBool bSuccess);
|
|
typedef hlVoid (*PExtractFileProgressProc) (const HLDirectoryItem *pFile, hlUInt uiBytesExtracted, hlUInt uiBytesTotal, hlBool *pCancel);
|
|
typedef hlVoid (*PValidateFileProgressProc) (const HLDirectoryItem *pFile, hlUInt uiBytesValidated, hlUInt uiBytesTotal, hlBool *pCancel);
|
|
typedef hlVoid (*PDefragmentProgressProc) (const HLDirectoryItem *pFile, hlUInt uiFilesDefragmented, hlUInt uiFilesTotal, hlUInt uiBytesDefragmented, hlUInt uiBytesTotal, hlBool *pCancel);
|
|
typedef hlVoid (*PDefragmentProgressExProc) (const HLDirectoryItem *pFile, hlUInt uiFilesDefragmented, hlUInt uiFilesTotal, hlULongLong uiBytesDefragmented, hlULongLong uiBytesTotal, hlBool *pCancel);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// C library routines.
|
|
//
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
HLLIB_API hlVoid hlInitialize();
|
|
HLLIB_API hlVoid hlShutdown();
|
|
|
|
//
|
|
// Get/Set
|
|
//
|
|
|
|
HLLIB_API hlBool hlGetBoolean(HLOption eOption);
|
|
HLLIB_API hlBool hlGetBooleanValidate(HLOption eOption, hlBool *pValue);
|
|
HLLIB_API hlVoid hlSetBoolean(HLOption eOption, hlBool bValue);
|
|
|
|
HLLIB_API hlInt hlGetInteger(HLOption eOption);
|
|
HLLIB_API hlBool hlGetIntegerValidate(HLOption eOption, hlInt *pValue);
|
|
HLLIB_API hlVoid hlSetInteger(HLOption eOption, hlInt iValue);
|
|
|
|
HLLIB_API hlUInt hlGetUnsignedInteger(HLOption eOption);
|
|
HLLIB_API hlBool hlGetUnsignedIntegerValidate(HLOption eOption, hlUInt *pValue);
|
|
HLLIB_API hlVoid hlSetUnsignedInteger(HLOption eOption, hlUInt iValue);
|
|
|
|
HLLIB_API hlLongLong hlGetLongLong(HLOption eOption);
|
|
HLLIB_API hlBool hlGetLongLongValidate(HLOption eOption, hlLongLong *pValue);
|
|
HLLIB_API hlVoid hlSetLongLong(HLOption eOption, hlLongLong iValue);
|
|
|
|
HLLIB_API hlULongLong hlGetUnsignedLongLong(HLOption eOption);
|
|
HLLIB_API hlBool hlGetUnsignedLongLongValidate(HLOption eOption, hlULongLong *pValue);
|
|
HLLIB_API hlVoid hlSetUnsignedLongLong(HLOption eOption, hlULongLong iValue);
|
|
|
|
HLLIB_API hlFloat hlGetFloat(HLOption eOption);
|
|
HLLIB_API hlBool hlGetFloatValidate(HLOption eOption, hlFloat *pValue);
|
|
HLLIB_API hlVoid hlSetFloat(HLOption eOption, hlFloat fValue);
|
|
|
|
HLLIB_API const hlChar *hlGetString(HLOption eOption);
|
|
HLLIB_API hlBool hlGetStringValidate(HLOption eOption, const hlChar **pValue);
|
|
HLLIB_API hlVoid hlSetString(HLOption eOption, const hlChar *lpValue);
|
|
|
|
HLLIB_API const hlVoid *hlGetVoid(HLOption eOption);
|
|
HLLIB_API hlBool hlGetVoidValidate(HLOption eOption, const hlVoid **pValue);
|
|
HLLIB_API hlVoid hlSetVoid(HLOption eOption, const hlVoid *pValue);
|
|
|
|
//
|
|
// Attributes
|
|
//
|
|
|
|
HLLIB_API hlBool hlAttributeGetBoolean(HLAttribute *pAttribute);
|
|
HLLIB_API hlVoid hlAttributeSetBoolean(HLAttribute *pAttribute, const hlChar *lpName, hlBool bValue);
|
|
|
|
HLLIB_API hlInt hlAttributeGetInteger(HLAttribute *pAttribute);
|
|
HLLIB_API hlVoid hlAttributeSetInteger(HLAttribute *pAttribute, const hlChar *lpName, hlInt iValue);
|
|
|
|
HLLIB_API hlUInt hlAttributeGetUnsignedInteger(HLAttribute *pAttribute);
|
|
HLLIB_API hlVoid hlAttributeSetUnsignedInteger(HLAttribute *pAttribute, const hlChar *lpName, hlUInt uiValue, hlBool bHexadecimal);
|
|
|
|
HLLIB_API hlFloat hlAttributeGetFloat(HLAttribute *pAttribute);
|
|
HLLIB_API hlVoid hlAttributeSetFloat(HLAttribute *pAttribute, const hlChar *lpName, hlFloat fValue);
|
|
|
|
HLLIB_API const hlChar *hlAttributeGetString(HLAttribute *pAttribute);
|
|
HLLIB_API hlVoid hlAttributeSetString(HLAttribute *pAttribute, const hlChar *lpName, const hlChar *lpValue);
|
|
|
|
//
|
|
// Directory Item
|
|
//
|
|
|
|
HLLIB_API HLDirectoryItemType hlItemGetType(const HLDirectoryItem *pItem);
|
|
|
|
HLLIB_API const hlChar *hlItemGetName(const HLDirectoryItem *pItem);
|
|
HLLIB_API hlUInt hlItemGetID(const HLDirectoryItem *pItem);
|
|
HLLIB_API const hlVoid *hlItemGetData(const HLDirectoryItem *pItem);
|
|
|
|
HLLIB_API hlUInt hlItemGetPackage(const HLDirectoryItem *pItem);
|
|
HLLIB_API HLDirectoryItem *hlItemGetParent(HLDirectoryItem *pItem);
|
|
|
|
HLLIB_API hlBool hlItemGetSize(const HLDirectoryItem *pItem, hlUInt *pSize);
|
|
HLLIB_API hlBool hlItemGetSizeEx(const HLDirectoryItem *pItem, hlULongLong *pSize);
|
|
HLLIB_API hlBool hlItemGetSizeOnDisk(const HLDirectoryItem *pItem, hlUInt *pSize);
|
|
HLLIB_API hlBool hlItemGetSizeOnDiskEx(const HLDirectoryItem *pItem, hlULongLong *pSize);
|
|
|
|
HLLIB_API hlVoid hlItemGetPath(const HLDirectoryItem *pItem, hlChar *lpPath, hlUInt uiPathSize);
|
|
HLLIB_API hlBool hlItemExtract(HLDirectoryItem *pItem, const hlChar *lpPath);
|
|
|
|
//
|
|
// Directory Folder
|
|
//
|
|
|
|
HLLIB_API hlUInt hlFolderGetCount(const HLDirectoryItem *pItem);
|
|
|
|
HLLIB_API HLDirectoryItem *hlFolderGetItem(HLDirectoryItem *pItem, hlUInt uiIndex);
|
|
HLLIB_API HLDirectoryItem *hlFolderGetItemByName(HLDirectoryItem *pItem, const hlChar *lpName, HLFindType eFind);
|
|
HLLIB_API HLDirectoryItem *hlFolderGetItemByPath(HLDirectoryItem *pItem, const hlChar *lpPath, HLFindType eFind);
|
|
|
|
HLLIB_API hlVoid hlFolderSort(HLDirectoryItem *pItem, HLSortField eField, HLSortOrder eOrder, hlBool bRecurse);
|
|
|
|
HLLIB_API HLDirectoryItem *hlFolderFindFirst(HLDirectoryItem *pFolder, const hlChar *lpSearch, HLFindType eFind);
|
|
HLLIB_API HLDirectoryItem *hlFolderFindNext(HLDirectoryItem *pFolder, HLDirectoryItem *pItem, const hlChar *lpSearch, HLFindType eFind);
|
|
|
|
HLLIB_API hlUInt hlFolderGetSize(const HLDirectoryItem *pItem, hlBool bRecurse);
|
|
HLLIB_API hlULongLong hlFolderGetSizeEx(const HLDirectoryItem *pItem, hlBool bRecurse);
|
|
HLLIB_API hlUInt hlFolderGetSizeOnDisk(const HLDirectoryItem *pItem, hlBool bRecurse);
|
|
HLLIB_API hlULongLong hlFolderGetSizeOnDiskEx(const HLDirectoryItem *pItem, hlBool bRecurse);
|
|
HLLIB_API hlUInt hlFolderGetFolderCount(const HLDirectoryItem *pItem, hlBool bRecurse);
|
|
HLLIB_API hlUInt hlFolderGetFileCount(const HLDirectoryItem *pItem, hlBool bRecurse);
|
|
|
|
//
|
|
// Directory File
|
|
//
|
|
|
|
HLLIB_API hlUInt hlFileGetExtractable(const HLDirectoryItem *pItem);
|
|
HLLIB_API HLValidation hlFileGetValidation(const HLDirectoryItem *pItem);
|
|
HLLIB_API hlUInt hlFileGetSize(const HLDirectoryItem *pItem);
|
|
HLLIB_API hlUInt hlFileGetSizeOnDisk(const HLDirectoryItem *pItem);
|
|
|
|
HLLIB_API hlBool hlFileCreateStream(HLDirectoryItem *pItem, HLStream **pStream);
|
|
HLLIB_API hlVoid hlFileReleaseStream(HLDirectoryItem *pItem, HLStream *pStream);
|
|
|
|
//
|
|
// Stream
|
|
//
|
|
|
|
HLLIB_API HLStreamType hlStreamGetType(const HLStream *pStream);
|
|
|
|
HLLIB_API hlBool hlStreamGetOpened(const HLStream *pStream);
|
|
HLLIB_API hlUInt hlStreamGetMode(const HLStream *pStream);
|
|
|
|
HLLIB_API hlBool hlStreamOpen(HLStream *pStream, hlUInt uiMode);
|
|
HLLIB_API hlVoid hlStreamClose(HLStream *pStream);
|
|
|
|
HLLIB_API hlUInt hlStreamGetStreamSize(const HLStream *pStream);
|
|
HLLIB_API hlULongLong hlStreamGetStreamSizeEx(const HLStream *pStream);
|
|
HLLIB_API hlUInt hlStreamGetStreamPointer(const HLStream *pStream);
|
|
HLLIB_API hlULongLong hlStreamGetStreamPointerEx(const HLStream *pStream);
|
|
|
|
HLLIB_API hlUInt hlStreamSeek(HLStream *pStream, hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
HLLIB_API hlULongLong hlStreamSeekEx(HLStream *pStream, hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
|
|
HLLIB_API hlBool hlStreamReadChar(HLStream *pStream, hlChar *pChar);
|
|
HLLIB_API hlUInt hlStreamRead(HLStream *pStream, hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
HLLIB_API hlBool hlStreamWriteChar(HLStream *pStream, hlChar iChar);
|
|
HLLIB_API hlUInt hlStreamWrite(HLStream *pStream, const hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
//
|
|
// Package
|
|
//
|
|
|
|
HLLIB_API hlBool hlBindPackage(hlUInt uiPackage);
|
|
|
|
HLLIB_API HLPackageType hlGetPackageTypeFromName(const hlChar *lpName);
|
|
HLLIB_API HLPackageType hlGetPackageTypeFromMemory(const hlVoid *lpBuffer, hlUInt uiBufferSize);
|
|
HLLIB_API HLPackageType hlGetPackageTypeFromStream(HLStream *pStream);
|
|
HLLIB_API hlBool hlCreatePackage(HLPackageType ePackageType, hlUInt *uiPackage);
|
|
HLLIB_API hlVoid hlDeletePackage(hlUInt uiPackage);
|
|
|
|
HLLIB_API HLPackageType hlPackageGetType();
|
|
HLLIB_API const hlChar *hlPackageGetExtension();
|
|
HLLIB_API const hlChar *hlPackageGetDescription();
|
|
|
|
HLLIB_API hlBool hlPackageGetOpened();
|
|
|
|
HLLIB_API hlBool hlPackageOpenFile(const hlChar *lpFileName, hlUInt uiMode);
|
|
HLLIB_API hlBool hlPackageOpenMemory(hlVoid *lpData, hlUInt uiBufferSize, hlUInt uiMode);
|
|
HLLIB_API hlBool hlPackageOpenProc(hlVoid *pUserData, hlUInt uiMode);
|
|
HLLIB_API hlBool hlPackageOpenStream(HLStream *pStream, hlUInt uiMode);
|
|
HLLIB_API hlVoid hlPackageClose();
|
|
|
|
HLLIB_API hlBool hlPackageDefragment();
|
|
|
|
HLLIB_API HLDirectoryItem *hlPackageGetRoot();
|
|
|
|
HLLIB_API hlUInt hlPackageGetAttributeCount();
|
|
HLLIB_API const hlChar *hlPackageGetAttributeName(HLPackageAttribute eAttribute);
|
|
HLLIB_API hlBool hlPackageGetAttribute(HLPackageAttribute eAttribute, HLAttribute *pAttribute);
|
|
|
|
HLLIB_API hlUInt hlPackageGetItemAttributeCount();
|
|
HLLIB_API const hlChar *hlPackageGetItemAttributeName(HLPackageAttribute eAttribute);
|
|
HLLIB_API hlBool hlPackageGetItemAttribute(const HLDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute *pAttribute);
|
|
|
|
HLLIB_API hlBool hlPackageGetExtractable(const HLDirectoryItem *pFile, hlBool *pExtractable);
|
|
HLLIB_API hlBool hlPackageGetFileSize(const HLDirectoryItem *pFile, hlUInt *pSize);
|
|
HLLIB_API hlBool hlPackageGetFileSizeOnDisk(const HLDirectoryItem *pFile, hlUInt *pSize);
|
|
HLLIB_API hlBool hlPackageCreateStream(const HLDirectoryItem *pFile, HLStream **pStream);
|
|
HLLIB_API hlVoid hlPackageReleaseStream(HLStream *pStream);
|
|
|
|
HLLIB_API const hlChar *hlNCFFileGetRootPath();
|
|
HLLIB_API hlVoid hlNCFFileSetRootPath(const hlChar *lpRootPath);
|
|
|
|
HLLIB_API hlBool hlWADFileGetImageSizePaletted(const HLDirectoryItem *pFile, hlUInt *uiPaletteDataSize, hlUInt *uiPixelDataSize);
|
|
HLLIB_API hlBool hlWADFileGetImageDataPaletted(const HLDirectoryItem *pFile, hlUInt *uiWidth, hlUInt *uiHeight, hlByte **lpPaletteData, hlByte **lpPixelData);
|
|
HLLIB_API hlBool hlWADFileGetImageSize(const HLDirectoryItem *pFile, hlUInt *uiPixelDataSize);
|
|
HLLIB_API hlBool hlWADFileGetImageData(const HLDirectoryItem *pFile, hlUInt *uiWidth, hlUInt *uiHeight, hlByte **lpPixelData);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
|
|
# include <list>
|
|
|
|
namespace HLLib
|
|
{
|
|
class HLLIB_API CDirectoryItem;
|
|
class HLLIB_API CDirectoryFile;
|
|
class HLLIB_API CDirectoryFolder;
|
|
|
|
namespace Streams
|
|
{
|
|
class HLLIB_API IStream;
|
|
class HLLIB_API CFileStream;
|
|
class HLLIB_API CGCFStream;
|
|
class HLLIB_API CMappingStream;
|
|
class HLLIB_API CMemoryStream;
|
|
class HLLIB_API CNullStream;
|
|
class HLLIB_API CProcStream;
|
|
}
|
|
|
|
namespace Mapping
|
|
{
|
|
class HLLIB_API CView;
|
|
class HLLIB_API CViewList;
|
|
class HLLIB_API CMapping;
|
|
class HLLIB_API CFileMapping;
|
|
class HLLIB_API CMemoryMapping;
|
|
class HLLIB_API CStreamMapping;
|
|
}
|
|
|
|
class HLLIB_API CStreamList;
|
|
class HLLIB_API CPackage;
|
|
class HLLIB_API CBSPFile;
|
|
class HLLIB_API CGCFFile;
|
|
class HLLIB_API CNCFFile;
|
|
class HLLIB_API CPAKFile;
|
|
class HLLIB_API CVBSPFile;
|
|
class HLLIB_API CVPKFile;
|
|
class HLLIB_API CWADFile;
|
|
class HLLIB_API CXZPFile;
|
|
class HLLIB_API CZIPFile;
|
|
}
|
|
|
|
namespace HLLib
|
|
{
|
|
//
|
|
// CDirectoryItem
|
|
//
|
|
|
|
class HLLIB_API CDirectoryItem
|
|
{
|
|
private:
|
|
hlChar *lpName;
|
|
hlUInt uiID;
|
|
hlVoid *pData;
|
|
CPackage *pPackage;
|
|
CDirectoryFolder *pParent;
|
|
|
|
public:
|
|
CDirectoryItem(const hlChar *lpName, hlUInt uiID, hlVoid *pData, CPackage *pPackage, CDirectoryFolder *pParent);
|
|
virtual ~CDirectoryItem();
|
|
|
|
virtual HLDirectoryItemType GetType() const = 0;
|
|
|
|
const hlChar *GetName() const;
|
|
hlUInt GetID() const;
|
|
hlVoid *GetData();
|
|
const hlVoid *GetData() const;
|
|
|
|
CPackage *GetPackage();
|
|
const CPackage *GetPackage() const;
|
|
CDirectoryFolder *GetParent();
|
|
const CDirectoryFolder *GetParent() const;
|
|
|
|
hlVoid GetPath(hlChar *lpPath, hlUInt uiPathSize) const;
|
|
|
|
virtual hlBool Extract(const hlChar *lpPath) = 0;
|
|
|
|
protected:
|
|
static hlBool GetFileExists(const hlChar *lpPath);
|
|
static hlBool GetFolderExists(const hlChar *lpPath);
|
|
static hlVoid RemoveIllegalCharacters(hlChar *lpName);
|
|
};
|
|
|
|
//
|
|
// CDirectoryFile
|
|
//
|
|
|
|
class HLLIB_API CDirectoryFile : public CDirectoryItem
|
|
{
|
|
public:
|
|
CDirectoryFile(const hlChar *lpName, hlUInt uiID, hlVoid *pData, CPackage *pPackage, CDirectoryFolder *pParent);
|
|
virtual ~CDirectoryFile();
|
|
|
|
virtual HLDirectoryItemType GetType() const;
|
|
|
|
hlBool GetExtractable() const;
|
|
hlBool GetExtractable(hlBool &bExtractable) const;
|
|
HLValidation GetValidation() const;
|
|
hlBool GetValidation(HLValidation &eValidation) const;
|
|
hlUInt GetSize() const;
|
|
hlBool GetSize(hlUInt &uiSize) const;
|
|
hlUInt GetSizeOnDisk() const;
|
|
hlBool GetSizeOnDisk(hlUInt &uiSize) const;
|
|
|
|
hlBool CreateStream(Streams::IStream *&pStream) const;
|
|
hlVoid ReleaseStream(Streams::IStream *pStream) const;
|
|
|
|
virtual hlBool Extract(const hlChar *lpPath);
|
|
};
|
|
|
|
//
|
|
// CDirectoryFolder
|
|
//
|
|
|
|
class HLLIB_API CDirectoryFolder : public CDirectoryItem
|
|
{
|
|
private:
|
|
class CDirectoryItemVector;
|
|
|
|
private:
|
|
CDirectoryItemVector *pDirectoryItemVector;
|
|
|
|
public:
|
|
CDirectoryFolder(CPackage *pPackage);
|
|
CDirectoryFolder(const hlChar *lpName, hlUInt uiID, hlVoid *pData, CPackage *pPackage, CDirectoryFolder *pParent);
|
|
virtual ~CDirectoryFolder();
|
|
|
|
virtual HLDirectoryItemType GetType() const;
|
|
|
|
CDirectoryFolder *AddFolder(const hlChar *lpName, hlUInt uiID = HL_ID_INVALID, hlVoid *lpData = 0);
|
|
CDirectoryFile *AddFile(const hlChar *lpName, hlUInt uiID = HL_ID_INVALID, hlVoid *lpData = 0);
|
|
|
|
hlUInt GetCount() const;
|
|
CDirectoryItem *GetItem(hlUInt uiIndex);
|
|
const CDirectoryItem *GetItem(hlUInt uiIndex) const;
|
|
CDirectoryItem *GetItem(const hlChar *lpName, HLFindType eFind = HL_FIND_ALL);
|
|
const CDirectoryItem *GetItem(const hlChar *lpName, HLFindType eFind = HL_FIND_ALL) const;
|
|
CDirectoryItem *GetRelativeItem(const hlChar *lpPath, HLFindType eFind = HL_FIND_ALL);
|
|
const CDirectoryItem *GetRelativeItem(const hlChar *lpPath, HLFindType eFind = HL_FIND_ALL) const;
|
|
|
|
hlVoid Sort(HLSortField eField = HL_FIELD_NAME, HLSortOrder eOrder = HL_ORDER_ASCENDING, hlBool bRecurse = hlTrue);
|
|
|
|
CDirectoryItem *FindFirst(const hlChar *lpSearch, HLFindType eFind = HL_FIND_ALL);
|
|
const CDirectoryItem *FindFirst(const hlChar *lpSearch, HLFindType eFind = HL_FIND_ALL) const;
|
|
CDirectoryItem *FindNext(const CDirectoryItem *pItem, const hlChar *lpSearch, HLFindType eFind = HL_FIND_ALL);
|
|
const CDirectoryItem *FindNext(const CDirectoryItem *pItem, const hlChar *lpSearch, HLFindType eFind = HL_FIND_ALL) const;
|
|
|
|
hlUInt GetSize(hlBool bRecurse = hlTrue) const;
|
|
hlULongLong GetSizeEx(hlBool bRecurse = hlTrue) const;
|
|
hlUInt GetSizeOnDisk(hlBool bRecurse = hlTrue) const;
|
|
hlULongLong GetSizeOnDiskEx(hlBool bRecurse = hlTrue) const;
|
|
hlUInt GetFolderCount(hlBool bRecurse = hlTrue) const;
|
|
hlUInt GetFileCount(hlBool bRecurse = hlTrue) const;
|
|
|
|
virtual hlBool Extract(const hlChar *lpPath);
|
|
|
|
private:
|
|
hlBool Match(const hlChar *lpString, const hlChar *lpSearch) const;
|
|
const CDirectoryItem *FindNext(const CDirectoryFolder *pFolder, const CDirectoryItem *pRelative, const hlChar *lpSearch, HLFindType eFind = HL_FIND_ALL) const;
|
|
};
|
|
|
|
namespace Streams
|
|
{
|
|
//
|
|
// IStream
|
|
//
|
|
|
|
class HLLIB_API IStream
|
|
{
|
|
public:
|
|
virtual ~IStream();
|
|
|
|
virtual HLStreamType GetType() const = 0;
|
|
|
|
virtual const hlChar *GetFileName() const = 0;
|
|
|
|
virtual hlBool GetOpened() const = 0;
|
|
virtual hlUInt GetMode() const = 0;
|
|
|
|
virtual hlBool Open(hlUInt uiMode) = 0;
|
|
virtual hlVoid Close() = 0;
|
|
|
|
virtual hlULongLong GetStreamSize() const = 0;
|
|
virtual hlULongLong GetStreamPointer() const = 0;
|
|
|
|
virtual hlULongLong Seek(hlLongLong iOffset, HLSeekMode eSeekMode) = 0;
|
|
|
|
virtual hlBool Read(hlChar &cChar) = 0;
|
|
virtual hlUInt Read(hlVoid *lpData, hlUInt uiBytes) = 0;
|
|
|
|
virtual hlBool Write(hlChar iChar) = 0;
|
|
virtual hlUInt Write(const hlVoid *lpData, hlUInt uiBytes) = 0;
|
|
};
|
|
|
|
//
|
|
// CFileStream
|
|
//
|
|
|
|
class HLLIB_API CFileStream : public IStream
|
|
{
|
|
private:
|
|
#ifdef _WIN32
|
|
HANDLE hFile;
|
|
#else
|
|
hlInt iFile;
|
|
#endif
|
|
hlUInt uiMode;
|
|
|
|
hlChar *lpFileName;
|
|
|
|
public:
|
|
CFileStream(const hlChar *lpFileName);
|
|
~CFileStream();
|
|
|
|
virtual HLStreamType GetType() const;
|
|
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlBool Open(hlUInt uiMode);
|
|
virtual hlVoid Close();
|
|
|
|
virtual hlULongLong GetStreamSize() const;
|
|
virtual hlULongLong GetStreamPointer() const;
|
|
|
|
virtual hlULongLong Seek(hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
|
|
virtual hlBool Read(hlChar &cChar);
|
|
virtual hlUInt Read(hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
virtual hlBool Write(hlChar iChar);
|
|
virtual hlUInt Write(const hlVoid *lpData, hlUInt uiBytes);
|
|
};
|
|
|
|
//
|
|
// CGCFStream
|
|
//
|
|
|
|
class HLLIB_API CGCFStream : public IStream
|
|
{
|
|
private:
|
|
hlBool bOpened;
|
|
hlUInt uiMode;
|
|
|
|
CGCFFile &GCFFile;
|
|
hlUInt uiFileID;
|
|
|
|
Mapping::CView *pView;
|
|
hlUInt uiBlockEntryIndex;
|
|
hlULongLong uiBlockEntryOffset;
|
|
hlUInt uiDataBlockIndex;
|
|
hlULongLong uiDataBlockOffset;
|
|
|
|
hlULongLong uiPointer;
|
|
hlULongLong uiLength;
|
|
|
|
public:
|
|
CGCFStream(CGCFFile &GCFFile, hlUInt uiFileID);
|
|
~CGCFStream();
|
|
|
|
virtual HLStreamType GetType() const;
|
|
|
|
const CGCFFile &GetPackage() const;
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlBool Open(hlUInt uiMode);
|
|
virtual hlVoid Close();
|
|
|
|
virtual hlULongLong GetStreamSize() const;
|
|
virtual hlULongLong GetStreamPointer() const;
|
|
|
|
virtual hlULongLong Seek(hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
|
|
virtual hlBool Read(hlChar &cChar);
|
|
virtual hlUInt Read(hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
virtual hlBool Write(hlChar iChar);
|
|
virtual hlUInt Write(const hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
private:
|
|
hlBool Map(hlUInt uiPointer);
|
|
};
|
|
|
|
//
|
|
// CMappingStream
|
|
//
|
|
|
|
class HLLIB_API CMappingStream : public IStream
|
|
{
|
|
private:
|
|
hlBool bOpened;
|
|
hlUInt uiMode;
|
|
|
|
Mapping::CMapping &Mapping;
|
|
Mapping::CView *pView;
|
|
|
|
hlULongLong uiMappingOffset;
|
|
hlULongLong uiMappingSize;
|
|
hlULongLong uiViewSize;
|
|
|
|
hlULongLong uiPointer;
|
|
hlULongLong uiLength;
|
|
|
|
public:
|
|
CMappingStream(Mapping::CMapping &Mapping, hlULongLong uiMappingOffset, hlULongLong uiMappingSize, hlULongLong uiViewSize = HL_DEFAULT_VIEW_SIZE);
|
|
~CMappingStream();
|
|
|
|
virtual HLStreamType GetType() const;
|
|
|
|
const Mapping::CMapping &GetMapping() const;
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlBool Open(hlUInt uiMode);
|
|
virtual hlVoid Close();
|
|
|
|
virtual hlULongLong GetStreamSize() const;
|
|
virtual hlULongLong GetStreamPointer() const;
|
|
|
|
virtual hlULongLong Seek(hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
|
|
virtual hlBool Read(hlChar &cChar);
|
|
virtual hlUInt Read(hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
virtual hlBool Write(hlChar iChar);
|
|
virtual hlUInt Write(const hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
private:
|
|
hlBool Map(hlULongLong uiPointer);
|
|
};
|
|
|
|
//
|
|
// CMemoryStream
|
|
//
|
|
|
|
class HLLIB_API CMemoryStream : public IStream
|
|
{
|
|
private:
|
|
hlBool bOpened;
|
|
hlUInt uiMode;
|
|
|
|
hlVoid *lpData;
|
|
hlUInt uiBufferSize;
|
|
|
|
hlULongLong uiPointer;
|
|
hlULongLong uiLength;
|
|
|
|
public:
|
|
CMemoryStream(hlVoid *lpData, hlUInt uiBufferSize);
|
|
~CMemoryStream();
|
|
|
|
virtual HLStreamType GetType() const;
|
|
|
|
const hlVoid *GetBuffer() const;
|
|
hlUInt GetBufferSize() const;
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlBool Open(hlUInt uiMode);
|
|
virtual hlVoid Close();
|
|
|
|
virtual hlULongLong GetStreamSize() const;
|
|
virtual hlULongLong GetStreamPointer() const;
|
|
|
|
virtual hlULongLong Seek(hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
|
|
virtual hlBool Read(hlChar &cChar);
|
|
virtual hlUInt Read(hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
virtual hlBool Write(hlChar iChar);
|
|
virtual hlUInt Write(const hlVoid *lpData, hlUInt uiBytes);
|
|
};
|
|
|
|
//
|
|
// CNullStream
|
|
//
|
|
|
|
class HLLIB_API CNullStream : public IStream
|
|
{
|
|
private:
|
|
hlBool bOpened;
|
|
hlUInt uiMode;
|
|
|
|
public:
|
|
CNullStream();
|
|
~CNullStream();
|
|
|
|
virtual HLStreamType GetType() const;
|
|
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlBool Open(hlUInt uiMode);
|
|
virtual hlVoid Close();
|
|
|
|
virtual hlULongLong GetStreamSize() const;
|
|
virtual hlULongLong GetStreamPointer() const;
|
|
|
|
virtual hlULongLong Seek(hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
|
|
virtual hlBool Read(hlChar &cChar);
|
|
virtual hlUInt Read(hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
virtual hlBool Write(hlChar cChar);
|
|
virtual hlUInt Write(const hlVoid *lpData, hlUInt uiBytes);
|
|
};
|
|
|
|
//
|
|
// CProcStream
|
|
//
|
|
|
|
class HLLIB_API CProcStream : public IStream
|
|
{
|
|
private:
|
|
hlBool bOpened;
|
|
hlUInt uiMode;
|
|
|
|
hlVoid *pUserData;
|
|
|
|
public:
|
|
CProcStream(hlVoid *pUserData);
|
|
~CProcStream();
|
|
|
|
virtual HLStreamType GetType() const;
|
|
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlBool Open(hlUInt uiMode);
|
|
virtual hlVoid Close();
|
|
|
|
virtual hlULongLong GetStreamSize() const;
|
|
virtual hlULongLong GetStreamPointer() const;
|
|
|
|
virtual hlULongLong Seek(hlLongLong iOffset, HLSeekMode eSeekMode);
|
|
|
|
virtual hlBool Read(hlChar &cChar);
|
|
virtual hlUInt Read(hlVoid *lpData, hlUInt uiBytes);
|
|
|
|
virtual hlBool Write(hlChar iChar);
|
|
virtual hlUInt Write(const hlVoid *lpData, hlUInt uiBytes);
|
|
};
|
|
}
|
|
|
|
namespace Mapping
|
|
{
|
|
//
|
|
// CView
|
|
//
|
|
|
|
class HLLIB_API CView
|
|
{
|
|
friend class CMapping;
|
|
|
|
private:
|
|
CMapping *pMapping;
|
|
|
|
hlVoid *lpView;
|
|
hlULongLong uiOffset;
|
|
hlULongLong uiLength;
|
|
hlULongLong uiAllocationOffset;
|
|
hlULongLong uiAllocationLength;
|
|
|
|
public:
|
|
CView(CMapping *pMapping, hlVoid *lpView, hlULongLong uiAllocationOffset, hlULongLong uiAllocationLength, hlULongLong uiOffset = 0, hlULongLong uiLength = 0);
|
|
~CView();
|
|
|
|
CMapping *GetMapping() const;
|
|
|
|
const hlVoid *GetView() const;
|
|
hlULongLong GetOffset() const;
|
|
hlULongLong GetLength() const;
|
|
const hlVoid *GetAllocationView() const;
|
|
hlULongLong GetAllocationOffset() const;
|
|
hlULongLong GetAllocationLength() const;
|
|
};
|
|
|
|
//
|
|
// CMapping
|
|
//
|
|
|
|
class HLLIB_API CMapping
|
|
{
|
|
private:
|
|
CViewList *pViews;
|
|
|
|
public:
|
|
CMapping();
|
|
virtual ~CMapping();
|
|
|
|
virtual HLMappingType GetType() const = 0;
|
|
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const = 0;
|
|
virtual hlUInt GetMode() const = 0;
|
|
|
|
hlUInt GetTotalAllocations() const;
|
|
hlULongLong GetTotalMemoryAllocated() const;
|
|
hlULongLong GetTotalMemoryUsed() const;
|
|
|
|
hlBool Open(hlUInt uiMode);
|
|
hlVoid Close();
|
|
|
|
virtual hlULongLong GetMappingSize() const = 0;
|
|
|
|
hlBool Map(CView *&pView, hlULongLong uiOffset, hlULongLong uiLength);
|
|
hlBool Unmap(CView *&pView);
|
|
|
|
hlBool Commit(CView &View);
|
|
hlBool Commit(CView &View, hlULongLong uiOffset, hlULongLong uiLength);
|
|
|
|
private:
|
|
virtual hlBool OpenInternal(hlUInt uiMode) = 0;
|
|
virtual hlVoid CloseInternal() = 0;
|
|
|
|
virtual hlBool MapInternal(CView *&pView, hlULongLong uiOffset, hlULongLong uiLength) = 0;
|
|
virtual hlVoid UnmapInternal(CView &View);
|
|
|
|
virtual hlBool CommitInternal(CView &View, hlULongLong uiOffset, hlULongLong uiLength);
|
|
};
|
|
|
|
//
|
|
// CFileMapping
|
|
//
|
|
|
|
class HLLIB_API CFileMapping : public CMapping
|
|
{
|
|
private:
|
|
#ifdef _WIN32
|
|
HANDLE hFile;
|
|
HANDLE hFileMapping;
|
|
#else
|
|
hlInt iFile;
|
|
#endif
|
|
hlUInt uiAllocationGranularity;
|
|
hlUInt uiMode;
|
|
|
|
hlVoid *lpView;
|
|
hlULongLong uiViewSize;
|
|
|
|
hlChar *lpFileName;
|
|
|
|
public:
|
|
CFileMapping(const hlChar *lpFileName);
|
|
virtual ~CFileMapping();
|
|
|
|
virtual HLMappingType GetType() const;
|
|
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlULongLong GetMappingSize() const;
|
|
|
|
private:
|
|
virtual hlBool OpenInternal(hlUInt uiMode);
|
|
virtual hlVoid CloseInternal();
|
|
|
|
virtual hlBool MapInternal(CView *&pView, hlULongLong uiOffset, hlULongLong uiLength);
|
|
virtual hlVoid UnmapInternal(CView &View);
|
|
};
|
|
|
|
//
|
|
// CMemoryMapping
|
|
//
|
|
|
|
class HLLIB_API CMemoryMapping : public CMapping
|
|
{
|
|
private:
|
|
hlBool bOpened;
|
|
hlUInt uiMode;
|
|
|
|
hlVoid *lpData;
|
|
hlULongLong uiBufferSize;
|
|
|
|
public:
|
|
CMemoryMapping(hlVoid *lpData, hlULongLong uiBufferSize);
|
|
virtual ~CMemoryMapping();
|
|
|
|
virtual HLMappingType GetType() const;
|
|
|
|
const hlVoid *GetBuffer() const;
|
|
hlUInt GetBufferSize() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlULongLong GetMappingSize() const;
|
|
|
|
private:
|
|
virtual hlBool OpenInternal(hlUInt uiMode);
|
|
virtual hlVoid CloseInternal();
|
|
|
|
virtual hlBool MapInternal(CView *&pView, hlULongLong uiOffset, hlULongLong uiLength);
|
|
};
|
|
|
|
//
|
|
// CStreamMapping
|
|
//
|
|
|
|
class HLLIB_API CStreamMapping : public CMapping
|
|
{
|
|
private:
|
|
Streams::IStream &Stream;
|
|
|
|
public:
|
|
CStreamMapping(Streams::IStream &Stream);
|
|
virtual ~CStreamMapping();
|
|
|
|
virtual HLMappingType GetType() const;
|
|
|
|
const Streams::IStream& GetStream() const;
|
|
virtual const hlChar *GetFileName() const;
|
|
|
|
virtual hlBool GetOpened() const;
|
|
virtual hlUInt GetMode() const;
|
|
|
|
virtual hlULongLong GetMappingSize() const;
|
|
|
|
private:
|
|
virtual hlBool OpenInternal(hlUInt uiMode);
|
|
virtual hlVoid CloseInternal();
|
|
|
|
virtual hlBool MapInternal(CView *&pView, hlULongLong uiOffset, hlULongLong uiLength);
|
|
virtual hlVoid UnmapInternal(CView &View);
|
|
|
|
virtual hlBool CommitInternal(CView &View, hlULongLong uiOffset, hlULongLong uiLength);
|
|
};
|
|
}
|
|
|
|
//
|
|
// CPackage
|
|
//
|
|
|
|
class HLLIB_API CPackage
|
|
{
|
|
private:
|
|
hlBool bDeleteStream;
|
|
hlBool bDeleteMapping;
|
|
Streams::IStream *pStream;
|
|
|
|
protected:
|
|
Mapping::CMapping *pMapping;
|
|
|
|
CDirectoryFolder *pRoot;
|
|
|
|
private:
|
|
CStreamList *pStreams;
|
|
|
|
public:
|
|
CPackage();
|
|
virtual ~CPackage();
|
|
|
|
virtual HLPackageType GetType() const = 0;
|
|
virtual const hlChar *GetExtension() const = 0;
|
|
virtual const hlChar *GetDescription() const = 0;
|
|
|
|
hlBool GetOpened() const;
|
|
|
|
hlBool Open(Streams::IStream &Stream, hlUInt uiMode);
|
|
hlBool Open(Mapping::CMapping &Mapping, hlUInt uiMode);
|
|
hlBool Open(const hlChar *lpFileName, hlUInt uiMode);
|
|
hlBool Open(hlVoid *lpData, hlUInt uiBufferSize, hlUInt uiMode);
|
|
hlBool Open(hlVoid *pUserData, hlUInt uiMode);
|
|
hlVoid Close();
|
|
|
|
hlBool Defragment();
|
|
|
|
const Mapping::CMapping* GetMapping() const;
|
|
CDirectoryFolder *GetRoot();
|
|
const CDirectoryFolder *GetRoot() const;
|
|
|
|
hlUInt GetAttributeCount() const;
|
|
const hlChar *GetAttributeName(HLPackageAttribute eAttribute) const;
|
|
hlBool GetAttribute(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
hlUInt GetItemAttributeCount() const;
|
|
const hlChar *GetItemAttributeName(HLPackageAttribute eAttribute) const;
|
|
hlBool GetItemAttribute(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
hlBool GetFileExtractable(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
hlBool GetFileValidation(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
hlBool GetFileSize(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
hlBool GetFileSizeOnDisk(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
hlBool CreateStream(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
hlVoid ReleaseStream(Streams::IStream *pStream) const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures() = 0;
|
|
virtual hlVoid UnmapDataStructures() = 0;
|
|
|
|
virtual hlBool DefragmentInternal();
|
|
|
|
virtual CDirectoryFolder *CreateRoot() = 0;
|
|
virtual hlVoid ReleaseRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const = 0;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const = 0;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const = 0;
|
|
virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
|
|
|
|
private:
|
|
hlBool Open(Streams::IStream *pStream, hlUInt uiMode, hlBool bDeleteStream);
|
|
hlBool Open(Mapping::CMapping *pMapping, hlUInt uiMode, hlBool bDeleteMapping);
|
|
};
|
|
|
|
//
|
|
// BSP File
|
|
//
|
|
|
|
#define HL_BSP_LUMP_COUNT 15
|
|
|
|
class HLLIB_API CBSPFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct BSPLump
|
|
{
|
|
hlUInt uiOffset;
|
|
hlUInt uiLength;
|
|
};
|
|
|
|
struct BSPHeader
|
|
{
|
|
hlUInt uiVersion;
|
|
BSPLump lpLumps[HL_BSP_LUMP_COUNT];
|
|
};
|
|
|
|
struct BSPTextureHeader
|
|
{
|
|
hlUInt uiTextureCount;
|
|
hlUInt lpOffsets[1];
|
|
};
|
|
|
|
struct BSPTexture
|
|
{
|
|
hlChar lpName[16];
|
|
hlUInt uiWidth;
|
|
hlUInt uiHeight;
|
|
hlUInt lpOffsets[4];
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
Mapping::CView *pHeaderView;
|
|
Mapping::CView *pTextureView;
|
|
|
|
const BSPHeader *pHeader;
|
|
const BSPTextureHeader *pTextureHeader;
|
|
|
|
public:
|
|
CBSPFile();
|
|
virtual ~CBSPFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
|
|
|
|
private:
|
|
hlVoid GetFileName(hlChar *lpBuffer, hlUInt uiBufferSize);
|
|
|
|
hlBool GetLumpInfo(const CDirectoryFile &File, hlUInt &uiWidth, hlUInt &uiHeight, hlUInt &uiPaletteSize, hlUInt uiMipmap = 0) const;
|
|
hlBool GetLumpInfo(const CDirectoryFile &File, hlUInt &uiWidth, hlUInt &uiHeight, hlUInt &uiPaletteSize, const hlByte *&lpPalette, const hlByte *&lpPixels, hlUInt uiMipmap = 0) const;
|
|
};
|
|
|
|
//
|
|
// CGCFFile
|
|
//
|
|
|
|
class HLLIB_API CGCFFile : public CPackage
|
|
{
|
|
friend class Streams::CGCFStream;
|
|
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct GCFHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000001
|
|
hlUInt uiDummy1; // Always 0x00000001
|
|
hlUInt uiVersion; // GCF version number.
|
|
hlUInt uiCacheID;
|
|
hlUInt uiLastVersionPlayed;
|
|
hlUInt uiDummy3;
|
|
hlUInt uiDummy4;
|
|
hlUInt uiFileSize; // Total size of GCF file in bytes.
|
|
hlUInt uiBlockSize; // Size of each data block in bytes.
|
|
hlUInt uiBlockCount; // Number of data blocks.
|
|
hlUInt uiDummy5;
|
|
};
|
|
|
|
struct GCFBlockEntryHeader
|
|
{
|
|
hlUInt uiBlockCount; // Number of data blocks.
|
|
hlUInt uiBlocksUsed; // Number of data blocks that point to data.
|
|
hlUInt uiDummy0;
|
|
hlUInt uiDummy1;
|
|
hlUInt uiDummy2;
|
|
hlUInt uiDummy3;
|
|
hlUInt uiDummy4;
|
|
hlUInt uiChecksum; // Header checksum.
|
|
};
|
|
|
|
struct GCFBlockEntry
|
|
{
|
|
hlUInt uiEntryFlags; // Flags for the block entry. 0x200F0000 == Not used.
|
|
hlUInt uiFileDataOffset; // The offset for the data contained in this block entry in the file.
|
|
hlUInt uiFileDataSize; // The length of the data in this block entry.
|
|
hlUInt uiFirstDataBlockIndex; // The index to the first data block of this block entry's data.
|
|
hlUInt uiNextBlockEntryIndex; // The next block entry in the series. (N/A if == BlockCount.)
|
|
hlUInt uiPreviousBlockEntryIndex; // The previous block entry in the series. (N/A if == BlockCount.)
|
|
hlUInt uiDirectoryIndex; // The index of the block entry in the directory.
|
|
};
|
|
|
|
struct GCFFragmentationMapHeader
|
|
{
|
|
hlUInt uiBlockCount; // Number of data blocks.
|
|
hlUInt uiFirstUnusedEntry; // The index of the first unused fragmentation map entry.
|
|
hlUInt uiTerminator; // The block entry terminator; 0 = 0x0000ffff or 1 = 0xffffffff.
|
|
hlUInt uiChecksum; // Header checksum.
|
|
};
|
|
|
|
struct GCFFragmentationMap
|
|
{
|
|
hlUInt uiNextDataBlockIndex; // The index of the next data block.
|
|
};
|
|
|
|
// The below section is part of version 5 but not version 6.
|
|
|
|
struct GCFBlockEntryMapHeader
|
|
{
|
|
hlUInt uiBlockCount; // Number of data blocks.
|
|
hlUInt uiFirstBlockEntryIndex; // Index of the first block entry.
|
|
hlUInt uiLastBlockEntryIndex; // Index of the last block entry.
|
|
hlUInt uiDummy0;
|
|
hlUInt uiChecksum; // Header checksum.
|
|
};
|
|
|
|
struct GCFBlockEntryMap
|
|
{
|
|
hlUInt uiPreviousBlockEntryIndex; // The previous block entry. (N/A if == BlockCount.)
|
|
hlUInt uiNextBlockEntryIndex; // The next block entry. (N/A if == BlockCount.)
|
|
};
|
|
|
|
// End section.
|
|
|
|
struct GCFDirectoryHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000004
|
|
hlUInt uiCacheID; // Cache ID.
|
|
hlUInt uiLastVersionPlayed; // GCF file version.
|
|
hlUInt uiItemCount; // Number of items in the directory.
|
|
hlUInt uiFileCount; // Number of files in the directory.
|
|
hlUInt uiDummy1; // Always 0x00008000. Data per checksum?
|
|
hlUInt uiDirectorySize; // Size of lpGCFDirectoryEntries & lpGCFDirectoryNames & lpGCFDirectoryInfo1Entries & lpGCFDirectoryInfo2Entries & lpGCFDirectoryCopyEntries & lpGCFDirectoryLocalEntries in bytes.
|
|
hlUInt uiNameSize; // Size of the directory names in bytes.
|
|
hlUInt uiInfo1Count; // Number of Info1 entires.
|
|
hlUInt uiCopyCount; // Number of files to copy.
|
|
hlUInt uiLocalCount; // Number of files to keep local.
|
|
hlUInt uiDummy2;
|
|
hlUInt uiDummy3;
|
|
hlUInt uiChecksum; // Header checksum.
|
|
};
|
|
|
|
struct GCFDirectoryEntry
|
|
{
|
|
hlUInt uiNameOffset; // Offset to the directory item name from the end of the directory items.
|
|
hlUInt uiItemSize; // Size of the item. (If file, file size. If folder, num items.)
|
|
hlUInt uiChecksumIndex; // Checksome index. (0xFFFFFFFF == None).
|
|
hlUInt uiDirectoryFlags; // Flags for the directory item. (0x00000000 == Folder).
|
|
hlUInt uiParentIndex; // Index of the parent directory item. (0xFFFFFFFF == None).
|
|
hlUInt uiNextIndex; // Index of the next directory item. (0x00000000 == None).
|
|
hlUInt uiFirstIndex; // Index of the first directory item. (0x00000000 == None).
|
|
};
|
|
|
|
struct GCFDirectoryInfo1Entry
|
|
{
|
|
hlUInt uiDummy0;
|
|
};
|
|
|
|
struct GCFDirectoryInfo2Entry
|
|
{
|
|
hlUInt uiDummy0;
|
|
};
|
|
|
|
struct GCFDirectoryCopyEntry
|
|
{
|
|
hlUInt uiDirectoryIndex; // Index of the directory item.
|
|
};
|
|
|
|
struct GCFDirectoryLocalEntry
|
|
{
|
|
hlUInt uiDirectoryIndex; // Index of the directory item.
|
|
};
|
|
|
|
// The below header was added in version 4 or version 5.
|
|
|
|
struct GCFDirectoryMapHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000001
|
|
hlUInt uiDummy1; // Always 0x00000000
|
|
};
|
|
|
|
struct GCFDirectoryMapEntry
|
|
{
|
|
hlUInt uiFirstBlockIndex; // Index of the first data block. (N/A if == BlockCount.)
|
|
};
|
|
|
|
struct GCFChecksumHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000001
|
|
hlUInt uiChecksumSize; // Size of LPGCFCHECKSUMHEADER & LPGCFCHECKSUMMAPHEADER & in bytes.
|
|
};
|
|
|
|
struct GCFChecksumMapHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x14893721
|
|
hlUInt uiDummy1; // Always 0x00000001
|
|
hlUInt uiItemCount; // Number of items.
|
|
hlUInt uiChecksumCount; // Number of checksums.
|
|
};
|
|
|
|
struct GCFChecksumMapEntry
|
|
{
|
|
hlUInt uiChecksumCount; // Number of checksums.
|
|
hlUInt uiFirstChecksumIndex; // Index of first checksum.
|
|
};
|
|
|
|
struct GCFChecksumEntry
|
|
{
|
|
hlULong uiChecksum; // Checksum.
|
|
};
|
|
|
|
struct GCFDataBlockHeader
|
|
{
|
|
hlUInt uiLastVersionPlayed; // GCF file version. This field is not part of all file versions.
|
|
hlUInt uiBlockCount; // Number of data blocks.
|
|
hlUInt uiBlockSize; // Size of each data block in bytes.
|
|
hlUInt uiFirstBlockOffset; // Offset to first data block.
|
|
hlUInt uiBlocksUsed; // Number of data blocks that contain data.
|
|
hlUInt uiChecksum; // Header checksum.
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
Mapping::CView *pHeaderView;
|
|
|
|
GCFHeader *pHeader;
|
|
|
|
GCFBlockEntryHeader *pBlockEntryHeader;
|
|
GCFBlockEntry *lpBlockEntries;
|
|
|
|
GCFFragmentationMapHeader *pFragmentationMapHeader;
|
|
GCFFragmentationMap *lpFragmentationMap;
|
|
|
|
// The below section is part of version 5 but not version 6.
|
|
GCFBlockEntryMapHeader *pBlockEntryMapHeader;
|
|
GCFBlockEntryMap *lpBlockEntryMap;
|
|
|
|
GCFDirectoryHeader *pDirectoryHeader;
|
|
GCFDirectoryEntry *lpDirectoryEntries;
|
|
hlChar *lpDirectoryNames;
|
|
GCFDirectoryInfo1Entry *lpDirectoryInfo1Entries;
|
|
GCFDirectoryInfo2Entry *lpDirectoryInfo2Entries;
|
|
GCFDirectoryCopyEntry *lpDirectoryCopyEntries;
|
|
GCFDirectoryLocalEntry *lpDirectoryLocalEntries;
|
|
|
|
GCFDirectoryMapHeader *pDirectoryMapHeader;
|
|
GCFDirectoryMapEntry *lpDirectoryMapEntries;
|
|
|
|
GCFChecksumHeader *pChecksumHeader;
|
|
GCFChecksumMapHeader *pChecksumMapHeader;
|
|
GCFChecksumMapEntry *lpChecksumMapEntries;
|
|
GCFChecksumEntry *lpChecksumEntries;
|
|
|
|
GCFDataBlockHeader *pDataBlockHeader;
|
|
|
|
CDirectoryItem **lpDirectoryItems;
|
|
|
|
public:
|
|
CGCFFile();
|
|
virtual ~CGCFFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual hlBool DefragmentInternal();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
|
|
private:
|
|
hlVoid CreateRoot(CDirectoryFolder *pFolder);
|
|
|
|
hlVoid GetItemFragmentation(hlUInt uiDirectoryItemIndex, hlUInt &uiBlocksFragmented, hlUInt &uiBlocksUsed) const;
|
|
};
|
|
|
|
//
|
|
// CNCFFile
|
|
//
|
|
|
|
class HLLIB_API CNCFFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct NCFHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000001
|
|
hlUInt uiMajorVersion; // Always 0x00000002
|
|
hlUInt uiMinorVersion; // NCF version number.
|
|
hlUInt uiCacheID;
|
|
hlUInt uiLastVersionPlayed;
|
|
hlUInt uiDummy3;
|
|
hlUInt uiDummy4;
|
|
hlUInt uiFileSize; // Total size of NCF file in bytes.
|
|
hlUInt uiBlockSize; // Size of each data block in bytes.
|
|
hlUInt uiBlockCount; // Number of data blocks.
|
|
hlUInt uiDummy5;
|
|
};
|
|
|
|
struct NCFDirectoryHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000004
|
|
hlUInt uiCacheID; // Cache ID.
|
|
hlUInt uiLastVersionPlayed; // NCF file version.
|
|
hlUInt uiItemCount; // Number of items in the directory.
|
|
hlUInt uiFileCount; // Number of files in the directory.
|
|
hlUInt uiChecksumDataLength; // Always 0x00008000. Data per checksum?
|
|
hlUInt uiDirectorySize; // Size of lpNCFDirectoryEntries & lpNCFDirectoryNames & lpNCFDirectoryInfo1Entries & lpNCFDirectoryInfo2Entries & lpNCFDirectoryCopyEntries & lpNCFDirectoryLocalEntries in bytes.
|
|
hlUInt uiNameSize; // Size of the directory names in bytes.
|
|
hlUInt uiInfo1Count; // Number of Info1 entires.
|
|
hlUInt uiCopyCount; // Number of files to copy.
|
|
hlUInt uiLocalCount; // Number of files to keep local.
|
|
hlUInt uiDummy1;
|
|
hlUInt uiDummy2;
|
|
hlUInt uiChecksum; // Header checksum.
|
|
};
|
|
|
|
struct NCFDirectoryEntry
|
|
{
|
|
hlUInt uiNameOffset; // Offset to the directory item name from the end of the directory items.
|
|
hlUInt uiItemSize; // Size of the item. (If file, file size. If folder, num items.)
|
|
hlUInt uiChecksumIndex; // Checksome index. (0xFFFFFFFF == None).
|
|
hlUInt uiDirectoryFlags; // Flags for the directory item. (0x00000000 == Folder).
|
|
hlUInt uiParentIndex; // Index of the parent directory item. (0xFFFFFFFF == None).
|
|
hlUInt uiNextIndex; // Index of the next directory item. (0x00000000 == None).
|
|
hlUInt uiFirstIndex; // Index of the first directory item. (0x00000000 == None).
|
|
};
|
|
|
|
struct NCFDirectoryInfo1Entry
|
|
{
|
|
hlUInt uiDummy0;
|
|
};
|
|
|
|
struct NCFDirectoryInfo2Entry
|
|
{
|
|
hlUInt uiDummy0;
|
|
};
|
|
|
|
struct NCFDirectoryCopyEntry
|
|
{
|
|
hlUInt uiDirectoryIndex; // Index of the directory item.
|
|
};
|
|
|
|
struct NCFDirectoryLocalEntry
|
|
{
|
|
hlUInt uiDirectoryIndex; // Index of the directory item.
|
|
};
|
|
|
|
struct NCFUnknownHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000001
|
|
hlUInt uiDummy1; // Always 0x00000000
|
|
};
|
|
|
|
struct NCFUnknownEntry
|
|
{
|
|
hlUInt uiDummy0;
|
|
};
|
|
|
|
struct NCFChecksumHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x00000001
|
|
hlUInt uiChecksumSize; // Size of LPNCFCHECKSUMHEADER & LPNCFCHECKSUMMAPHEADER & in bytes.
|
|
};
|
|
|
|
struct NCFChecksumMapHeader
|
|
{
|
|
hlUInt uiDummy0; // Always 0x14893721
|
|
hlUInt uiDummy1; // Always 0x00000001
|
|
hlUInt uiItemCount; // Number of items.
|
|
hlUInt uiChecksumCount; // Number of checksums.
|
|
};
|
|
|
|
struct NCFChecksumMapEntry
|
|
{
|
|
hlUInt uiChecksumCount; // Number of checksums.
|
|
hlUInt uiFirstChecksumIndex; // Index of first checksum.
|
|
};
|
|
|
|
struct NCFChecksumEntry
|
|
{
|
|
hlULong uiChecksum; // Checksum.
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
hlChar *lpRootPath;
|
|
|
|
Mapping::CView *pHeaderView;
|
|
|
|
NCFHeader *pHeader;
|
|
|
|
NCFDirectoryHeader *pDirectoryHeader;
|
|
NCFDirectoryEntry *lpDirectoryEntries;
|
|
hlChar *lpDirectoryNames;
|
|
NCFDirectoryInfo1Entry *lpDirectoryInfo1Entries;
|
|
NCFDirectoryInfo2Entry *lpDirectoryInfo2Entries;
|
|
NCFDirectoryCopyEntry *lpDirectoryCopyEntries;
|
|
NCFDirectoryLocalEntry *lpDirectoryLocalEntries;
|
|
|
|
NCFUnknownHeader *pUnknownHeader;
|
|
NCFUnknownEntry *lpUnknownEntries;
|
|
|
|
NCFChecksumHeader *pChecksumHeader;
|
|
NCFChecksumMapHeader *pChecksumMapHeader;
|
|
NCFChecksumMapEntry *lpChecksumMapEntries;
|
|
NCFChecksumEntry *lpChecksumEntries;
|
|
|
|
public:
|
|
CNCFFile();
|
|
virtual ~CNCFFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
const hlChar *GetRootPath() const;
|
|
hlVoid SetRootPath(const hlChar *lpRootPath);
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
|
|
private:
|
|
hlVoid CreateRoot(CDirectoryFolder *pFolder);
|
|
|
|
hlVoid GetPath(const CDirectoryFile *pFile, hlChar *lpPath, hlUInt uiPathSize) const;
|
|
};
|
|
|
|
//
|
|
// CPAKFile
|
|
//
|
|
|
|
class HLLIB_API CPAKFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct PAKHeader
|
|
{
|
|
hlChar lpSignature[4];
|
|
hlUInt uiDirectoryOffset;
|
|
hlUInt uiDirectoryLength;
|
|
};
|
|
|
|
struct PAKDirectoryItem
|
|
{
|
|
hlChar lpItemName[56];
|
|
hlUInt uiItemOffset;
|
|
hlUInt uiItemLength;
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
Mapping::CView *pHeaderView;
|
|
Mapping::CView *pDirectoryItemView;
|
|
|
|
const PAKHeader *pHeader;
|
|
const PAKDirectoryItem *lpDirectoryItems;
|
|
|
|
public:
|
|
CPAKFile();
|
|
virtual ~CPAKFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
};
|
|
|
|
//
|
|
// CSGAFile
|
|
//
|
|
|
|
class HLLIB_API CSGAFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct SGAHeaderBase
|
|
{
|
|
hlChar lpSignature[8];
|
|
hlUShort uiMajorVersion;
|
|
hlUShort uiMinorVersion;
|
|
};
|
|
|
|
struct SGAHeader4 : public SGAHeaderBase
|
|
{
|
|
hlByte lpFileMD5[16];
|
|
hlWChar lpName[64];
|
|
hlByte lpHeaderMD5[16];
|
|
hlUInt uiHeaderLength;
|
|
hlUInt uiFileDataOffset;
|
|
hlUInt uiDummy0;
|
|
};
|
|
|
|
struct SGAHeader6 : public SGAHeaderBase
|
|
{
|
|
hlWChar lpName[64];
|
|
hlUInt uiHeaderLength;
|
|
hlUInt uiFileDataOffset;
|
|
hlUInt uiDummy0;
|
|
};
|
|
|
|
template<typename T>
|
|
struct SGADirectoryHeader
|
|
{
|
|
hlUInt uiSectionOffset;
|
|
T uiSectionCount;
|
|
hlUInt uiFolderOffset;
|
|
T uiFolderCount;
|
|
hlUInt uiFileOffset;
|
|
T uiFileCount;
|
|
hlUInt uiStringTableOffset;
|
|
T uiStringTableCount;
|
|
};
|
|
|
|
typedef SGADirectoryHeader<hlUShort> SGADirectoryHeader4;
|
|
typedef SGADirectoryHeader<hlUInt> SGADirectoryHeader5;
|
|
|
|
struct SGADirectoryHeader7 : public SGADirectoryHeader5
|
|
{
|
|
hlUInt uiHashTableOffset;
|
|
hlUInt uiBlockSize;
|
|
};
|
|
|
|
template<typename T>
|
|
struct SGASection
|
|
{
|
|
hlChar lpAlias[64];
|
|
hlChar lpName[64];
|
|
T uiFolderStartIndex;
|
|
T uiFolderEndIndex;
|
|
T uiFileStartIndex;
|
|
T uiFileEndIndex;
|
|
T uiFolderRootIndex;
|
|
};
|
|
|
|
typedef SGASection<hlUShort> SGASection4;
|
|
typedef SGASection<hlUInt> SGASection5;
|
|
|
|
template<typename T>
|
|
struct SGAFolder
|
|
{
|
|
hlUInt uiNameOffset;
|
|
T uiFolderStartIndex;
|
|
T uiFolderEndIndex;
|
|
T uiFileStartIndex;
|
|
T uiFileEndIndex;
|
|
};
|
|
|
|
typedef SGAFolder<hlUShort> SGAFolder4;
|
|
typedef SGAFolder<hlUInt> SGAFolder5;
|
|
|
|
struct SGAFile4
|
|
{
|
|
hlUInt uiNameOffset;
|
|
hlUInt uiOffset;
|
|
hlUInt uiSizeOnDisk;
|
|
hlUInt uiSize;
|
|
hlUInt uiTimeModified;
|
|
hlByte uiDummy0;
|
|
hlByte uiType;
|
|
};
|
|
|
|
struct SGAFile6 : public SGAFile4
|
|
{
|
|
hlUInt uiCRC32;
|
|
};
|
|
|
|
struct SGAFile7 : public SGAFile6
|
|
{
|
|
hlUInt uiHashOffset;
|
|
};
|
|
|
|
struct SGAFileHeader
|
|
{
|
|
hlChar lpName[256];
|
|
hlUInt uiCRC32;
|
|
};
|
|
|
|
enum SGAFileVerification
|
|
{
|
|
VERIFICATION_NONE,
|
|
VERIFICATION_CRC,
|
|
VERIFICATION_CRC_BLOCKS,
|
|
VERIFICATION_MD5_BLOCKS,
|
|
VERIFICATION_SHA1_BLOCKS,
|
|
VERIFICATION_COUNT,
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
class ISGADirectory
|
|
{
|
|
public:
|
|
virtual ~ISGADirectory() = 0;
|
|
|
|
public:
|
|
virtual hlBool MapDataStructures() = 0;
|
|
virtual hlVoid UnmapDataStructures() = 0;
|
|
|
|
virtual CDirectoryFolder *CreateRoot() = 0;
|
|
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const = 0;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const = 0;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const = 0;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const = 0;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const = 0;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const = 0;
|
|
virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const = 0;
|
|
};
|
|
|
|
// Specialization SGAFile7 and up where the CRC moved to the header and the CRC is of the compressed data and there are stronger hashes.
|
|
template<typename TSGAHeader, typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile>
|
|
class CSGASpecializedDirectory : public ISGADirectory
|
|
{
|
|
public:
|
|
typedef TSGAHeader SGAHeader;
|
|
typedef TSGADirectoryHeader SGADirectoryHeader;
|
|
typedef TSGASection SGASection;
|
|
typedef TSGAFolder SGAFolder;
|
|
typedef TSGAFile SGAFile;
|
|
|
|
CSGASpecializedDirectory(CSGAFile& File);
|
|
|
|
protected:
|
|
CSGAFile& File;
|
|
|
|
Mapping::CView *pHeaderDirectoryView;
|
|
const SGADirectoryHeader *pDirectoryHeader;
|
|
const SGASection *lpSections;
|
|
const SGAFolder *lpFolders;
|
|
const SGAFile *lpFiles;
|
|
const hlChar *lpStringTable;
|
|
|
|
public:
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
};
|
|
|
|
// Specialization SGAFile4 where the CRC was stored in a SGAFileHeader located before the file data.
|
|
template<typename TSGAHeader, typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder>
|
|
class CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, SGAFile4> : public ISGADirectory
|
|
{
|
|
public:
|
|
typedef TSGAHeader SGAHeader;
|
|
typedef TSGADirectoryHeader SGADirectoryHeader;
|
|
typedef TSGASection SGASection;
|
|
typedef TSGAFolder SGAFolder;
|
|
typedef CSGAFile::SGAFile4 SGAFile;
|
|
|
|
CSGASpecializedDirectory(CSGAFile& File);
|
|
|
|
protected:
|
|
CSGAFile& File;
|
|
|
|
Mapping::CView *pHeaderDirectoryView;
|
|
const SGADirectoryHeader *pDirectoryHeader;
|
|
const SGASection *lpSections;
|
|
const SGAFolder *lpFolders;
|
|
const SGAFile *lpFiles;
|
|
const hlChar *lpStringTable;
|
|
|
|
public:
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
};
|
|
|
|
// Specialization SGAFile6 where the CRC moved to the header and the CRC is of the compressed data.
|
|
template<typename TSGAHeader, typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder>
|
|
class CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, SGAFile6> : public ISGADirectory
|
|
{
|
|
public:
|
|
typedef TSGAHeader SGAHeader;
|
|
typedef TSGADirectoryHeader SGADirectoryHeader;
|
|
typedef TSGASection SGASection;
|
|
typedef TSGAFolder SGAFolder;
|
|
typedef CSGAFile::SGAFile6 SGAFile;
|
|
|
|
CSGASpecializedDirectory(CSGAFile& File);
|
|
|
|
protected:
|
|
CSGAFile& File;
|
|
|
|
Mapping::CView *pHeaderDirectoryView;
|
|
const SGADirectoryHeader *pDirectoryHeader;
|
|
const SGASection *lpSections;
|
|
const SGAFolder *lpFolders;
|
|
const SGAFile *lpFiles;
|
|
const hlChar *lpStringTable;
|
|
|
|
public:
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
};
|
|
|
|
template<typename TSGAHeader, typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile>
|
|
class CSGADirectory : public CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile>
|
|
{
|
|
public:
|
|
typedef typename CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile>::SGAHeader SGAHeader;
|
|
typedef typename CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile>::SGADirectoryHeader SGADirectoryHeader;
|
|
typedef typename CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile>::SGASection SGASection;
|
|
typedef typename CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile>::SGAFolder SGAFolder;
|
|
typedef typename CSGASpecializedDirectory<TSGAHeader, TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile>::SGAFile SGAFile;
|
|
|
|
CSGADirectory(CSGAFile& File);
|
|
virtual ~CSGADirectory();
|
|
|
|
public:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
|
|
|
|
private:
|
|
hlVoid CreateFolder(CDirectoryFolder *pParent, hlUInt uiFolderIndex);
|
|
};
|
|
|
|
typedef CSGADirectory<SGAHeader4, SGADirectoryHeader4, SGASection4, SGAFolder4, SGAFile4> CSGADirectory4;
|
|
typedef CSGADirectory<SGAHeader4, SGADirectoryHeader5, SGASection5, SGAFolder5, SGAFile4> CSGADirectory5;
|
|
typedef CSGADirectory<SGAHeader6, SGADirectoryHeader5, SGASection5, SGAFolder5, SGAFile6> CSGADirectory6;
|
|
typedef CSGADirectory<SGAHeader6, SGADirectoryHeader7, SGASection5, SGAFolder5, SGAFile7> CSGADirectory7;
|
|
|
|
friend CSGADirectory4;
|
|
friend CSGADirectory5;
|
|
friend CSGADirectory6;
|
|
friend CSGADirectory7;
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
static const char *lpVerificationNames[];
|
|
|
|
Mapping::CView *pHeaderView;
|
|
const SGAHeaderBase *pHeader;
|
|
|
|
ISGADirectory* pDirectory;
|
|
|
|
public:
|
|
CSGAFile();
|
|
virtual ~CSGAFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
|
|
};
|
|
|
|
//
|
|
// CVBSPFile
|
|
//
|
|
|
|
#define HL_VBSP_LUMP_COUNT 64
|
|
|
|
class HLLIB_API CVBSPFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct VBSPLump
|
|
{
|
|
hlUInt uiOffset;
|
|
hlUInt uiLength;
|
|
hlUInt uiVersion; // Default to zero.
|
|
hlChar lpFourCC[4]; // Default to ( char )0, ( char )0, ( char )0, ( char )0.
|
|
};
|
|
|
|
struct VBSPHeader
|
|
{
|
|
hlChar lpSignature[4]; // BSP file signature.
|
|
hlInt iVersion; // BSP file version.
|
|
VBSPLump lpLumps[HL_VBSP_LUMP_COUNT]; // Lumps.
|
|
hlInt iMapRevision; // The map's revision (iteration, version) number.
|
|
};
|
|
|
|
struct ZIPEndOfCentralDirectoryRecord
|
|
{
|
|
hlUInt uiSignature; // 4 bytes (0x06054b50)
|
|
hlUInt16 uiNumberOfThisDisk; // 2 bytes
|
|
hlUInt16 uiNumberOfTheDiskWithStartOfCentralDirectory; // 2 bytes
|
|
hlUInt16 uiCentralDirectoryEntriesThisDisk; // 2 bytes
|
|
hlUInt16 uiCentralDirectoryEntriesTotal; // 2 bytes
|
|
hlUInt uiCentralDirectorySize; // 4 bytes
|
|
hlUInt uiStartOfCentralDirOffset; // 4 bytes
|
|
hlUInt16 uiCommentLength; // 2 bytes
|
|
// zip file comment follows
|
|
};
|
|
|
|
struct ZIPFileHeader
|
|
{
|
|
hlUInt uiSignature; // 4 bytes (0x02014b50)
|
|
hlUInt16 uiVersionMadeBy; // version made by 2 bytes
|
|
hlUInt16 uiVersionNeededToExtract; // version needed to extract 2 bytes
|
|
hlUInt16 uiFlags; // general purpose bit flag 2 bytes
|
|
hlUInt16 uiCompressionMethod; // compression method 2 bytes
|
|
hlUInt16 uiLastModifiedTime; // last mod file time 2 bytes
|
|
hlUInt16 uiLastModifiedDate; // last mod file date 2 bytes
|
|
hlUInt uiCRC32; // crc-32 4 bytes
|
|
hlUInt uiCompressedSize; // compressed size 4 bytes
|
|
hlUInt uiUncompressedSize; // uncompressed size 4 bytes
|
|
hlUInt16 uiFileNameLength; // file name length 2 bytes
|
|
hlUInt16 uiExtraFieldLength; // extra field length 2 bytes
|
|
hlUInt16 uiFileCommentLength; // file comment length 2 bytes
|
|
hlUInt16 uiDiskNumberStart; // disk number start 2 bytes
|
|
hlUInt16 uiInternalFileAttribs; // internal file attributes 2 bytes
|
|
hlUInt uiExternalFileAttribs; // external file attributes 4 bytes
|
|
hlUInt uiRelativeOffsetOfLocalHeader; // relative offset of local header 4 bytes
|
|
// file name (variable size)
|
|
// extra field (variable size)
|
|
// file comment (variable size)
|
|
};
|
|
|
|
struct ZIPLocalFileHeader
|
|
{
|
|
hlUInt uiSignature; //local file header signature 4 bytes (0x04034b50)
|
|
hlUInt16 uiVersionNeededToExtract; // version needed to extract 2 bytes
|
|
hlUInt16 uiFlags; // general purpose bit flag 2 bytes
|
|
hlUInt16 uiCompressionMethod; // compression method 2 bytes
|
|
hlUInt16 uiLastModifiedTime; // last mod file time 2 bytes
|
|
hlUInt16 uiLastModifiedDate; // last mod file date 2 bytes
|
|
hlUInt uiCRC32; // crc-32 4 bytes
|
|
hlUInt uiCompressedSize; // compressed size 4 bytes
|
|
hlUInt uiUncompressedSize; // uncompressed size 4 bytes
|
|
hlUInt16 uiFileNameLength; // file name length 2 bytes
|
|
hlUInt16 uiExtraFieldLength; // extra field length 2 bytes
|
|
// file name (variable size)
|
|
// extra field (variable size)
|
|
// file data (variable size)
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
Mapping::CView *pHeaderView;
|
|
Mapping::CView *pFileHeaderView;
|
|
Mapping::CView *pEndOfCentralDirectoryRecordView;
|
|
|
|
const VBSPHeader *pHeader;
|
|
const ZIPEndOfCentralDirectoryRecord *pEndOfCentralDirectoryRecord;
|
|
|
|
public:
|
|
CVBSPFile();
|
|
virtual ~CVBSPFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
|
|
private:
|
|
hlVoid GetFileName(hlChar *lpBuffer, hlUInt uiBufferSize);
|
|
};
|
|
|
|
//
|
|
// CVPKFile
|
|
//
|
|
|
|
class HLLIB_API CVPKFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct VPKHeader
|
|
{
|
|
hlUInt uiSignature; // Always 0x55aa1234.
|
|
hlUInt uiVersion;
|
|
hlUInt uiDirectoryLength;
|
|
};
|
|
|
|
// Added in version 2.
|
|
struct VPKExtendedHeader
|
|
{
|
|
hlUInt uiDummy0;
|
|
hlUInt uiArchiveHashLength;
|
|
hlUInt uiExtraLength; // Looks like some more MD5 hashes.
|
|
hlUInt uiDummy1;
|
|
};
|
|
|
|
struct VPKDirectoryEntry
|
|
{
|
|
hlUInt uiCRC;
|
|
hlUShort uiPreloadBytes;
|
|
hlUShort uiArchiveIndex;
|
|
hlUInt uiEntryOffset;
|
|
hlUInt uiEntryLength;
|
|
hlUShort uiDummy0; // Always 0xffff.
|
|
};
|
|
|
|
// Added in version 2.
|
|
struct VPKArchiveHash
|
|
{
|
|
hlUInt uiArchiveIndex;
|
|
hlUInt uiArchiveOffset;
|
|
hlUInt uiLength;
|
|
hlByte lpHash[16]; // MD5
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
struct VPKArchive
|
|
{
|
|
Streams::IStream *pStream;
|
|
Mapping::CMapping *pMapping;
|
|
};
|
|
|
|
struct VPKDirectoryItem
|
|
{
|
|
VPKDirectoryItem(const hlChar *lpExtention, const hlChar *lpPath, const hlChar *lpName, const VPKDirectoryEntry *pDirectoryEntry, const hlVoid *lpPreloadData) : lpExtention(lpExtention), lpPath(lpPath), lpName(lpName), pDirectoryEntry(pDirectoryEntry), lpPreloadData(lpPreloadData)
|
|
{
|
|
}
|
|
|
|
const hlChar *lpExtention;
|
|
const hlChar *lpPath;
|
|
const hlChar *lpName;
|
|
const VPKDirectoryEntry *pDirectoryEntry;
|
|
const hlVoid *lpPreloadData;
|
|
};
|
|
|
|
typedef std::list<VPKDirectoryItem *> CDirectoryItemList;
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
Mapping::CView *pView;
|
|
|
|
hlUInt uiArchiveCount;
|
|
VPKArchive *lpArchives;
|
|
|
|
const VPKHeader *pHeader;
|
|
const VPKExtendedHeader *pExtendedHeader;
|
|
const VPKArchiveHash *lpArchiveHashes;
|
|
CDirectoryItemList *pDirectoryItems;
|
|
|
|
public:
|
|
CVPKFile();
|
|
virtual ~CVPKFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
|
|
|
|
private:
|
|
hlBool MapString(const hlChar *&lpViewData, const hlChar *lpViewDirectoryDataEnd, const hlChar *&lpString);
|
|
};
|
|
|
|
//
|
|
// CWADFile
|
|
//
|
|
|
|
class HLLIB_API CWADFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct WADHeader
|
|
{
|
|
hlChar lpSignature[4];
|
|
hlUInt uiLumpCount;
|
|
hlUInt uiLumpOffset;
|
|
};
|
|
|
|
struct WADLump
|
|
{
|
|
hlUInt uiOffset;
|
|
hlUInt uiDiskLength;
|
|
hlUInt uiLength;
|
|
hlChar iType;
|
|
hlChar iCompression;
|
|
hlChar iPadding0;
|
|
hlChar iPadding1;
|
|
hlChar lpName[16];
|
|
};
|
|
|
|
struct WADLumpInfo
|
|
{
|
|
hlUInt uiWidth;
|
|
hlUInt uiHeight;
|
|
hlUInt uiPaletteSize;
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
Mapping::CView *pHeaderView;
|
|
Mapping::CView *pLumpView;
|
|
|
|
const WADHeader *pHeader;
|
|
const WADLump *lpLumps;
|
|
WADLumpInfo *lpLumpInfo;
|
|
|
|
public:
|
|
CWADFile();
|
|
virtual ~CWADFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
hlBool GetImageSize(const CDirectoryFile *pFile, hlUInt &uiPaletteDataSize, hlUInt &uiPixelDataSize);
|
|
hlBool GetImageData(const CDirectoryFile *pFile, hlUInt &uiWidth, hlUInt &uiHeight, hlByte *lpPaletteData, hlByte *lpPixelData);
|
|
|
|
hlBool GetImageSize(const CDirectoryFile *pFile, hlUInt &uiPixelDataSize);
|
|
hlBool GetImageData(const CDirectoryFile *pFile, hlUInt &uiWidth, hlUInt &uiHeight, hlByte *lpPixelData);
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
virtual hlVoid ReleaseStreamInternal(Streams::IStream &Stream) const;
|
|
|
|
private:
|
|
hlBool GetLumpInfo(const CDirectoryFile &File, hlUInt &uiWidth, hlUInt &uiHeight, hlUInt &uiPaletteSize, hlUInt uiMipmap = 0) const;
|
|
hlBool GetLumpInfo(const CDirectoryFile &File, hlUInt &uiWidth, hlUInt &uiHeight, hlUInt &uiPaletteSize, const hlByte *&lpPalette, const hlByte *&lpPixels, Mapping::CView *&pView, hlUInt uiMipmap = 0) const;
|
|
};
|
|
|
|
//
|
|
// CXZPFile
|
|
//
|
|
|
|
class HLLIB_API CXZPFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct XZPHeader
|
|
{
|
|
hlChar lpSignature[4];
|
|
hlUInt uiVersion;
|
|
hlUInt uiPreloadDirectoryEntryCount;
|
|
hlUInt uiDirectoryEntryCount;
|
|
hlUInt uiPreloadBytes;
|
|
hlUInt uiHeaderLength;
|
|
hlUInt uiDirectoryItemCount;
|
|
hlUInt uiDirectoryItemOffset;
|
|
hlUInt uiDirectoryItemLength;
|
|
};
|
|
|
|
struct XZPDirectoryEntry
|
|
{
|
|
hlUInt uiFileNameCRC;
|
|
hlUInt uiEntryLength;
|
|
hlUInt uiEntryOffset;
|
|
};
|
|
|
|
struct XZPDirectoryMapping
|
|
{
|
|
hlUInt16 uiPreloadDirectoryEntryIndex;
|
|
};
|
|
|
|
struct XZPDirectoryItem
|
|
{
|
|
hlUInt uiFileNameCRC;
|
|
hlUInt uiNameOffset;
|
|
hlUInt uiTimeCreated;
|
|
};
|
|
|
|
struct XZPFooter
|
|
{
|
|
hlUInt uiFileLength;
|
|
hlChar lpSignature[4];
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
Mapping::CView *pHeaderView;
|
|
Mapping::CView *pDirectoryEntryView;
|
|
Mapping::CView *pDirectoryItemView;
|
|
Mapping::CView *pFooterView;
|
|
|
|
const XZPHeader *pHeader;
|
|
const XZPDirectoryEntry *lpDirectoryEntries;
|
|
const XZPDirectoryEntry *lpPreloadDirectoryEntries;
|
|
const XZPDirectoryMapping *lpPreloadDirectoryMappings;
|
|
const XZPDirectoryItem *lpDirectoryItems;
|
|
const XZPFooter *pFooter;
|
|
|
|
public:
|
|
CXZPFile();
|
|
virtual ~CXZPFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
};
|
|
|
|
//
|
|
// CZIPFile
|
|
//
|
|
|
|
class HLLIB_API CZIPFile : public CPackage
|
|
{
|
|
private:
|
|
#pragma pack(1)
|
|
|
|
struct ZIPEndOfCentralDirectoryRecord
|
|
{
|
|
hlUInt uiSignature; // 4 bytes (0x06054b50)
|
|
hlUInt16 uiNumberOfThisDisk; // 2 bytes
|
|
hlUInt16 uiNumberOfTheDiskWithStartOfCentralDirectory; // 2 bytes
|
|
hlUInt16 uiCentralDirectoryEntriesThisDisk; // 2 bytes
|
|
hlUInt16 uiCentralDirectoryEntriesTotal; // 2 bytes
|
|
hlUInt uiCentralDirectorySize; // 4 bytes
|
|
hlUInt uiStartOfCentralDirOffset; // 4 bytes
|
|
hlUInt16 uiCommentLength; // 2 bytes
|
|
// zip file comment follows
|
|
};
|
|
|
|
struct ZIPFileHeader
|
|
{
|
|
hlUInt uiSignature; // 4 bytes (0x02014b50)
|
|
hlUInt16 uiVersionMadeBy; // version made by 2 bytes
|
|
hlUInt16 uiVersionNeededToExtract; // version needed to extract 2 bytes
|
|
hlUInt16 uiFlags; // general purpose bit flag 2 bytes
|
|
hlUInt16 uiCompressionMethod; // compression method 2 bytes
|
|
hlUInt16 uiLastModifiedTime; // last mod file time 2 bytes
|
|
hlUInt16 uiLastModifiedDate; // last mod file date 2 bytes
|
|
hlUInt uiCRC32; // crc-32 4 bytes
|
|
hlUInt uiCompressedSize; // compressed size 4 bytes
|
|
hlUInt uiUncompressedSize; // uncompressed size 4 bytes
|
|
hlUInt16 uiFileNameLength; // file name length 2 bytes
|
|
hlUInt16 uiExtraFieldLength; // extra field length 2 bytes
|
|
hlUInt16 uiFileCommentLength; // file comment length 2 bytes
|
|
hlUInt16 uiDiskNumberStart; // disk number start 2 bytes
|
|
hlUInt16 uiInternalFileAttribs; // internal file attributes 2 bytes
|
|
hlUInt uiExternalFileAttribs; // external file attributes 4 bytes
|
|
hlUInt uiRelativeOffsetOfLocalHeader; // relative offset of local header 4 bytes
|
|
// file name (variable size)
|
|
// extra field (variable size)
|
|
// file comment (variable size)
|
|
};
|
|
|
|
struct ZIPLocalFileHeader
|
|
{
|
|
hlUInt uiSignature; //local file header signature 4 bytes (0x04034b50)
|
|
hlUInt16 uiVersionNeededToExtract; // version needed to extract 2 bytes
|
|
hlUInt16 uiFlags; // general purpose bit flag 2 bytes
|
|
hlUInt16 uiCompressionMethod; // compression method 2 bytes
|
|
hlUInt16 uiLastModifiedTime; // last mod file time 2 bytes
|
|
hlUInt16 uiLastModifiedDate; // last mod file date 2 bytes
|
|
hlUInt uiCRC32; // crc-32 4 bytes
|
|
hlUInt uiCompressedSize; // compressed size 4 bytes
|
|
hlUInt uiUncompressedSize; // uncompressed size 4 bytes
|
|
hlUInt16 uiFileNameLength; // file name length 2 bytes
|
|
hlUInt16 uiExtraFieldLength; // extra field length 2 bytes
|
|
// file name (variable size)
|
|
// extra field (variable size)
|
|
// file data (variable size)
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
private:
|
|
static const char *lpAttributeNames[];
|
|
static const char *lpItemAttributeNames[];
|
|
|
|
Mapping::CView *pFileHeaderView;
|
|
Mapping::CView *pEndOfCentralDirectoryRecordView;
|
|
|
|
const ZIPEndOfCentralDirectoryRecord *pEndOfCentralDirectoryRecord;
|
|
|
|
public:
|
|
CZIPFile();
|
|
virtual ~CZIPFile();
|
|
|
|
virtual HLPackageType GetType() const;
|
|
virtual const hlChar *GetExtension() const;
|
|
virtual const hlChar *GetDescription() const;
|
|
|
|
protected:
|
|
virtual hlBool MapDataStructures();
|
|
virtual hlVoid UnmapDataStructures();
|
|
|
|
virtual CDirectoryFolder *CreateRoot();
|
|
|
|
virtual hlUInt GetAttributeCountInternal() const;
|
|
virtual const hlChar *GetAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlUInt GetItemAttributeCountInternal() const;
|
|
virtual const hlChar *GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const;
|
|
virtual hlBool GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const;
|
|
|
|
virtual hlBool GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const;
|
|
virtual hlBool GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const;
|
|
virtual hlBool GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
virtual hlBool GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const;
|
|
|
|
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
|
};
|
|
}
|
|
#endif
|
|
|
|
#endif
|