write some funcs for CKStateChunk writer

This commit is contained in:
2023-09-24 12:21:33 +08:00
parent a17b9deb4c
commit 3e265cdf1d
5 changed files with 355 additions and 74 deletions

View File

@ -234,17 +234,47 @@ namespace LibCmo::CK2 {
bool CKFileWriter::AddSavedObject(ObjImpls::CKObject* obj, CKDWORD flags) {
if (m_Done || m_IsCopyFromReader) return false;
return false;
if (obj == nullptr) return false;
// check whether is saved.
CK_ID objid = obj->GetID();
if (XContainer::NSXBitArray::IsSet(m_AlreadySavedMask, static_cast<CKDWORD>(objid))) return false;
// ok, insert this value
m_ObjectsHashTable.try_emplace(objid, static_cast<CKDWORD>(m_FileObjects.size()));
XContainer::NSXBitArray::Set(m_AlreadySavedMask, static_cast<CKDWORD>(objid));
CKFileObject fobj;
fobj.ObjectId = objid;
fobj.ObjPtr = obj;
fobj.ObjectCid = obj->GetClassID();
fobj.SaveFlags = flags;
XContainer::NSXString::FromCKSTRING(fobj.Name, obj->GetName());
m_FileObjects.emplace_back(std::move(fobj));
return true;
}
bool CKFileWriter::AddSavedObjects(CKObjectArray* objarray, CKDWORD flags) {
bool CKFileWriter::AddSavedObjects(const XContainer::XObjectPointerArray& objarray, CKDWORD flags) {
if (m_Done || m_IsCopyFromReader) return false;
return false;
bool ret = true;
for (auto obj : objarray) {
if (!AddSavedObject(obj, flags)) {
ret = false;
}
}
return ret;
}
bool CKFileWriter::AddSavedFile(CKSTRING u8FileName) {
if (m_Done || m_IsCopyFromReader) return false;
return false;
if (u8FileName == nullptr) return false;
m_IncludedFiles.emplace_back(u8FileName);
return true;
}
#pragma endregion
@ -294,6 +324,16 @@ namespace LibCmo::CK2 {
}
}
CKDWORD CKFileVisitor::GetIndexByObjectID(CK_ID objid) {
// see CKFile::SaveFindObjectIndex in IDA
CKDWORD idx = -1;
if (m_IsReader) return idx;
auto finder = m_Writer->m_ObjectsHashTable.find(objid);
if (finder == m_Writer->m_ObjectsHashTable.end()) return idx;
return finder->second;
}
#pragma endregion
}