ddnet/src/engine/shared/datafile.h

147 lines
3.4 KiB
C
Raw Normal View History

2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2010-05-29 07:25:38 +00:00
#ifndef ENGINE_SHARED_DATAFILE_H
#define ENGINE_SHARED_DATAFILE_H
2019-12-08 22:14:56 +00:00
#include <engine/storage.h>
#include <base/hash.h>
#include <base/types.h>
#include "uuid_manager.h"
#include <array>
#include <vector>
enum
{
ITEMTYPE_EX = 0xffff,
};
2010-05-29 07:25:38 +00:00
// raw datafile access
class CDataFileReader
{
struct CDatafile *m_pDataFile;
void *GetDataImpl(int Index, bool Swap);
int GetFileDataSize(int Index) const;
int GetExternalItemType(int InternalType, CUuid *pUuid);
int GetInternalItemType(int ExternalType);
2010-05-29 07:25:38 +00:00
public:
CDataFileReader() :
m_pDataFile(nullptr) {}
2010-05-29 07:25:38 +00:00
~CDataFileReader() { Close(); }
CDataFileReader &operator=(CDataFileReader &&Other)
{
m_pDataFile = Other.m_pDataFile;
Other.m_pDataFile = nullptr;
return *this;
}
2010-10-06 21:07:35 +00:00
bool Open(class IStorage *pStorage, const char *pFilename, int StorageType);
2010-05-29 07:25:38 +00:00
bool Close();
2023-05-15 16:04:58 +00:00
bool IsOpen() const { return m_pDataFile != nullptr; }
IOHANDLE File() const;
int GetDataSize(int Index) const;
2010-05-29 07:25:38 +00:00
void *GetData(int Index);
void *GetDataSwapped(int Index); // makes sure that the data is 32bit LE ints when saved
const char *GetDataString(int Index);
void ReplaceData(int Index, char *pData, size_t Size); // memory for data must have been allocated with malloc
2010-05-29 07:25:38 +00:00
void UnloadData(int Index);
2023-05-15 16:04:58 +00:00
int NumData() const;
int GetItemSize(int Index) const;
void *GetItem(int Index, int *pType = nullptr, int *pID = nullptr, CUuid *pUuid = nullptr);
2010-05-29 07:25:38 +00:00
void GetType(int Type, int *pStart, int *pNum);
int FindItemIndex(int Type, int ID);
void *FindItem(int Type, int ID);
int NumItems() const;
SHA256_DIGEST Sha256() const;
unsigned Crc() const;
int MapSize() const;
2010-05-29 07:25:38 +00:00
};
// write access
class CDataFileWriter
{
public:
enum ECompressionLevel
{
COMPRESSION_DEFAULT,
COMPRESSION_BEST,
};
private:
2010-05-29 07:25:38 +00:00
struct CDataInfo
{
void *m_pUncompressedData;
2010-05-29 07:25:38 +00:00
int m_UncompressedSize;
void *m_pCompressedData;
int m_CompressedSize;
ECompressionLevel m_CompressionLevel;
};
2010-05-29 07:25:38 +00:00
struct CItemInfo
{
int m_Type;
int m_ID;
2010-05-29 07:25:38 +00:00
int m_Size;
int m_Next;
int m_Prev;
void *m_pData;
};
struct CItemTypeInfo
{
int m_Num;
int m_First;
int m_Last;
};
struct CExtendedItemType
{
int m_Type;
CUuid m_Uuid;
};
enum
{
MAX_ITEM_TYPES = 0x10000,
};
2010-05-29 07:25:38 +00:00
IOHANDLE m_File;
std::array<CItemTypeInfo, MAX_ITEM_TYPES> m_aItemTypes;
std::vector<CItemInfo> m_vItems;
std::vector<CDataInfo> m_vDatas;
std::vector<CExtendedItemType> m_vExtendedItemTypes;
int GetTypeFromIndex(int Index) const;
int GetExtendedItemTypeIndex(int Type, const CUuid *pUuid);
2010-05-29 07:25:38 +00:00
public:
CDataFileWriter();
CDataFileWriter(CDataFileWriter &&Other)
{
m_File = Other.m_File;
Other.m_File = 0;
m_aItemTypes = std::move(Other.m_aItemTypes);
m_vItems = std::move(Other.m_vItems);
m_vDatas = std::move(Other.m_vDatas);
m_vExtendedItemTypes = std::move(Other.m_vExtendedItemTypes);
}
~CDataFileWriter();
2020-10-27 17:57:14 +00:00
bool Open(class IStorage *pStorage, const char *pFilename, int StorageType = IStorage::TYPE_SAVE);
int AddItem(int Type, int ID, size_t Size, const void *pData, const CUuid *pUuid = nullptr);
int AddData(size_t Size, const void *pData, ECompressionLevel CompressionLevel = COMPRESSION_DEFAULT);
int AddDataSwapped(size_t Size, const void *pData);
int AddDataString(const char *pStr);
void Finish();
2010-05-29 07:25:38 +00:00
};
#endif