Merge branch 'upstream'
This commit is contained in:
commit
3c79312e89
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLExtract.Net
|
||||
* Copyright (C) 2008-2010 Ryan Gregg
|
||||
* Copyright (C) 2008-2012 Ryan Gregg
|
||||
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -19,8 +19,8 @@ using System.Runtime.InteropServices;
|
|||
public sealed class HLLib
|
||||
{
|
||||
#region Constants
|
||||
public const int HL_VERSION_NUMBER = ((2 << 24) | (4 << 16) | (2 << 8) | 0);
|
||||
public const string HL_VERSION_STRING = "2.4.2";
|
||||
public const int HL_VERSION_NUMBER = ((2 << 24) | (4 << 16) | (3 << 8) | 0);
|
||||
public const string HL_VERSION_STRING = "2.4.3";
|
||||
|
||||
public const uint HL_ID_INVALID = 0xffffffff;
|
||||
|
||||
|
@ -143,7 +143,8 @@ public sealed class HLLib
|
|||
HL_PACKAGE_XZP,
|
||||
HL_PACKAGE_ZIP,
|
||||
HL_PACKAGE_NCF,
|
||||
HL_PACKAGE_VPK
|
||||
HL_PACKAGE_VPK,
|
||||
HL_PACKAGE_SGA
|
||||
}
|
||||
|
||||
public enum HLAttributeType : uint
|
||||
|
@ -194,6 +195,19 @@ public sealed class HLLib
|
|||
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_COUNT,
|
||||
|
||||
HL_VBSP_PACKAGE_VERSION = 0,
|
||||
HL_VBSP_PACKAGE_MAP_REVISION,
|
||||
HL_VBSP_PACKAGE_COUNT,
|
||||
|
|
|
@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
|||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("HLExtract.Net")]
|
||||
[assembly: AssemblyCopyright("Copyright (C) 2008-2011 Ryan Gregg")]
|
||||
[assembly: AssemblyCopyright("Copyright (C) 2008-2012 Ryan Gregg")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
|
@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
|
|||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
[assembly: AssemblyVersion("2.4.2.0")]
|
||||
[assembly: AssemblyFileVersion("2.4.2.0")]
|
||||
[assembly: AssemblyVersion("2.4.3.0")]
|
||||
[assembly: AssemblyFileVersion("2.4.3.0")]
|
||||
|
|
|
@ -13,13 +13,11 @@
|
|||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
// English (United States) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -53,8 +51,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 2,4,2,0
|
||||
PRODUCTVERSION 2,4,2,0
|
||||
FILEVERSION 2,4,3,0
|
||||
PRODUCTVERSION 2,4,3,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -71,12 +69,12 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "Comments", "Half-Life Package Extraction Utility"
|
||||
VALUE "FileDescription", "HLExtract Application"
|
||||
VALUE "FileVersion", "2.4.2"
|
||||
VALUE "FileVersion", "2.4.3"
|
||||
VALUE "InternalName", "HLExtract"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2006-2011 Ryan Gregg"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2006-2012 Ryan Gregg"
|
||||
VALUE "OriginalFilename", "HLExtract.exe"
|
||||
VALUE "ProductName", " HLExtract Application"
|
||||
VALUE "ProductVersion", "2.4.2"
|
||||
VALUE "ProductVersion", "2.4.3"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
@ -85,7 +83,7 @@ BEGIN
|
|||
END
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
#endif // English (United States) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -690,7 +690,11 @@ hlBool CDirectoryFolder::Extract(const hlChar *lpPath) const
|
|||
|
||||
for(hlUInt i = 0; i < this->pDirectoryItemVector->size(); i++)
|
||||
{
|
||||
bResult &= (*this->pDirectoryItemVector)[i]->Extract(lpFolderName);
|
||||
const CDirectoryItem *pItem = (*this->pDirectoryItemVector)[i];
|
||||
if(pItem->GetType() != HL_ITEM_FILE || static_cast<const CDirectoryFile *>(pItem)->GetExtractable())
|
||||
{
|
||||
bResult &= pItem->Extract(lpFolderName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,13 +13,11 @@
|
|||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
// English (United States) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -53,8 +51,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 2,4,2,0
|
||||
PRODUCTVERSION 2,4,2,0
|
||||
FILEVERSION 2,4,3,0
|
||||
PRODUCTVERSION 2,4,3,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -71,12 +69,12 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "Comments", "Half-Life Package Library"
|
||||
VALUE "FileDescription", "HLLib Dynamic Link Library"
|
||||
VALUE "FileVersion", "2.4.2"
|
||||
VALUE "FileVersion", "2.4.3"
|
||||
VALUE "InternalName", "HLLib"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2006-2011 Ryan Gregg"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2006-2012 Ryan Gregg"
|
||||
VALUE "OriginalFilename", "HLLib.dll"
|
||||
VALUE "ProductName", " HLLib Dynamic Link Library"
|
||||
VALUE "ProductVersion", "2.4.2"
|
||||
VALUE "ProductVersion", "2.4.3"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
@ -85,7 +83,7 @@ BEGIN
|
|||
END
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
#endif // English (United States) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -14,6 +14,7 @@
|
|||
#include "GCFFile.h"
|
||||
#include "NCFFile.h"
|
||||
#include "PAKFile.h"
|
||||
#include "SGAFile.h"
|
||||
#include "VBSPFile.h"
|
||||
#include "VPKFile.h"
|
||||
#include "WADFile.h"
|
||||
|
|
|
@ -0,0 +1,627 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2012 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.
|
||||
*/
|
||||
|
||||
#include "HLLib.h"
|
||||
#include "SGAFile.h"
|
||||
#include "Streams.h"
|
||||
#include "Checksum.h"
|
||||
#include "Utility.h"
|
||||
|
||||
#if USE_ZLIB
|
||||
# ifdef _WIN32
|
||||
# define ZLIB_WINAPI
|
||||
# endif
|
||||
# include <zlib.h>
|
||||
#endif
|
||||
|
||||
using namespace HLLib;
|
||||
|
||||
#define HL_SGA_CHECKSUM_LENGTH 0x00008000
|
||||
|
||||
const char *CSGAFile::lpAttributeNames[] = { "Major Version", "Minor Version", "File MD5", "Name", "Header MD5" };
|
||||
const char *CSGAFile::lpItemAttributeNames[] = { "Section Alias", "Section Name", "Modified", "Type", "CRC" };
|
||||
|
||||
CSGAFile::CSGAFile() : CPackage(), pHeaderView(0), pHeader(0), pDirectory(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CSGAFile::~CSGAFile()
|
||||
{
|
||||
this->Close();
|
||||
}
|
||||
|
||||
HLPackageType CSGAFile::GetType() const
|
||||
{
|
||||
return HL_PACKAGE_SGA;
|
||||
}
|
||||
|
||||
const hlChar *CSGAFile::GetExtension() const
|
||||
{
|
||||
return "sga";
|
||||
}
|
||||
|
||||
const hlChar *CSGAFile::GetDescription() const
|
||||
{
|
||||
return "Archive File";
|
||||
}
|
||||
|
||||
hlBool CSGAFile::MapDataStructures()
|
||||
{
|
||||
if(sizeof(SGAHeader) > this->pMapping->GetMappingSize())
|
||||
{
|
||||
LastError.SetErrorMessage("Invalid file: the file map is too small for it's header.");
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
if(!this->pMapping->Map(this->pHeaderView, 0, sizeof(SGAHeader)))
|
||||
{
|
||||
return hlFalse;
|
||||
}
|
||||
this->pHeader = static_cast<const SGAHeader *>(this->pHeaderView->GetView());
|
||||
|
||||
if(memcmp(this->pHeader->lpSignature, "_ARCHIVE", 8) != 0)
|
||||
{
|
||||
LastError.SetErrorMessage("Invalid file: the file's signature does not match.");
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
if((this->pHeader->uiMajorVersion != 4 || this->pHeader->uiMinorVersion != 0) && (this->pHeader->uiMajorVersion != 5 || this->pHeader->uiMinorVersion != 0))
|
||||
{
|
||||
LastError.SetErrorMessageFormated("Invalid SGA version (v%hu.%hu): you have a version of a SGA file that HLLib does not know how to read. Check for product updates.", this->pHeader->uiMajorVersion, this->pHeader->uiMinorVersion);
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
if(this->pHeader->uiHeaderLength > this->pMapping->GetMappingSize())
|
||||
{
|
||||
LastError.SetErrorMessage("Invalid file: the file map is too small for it's extended header.");
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
switch(this->pHeader->uiMajorVersion)
|
||||
{
|
||||
case 4:
|
||||
this->pDirectory = new CSGADirectory4(*this);
|
||||
break;
|
||||
case 5:
|
||||
this->pDirectory = new CSGADirectory5(*this);
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
if(!this->pDirectory->MapDataStructures())
|
||||
{
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
return hlTrue;
|
||||
}
|
||||
|
||||
hlVoid CSGAFile::UnmapDataStructures()
|
||||
{
|
||||
delete this->pDirectory;
|
||||
this->pDirectory = 0;
|
||||
|
||||
this->pHeader = 0;
|
||||
|
||||
this->pMapping->Unmap(this->pHeaderView);
|
||||
}
|
||||
|
||||
CDirectoryFolder *CSGAFile::CreateRoot()
|
||||
{
|
||||
return this->pDirectory->CreateRoot();
|
||||
}
|
||||
|
||||
hlBool CSGAFile::GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const
|
||||
{
|
||||
return this->pDirectory->GetItemAttributeInternal(pItem, eAttribute, Attribute);
|
||||
}
|
||||
|
||||
hlBool CSGAFile::GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const
|
||||
{
|
||||
return this->pDirectory->GetFileExtractableInternal(pFile, bExtractable);
|
||||
}
|
||||
|
||||
hlBool CSGAFile::GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const
|
||||
{
|
||||
return this->pDirectory->GetFileValidationInternal(pFile, eValidation);
|
||||
}
|
||||
|
||||
hlBool CSGAFile::GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const
|
||||
{
|
||||
return this->pDirectory->GetFileSizeInternal(pFile, uiSize);
|
||||
}
|
||||
|
||||
hlBool CSGAFile::GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const
|
||||
{
|
||||
return this->pDirectory->GetFileSizeOnDiskInternal(pFile, uiSize);
|
||||
}
|
||||
|
||||
hlBool CSGAFile::CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const
|
||||
{
|
||||
return this->pDirectory->CreateStreamInternal(pFile, pStream);
|
||||
}
|
||||
|
||||
hlVoid CSGAFile::ReleaseStreamInternal(Streams::IStream &Stream) const
|
||||
{
|
||||
return this->pDirectory->ReleaseStreamInternal(Stream);
|
||||
}
|
||||
|
||||
|
||||
hlUInt CSGAFile::GetAttributeCountInternal() const
|
||||
{
|
||||
return HL_SGA_PACKAGE_COUNT;
|
||||
}
|
||||
|
||||
const hlChar *CSGAFile::GetAttributeNameInternal(HLPackageAttribute eAttribute) const
|
||||
{
|
||||
if(eAttribute < HL_SGA_PACKAGE_COUNT)
|
||||
{
|
||||
return this->lpAttributeNames[eAttribute];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
hlBool CSGAFile::GetAttributeInternal(HLPackageAttribute eAttribute, HLAttribute &Attribute) const
|
||||
{
|
||||
hlChar lpBuffer[64];
|
||||
switch(eAttribute)
|
||||
{
|
||||
case HL_SGA_PACKAGE_VERSION_MAJOR:
|
||||
hlAttributeSetUnsignedInteger(&Attribute, this->lpAttributeNames[eAttribute], this->pHeader->uiMajorVersion, hlFalse);
|
||||
return hlTrue;
|
||||
case HL_SGA_PACKAGE_VERSION_MINOR:
|
||||
hlAttributeSetUnsignedInteger(&Attribute, this->lpAttributeNames[eAttribute], this->pHeader->uiMinorVersion, hlFalse);
|
||||
return hlTrue;
|
||||
case HL_SGA_PACKAGE_MD5_FILE:
|
||||
BufferToHexString(this->pHeader->lpFileMD5, 16, lpBuffer, sizeof(lpBuffer));
|
||||
hlAttributeSetString(&Attribute, this->lpAttributeNames[eAttribute], lpBuffer);
|
||||
return hlTrue;
|
||||
case HL_SGA_PACKAGE_NAME:
|
||||
WStringToString(this->pHeader->lpName, lpBuffer, sizeof(lpBuffer));
|
||||
hlAttributeSetString(&Attribute, this->lpAttributeNames[eAttribute], lpBuffer);
|
||||
return hlTrue;
|
||||
case HL_SGA_PACKAGE_MD5_HEADER:
|
||||
BufferToHexString(this->pHeader->lpHeaderMD5, 16, lpBuffer, sizeof(lpBuffer));
|
||||
hlAttributeSetString(&Attribute, this->lpAttributeNames[eAttribute], lpBuffer);
|
||||
return hlTrue;
|
||||
default:
|
||||
return hlFalse;
|
||||
}
|
||||
}
|
||||
|
||||
hlUInt CSGAFile::GetItemAttributeCountInternal() const
|
||||
{
|
||||
return HL_SGA_ITEM_COUNT;
|
||||
}
|
||||
|
||||
const hlChar *CSGAFile::GetItemAttributeNameInternal(HLPackageAttribute eAttribute) const
|
||||
{
|
||||
if(eAttribute < HL_SGA_ITEM_COUNT)
|
||||
{
|
||||
return this->lpItemAttributeNames[eAttribute];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
CSGAFile::ISGADirectory::~ISGADirectory()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::CSGADirectory(CSGAFile& File) : File(File), pHeaderDirectoryView(0), pDirectoryHeader(0), lpSections(0), lpFolders(0), lpFiles(0), lpStringTable(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::~CSGADirectory()
|
||||
{
|
||||
this->UnmapDataStructures();
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlBool CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::MapDataStructures()
|
||||
{
|
||||
if(!this->File.pMapping->Map(this->pHeaderDirectoryView, sizeof(SGAHeader), this->File.pHeader->uiHeaderLength))
|
||||
{
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
this->pDirectoryHeader = static_cast<const TSGADirectoryHeader *>(this->pHeaderDirectoryView->GetView());
|
||||
|
||||
if(this->pDirectoryHeader->uiSectionCount > 0 && this->pDirectoryHeader->uiSectionOffset + sizeof(TSGASection) * this->pDirectoryHeader->uiSectionCount > this->File.pHeader->uiHeaderLength)
|
||||
{
|
||||
LastError.SetErrorMessage("Invalid file: the file map is too small for section data.");
|
||||
return hlFalse;
|
||||
}
|
||||
if(this->pDirectoryHeader->uiFolderCount > 0 && this->pDirectoryHeader->uiFolderOffset + sizeof(TSGAFolder) * this->pDirectoryHeader->uiFolderCount > this->File.pHeader->uiHeaderLength)
|
||||
{
|
||||
LastError.SetErrorMessage("Invalid file: the file map is too small for folder data.");
|
||||
return hlFalse;
|
||||
}
|
||||
if(this->pDirectoryHeader->uiFileCount > 0 && this->pDirectoryHeader->uiFileOffset + sizeof(TSGAFile) * this->pDirectoryHeader->uiFileCount > this->File.pHeader->uiHeaderLength)
|
||||
{
|
||||
LastError.SetErrorMessage("Invalid file: the file map is too small for file data.");
|
||||
return hlFalse;
|
||||
}
|
||||
if(this->pDirectoryHeader->uiStringTableOffset > this->File.pHeader->uiHeaderLength)
|
||||
{
|
||||
LastError.SetErrorMessage("Invalid file: the file map is too small for string table data.");
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
this->lpSections = reinterpret_cast<const TSGASection *>(reinterpret_cast<const hlByte *>(this->pDirectoryHeader) + this->pDirectoryHeader->uiSectionOffset);
|
||||
this->lpFolders = reinterpret_cast<const TSGAFolder *>(reinterpret_cast<const hlByte *>(this->pDirectoryHeader) + this->pDirectoryHeader->uiFolderOffset);
|
||||
this->lpFiles = reinterpret_cast<const TSGAFile *>(reinterpret_cast<const hlByte *>(this->pDirectoryHeader) + this->pDirectoryHeader->uiFileOffset);
|
||||
this->lpStringTable = reinterpret_cast<const hlChar *>(reinterpret_cast<const hlByte *>(this->pDirectoryHeader) + this->pDirectoryHeader->uiStringTableOffset);
|
||||
|
||||
return hlTrue;
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlVoid CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::UnmapDataStructures()
|
||||
{
|
||||
this->pDirectoryHeader = 0;
|
||||
this->lpSections = 0;
|
||||
this->lpFolders = 0;
|
||||
this->lpFiles = 0;
|
||||
this->lpStringTable = 0;
|
||||
|
||||
this->File.pMapping->Unmap(this->pHeaderDirectoryView);
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
CDirectoryFolder *CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::CreateRoot()
|
||||
{
|
||||
CDirectoryFolder *pRoot = new CDirectoryFolder(&File);
|
||||
|
||||
for(hlUInt i = 0; i < this->pDirectoryHeader->uiSectionCount; i++)
|
||||
{
|
||||
CDirectoryFolder* pSection;
|
||||
// Check if folder exists.
|
||||
CDirectoryItem *pItem = pRoot->GetItem(this->lpSections[i].lpAlias);
|
||||
if(pItem == 0 || pItem->GetType() == HL_ITEM_FILE)
|
||||
{
|
||||
// It doesn't, create it.
|
||||
pSection = pRoot->AddFolder(this->lpSections[i].lpAlias);
|
||||
}
|
||||
else
|
||||
{
|
||||
// It does, use it.
|
||||
pSection = static_cast<CDirectoryFolder *>(pItem);
|
||||
}
|
||||
this->CreateFolder(pSection, this->lpSections[i].uiFolderRootIndex);
|
||||
}
|
||||
|
||||
return pRoot;
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlVoid CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::CreateFolder(CDirectoryFolder *pParent, hlUInt uiFolderIndex)
|
||||
{
|
||||
const hlChar* lpName = this->lpStringTable + this->lpFolders[uiFolderIndex].uiNameOffset;
|
||||
if(*lpName != '\0')
|
||||
{
|
||||
// Strip parent folder names.
|
||||
const hlChar* lpTemp = strrchr(lpName, '/');
|
||||
if(lpTemp != 0)
|
||||
{
|
||||
lpName = lpTemp + 1;
|
||||
}
|
||||
lpTemp = strrchr(lpName, '\\');
|
||||
if(lpTemp != 0)
|
||||
{
|
||||
lpName = lpTemp + 1;
|
||||
}
|
||||
// Check if folder exists.
|
||||
CDirectoryItem *pItem = pParent->GetItem(lpName);
|
||||
if(pItem == 0 || pItem->GetType() == HL_ITEM_FILE)
|
||||
{
|
||||
// It doesn't, create it.
|
||||
pParent = pParent->AddFolder(lpName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// It does, use it.
|
||||
pParent = static_cast<CDirectoryFolder *>(pItem);
|
||||
}
|
||||
}
|
||||
for(hlUInt i = this->lpFolders[uiFolderIndex].uiFolderStartIndex; i < this->lpFolders[uiFolderIndex].uiFolderEndIndex; i++)
|
||||
{
|
||||
CreateFolder(pParent, i);
|
||||
}
|
||||
for(hlUInt i = this->lpFolders[uiFolderIndex].uiFileStartIndex; i < this->lpFolders[uiFolderIndex].uiFileEndIndex; i++)
|
||||
{
|
||||
const hlChar* lpName = this->lpStringTable + this->lpFiles[i].uiNameOffset;
|
||||
pParent->AddFile(lpName, i);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlBool CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::GetItemAttributeInternal(const CDirectoryItem *pItem, HLPackageAttribute eAttribute, HLAttribute &Attribute) const
|
||||
{
|
||||
if(pItem->GetID() != HL_ID_INVALID)
|
||||
{
|
||||
switch(pItem->GetType())
|
||||
{
|
||||
case HL_ITEM_FOLDER:
|
||||
{
|
||||
const CDirectoryFolder *pFolder = static_cast<const CDirectoryFolder *>(pItem);
|
||||
switch(eAttribute)
|
||||
{
|
||||
case HL_SGA_ITEM_SECTION_ALIAS:
|
||||
{
|
||||
for(hlUInt i = 0; i < this->pDirectoryHeader->uiSectionCount; i++)
|
||||
{
|
||||
if(pFolder->GetID() >= this->lpSections[i].uiFolderStartIndex && pFolder->GetID() < this->lpSections[i].uiFolderEndIndex)
|
||||
{
|
||||
hlAttributeSetString(&Attribute, CSGAFile::lpItemAttributeNames[eAttribute], this->lpSections[i].lpAlias);
|
||||
return hlTrue;
|
||||
}
|
||||
}
|
||||
return hlFalse;
|
||||
}
|
||||
case HL_SGA_ITEM_SECTION_NAME:
|
||||
{
|
||||
for(hlUInt i = 0; i < this->pDirectoryHeader->uiSectionCount; i++)
|
||||
{
|
||||
if(pFolder->GetID() >= this->lpSections[i].uiFolderStartIndex && pFolder->GetID() < this->lpSections[i].uiFolderEndIndex)
|
||||
{
|
||||
hlAttributeSetString(&Attribute, CSGAFile::lpItemAttributeNames[eAttribute], this->lpSections[i].lpName);
|
||||
return hlTrue;
|
||||
}
|
||||
}
|
||||
return hlFalse;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HL_ITEM_FILE:
|
||||
{
|
||||
const CDirectoryFile *pFile = static_cast<const CDirectoryFile *>(pItem);
|
||||
const TSGAFile &File = this->lpFiles[pFile->GetID()];
|
||||
switch(eAttribute)
|
||||
{
|
||||
case HL_SGA_ITEM_SECTION_ALIAS:
|
||||
{
|
||||
for(hlUInt i = 0; i < this->pDirectoryHeader->uiSectionCount; i++)
|
||||
{
|
||||
if(pFile->GetID() >= this->lpSections[i].uiFileStartIndex && pFile->GetID() < this->lpSections[i].uiFileEndIndex)
|
||||
{
|
||||
hlAttributeSetString(&Attribute, CSGAFile::lpItemAttributeNames[eAttribute], this->lpSections[i].lpAlias);
|
||||
return hlTrue;
|
||||
}
|
||||
}
|
||||
return hlFalse;
|
||||
}
|
||||
case HL_SGA_ITEM_SECTION_NAME:
|
||||
{
|
||||
for(hlUInt i = 0; i < this->pDirectoryHeader->uiSectionCount; i++)
|
||||
{
|
||||
if(pFile->GetID() >= this->lpSections[i].uiFileStartIndex && pFile->GetID() < this->lpSections[i].uiFileEndIndex)
|
||||
{
|
||||
hlAttributeSetString(&Attribute, CSGAFile::lpItemAttributeNames[eAttribute], this->lpSections[i].lpName);
|
||||
return hlTrue;
|
||||
}
|
||||
}
|
||||
return hlFalse;
|
||||
}
|
||||
case HL_SGA_ITEM_MODIFIED:
|
||||
{
|
||||
time_t Time = (time_t)File.uiTimeModified;
|
||||
tm *pTime = localtime(&Time);
|
||||
|
||||
hlChar lpTime[128];
|
||||
strftime(lpTime, sizeof(lpTime), "%c", pTime);
|
||||
|
||||
hlAttributeSetString(&Attribute, CSGAFile::lpItemAttributeNames[eAttribute], lpTime);
|
||||
return hlTrue;
|
||||
}
|
||||
case HL_SGA_ITEM_TYPE:
|
||||
{
|
||||
hlAttributeSetUnsignedInteger(&Attribute, CSGAFile::lpItemAttributeNames[eAttribute], File.uiType, hlFalse);
|
||||
return hlTrue;
|
||||
}
|
||||
case HL_SGA_ITEM_CRC:
|
||||
{
|
||||
Mapping::CView *pFileHeaderView = 0;
|
||||
if(this->File.pMapping->Map(pFileHeaderView, this->File.pHeader->uiFileDataOffset + File.uiOffset - sizeof(TSGAFileHeader), sizeof(TSGAFileHeader)))
|
||||
{
|
||||
const TSGAFileHeader* pFileHeader = static_cast<const TSGAFileHeader *>(pFileHeaderView->GetView());
|
||||
hlAttributeSetUnsignedInteger(&Attribute, CSGAFile::lpItemAttributeNames[eAttribute], pFileHeader->uiCRC32, hlTrue);
|
||||
this->File.pMapping->Unmap(pFileHeaderView);
|
||||
return hlTrue;
|
||||
}
|
||||
return hlFalse;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlBool CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool &bExtractable) const
|
||||
{
|
||||
#if !USE_ZLIB
|
||||
const TSGAFile &File = this->lpFiles[pFile->GetID()];
|
||||
|
||||
bExtractable = File.uiType == 0;
|
||||
#else
|
||||
bExtractable = true;
|
||||
#endif
|
||||
|
||||
return hlTrue;
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlBool CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::GetFileValidationInternal(const CDirectoryFile *pFile, HLValidation &eValidation) const
|
||||
{
|
||||
const TSGAFile &File = this->lpFiles[pFile->GetID()];
|
||||
|
||||
#if !USE_ZLIB
|
||||
if(File.uiType != 0)
|
||||
{
|
||||
eValidation = HL_VALIDATES_ASSUMED_OK;
|
||||
return hlTrue;
|
||||
}
|
||||
#endif
|
||||
|
||||
Mapping::CView *pFileHeaderDataView = 0;
|
||||
if(this->File.pMapping->Map(pFileHeaderDataView, this->File.pHeader->uiFileDataOffset + File.uiOffset - sizeof(TSGAFileHeader), File.uiSizeOnDisk + sizeof(TSGAFileHeader)))
|
||||
{
|
||||
hlULong uiChecksum = 0;
|
||||
const TSGAFileHeader* pFileHeader = static_cast<const TSGAFileHeader*>(pFileHeaderDataView->GetView());
|
||||
const hlByte* lpBuffer = reinterpret_cast<const hlByte *>(pFileHeader) + sizeof(TSGAFileHeader);
|
||||
#if USE_ZLIB
|
||||
hlByte *lpInflateBuffer = 0;
|
||||
if(File.uiType != 0)
|
||||
{
|
||||
lpInflateBuffer = new hlByte[File.uiSize];
|
||||
uLongf iInflateSize = File.uiSize;
|
||||
switch(uncompress(lpInflateBuffer, &iInflateSize, lpBuffer, static_cast<uLong>(File.uiSizeOnDisk)))
|
||||
{
|
||||
case Z_OK:
|
||||
lpBuffer = lpInflateBuffer;
|
||||
break;
|
||||
default:
|
||||
delete []lpInflateBuffer;
|
||||
lpInflateBuffer = 0;
|
||||
eValidation = HL_VALIDATES_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(File.uiType == 0 || lpInflateBuffer != 0)
|
||||
#endif
|
||||
{
|
||||
hlULongLong uiTotalBytes = 0, uiFileBytes = File.uiSize;
|
||||
|
||||
hlBool bCancel = hlFalse;
|
||||
hlValidateFileProgress(const_cast<CDirectoryFile *>(pFile), uiTotalBytes, uiFileBytes, &bCancel);
|
||||
|
||||
while(uiTotalBytes < uiFileBytes)
|
||||
{
|
||||
if(bCancel)
|
||||
{
|
||||
eValidation = HL_VALIDATES_CANCELED;
|
||||
break;
|
||||
}
|
||||
|
||||
hlUInt uiBufferSize = static_cast<hlUInt>(uiTotalBytes + HL_SGA_CHECKSUM_LENGTH <= uiFileBytes ? HL_SGA_CHECKSUM_LENGTH : uiFileBytes - uiTotalBytes);
|
||||
uiChecksum = CRC32(lpBuffer, uiBufferSize, uiChecksum);
|
||||
|
||||
lpBuffer += uiBufferSize;
|
||||
uiTotalBytes += static_cast<hlULongLong>(uiBufferSize);
|
||||
|
||||
hlValidateFileProgress(const_cast<CDirectoryFile *>(pFile), uiTotalBytes, uiFileBytes, &bCancel);
|
||||
}
|
||||
}
|
||||
#if USE_ZLIB
|
||||
delete []lpInflateBuffer;
|
||||
#endif
|
||||
eValidation = static_cast<hlULong>(pFileHeader->uiCRC32) == uiChecksum ? HL_VALIDATES_OK : HL_VALIDATES_CORRUPT;
|
||||
|
||||
this->File.pMapping->Unmap(pFileHeaderDataView);
|
||||
}
|
||||
else
|
||||
{
|
||||
eValidation = HL_VALIDATES_ERROR;
|
||||
}
|
||||
|
||||
return hlTrue;
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlBool CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::GetFileSizeInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const
|
||||
{
|
||||
const TSGAFile &File = this->lpFiles[pFile->GetID()];
|
||||
|
||||
uiSize = File.uiSize;
|
||||
|
||||
return hlTrue;
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlBool CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::GetFileSizeOnDiskInternal(const CDirectoryFile *pFile, hlUInt &uiSize) const
|
||||
{
|
||||
const TSGAFile &File = this->lpFiles[pFile->GetID()];
|
||||
|
||||
uiSize = File.uiSizeOnDisk;
|
||||
|
||||
return hlTrue;
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlBool CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const
|
||||
{
|
||||
const TSGAFile &File = this->lpFiles[pFile->GetID()];
|
||||
|
||||
if(File.uiType == 0)
|
||||
{
|
||||
pStream = new Streams::CMappingStream(*this->File.pMapping, this->File.pHeader->uiFileDataOffset + File.uiOffset, File.uiSizeOnDisk);
|
||||
return hlTrue;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if USE_ZLIB
|
||||
Mapping::CView *pFileDataView = 0;
|
||||
if(this->File.pMapping->Map(pFileDataView, this->File.pHeader->uiFileDataOffset + File.uiOffset, File.uiSizeOnDisk))
|
||||
{
|
||||
hlBool bResult = hlFalse;
|
||||
hlByte *lpInflateBuffer = new hlByte[File.uiSize];
|
||||
uLongf iInflateSize = File.uiSize;
|
||||
switch(uncompress(lpInflateBuffer, &iInflateSize, static_cast<const hlByte *>(pFileDataView->GetView()), (uLong)File.uiSizeOnDisk))
|
||||
{
|
||||
case Z_OK:
|
||||
pStream = new Streams::CMemoryStream(lpInflateBuffer, iInflateSize);
|
||||
bResult = hlTrue;
|
||||
break;
|
||||
case Z_MEM_ERROR:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Z_MEM_ERROR.");
|
||||
break;
|
||||
case Z_BUF_ERROR:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Z_BUF_ERROR.");
|
||||
break;
|
||||
case Z_DATA_ERROR:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Z_DATA_ERROR.");
|
||||
break;
|
||||
default:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Unknown.");
|
||||
break;
|
||||
}
|
||||
this->File.pMapping->Unmap(pFileDataView);
|
||||
return bResult;
|
||||
}
|
||||
#endif
|
||||
return hlFalse;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
hlVoid CSGAFile::CSGADirectory<TSGADirectoryHeader, TSGASection, TSGAFolder, TSGAFile, TSGAFileHeader>::ReleaseStreamInternal(Streams::IStream &Stream) const
|
||||
{
|
||||
if(Stream.GetType() == HL_STREAM_MEMORY)
|
||||
{
|
||||
delete []static_cast<const hlByte *>(static_cast<Streams::CMemoryStream &>(Stream).GetBuffer());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,207 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2012 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 SGAFILE_H
|
||||
#define SGAFILE_H
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "Package.h"
|
||||
|
||||
namespace HLLib
|
||||
{
|
||||
class HLLIB_API CSGAFile : public CPackage
|
||||
{
|
||||
private:
|
||||
#pragma pack(1)
|
||||
|
||||
struct SGAHeader
|
||||
{
|
||||
hlChar lpSignature[8];
|
||||
hlUShort uiMajorVersion;
|
||||
hlUShort uiMinorVersion;
|
||||
hlByte lpFileMD5[16];
|
||||
hlWChar lpName[64];
|
||||
hlByte lpHeaderMD5[16];
|
||||
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;
|
||||
|
||||
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 SGAFile
|
||||
{
|
||||
hlUInt uiNameOffset;
|
||||
hlUInt uiOffset;
|
||||
hlUInt uiSizeOnDisk;
|
||||
hlUInt uiSize;
|
||||
hlUInt uiTimeModified;
|
||||
hlByte uiDummy0;
|
||||
hlByte uiType;
|
||||
};
|
||||
|
||||
struct SGAFileHeader
|
||||
{
|
||||
hlChar lpName[256];
|
||||
hlUInt uiCRC32;
|
||||
};
|
||||
|
||||
#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;
|
||||
};
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
class CSGADirectory : public ISGADirectory
|
||||
{
|
||||
public:
|
||||
CSGADirectory(CSGAFile& File);
|
||||
virtual ~CSGADirectory();
|
||||
|
||||
private:
|
||||
CSGAFile& File;
|
||||
|
||||
Mapping::CView *pHeaderDirectoryView;
|
||||
const TSGADirectoryHeader *pDirectoryHeader;
|
||||
const TSGASection *lpSections;
|
||||
const TSGAFolder *lpFolders;
|
||||
const TSGAFile *lpFiles;
|
||||
const hlChar *lpStringTable;
|
||||
|
||||
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 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:
|
||||
hlVoid CreateFolder(CDirectoryFolder *pParent, hlUInt uiFolderIndex);
|
||||
};
|
||||
|
||||
typedef CSGADirectory<SGADirectoryHeader4, SGASection4, SGAFolder4, SGAFile, SGAFileHeader> CSGADirectory4;
|
||||
typedef CSGADirectory<SGADirectoryHeader5, SGASection5, SGAFolder5, SGAFile, SGAFileHeader> CSGADirectory5;
|
||||
|
||||
friend CSGADirectory4;
|
||||
friend CSGADirectory5;
|
||||
|
||||
private:
|
||||
static const char *lpAttributeNames[];
|
||||
static const char *lpItemAttributeNames[];
|
||||
|
||||
Mapping::CView *pHeaderView;
|
||||
const SGAHeader *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;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -157,3 +157,61 @@ hlVoid HLLib::RemoveIllegalCharacters(hlChar *lpName)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
hlChar HLLib::NibbleToChar(hlByte uiNibble)
|
||||
{
|
||||
uiNibble &= 0x0F;
|
||||
return uiNibble <= 9 ? '0' + static_cast<hlChar>(uiNibble) : 'A' + static_cast<hlChar>(uiNibble) - ('9' - '0' + 1);
|
||||
}
|
||||
|
||||
hlUInt HLLib::BufferToHexString(const hlByte *lpBuffer, hlUInt uiBufferSize, hlChar* lpString, hlUInt uiStringSize)
|
||||
{
|
||||
hlUInt uiCharsWritten = (uiStringSize + 1) / 2;
|
||||
for(hlUInt i = 0; i < uiBufferSize && uiStringSize > 2; i++)
|
||||
{
|
||||
*lpString++ = NibbleToChar(lpBuffer[i] >> 4);
|
||||
uiStringSize--;
|
||||
|
||||
*lpString++ = NibbleToChar(lpBuffer[i]);
|
||||
uiStringSize--;
|
||||
}
|
||||
if(uiStringSize > 0)
|
||||
{
|
||||
*lpString = '\0';
|
||||
}
|
||||
return uiCharsWritten;
|
||||
}
|
||||
|
||||
hlUInt HLLib::WStringToString(const hlWChar *lpSource, hlChar* lpDest, hlUInt uiDestSize)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
int iResult = WideCharToMultiByte(CP_ACP, 0, lpSource, -1, lpDest, static_cast<int>(uiDestSize), NULL, NULL);
|
||||
if(iResult > 0)
|
||||
{
|
||||
return static_cast<hlUInt>(iResult);
|
||||
}
|
||||
else if(uiDestSize > 0)
|
||||
{
|
||||
*lpDest = '\0';
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
#else
|
||||
hlUInt uiCharsWritten = 0;
|
||||
while(*lpSource != L'\0' && uiDestSize > 1)
|
||||
{
|
||||
if(*lpSource >= L' ' && *lpSource <= L'~')
|
||||
{
|
||||
*lpDest++ = static_cast<hlChar>(*lpSource++);
|
||||
uiDestSize--;
|
||||
uiCharsWritten++;
|
||||
}
|
||||
}
|
||||
if(uiDestSize > 0)
|
||||
{
|
||||
*lpDest = '\0';
|
||||
uiCharsWritten++;
|
||||
}
|
||||
return uiCharsWritten;
|
||||
#endif
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -17,15 +17,19 @@
|
|||
|
||||
namespace HLLib
|
||||
{
|
||||
hlBool GetFileExists(const hlChar *lpPath);
|
||||
hlBool GetFolderExists(const hlChar *lpPath);
|
||||
extern hlBool GetFileExists(const hlChar *lpPath);
|
||||
extern hlBool GetFolderExists(const hlChar *lpPath);
|
||||
|
||||
hlBool GetFileSize(const hlChar *lpPath, hlUInt &uiFileSize);
|
||||
extern hlBool GetFileSize(const hlChar *lpPath, hlUInt &uiFileSize);
|
||||
|
||||
hlBool CreateFolder(const hlChar *lpPath);
|
||||
extern hlBool CreateFolder(const hlChar *lpPath);
|
||||
|
||||
hlVoid FixupIllegalCharacters(hlChar *lpName);
|
||||
hlVoid RemoveIllegalCharacters(hlChar *lpName);
|
||||
extern hlVoid FixupIllegalCharacters(hlChar *lpName);
|
||||
extern hlVoid RemoveIllegalCharacters(hlChar *lpName);
|
||||
|
||||
extern hlChar NibbleToChar(hlByte uiNibble);
|
||||
extern hlUInt BufferToHexString(const hlByte *lpBuffer, hlUInt uiBufferSize, hlChar* lpString, hlUInt uiStringSize);
|
||||
extern hlUInt WStringToString(const hlWChar *lpSource, hlChar* lpDest, hlUInt uiDestSize);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -97,7 +97,19 @@ hlBool CVPKFile::MapDataStructures()
|
|||
}
|
||||
else
|
||||
{
|
||||
if(this->pHeader->uiVersion > 2)
|
||||
{
|
||||
LastError.SetErrorMessageFormated("Invalid VPK version (v%u): you have a version of a VPK file that HLLib does not know how to read. Check for product updates.", this->pHeader->uiVersion);
|
||||
return hlFalse;
|
||||
}
|
||||
lpViewData += sizeof(VPKHeader);
|
||||
switch(this->pHeader->uiVersion)
|
||||
{
|
||||
case 2:
|
||||
// Version two includes 4 more double words.
|
||||
lpViewData += 4 * sizeof(hlUInt);
|
||||
break;
|
||||
}
|
||||
lpViewDirectoryDataEnd = lpViewData + this->pHeader->uiDirectoryLength;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -513,6 +513,7 @@ HLPackageTest lpPackageTests[] =
|
|||
{ HL_PACKAGE_GCF, 8, { 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 } },
|
||||
{ HL_PACKAGE_NCF, 8, { 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 } },
|
||||
{ HL_PACKAGE_PAK, 4, { 'P', 'A', 'C', 'K' } },
|
||||
{ HL_PACKAGE_SGA, 8, { '_', 'A', 'R', 'C', 'H', 'I', 'V', 'E' } },
|
||||
{ HL_PACKAGE_VBSP, 4, { 'V', 'B', 'S', 'P' } },
|
||||
{ HL_PACKAGE_VPK, 4, { 0x34, 0x12, 0xaa, 0x55 } },
|
||||
{ HL_PACKAGE_WAD, 4, { 'W', 'A', 'D', '3' } },
|
||||
|
@ -596,6 +597,9 @@ HLLIB_API hlBool hlCreatePackage(HLPackageType ePackageType, hlUInt *uiPackage)
|
|||
case HL_PACKAGE_PAK:
|
||||
pNewPackage = new CPAKFile();
|
||||
break;
|
||||
case HL_PACKAGE_SGA:
|
||||
pNewPackage = new CSGAFile();
|
||||
break;
|
||||
case HL_PACKAGE_VBSP:
|
||||
pNewPackage = new CVBSPFile();
|
||||
break;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -14,6 +14,69 @@
|
|||
#include "Streams.h"
|
||||
#include "Checksum.h"
|
||||
|
||||
#if USE_ZLIB
|
||||
# ifdef _WIN32
|
||||
# define ZLIB_WINAPI
|
||||
# endif
|
||||
# include <zlib.h>
|
||||
|
||||
struct OutDesc
|
||||
{
|
||||
Bytef *dest;
|
||||
uLongf destLen;
|
||||
};
|
||||
|
||||
static unsigned in(void FAR *in_desc, unsigned char FAR * FAR *input)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int out(void FAR *out_desc, unsigned char FAR *ouput, unsigned len)
|
||||
{
|
||||
if(len <= ((OutDesc*)(out_desc))->destLen)
|
||||
{
|
||||
memcpy(((OutDesc*)(out_desc))->dest, ouput, len);
|
||||
((OutDesc*)(out_desc))->dest += len;
|
||||
((OutDesc*)(out_desc))->destLen -= len;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int uncompressBack(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
|
||||
{
|
||||
z_stream stream;
|
||||
int err;
|
||||
|
||||
stream.next_in = (Bytef*)source;
|
||||
stream.avail_in = (uInt)sourceLen;
|
||||
|
||||
stream.next_out = dest;
|
||||
stream.avail_out = (uInt)*destLen;
|
||||
|
||||
stream.zalloc = (alloc_func)0;
|
||||
stream.zfree = (free_func)0;
|
||||
|
||||
unsigned char window[32768];
|
||||
err = inflateBackInit(&stream, 15, window);
|
||||
if (err != Z_OK) return err;
|
||||
|
||||
OutDesc out_desc = { dest, *destLen };
|
||||
err = inflateBack(&stream, in, 0, out, &out_desc);
|
||||
if (err != Z_STREAM_END) {
|
||||
inflateBackEnd(&stream);
|
||||
if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
|
||||
return Z_DATA_ERROR;
|
||||
return err;
|
||||
}
|
||||
*destLen = *destLen - out_desc.destLen;
|
||||
|
||||
err = inflateBackEnd(&stream);
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
using namespace HLLib;
|
||||
|
||||
#define HL_ZIP_LOCAL_FILE_HEADER_SIGNATURE 0x04034b50
|
||||
|
@ -346,7 +409,18 @@ hlBool CZIPFile::GetFileExtractableInternal(const CDirectoryFile *pFile, hlBool
|
|||
{
|
||||
const ZIPFileHeader *pDirectoryItem = static_cast<const ZIPFileHeader *>(pFile->GetData());
|
||||
|
||||
bExtractable = pDirectoryItem->uiCompressionMethod == 0 && pDirectoryItem->uiDiskNumberStart == this->pEndOfCentralDirectoryRecord->uiNumberOfThisDisk;
|
||||
switch(pDirectoryItem->uiCompressionMethod)
|
||||
{
|
||||
case 0: // None.
|
||||
#if USE_ZLIB
|
||||
case 8: // Deflate.
|
||||
#endif
|
||||
bExtractable = (pDirectoryItem->uiFlags & 0x01u) == 0 && pDirectoryItem->uiDiskNumberStart == this->pEndOfCentralDirectoryRecord->uiNumberOfThisDisk;
|
||||
break;
|
||||
default:
|
||||
bExtractable = hlFalse;
|
||||
break;
|
||||
}
|
||||
|
||||
return hlTrue;
|
||||
}
|
||||
|
@ -355,7 +429,8 @@ hlBool CZIPFile::GetFileValidationInternal(const CDirectoryFile *pFile, HLValida
|
|||
{
|
||||
const ZIPFileHeader *pDirectoryItem = static_cast<const ZIPFileHeader *>(pFile->GetData());
|
||||
|
||||
if(pDirectoryItem->uiCompressionMethod != 0 || pDirectoryItem->uiDiskNumberStart != this->pEndOfCentralDirectoryRecord->uiNumberOfThisDisk)
|
||||
hlBool bExtractable = false;
|
||||
if(!GetFileExtractableInternal(pFile, bExtractable) || !bExtractable)
|
||||
{
|
||||
eValidation = HL_VALIDATES_ASSUMED_OK;
|
||||
return hlTrue;
|
||||
|
@ -423,12 +498,24 @@ hlBool CZIPFile::CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStr
|
|||
{
|
||||
const ZIPFileHeader *pDirectoryItem = static_cast<const ZIPFileHeader *>(pFile->GetData());
|
||||
|
||||
if(pDirectoryItem->uiCompressionMethod != 0)
|
||||
switch(pDirectoryItem->uiCompressionMethod)
|
||||
{
|
||||
case 0: // None.
|
||||
#if USE_ZLIB
|
||||
case 8: // Deflate.
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
LastError.SetErrorMessageFormated("Compression format %#.2x not supported.", pDirectoryItem->uiCompressionMethod);
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
if((pDirectoryItem->uiFlags & 0x01u) != 0)
|
||||
{
|
||||
LastError.SetErrorMessageFormated("File is encrypted.");
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
if(pDirectoryItem->uiDiskNumberStart != this->pEndOfCentralDirectoryRecord->uiNumberOfThisDisk)
|
||||
{
|
||||
LastError.SetErrorMessageFormated("File resides on disk %u.", pDirectoryItem->uiDiskNumberStart);
|
||||
|
@ -442,17 +529,77 @@ hlBool CZIPFile::CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStr
|
|||
return hlFalse;
|
||||
}
|
||||
|
||||
const ZIPLocalFileHeader DirectoryEntry = *static_cast<const ZIPLocalFileHeader *>(pDirectoryEnrtyView->GetView());
|
||||
ZIPLocalFileHeader DirectoryEntry = *static_cast<const ZIPLocalFileHeader *>(pDirectoryEnrtyView->GetView());
|
||||
|
||||
this->pMapping->Unmap(pDirectoryEnrtyView);
|
||||
|
||||
if((DirectoryEntry.uiFlags & 0x08u) != 0)
|
||||
{
|
||||
DirectoryEntry.uiCRC32 = pDirectoryItem->uiCRC32;
|
||||
DirectoryEntry.uiUncompressedSize = pDirectoryItem->uiUncompressedSize;
|
||||
DirectoryEntry.uiCompressedSize = pDirectoryItem->uiCompressedSize;
|
||||
}
|
||||
|
||||
if(DirectoryEntry.uiSignature != HL_ZIP_LOCAL_FILE_HEADER_SIGNATURE)
|
||||
{
|
||||
LastError.SetErrorMessageFormated("Invalid file data offset.", pDirectoryItem->uiDiskNumberStart);
|
||||
LastError.SetErrorMessageFormated("Invalid file data offset.");
|
||||
return hlFalse;
|
||||
}
|
||||
|
||||
pStream = new Streams::CMappingStream(*this->pMapping, pDirectoryItem->uiRelativeOffsetOfLocalHeader + sizeof(ZIPLocalFileHeader) + DirectoryEntry.uiFileNameLength + DirectoryEntry.uiExtraFieldLength, DirectoryEntry.uiUncompressedSize);
|
||||
|
||||
return hlTrue;
|
||||
switch(pDirectoryItem->uiCompressionMethod)
|
||||
{
|
||||
case 0: // None.
|
||||
{
|
||||
pStream = new Streams::CMappingStream(*this->pMapping, pDirectoryItem->uiRelativeOffsetOfLocalHeader + sizeof(ZIPLocalFileHeader) + DirectoryEntry.uiFileNameLength + DirectoryEntry.uiExtraFieldLength, DirectoryEntry.uiUncompressedSize);
|
||||
return hlTrue;
|
||||
}
|
||||
#if USE_ZLIB
|
||||
case 8: // Deflate.
|
||||
{
|
||||
Mapping::CView *pFileDataView = 0;
|
||||
if(this->pMapping->Map(pFileDataView, pDirectoryItem->uiRelativeOffsetOfLocalHeader + sizeof(ZIPLocalFileHeader) + DirectoryEntry.uiFileNameLength + DirectoryEntry.uiExtraFieldLength, DirectoryEntry.uiCompressedSize))
|
||||
{
|
||||
hlBool bResult = hlFalse;
|
||||
hlByte *lpInflateBuffer = new hlByte[DirectoryEntry.uiUncompressedSize];
|
||||
uLongf iInflateSize = DirectoryEntry.uiUncompressedSize;
|
||||
switch(uncompressBack(lpInflateBuffer, &iInflateSize, static_cast<const hlByte *>(pFileDataView->GetView()), (uLong)DirectoryEntry.uiCompressedSize))
|
||||
{
|
||||
case Z_OK:
|
||||
pStream = new Streams::CMemoryStream(lpInflateBuffer, iInflateSize);
|
||||
bResult = hlTrue;
|
||||
break;
|
||||
case Z_MEM_ERROR:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Z_MEM_ERROR.");
|
||||
break;
|
||||
case Z_BUF_ERROR:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Z_BUF_ERROR.");
|
||||
break;
|
||||
case Z_DATA_ERROR:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Z_DATA_ERROR.");
|
||||
break;
|
||||
default:
|
||||
delete []lpInflateBuffer;
|
||||
LastError.SetErrorMessage("Deflate Error: Unknown.");
|
||||
break;
|
||||
}
|
||||
this->pMapping->Unmap(pFileDataView);
|
||||
return bResult;
|
||||
}
|
||||
return hlFalse;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
return hlFalse;
|
||||
}
|
||||
}
|
||||
|
||||
hlVoid CZIPFile::ReleaseStreamInternal(Streams::IStream &Stream) const
|
||||
{
|
||||
if(Stream.GetType() == HL_STREAM_MEMORY)
|
||||
{
|
||||
delete []static_cast<const hlByte *>(static_cast<Streams::CMemoryStream &>(Stream).GetBuffer());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -116,6 +116,7 @@ namespace HLLib
|
|||
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;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -28,6 +28,11 @@
|
|||
|
||||
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;
|
||||
|
@ -60,8 +65,8 @@ typedef hlSingle hlFloat;
|
|||
#define hlFalse 0
|
||||
#define hlTrue 1
|
||||
|
||||
#define HL_VERSION_NUMBER ((2 << 24) | (4 << 16) | (2 << 8) | 0)
|
||||
#define HL_VERSION_STRING "2.4.2"
|
||||
#define HL_VERSION_NUMBER ((2 << 24) | (4 << 16) | (3 << 8) | 0)
|
||||
#define HL_VERSION_STRING "2.4.3"
|
||||
|
||||
#define HL_ID_INVALID 0xffffffff
|
||||
|
||||
|
@ -186,7 +191,8 @@ typedef enum
|
|||
HL_PACKAGE_XZP,
|
||||
HL_PACKAGE_ZIP,
|
||||
HL_PACKAGE_NCF,
|
||||
HL_PACKAGE_VPK
|
||||
HL_PACKAGE_VPK,
|
||||
HL_PACKAGE_SGA
|
||||
} HLPackageType;
|
||||
|
||||
typedef enum
|
||||
|
@ -237,6 +243,19 @@ typedef enum
|
|||
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_COUNT,
|
||||
|
||||
HL_VBSP_PACKAGE_VERSION = 0,
|
||||
HL_VBSP_PACKAGE_MAP_REVISION,
|
||||
HL_VBSP_PACKAGE_COUNT,
|
||||
|
|
11
Readme.txt
11
Readme.txt
|
@ -9,11 +9,11 @@ Library/Author Information:
|
|||
===========================
|
||||
|
||||
---- General Library Information ----
|
||||
Date : May 22nd, 2011
|
||||
Date : September 18th, 2012
|
||||
Author : Ryan Gregg
|
||||
Michael Mohr (Linux Port)
|
||||
Title : HLLib
|
||||
Build : 2.4.2
|
||||
Build : 2.4.3
|
||||
Email address : ryansgregg@hotmail.com (Ryan Gregg)
|
||||
m.mohr@laposte.net (Michael Mohr)
|
||||
Home page / Website : http://nemesis.thewavelength.net/
|
||||
|
@ -93,6 +93,11 @@ Console Commands (Interactive console mode):
|
|||
Library Changelog:
|
||||
==================
|
||||
|
||||
v2.4.3
|
||||
- Added support for new VPK file format (v2).
|
||||
- Added SGA file support.
|
||||
- Added ZIP deflate support.
|
||||
|
||||
v2.4.2
|
||||
- Fixed crash when opening VBSP files with no pak file lump.
|
||||
|
||||
|
@ -117,7 +122,7 @@ Library Changelog:
|
|||
- Added support for new VBSP file format.
|
||||
|
||||
v2.1.1
|
||||
- Added support for new VPK file format.
|
||||
- Added support for new VPK file format (v1).
|
||||
- Added VPK file validation.
|
||||
- Fixed crash when closing VPK files.
|
||||
|
||||
|
|
217
lib/HLLib.h
217
lib/HLLib.h
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* HLLib
|
||||
* Copyright (C) 2006-2010 Ryan Gregg
|
||||
* Copyright (C) 2006-2012 Ryan Gregg
|
||||
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -28,6 +28,11 @@
|
|||
|
||||
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;
|
||||
|
@ -60,8 +65,8 @@ typedef hlSingle hlFloat;
|
|||
#define hlFalse 0
|
||||
#define hlTrue 1
|
||||
|
||||
#define HL_VERSION_NUMBER ((2 << 24) | (4 << 16) | (2 << 8) | 0)
|
||||
#define HL_VERSION_STRING "2.4.2"
|
||||
#define HL_VERSION_NUMBER ((2 << 24) | (4 << 16) | (3 << 8) | 0)
|
||||
#define HL_VERSION_STRING "2.4.3"
|
||||
|
||||
#define HL_ID_INVALID 0xffffffff
|
||||
|
||||
|
@ -190,7 +195,8 @@ typedef enum
|
|||
HL_PACKAGE_XZP,
|
||||
HL_PACKAGE_ZIP,
|
||||
HL_PACKAGE_NCF,
|
||||
HL_PACKAGE_VPK
|
||||
HL_PACKAGE_VPK,
|
||||
HL_PACKAGE_SGA
|
||||
} HLPackageType;
|
||||
|
||||
typedef enum
|
||||
|
@ -241,6 +247,19 @@ typedef enum
|
|||
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_COUNT,
|
||||
|
||||
HL_VBSP_PACKAGE_VERSION = 0,
|
||||
HL_VBSP_PACKAGE_MAP_REVISION,
|
||||
HL_VBSP_PACKAGE_COUNT,
|
||||
|
@ -1858,6 +1877,196 @@ namespace HLLib
|
|||
virtual hlBool CreateStreamInternal(const CDirectoryFile *pFile, Streams::IStream *&pStream) const;
|
||||
};
|
||||
|
||||
//
|
||||
// CSGAFile
|
||||
//
|
||||
|
||||
class HLLIB_API CSGAFile : public CPackage
|
||||
{
|
||||
private:
|
||||
#pragma pack(1)
|
||||
|
||||
struct SGAHeader
|
||||
{
|
||||
hlChar lpSignature[8];
|
||||
hlUShort uiMajorVersion;
|
||||
hlUShort uiMinorVersion;
|
||||
hlByte lpFileMD5[16];
|
||||
hlWChar lpName[64];
|
||||
hlByte lpHeaderMD5[16];
|
||||
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;
|
||||
|
||||
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 SGAFile
|
||||
{
|
||||
hlUInt uiNameOffset;
|
||||
hlUInt uiOffset;
|
||||
hlUInt uiSizeOnDisk;
|
||||
hlUInt uiSize;
|
||||
hlUInt uiTimeModified;
|
||||
hlByte uiDummy0;
|
||||
hlByte uiType;
|
||||
};
|
||||
|
||||
struct SGAFileHeader
|
||||
{
|
||||
hlChar lpName[256];
|
||||
hlUInt uiCRC32;
|
||||
};
|
||||
|
||||
#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;
|
||||
};
|
||||
|
||||
template<typename TSGADirectoryHeader, typename TSGASection, typename TSGAFolder, typename TSGAFile, typename TSGAFileHeader>
|
||||
class CSGADirectory : public ISGADirectory
|
||||
{
|
||||
public:
|
||||
CSGADirectory(CSGAFile& File);
|
||||
virtual ~CSGADirectory();
|
||||
|
||||
private:
|
||||
CSGAFile& File;
|
||||
|
||||
Mapping::CView *pHeaderDirectoryView;
|
||||
const TSGADirectoryHeader *pDirectoryHeader;
|
||||
const TSGASection *lpSections;
|
||||
const TSGAFolder *lpFolders;
|
||||
const TSGAFile *lpFiles;
|
||||
const hlChar *lpStringTable;
|
||||
|
||||
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 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:
|
||||
hlVoid CreateFolder(CDirectoryFolder *pParent, hlUInt uiFolderIndex);
|
||||
};
|
||||
|
||||
typedef CSGADirectory<SGADirectoryHeader4, SGASection4, SGAFolder4, SGAFile, SGAFileHeader> CSGADirectory4;
|
||||
typedef CSGADirectory<SGADirectoryHeader5, SGASection5, SGAFolder5, SGAFile, SGAFileHeader> CSGADirectory5;
|
||||
|
||||
friend CSGADirectory4;
|
||||
friend CSGADirectory5;
|
||||
|
||||
private:
|
||||
static const char *lpAttributeNames[];
|
||||
static const char *lpItemAttributeNames[];
|
||||
|
||||
Mapping::CView *pHeaderView;
|
||||
const SGAHeader *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
|
||||
//
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS;USE_ZLIB=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
|
@ -90,6 +90,7 @@
|
|||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||
<AdditionalIncludeDirectories>E:\Projects\Utilities\ZLib</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)HLLib.dll</OutputFile>
|
||||
|
@ -101,6 +102,8 @@
|
|||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(OutDir)HLLib.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
<AdditionalLibraryDirectories>E:\Projects\Utilities\ZLib\contrib\vstudio\vc10\x86\ZlibStatDebug</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>zlibstat.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
|
@ -109,7 +112,7 @@
|
|||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS;USE_ZLIB=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
|
@ -119,6 +122,7 @@
|
|||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<AdditionalIncludeDirectories>E:\Projects\Utilities\ZLib</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)HLLib.dll</OutputFile>
|
||||
|
@ -130,6 +134,8 @@
|
|||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(OutDir)HLLib.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
<AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>E:\Projects\Utilities\ZLib\contrib\vstudio\vc10\x64\ZlibStatDebug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
|
@ -139,7 +145,7 @@
|
|||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS;USE_ZLIB=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||
|
@ -147,6 +153,7 @@
|
|||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<AdditionalIncludeDirectories>E:\Projects\Utilities\ZLib</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)HLLib.dll</OutputFile>
|
||||
|
@ -159,6 +166,8 @@
|
|||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(OutDir)HLLib.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
<AdditionalLibraryDirectories>E:\Projects\Utilities\ZLib\contrib\vstudio\vc10\x86\ZlibStatRelease</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>zlibstat.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
|
@ -171,7 +180,7 @@
|
|||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS;USE_ZLIB=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||
|
@ -179,6 +188,7 @@
|
|||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<AdditionalIncludeDirectories>E:\Projects\Utilities\ZLib</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)HLLib.dll</OutputFile>
|
||||
|
@ -191,6 +201,8 @@
|
|||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(OutDir)HLLib.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
<AdditionalLibraryDirectories>E:\Projects\Utilities\ZLib\contrib\vstudio\vc10\x64\ZlibStatRelease;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
|
@ -198,6 +210,7 @@
|
|||
<ClCompile Include="..\..\..\HLLib\DebugMemory.cpp" />
|
||||
<ClCompile Include="..\..\..\HLLib\Error.cpp" />
|
||||
<ClCompile Include="..\..\..\HLLib\HLLib.cpp" />
|
||||
<ClCompile Include="..\..\..\HLLib\SGAFile.cpp" />
|
||||
<ClCompile Include="..\..\..\HLLib\Utility.cpp" />
|
||||
<ClCompile Include="..\..\..\HLLib\Wrapper.cpp" />
|
||||
<ClCompile Include="..\..\..\HLLib\DirectoryFile.cpp" />
|
||||
|
@ -231,6 +244,7 @@
|
|||
<ClInclude Include="..\..\..\HLLib\Error.h" />
|
||||
<ClInclude Include="..\..\..\HLLib\HLLib.h" />
|
||||
<ClInclude Include="..\..\..\HLLib\resource.h" />
|
||||
<ClInclude Include="..\..\..\HLLib\SGAFile.h" />
|
||||
<ClInclude Include="..\..\..\HLLib\stdafx.h" />
|
||||
<ClInclude Include="..\..\..\HLLib\Utility.h" />
|
||||
<ClInclude Include="..\..\..\HLLib\Wrapper.h" />
|
||||
|
|
|
@ -99,6 +99,88 @@
|
|||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|x64"
|
||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||
CharacterSet="0"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_WIN64;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
ExceptionHandling="1"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
RuntimeTypeInfo="false"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/HLLib.dll"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile="$(OutDir)/HLLib.pdb"
|
||||
SubSystem="2"
|
||||
ImportLibrary="$(OutDir)/HLLib.lib"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
|
@ -184,88 +266,6 @@
|
|||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|x64"
|
||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||
CharacterSet="0"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_WIN64;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
ExceptionHandling="1"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
RuntimeTypeInfo="false"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/HLLib.dll"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile="$(OutDir)/HLLib.pdb"
|
||||
SubSystem="2"
|
||||
ImportLibrary="$(OutDir)/HLLib.lib"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|x64"
|
||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
|
@ -424,6 +424,10 @@
|
|||
RelativePath="..\..\..\HLLib\PAKFile.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\SGAFile.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\VBSPFile.cpp"
|
||||
>
|
||||
|
@ -582,6 +586,10 @@
|
|||
RelativePath="..\..\..\HLLib\PAKFile.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\SGAFile.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\VBSPFile.h"
|
||||
>
|
||||
|
|
|
@ -45,7 +45,8 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS"
|
||||
AdditionalIncludeDirectories="E:\Projects\Utilities\ZLib"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS;USE_ZLIB=1"
|
||||
MinimalRebuild="true"
|
||||
ExceptionHandling="1"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -66,8 +67,10 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="zlibstat.lib"
|
||||
OutputFile="$(OutDir)/HLLib.dll"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="E:\Projects\Utilities\ZLib\contrib\vstudio\vc9\x86\ZlibStatDebug"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile="$(OutDir)/HLLib.pdb"
|
||||
SubSystem="2"
|
||||
|
@ -125,7 +128,8 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS"
|
||||
AdditionalIncludeDirectories="E:\Projects\Utilities\ZLib"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;_USE_RTM_VERSION;HLLIB_EXPORTS;USE_ZLIB=1"
|
||||
MinimalRebuild="true"
|
||||
ExceptionHandling="1"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -146,8 +150,10 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="zlibstat.lib"
|
||||
OutputFile="$(OutDir)/HLLib.dll"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="E:\Projects\Utilities\ZLib\contrib\vstudio\vc9\x64\ZlibStatDebug"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile="$(OutDir)/HLLib.pdb"
|
||||
SubSystem="2"
|
||||
|
@ -209,7 +215,8 @@
|
|||
EnableIntrinsicFunctions="true"
|
||||
FavorSizeOrSpeed="1"
|
||||
WholeProgramOptimization="true"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS"
|
||||
AdditionalIncludeDirectories="E:\Projects\Utilities\ZLib"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS;USE_ZLIB=1"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
BufferSecurityCheck="false"
|
||||
|
@ -228,8 +235,10 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="zlibstat.lib"
|
||||
OutputFile="$(OutDir)/HLLib.dll"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="E:\Projects\Utilities\ZLib\contrib\vstudio\vc9\x86\ZlibStatRelease"
|
||||
GenerateDebugInformation="false"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
|
@ -293,7 +302,8 @@
|
|||
EnableIntrinsicFunctions="true"
|
||||
FavorSizeOrSpeed="1"
|
||||
WholeProgramOptimization="true"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS"
|
||||
AdditionalIncludeDirectories="E:\Projects\Utilities\ZLib"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HLLIB_EXPORTS;USE_ZLIB=1"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
BufferSecurityCheck="false"
|
||||
|
@ -312,8 +322,10 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="zlibstat.lib"
|
||||
OutputFile="$(OutDir)/HLLib.dll"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="E:\Projects\Utilities\ZLib\contrib\vstudio\vc9\x64\ZlibStatRelease"
|
||||
GenerateDebugInformation="false"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
|
@ -417,6 +429,10 @@
|
|||
RelativePath="..\..\..\HLLib\PAKFile.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\SGAFile.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\VBSPFile.cpp"
|
||||
>
|
||||
|
@ -575,6 +591,10 @@
|
|||
RelativePath="..\..\..\HLLib\PAKFile.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\SGAFile.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\HLLib\VBSPFile.h"
|
||||
>
|
||||
|
|
Loading…
Reference in New Issue