#ifndef __FILETREE_H__
#define __FILETREE_H__
#define FTREE_FLAG_USE_DATA_ID 0x0001
#define FTREE_FLAG_USE_LOCALE_FLAGS 0x0002
#define FTREE_FLAG_USE_CONTENT_FLAGS 0x0004
#define CFN_FLAG_FOLDER 0x0001
#define CFN_FLAG_MOUNT_POINT 0x0002
typedef struct _CASC_FILE_NODE
{
ULONGLONG FileNameHash; PCASC_CKEY_ENTRY pCKeyEntry;
DWORD Parent; DWORD NameIndex; USHORT NameLength; USHORT Flags;
DWORD ExtraValues[4]; } CASC_FILE_NODE, *PCASC_FILE_NODE;
class CASC_FILE_TREE
{
public:
DWORD Create(DWORD Flags = 0);
void Free();
PCASC_FILE_NODE InsertByName(PCASC_CKEY_ENTRY pCKeyEntry, const char * szFileName, DWORD FileDataId = CASC_INVALID_ID, DWORD LocaleFlags = CASC_INVALID_ID, DWORD ContentFlags = CASC_INVALID_ID);
PCASC_FILE_NODE InsertByHash(PCASC_CKEY_ENTRY pCKeyEntry, ULONGLONG FileNameHash, DWORD FileDataId, DWORD LocaleFlags = CASC_INVALID_ID, DWORD ContentFlags = CASC_INVALID_ID);
PCASC_FILE_NODE InsertById(PCASC_CKEY_ENTRY pCKeyEntry, DWORD FileDataId, DWORD LocaleFlags = CASC_INVALID_ID, DWORD ContentFlags = CASC_INVALID_ID);
PCASC_FILE_NODE ItemAt(size_t nItemIndex);
PCASC_FILE_NODE PathAt(char * szBuffer, size_t cchBuffer, size_t nItemIndex);
size_t PathAt(char * szBuffer, size_t cchBuffer, PCASC_FILE_NODE pFileNode);
PCASC_FILE_NODE Find(const char * szFullPath, DWORD FileDataId, struct _CASC_FIND_DATA * pFindData);
PCASC_FILE_NODE Find(PCASC_CKEY_ENTRY pCKeyEntry);
PCASC_FILE_NODE Find(ULONGLONG FileNameHash);
PCASC_FILE_NODE FindById(DWORD FileDataId);
bool SetNodeFileName(PCASC_FILE_NODE pFileNode, const char * szFileName);
size_t GetMaxFileIndex();
size_t GetCount();
size_t IndexOf(PCASC_FILE_NODE pFileNode);
void GetExtras(PCASC_FILE_NODE pFileNode, PDWORD PtrFileDataId, PDWORD PtrLocaleFlags, PDWORD PtrContentFlags);
void SetExtras(PCASC_FILE_NODE pFileNode, DWORD FileDataId, DWORD LocaleFlags, DWORD ContentFlags);
bool SetKeyLength(DWORD KeyLength);
DWORD GetNextFileDataId();
#ifdef CASCLIB_DEBUG
void DumpFileDataIds(const char * szFileName)
{
FileDataIds.Dump(szFileName);
}
#endif
protected:
PCASC_FILE_NODE InsertNew(PCASC_CKEY_ENTRY pCKeyEntry);
PCASC_FILE_NODE InsertNew();
bool InsertToNameMap(PCASC_FILE_NODE pFileNode);
bool InsertToIdTable(PCASC_FILE_NODE pFileNode);
bool SetNodePlainName(PCASC_FILE_NODE pFileNode, const char * szPlainName, const char * szPlainNameEnd);
bool RebuildNameMaps();
CASC_ARRAY NodeTable; CASC_ARRAY NameTable;
CASC_SPARSE_ARRAY FileDataIds; CASC_MAP NameMap;
size_t FileDataIdOffset; size_t LocaleFlagsOffset; size_t ContentFlagsOffset; size_t FolderNodes; size_t FileNodes; DWORD KeyLength; };
typedef CASC_FILE_TREE * PCASC_FILE_TREE;
#endif