write some CKStateChunk code
This commit is contained in:
@ -23,7 +23,6 @@ namespace LibCmo {
|
||||
using XClassArray = std::vector<T>;
|
||||
//using CKObjectArray = std::vector<CKObject*>;
|
||||
|
||||
|
||||
struct CKGUID {
|
||||
union {
|
||||
struct {
|
||||
|
@ -347,6 +347,11 @@ namespace LibCmo {
|
||||
return CKERROR::CKERR_OK;
|
||||
}
|
||||
|
||||
CKERROR CKFile::DeepLoad(CKSTRING u8_filename, CKFileData::DeepDocument** out_doc) {
|
||||
return CKERROR::CKERR_OK;
|
||||
}
|
||||
|
||||
|
||||
//CKERROR CKFile::Load(CKSTRING u8_filename, /*CKObjectArray list, */ CK_LOAD_FLAGS flags) {
|
||||
// CKERROR result = this->OpenFile(u8_filename, flags);
|
||||
// if (result == CKERROR::CKERR_OK || result == CKERROR::CKERR_PLUGINSMISSING) {
|
||||
|
@ -3,13 +3,11 @@
|
||||
#include "CKDefines.hpp"
|
||||
#include "CKEnums.hpp"
|
||||
#include "VTEncoding.hpp"
|
||||
#include "VTObjects.hpp"
|
||||
#include <filesystem>
|
||||
|
||||
namespace LibCmo {
|
||||
|
||||
// forward decl to rm recursive reference
|
||||
namespace ObjsImpl { class CKObject; }
|
||||
|
||||
class CKMinContext {
|
||||
public:
|
||||
CKMinContext();
|
||||
@ -19,7 +17,7 @@ namespace LibCmo {
|
||||
|
||||
void Printf(CKSTRING fmt, ...);
|
||||
|
||||
ObjsImpl::CKObject* CreateObject(CK_ID id, CKSTRING name);
|
||||
ObjsImpl::CKObject* CreateObject(CK_ID id, CK_CLASSID cls, CKSTRING name);
|
||||
void DestroyObject(ObjsImpl::CKObject* obj);
|
||||
|
||||
void GetUtf8ObjectName(std::string& native_name, std::string& u8_name);
|
||||
|
@ -9,27 +9,96 @@
|
||||
|
||||
namespace LibCmo {
|
||||
|
||||
#pragma region Ctor Dtor
|
||||
|
||||
CKStateChunk::CKStateChunk() :
|
||||
m_ClassId(CK_CLASSID::CKCID_OBJECT), m_DataDwSize(0u), m_pData(nullptr),
|
||||
m_DataVersion(CK_STATECHUNK_DATAVERSION::CHUNKDATA_CURRENTVERSION), m_ChunkVersion(CK_STATECHUNK_CHUNKVERSION::CHUNK_VERSION4),
|
||||
m_Parser{ 0u, 0u, 0u },
|
||||
m_Parser{ CKStateChunkStatus::IDLE, 0u, 0u, 0u },
|
||||
m_ObjectList(), m_ChunkList(), m_ManagerList()
|
||||
{
|
||||
;
|
||||
}
|
||||
LibCmo::CKStateChunk::CKStateChunk(CK_CLASSID clsid) :
|
||||
m_ClassId(clsid), m_DataDwSize(0u), m_pData(nullptr),
|
||||
m_DataVersion(CK_STATECHUNK_DATAVERSION::CHUNKDATA_CURRENTVERSION), m_ChunkVersion(CK_STATECHUNK_CHUNKVERSION::CHUNK_VERSION4),
|
||||
m_Parser{ 0u, 0u, 0u },
|
||||
m_ObjectList(), m_ChunkList(), m_ManagerList()
|
||||
CKStateChunk::CKStateChunk(const CKStateChunk& rhs) :
|
||||
m_ClassId(rhs.m_ClassId), m_DataVersion(rhs.m_DataVersion), m_ChunkVersion(rhs.m_ChunkVersion),
|
||||
m_Parser(rhs.m_Parser),
|
||||
m_ObjectList(rhs.m_ObjectList), m_ManagerList(rhs.m_ManagerList), m_ChunkList(rhs.m_ChunkList),
|
||||
m_pData(nullptr), m_DataDwSize(rhs.m_DataDwSize)
|
||||
{
|
||||
;
|
||||
// copy buffer
|
||||
if (rhs.m_pData != nullptr) {
|
||||
this->m_pData = new(std::nothrow) CKDWORD[rhs.m_DataDwSize];
|
||||
if (this->m_pData != nullptr) {
|
||||
memcpy(this->m_pData, rhs.m_pData, sizeof(CKDWORD) * rhs.m_DataDwSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
CKStateChunk& CKStateChunk::operator=(const CKStateChunk& rhs) {
|
||||
this->Clear();
|
||||
|
||||
this->m_DataVersion = rhs.m_DataVersion;
|
||||
this->m_ChunkVersion = rhs.m_ChunkVersion;
|
||||
this->m_ClassId = rhs.m_ClassId;
|
||||
|
||||
this->m_Parser = rhs.m_Parser;
|
||||
|
||||
this->m_ObjectList = rhs.m_ObjectList;
|
||||
this->m_ManagerList = rhs.m_ManagerList;
|
||||
this->m_ChunkList = rhs.m_ChunkList;
|
||||
|
||||
// copy buffer
|
||||
if (rhs.m_pData != nullptr) {
|
||||
this->m_pData = new(std::nothrow) CKDWORD[rhs.m_DataDwSize];
|
||||
if (this->m_pData != nullptr) {
|
||||
memcpy(this->m_pData, rhs.m_pData, sizeof(CKDWORD) * rhs.m_DataDwSize);
|
||||
}
|
||||
}
|
||||
this->m_DataDwSize = rhs.m_DataDwSize;
|
||||
|
||||
return *this;
|
||||
}
|
||||
CKStateChunk::~CKStateChunk() {
|
||||
if (this->m_pData != nullptr)
|
||||
delete[] this->m_pData;
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Misc Funcs
|
||||
|
||||
void CKStateChunk::Clear(void) {
|
||||
this->m_ClassId = CK_CLASSID::CKCID_OBJECT;
|
||||
//this->m_DataVersion = CK_STATECHUNK_DATAVERSION::CHUNK_DEV_2_1;
|
||||
//this->m_ChunkVersion = CK_STATECHUNK_CHUNKVERSION::CHUNK_VERSION4;
|
||||
|
||||
this->m_Parser.m_CurrentPos = 0;
|
||||
this->m_Parser.m_DataSize = 0;
|
||||
this->m_Parser.m_PrevIdentifierPos = 0;
|
||||
|
||||
this->m_DataDwSize = 0;
|
||||
if (this->m_pData != nullptr) {
|
||||
delete[] this->m_pData;
|
||||
this->m_pData = nullptr;
|
||||
}
|
||||
|
||||
this->m_ObjectList.clear();
|
||||
this->m_ManagerList.clear();
|
||||
this->m_ChunkList.clear();
|
||||
}
|
||||
|
||||
CKDWORD CKStateChunk::GetDataSize(void) {
|
||||
return sizeof(CKDWORD) * this->m_DataDwSize;
|
||||
}
|
||||
|
||||
void LibCmo::CKStateChunk::_EnsureWriteSpace(CKDWORD size) {
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Buffer Related
|
||||
|
||||
bool CKStateChunk::ConvertFromBuffer(const void* buf) {
|
||||
if (buf == nullptr) return false;
|
||||
|
||||
@ -163,6 +232,9 @@ namespace LibCmo {
|
||||
return 0u;
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
|
||||
//bool CKStateChunk::UnPack(CKDWORD DestSize) {
|
||||
// // NOTE: in UnPack. pData store the compressed buffer, and
|
||||
// // dwSize store the length of compressed buffer as CHAR size, not DWORD size!
|
||||
@ -192,20 +264,21 @@ namespace LibCmo {
|
||||
// return true;
|
||||
//}
|
||||
|
||||
CKDWORD CKStateChunk::GetDataSize(void) {
|
||||
return sizeof(CKDWORD) * this->m_DataDwSize;
|
||||
}
|
||||
|
||||
bool CKStateChunk::SeekIdentifier(CKDWORD identifier) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void CKStateChunk::StartRead(void) {
|
||||
if (this->m_Parser.m_Status != CKStateChunkStatus::IDLE) return;
|
||||
|
||||
this->m_Parser.m_CurrentPos = 0u;
|
||||
this->m_Parser.m_DataSize = this->m_DataDwSize;
|
||||
this->m_Parser.m_PrevIdentifierPos = 0u;
|
||||
this->m_Parser.m_Status = CKStateChunkStatus::READ;
|
||||
}
|
||||
|
||||
void CKStateChunk::ReadString(std::string& strl) {
|
||||
;
|
||||
}
|
||||
|
||||
void LibCmo::CKStateChunk::_EnsureEnoughSpace(CKDWORD size) {
|
||||
;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -8,23 +8,30 @@ namespace LibCmo {
|
||||
class CKStateChunk {
|
||||
public:
|
||||
CKStateChunk();
|
||||
CKStateChunk(CK_CLASSID clsid);
|
||||
CKStateChunk(const CKStateChunk&) = delete;
|
||||
CKStateChunk& operator=(const CKStateChunk&) = delete;
|
||||
CKStateChunk(const CKStateChunk&);
|
||||
CKStateChunk& operator=(const CKStateChunk&);
|
||||
~CKStateChunk();
|
||||
|
||||
bool ConvertFromOldBuffer(const void* buf, CKDWORD buf_size, CKDWORD blk_size, CK_FILE_WRITEMODE mode);
|
||||
void Clear(void);
|
||||
|
||||
bool ConvertFromBuffer(const void* buf);
|
||||
CKDWORD ConvertToBuffer(void* buf);
|
||||
|
||||
bool UnPack(CKDWORD DestSize);
|
||||
//bool UnPack(CKDWORD DestSize);
|
||||
CKDWORD GetDataSize(void);
|
||||
|
||||
bool SeekIdentifier(CKDWORD identifier);
|
||||
|
||||
void StartRead(void);
|
||||
void ReadString(std::string& strl);
|
||||
|
||||
private:
|
||||
enum class CKStateChunkStatus : int32_t {
|
||||
IDLE,
|
||||
READ,
|
||||
WRITE
|
||||
};
|
||||
|
||||
CK_CLASSID m_ClassId;
|
||||
CKDWORD m_DataDwSize;
|
||||
CKDWORD* m_pData;
|
||||
@ -33,6 +40,7 @@ namespace LibCmo {
|
||||
CK_STATECHUNK_CHUNKVERSION m_ChunkVersion;
|
||||
|
||||
struct {
|
||||
CKStateChunkStatus m_Status;
|
||||
CKDWORD m_CurrentPos;
|
||||
CKDWORD m_DataSize;
|
||||
CKDWORD m_PrevIdentifierPos;
|
||||
@ -43,8 +51,10 @@ namespace LibCmo {
|
||||
std::vector<CKDWORD> m_ManagerList;
|
||||
|
||||
private:
|
||||
void _EnsureEnoughSpace(CKDWORD size);
|
||||
|
||||
void _EnsureWriteSpace(CKDWORD size);
|
||||
inline bool _EnsureReadSpace(CKDWORD required) {
|
||||
return (this->m_Parser.m_CurrentPos <= this->m_Parser.m_DataSize) && (required <= (this->m_Parser.m_DataSize - this->m_Parser.m_CurrentPos));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -190,6 +190,7 @@
|
||||
<ClInclude Include="CKMinContext.hpp" />
|
||||
<ClInclude Include="CKStateChunk.hpp" />
|
||||
<ClInclude Include="VTEncoding.hpp" />
|
||||
<ClInclude Include="VTManagers.hpp" />
|
||||
<ClInclude Include="VTObjects.hpp" />
|
||||
<ClInclude Include="VTUtils.hpp" />
|
||||
<ClInclude Include="VxMemoryMappedFile.hpp" />
|
||||
|
@ -80,5 +80,8 @@
|
||||
<ClInclude Include="CKMinContext.hpp">
|
||||
<Filter>Headers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="VTManagers.hpp">
|
||||
<Filter>Headers</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
26
LibCmo/VTManagers.hpp
Normal file
26
LibCmo/VTManagers.hpp
Normal file
@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include "CKDefines.hpp"
|
||||
#include "CKEnums.hpp"
|
||||
|
||||
namespace LibCmo {
|
||||
|
||||
// forward decl to rm recursive reference
|
||||
class CKMinContext;
|
||||
class CKStateChunk;
|
||||
|
||||
namespace MgrsImpl {
|
||||
|
||||
class CKBaseManager {
|
||||
public:
|
||||
CKBaseManager();
|
||||
CKBaseManager(const CKBaseManager&) = delete;
|
||||
CKBaseManager& operator=(const CKBaseManager&) = delete;
|
||||
virtual ~CKBaseManager();
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
}
|
@ -2,9 +2,13 @@
|
||||
|
||||
#include "CKDefines.hpp"
|
||||
#include "CKEnums.hpp"
|
||||
#include "CKStateChunk.hpp"
|
||||
|
||||
namespace LibCmo {
|
||||
|
||||
// forward decl to rm recursive reference
|
||||
class CKMinContext;
|
||||
class CKStateChunk;
|
||||
|
||||
namespace ObjsImpl {
|
||||
|
||||
class CKObject {
|
||||
|
Reference in New Issue
Block a user