fix including file error in CKFile. update reader -> writer method
This commit is contained in:
@ -1,5 +1,7 @@
|
||||
#include "CKFile.hpp"
|
||||
#include "CKStateChunk.hpp"
|
||||
#include "CKContext.hpp"
|
||||
#include "MgrImpls/CKPathManager.hpp"
|
||||
#include "ObjImpls/CKObject.hpp"
|
||||
#include <cstdarg>
|
||||
|
||||
@ -132,7 +134,7 @@ namespace LibCmo::CK2 {
|
||||
|
||||
CKFileReader::~CKFileReader() {}
|
||||
|
||||
CKINT CKFileReader::GetSaveIdMax() {
|
||||
CK_ID CKFileReader::GetSaveIdMax() {
|
||||
return m_SaveIDMax;
|
||||
}
|
||||
|
||||
@ -162,78 +164,124 @@ namespace LibCmo::CK2 {
|
||||
|
||||
CKFileWriter::CKFileWriter(CKContext* ctx) :
|
||||
m_Ctx(ctx), m_Visitor(this),
|
||||
m_Done(false), m_IsCopyFromReader(false),
|
||||
m_Done(false),
|
||||
m_DisableAddingObject(false), m_DisableAddingFile(false),
|
||||
m_SaveIDMax(0),
|
||||
m_FileObjects(), m_ManagersData(), m_PluginsDep(), m_IncludedFiles(),
|
||||
m_FileInfo()
|
||||
{}
|
||||
|
||||
CKFileWriter::CKFileWriter(CKContext* ctx, CKFileReader* reader) :
|
||||
CKFileWriter::CKFileWriter(CKContext* ctx, CKFileReader* reader, bool is_shallow) :
|
||||
m_Ctx(ctx), m_Visitor(this),
|
||||
m_Done(false), m_IsCopyFromReader(true),
|
||||
m_Done(false),
|
||||
m_DisableAddingObject(true), m_DisableAddingFile(!is_shallow), // only disable adding file in shallow mode. but disable adding object in all mode.
|
||||
m_SaveIDMax(0),
|
||||
m_FileObjects(), m_ManagersData(), m_PluginsDep(), m_IncludedFiles(),
|
||||
m_FileInfo()
|
||||
{
|
||||
// sync save id max
|
||||
this->m_SaveIDMax = reader->GetSaveIdMax();
|
||||
if (is_shallow) {
|
||||
|
||||
// copy objects
|
||||
for (const auto& item : reader->GetFileObjects()) {
|
||||
CKFileObject obj;
|
||||
// copy CKObject pointer
|
||||
obj.ObjPtr = item.ObjPtr;
|
||||
// and use ctor to copy CKStateChunk
|
||||
if (item.Data == nullptr) {
|
||||
obj.Data = nullptr;
|
||||
} else {
|
||||
obj.Data = new CKStateChunk(*item.Data);
|
||||
#pragma region Shallow Assign
|
||||
|
||||
// sync save id max
|
||||
this->m_SaveIDMax = reader->GetSaveIdMax();
|
||||
|
||||
// copy statechunk
|
||||
for (const auto& item : reader->GetFileObjects()) {
|
||||
CKFileObject obj;
|
||||
|
||||
// use ctor to copy CKStateChunk
|
||||
if (item.Data == nullptr) {
|
||||
obj.Data = nullptr;
|
||||
} else {
|
||||
obj.Data = new CKStateChunk(*item.Data);
|
||||
}
|
||||
|
||||
// set other data
|
||||
obj.ObjectId = item.ObjectId;
|
||||
obj.CreatedObjectId = 0;
|
||||
obj.ObjectCid = item.ObjectCid;
|
||||
obj.ObjPtr = nullptr; // set zero for obj
|
||||
obj.Name = item.Name;
|
||||
obj.SaveFlags = item.SaveFlags;
|
||||
|
||||
// insert
|
||||
m_FileObjects.emplace_back(std::move(obj));
|
||||
}
|
||||
|
||||
// copy other data
|
||||
obj.ObjectId = item.ObjectId;
|
||||
obj.ObjectCid = item.ObjectCid;
|
||||
obj.SaveFlags = item.SaveFlags;
|
||||
obj.Name = item.Name;
|
||||
// copy managers
|
||||
for (const auto& item : reader->GetManagersData()) {
|
||||
CKFileManagerData mgr;
|
||||
// copy guid
|
||||
mgr.Manager = item.Manager;
|
||||
// copy chunk
|
||||
if (item.Data == nullptr) {
|
||||
mgr.Data = nullptr;
|
||||
} else {
|
||||
mgr.Data = new CKStateChunk(*item.Data);
|
||||
}
|
||||
|
||||
// insert
|
||||
m_FileObjects.emplace_back(std::move(obj));
|
||||
}
|
||||
|
||||
// copy managers
|
||||
for (const auto& item : reader->GetManagersData()) {
|
||||
CKFileManagerData mgr;
|
||||
// copy guid
|
||||
mgr.Manager = item.Manager;
|
||||
// copy chunk
|
||||
if (item.Data == nullptr) {
|
||||
mgr.Data = nullptr;
|
||||
} else {
|
||||
mgr.Data = new CKStateChunk(*item.Data);
|
||||
// insert
|
||||
m_ManagersData.emplace_back(std::move(mgr));
|
||||
}
|
||||
|
||||
// insert
|
||||
m_ManagersData.emplace_back(std::move(mgr));
|
||||
}
|
||||
// copy plugin dep
|
||||
for (const auto& item : reader->GetPluginsDep()) {
|
||||
// direct copy
|
||||
m_PluginsDep.emplace_back(item);
|
||||
}
|
||||
|
||||
// copy plugin dep
|
||||
for (const auto& item : reader->GetPluginsDep()) {
|
||||
// direct copy
|
||||
m_PluginsDep.emplace_back(item);
|
||||
}
|
||||
// copy included file
|
||||
for (const auto& item : reader->GetIncludedFiles()) {
|
||||
// resolve it to temp folder
|
||||
// and add it
|
||||
m_IncludedFiles.emplace_back(m_Ctx->GetPathManager()->GetTempFilePath(item.c_str()));
|
||||
}
|
||||
|
||||
// copy included file
|
||||
for (const auto& item : reader->GetIncludedFiles()) {
|
||||
// direct copy
|
||||
m_IncludedFiles.emplace_back(item);
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
} else {
|
||||
|
||||
#pragma region Deep Assign
|
||||
|
||||
// copy object and calc max id
|
||||
CK_ID maxid = 0;
|
||||
for (const auto& item : reader->GetFileObjects()) {
|
||||
CKFileObject obj;
|
||||
|
||||
// skip if invalid
|
||||
if (item.ObjPtr == nullptr) continue;
|
||||
|
||||
// set obj ptr
|
||||
obj.ObjPtr = item.ObjPtr;
|
||||
|
||||
// set other data
|
||||
obj.ObjectId = obj.ObjPtr->GetID();
|
||||
obj.ObjectCid = obj.ObjPtr->GetClassID();
|
||||
obj.Data = nullptr; // blank statechunk
|
||||
obj.SaveFlags = CK_STATESAVE_ALL;
|
||||
XContainer::NSXString::FromCKSTRING(obj.Name, obj.ObjPtr->GetName());
|
||||
|
||||
// update max id
|
||||
maxid = std::max(maxid, obj.ObjectId);
|
||||
|
||||
// insert
|
||||
m_FileObjects.emplace_back(std::move(obj));
|
||||
|
||||
}
|
||||
|
||||
// set max id
|
||||
m_SaveIDMax = maxid;
|
||||
|
||||
#pragma endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
CKFileWriter::~CKFileWriter() {}
|
||||
|
||||
bool CKFileWriter::AddSavedObject(ObjImpls::CKObject* obj, CKDWORD flags) {
|
||||
if (m_Done || m_IsCopyFromReader) return false;
|
||||
if (m_Done || m_DisableAddingObject) return false;
|
||||
if (obj == nullptr) return false;
|
||||
|
||||
// check whether is saved.
|
||||
@ -242,9 +290,11 @@ namespace LibCmo::CK2 {
|
||||
|
||||
// ok, insert this value
|
||||
m_ObjectsHashTable.try_emplace(objid, static_cast<CKDWORD>(m_FileObjects.size()));
|
||||
|
||||
XContainer::NSXBitArray::Set(m_AlreadySavedMask, static_cast<CKDWORD>(objid));
|
||||
// update max id
|
||||
m_SaveIDMax = std::max(m_SaveIDMax, objid);
|
||||
|
||||
// add entry
|
||||
CKFileObject fobj;
|
||||
fobj.ObjectId = objid;
|
||||
fobj.ObjPtr = obj;
|
||||
@ -257,7 +307,7 @@ namespace LibCmo::CK2 {
|
||||
}
|
||||
|
||||
bool CKFileWriter::AddSavedObjects(const XContainer::XObjectPointerArray& objarray, CKDWORD flags) {
|
||||
if (m_Done || m_IsCopyFromReader) return false;
|
||||
if (m_Done || m_DisableAddingObject) return false;
|
||||
|
||||
bool ret = true;
|
||||
for (auto obj : objarray) {
|
||||
@ -270,7 +320,7 @@ namespace LibCmo::CK2 {
|
||||
}
|
||||
|
||||
bool CKFileWriter::AddSavedFile(CKSTRING u8FileName) {
|
||||
if (m_Done || m_IsCopyFromReader) return false;
|
||||
if (m_Done || m_DisableAddingFile) return false;
|
||||
if (u8FileName == nullptr) return false;
|
||||
|
||||
m_IncludedFiles.emplace_back(u8FileName);
|
||||
|
Reference in New Issue
Block a user