fix some fatal error when fully-rewrite file
This commit is contained in:
parent
f3e7cdf004
commit
0887cd6d86
|
@ -20,8 +20,8 @@ namespace LibCmo::CK2 {
|
||||||
/**
|
/**
|
||||||
* @brief Current Version of Dev
|
* @brief Current Version of Dev
|
||||||
*/
|
*/
|
||||||
constexpr const CKDWORD DEVVERSION = 0x02010001u;
|
constexpr const CKDWORD DEVBUILD = 0x02010001u;
|
||||||
constexpr const CKDWORD DEVBUILD = 0u;
|
constexpr const CKDWORD DEVVERSION = 0u;
|
||||||
constexpr const CKGUID VIRTOOLS_GUID = CKGUID(0x56495254u, 0x4f4f4c53u);
|
constexpr const CKGUID VIRTOOLS_GUID = CKGUID(0x56495254u, 0x4f4f4c53u);
|
||||||
|
|
||||||
// ========== Class registration utilities ==========
|
// ========== Class registration utilities ==========
|
||||||
|
|
|
@ -87,8 +87,13 @@ namespace LibCmo::CK2 {
|
||||||
CKDWORD sumDataObjSize = 0,
|
CKDWORD sumDataObjSize = 0,
|
||||||
sumHdrObjSize = 0;
|
sumHdrObjSize = 0;
|
||||||
for (auto& obj : m_FileObjects) {
|
for (auto& obj : m_FileObjects) {
|
||||||
// += 4DWORD(ObjId, ObjCid, FileIndex, NameLen) + Name size
|
// += 4DWORD(ObjId, ObjCid, FileIndex, NameLen)
|
||||||
sumHdrObjSize += 4 * sizeof(CKDWORD) + obj.Name.size();
|
sumHdrObjSize += 4 * sizeof(CKDWORD);
|
||||||
|
if (obj.Name.c_str() != nullptr) {
|
||||||
|
// += Name size
|
||||||
|
m_Ctx->GetNativeString(obj.Name.string(), name_conv);
|
||||||
|
sumHdrObjSize += name_conv.size();
|
||||||
|
}
|
||||||
|
|
||||||
if (obj.Data == nullptr) {
|
if (obj.Data == nullptr) {
|
||||||
obj.PackSize = 0;
|
obj.PackSize = 0;
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace LibCmo::EncodingHelper {
|
||||||
count = WideCharToMultiByte(codepage, 0, src, -1, NULL, 0, NULL, NULL);
|
count = WideCharToMultiByte(codepage, 0, src, -1, NULL, 0, NULL, NULL);
|
||||||
if (count <= 0) return false;
|
if (count <= 0) return false;
|
||||||
|
|
||||||
dest.resize(count);
|
dest.resize(count - 1);
|
||||||
write_result = WideCharToMultiByte(codepage, 0, src, -1, dest.data(), count, NULL, NULL);
|
write_result = WideCharToMultiByte(codepage, 0, src, -1, dest.data(), count, NULL, NULL);
|
||||||
if (write_result <= 0) return false;
|
if (write_result <= 0) return false;
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ namespace LibCmo::EncodingHelper {
|
||||||
wcount = MultiByteToWideChar(codepage, 0, src, -1, NULL, 0);
|
wcount = MultiByteToWideChar(codepage, 0, src, -1, NULL, 0);
|
||||||
if (wcount <= 0) return false;
|
if (wcount <= 0) return false;
|
||||||
|
|
||||||
dest.resize(wcount);
|
dest.resize(wcount - 1);
|
||||||
write_result = MultiByteToWideChar(codepage, 0, src, -1, dest.data(), wcount);
|
write_result = MultiByteToWideChar(codepage, 0, src, -1, dest.data(), wcount);
|
||||||
if (write_result <= 0) return false;
|
if (write_result <= 0) return false;
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,15 @@ namespace Unvirt::Context {
|
||||||
"Release loaded Virtools composition."
|
"Release loaded Virtools composition."
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
->Then((new CmdHelper::Literal("save"))
|
||||||
|
->Then((new CmdHelper::StringArgument("filepath"))
|
||||||
|
->Comment("The path to save file.")
|
||||||
|
->Executes(
|
||||||
|
std::bind(&UnvirtContext::ProcSave, this, std::placeholders::_1),
|
||||||
|
"Save the loaded file into a new file."
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
->Then((new CmdHelper::Literal("info"))
|
->Then((new CmdHelper::Literal("info"))
|
||||||
->Executes(
|
->Executes(
|
||||||
std::bind(&UnvirtContext::ProcInfo, this, std::placeholders::_1),
|
std::bind(&UnvirtContext::ProcInfo, this, std::placeholders::_1),
|
||||||
|
@ -206,7 +215,7 @@ namespace Unvirt::Context {
|
||||||
}
|
}
|
||||||
if (err != LibCmo::CK2::CKERROR::CKERR_OK) {
|
if (err != LibCmo::CK2::CKERROR::CKERR_OK) {
|
||||||
// fail to load. release all.
|
// fail to load. release all.
|
||||||
PrintCommonError("Fail to open file. Function return: %s\n\t%s",
|
PrintCommonError("Fail to load file. Function return: %s\n\t%s",
|
||||||
Unvirt::AccessibleValue::GetCkErrorName(err).c_str(),
|
Unvirt::AccessibleValue::GetCkErrorName(err).c_str(),
|
||||||
Unvirt::AccessibleValue::GetCkErrorDescription(err).c_str()
|
Unvirt::AccessibleValue::GetCkErrorDescription(err).c_str()
|
||||||
);
|
);
|
||||||
|
@ -226,6 +235,38 @@ namespace Unvirt::Context {
|
||||||
ClearDocument();
|
ClearDocument();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Unvirt::Context::UnvirtContext::ProcSave(const CmdHelper::ArgumentsMap* amap) {
|
||||||
|
// check pre-requirement
|
||||||
|
if (!HasOpenedFile()) {
|
||||||
|
PrintCommonError("No loaded file.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string filepath = *amap->Get<CmdHelper::StringArgument::vType>("filepath");
|
||||||
|
|
||||||
|
// construct writer from reader
|
||||||
|
LibCmo::CK2::CKFileWriter writer(m_Ctx, m_FileReader);
|
||||||
|
|
||||||
|
// backup current file write mode
|
||||||
|
// and replace it with reader
|
||||||
|
LibCmo::CK2::CK_FILE_WRITEMODE backup = m_Ctx->GetFileWriteMode();
|
||||||
|
m_Ctx->SetFileWriteMode(m_FileReader->GetFileInfo().FileWriteMode);
|
||||||
|
|
||||||
|
// run writer
|
||||||
|
LibCmo::CK2::CKERROR err = writer.Save(filepath.c_str());
|
||||||
|
if (err != LibCmo::CK2::CKERROR::CKERR_OK) {
|
||||||
|
// fail to load. release all.
|
||||||
|
PrintCommonError("Fail to save file. Function return: %s\n\t%s",
|
||||||
|
Unvirt::AccessibleValue::GetCkErrorName(err).c_str(),
|
||||||
|
Unvirt::AccessibleValue::GetCkErrorDescription(err).c_str()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore file write mode
|
||||||
|
m_Ctx->SetFileWriteMode(backup);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void UnvirtContext::ProcInfo(const CmdHelper::ArgumentsMap*) {
|
void UnvirtContext::ProcInfo(const CmdHelper::ArgumentsMap*) {
|
||||||
// check pre-requirement
|
// check pre-requirement
|
||||||
if (!HasOpenedFile()) {
|
if (!HasOpenedFile()) {
|
||||||
|
@ -354,7 +395,7 @@ namespace Unvirt::Context {
|
||||||
m_Ctx->SetTempPath(amap->Get<CmdHelper::StringArgument::vType>("temppath")->c_str());
|
m_Ctx->SetTempPath(amap->Get<CmdHelper::StringArgument::vType>("temppath")->c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unvirt::Context::UnvirtContext::ProcHelp(const CmdHelper::ArgumentsMap* amap) {
|
void Unvirt::Context::UnvirtContext::ProcHelp(const CmdHelper::ArgumentsMap*) {
|
||||||
m_Help->Print();
|
m_Help->Print();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ namespace Unvirt::Context {
|
||||||
|
|
||||||
void ProcLoad(const CmdHelper::ArgumentsMap* amap);
|
void ProcLoad(const CmdHelper::ArgumentsMap* amap);
|
||||||
void ProcUnLoad(const CmdHelper::ArgumentsMap* amap);
|
void ProcUnLoad(const CmdHelper::ArgumentsMap* amap);
|
||||||
|
void ProcSave(const CmdHelper::ArgumentsMap* amap);
|
||||||
void ProcInfo(const CmdHelper::ArgumentsMap* amap);
|
void ProcInfo(const CmdHelper::ArgumentsMap* amap);
|
||||||
void ProcLs(const CmdHelper::ArgumentsMap* amap);
|
void ProcLs(const CmdHelper::ArgumentsMap* amap);
|
||||||
void ProcData(const CmdHelper::ArgumentsMap* amap);
|
void ProcData(const CmdHelper::ArgumentsMap* amap);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user