diff --git a/CodeGen/src/CK_CLASSID.txt b/CodeGen/src/CK_CLASSID.txt
index 2ebbb8b..ee3e175 100644
--- a/CodeGen/src/CK_CLASSID.txt
+++ b/CodeGen/src/CK_CLASSID.txt
@@ -42,7 +42,6 @@
#define CKCID_BODYPART 42
#define CKCID_PARAMETER 46
#define CKCID_PARAMETERLOCAL 45
- #define CKCID_PARAMETERVARIABLE 55
#define CKCID_PARAMETEROUT 3
#define CKCID_INTERFACEOBJECTMANAGER 48
#define CKCID_CRITICALSECTION 49
@@ -66,5 +65,5 @@
#define CKCID_TIMEMANAGER 93
#define CKCID_CUIKBEHDATA -1
-#define CKCID_MAXCLASSID 56
+#define CKCID_MAXCLASSID 55
#define CKCID_MAXMAXCLASSID 128
\ No newline at end of file
diff --git a/LibCmo/LibCmo.vcxproj b/LibCmo/LibCmo.vcxproj
index 35fff1b..9b39697 100644
--- a/LibCmo/LibCmo.vcxproj
+++ b/LibCmo/LibCmo.vcxproj
@@ -27,26 +27,26 @@
- DynamicLibrary
+ StaticLibrary
true
v142
Unicode
- DynamicLibrary
+ StaticLibrary
false
v142
true
Unicode
- DynamicLibrary
+ StaticLibrary
true
v142
Unicode
- DynamicLibrary
+ StaticLibrary
false
v142
true
@@ -98,7 +98,7 @@
Level3
true
- LIBCMO_EXPORTING;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(BOOST_INCLUDE_PATH);$(ZLIB_PATH);%(AdditionalIncludeDirectories)
stdcpp20
@@ -106,8 +106,7 @@
Console
true
- $(ZLIB_PATH)\contrib\vstudio\vc14\x86\ZlibDllReleaseWithoutAsm;%(AdditionalLibraryDirectories)
- zlibwapi.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
@@ -116,7 +115,7 @@
true
true
true
- LIBCMO_EXPORTING;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(BOOST_INCLUDE_PATH);$(ZLIB_PATH);%(AdditionalIncludeDirectories)
stdcpp20
@@ -126,15 +125,14 @@
true
true
true
- $(ZLIB_PATH)\contrib\vstudio\vc14\x86\ZlibDllReleaseWithoutAsm;%(AdditionalLibraryDirectories)
- zlibwapi.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
Level3
true
- LIBCMO_EXPORTING;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(BOOST_INCLUDE_PATH);$(ZLIB_PATH);%(AdditionalIncludeDirectories)
stdcpp20
@@ -142,8 +140,9 @@
Console
true
- $(ZLIB_PATH)\contrib\vstudio\vc14\x64\ZlibDllReleaseWithoutAsm
- zlibwapi.lib;%(AdditionalDependencies)
+
+
+ %(AdditionalDependencies)
@@ -152,7 +151,7 @@
true
true
true
- LIBCMO_EXPORTING;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(BOOST_INCLUDE_PATH);$(ZLIB_PATH);%(AdditionalIncludeDirectories)
stdcpp20
@@ -162,18 +161,19 @@
true
true
true
- $(ZLIB_PATH)\contrib\vstudio\vc14\x64\ZlibDllReleaseWithoutAsm
- zlibwapi.lib;%(AdditionalDependencies)
+
+
+ %(AdditionalDependencies)
+
-
diff --git a/LibCmo/LibCmo.vcxproj.filters b/LibCmo/LibCmo.vcxproj.filters
index e63257d..b93dc59 100644
--- a/LibCmo/LibCmo.vcxproj.filters
+++ b/LibCmo/LibCmo.vcxproj.filters
@@ -21,11 +21,11 @@
Sources
+
+ Sources
+
-
- Headers
-
Headers
diff --git a/LibCmo/VTConstants.hpp b/LibCmo/VTConstants.hpp
index e9a3e09..7c7c462 100644
--- a/LibCmo/VTConstants.hpp
+++ b/LibCmo/VTConstants.hpp
@@ -26,9 +26,12 @@ namespace LibCmo {
}
}
+ using CKINT = int32_t;
using CK_ID = uint32_t;
using CKDWORD = uint32_t;
using CKBOOL = int32_t;
+ using CKMUTSTRING = char*;
+ using CKSTRING = const char*;
using XString = std::string;
using XBitArray = std::vector;
@@ -36,7 +39,8 @@ namespace LibCmo {
using XArray = std::vector;
using XIntArray = std::vector;
template
- using XClassArray = std::vector;
+ using XClassArray = std::vector;
+ //using CKObjectArray = std::vector;
enum class CK_CLASSID : uint32_t {
CKCID_OBJECT = 1,
@@ -83,7 +87,6 @@ namespace LibCmo {
CKCID_BODYPART = 42,
CKCID_PARAMETER = 46,
CKCID_PARAMETERLOCAL = 45,
- CKCID_PARAMETERVARIABLE = 55,
CKCID_PARAMETEROUT = 3,
CKCID_INTERFACEOBJECTMANAGER = 48,
CKCID_CRITICALSECTION = 49,
@@ -105,9 +108,9 @@ namespace LibCmo {
CKCID_GRIDMANAGER = 91,
CKCID_SOUNDMANAGER = 92,
CKCID_TIMEMANAGER = 93,
- CKCID_CUIKBEHDATA = (uint32_t)-1,
+ CKCID_CUIKBEHDATA = static_cast(-1),
- CKCID_MAXCLASSID = 56,
+ CKCID_MAXCLASSID = 55,
CKCID_MAXMAXCLASSID = 128
};
diff --git a/LibCmo/VTEncoding.cpp b/LibCmo/VTEncoding.cpp
new file mode 100644
index 0000000..dc4fefc
--- /dev/null
+++ b/LibCmo/VTEncoding.cpp
@@ -0,0 +1,106 @@
+#include "VTEncoding.hpp"
+
+namespace LibCmo {
+ namespace Encoding {
+
+#pragma region assist functions
+
+#if defined(LIBCMO_OS_WIN32)
+
+#define LIBCMO_STR_EQUAL(a, b) strcmp(reinterpret_cast(a), reinterpret_cast(b)) == 0
+ bool GetWindowsCodePage(const char* u8_encoding_spec, UINT* result) {
+ if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_ACP")) *result = CP_ACP;
+ else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_MACCP")) *result = CP_MACCP;
+ else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_OEMCP")) *result = CP_OEMCP;
+ else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_THREAD_ACPP")) *result = CP_THREAD_ACP;
+ else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_UTF8")) *result = CP_UTF8;
+ else {
+ char* pend = nullptr;
+ errno = 0;
+ uint64_t v = std::strtoull(u8_encoding_spec, &pend, 10);
+
+ if (pend == u8_encoding_spec || errno == ERANGE) return false;
+ *result = static_cast(v);
+ }
+ return true;
+ }
+#undef LIBCMO_STR_EQUAL
+
+ bool WcharToChar(const wchar_t* src, std::string& dest, UINT codepage) {
+ int count, write_result;
+
+ //converter to CHAR
+ count = WideCharToMultiByte(CP_UTF8, 0, src, -1, NULL, 0, NULL, NULL);
+ if (count <= 0) return false;
+
+ dest.resize(count);
+ write_result = WideCharToMultiByte(CP_UTF8, 0, src, -1, dest.data(), count, NULL, NULL);
+ if (write_result <= 0) return false;
+
+ return true;
+ }
+ bool WcharToChar(std::wstring& src, std::string& dest, UINT codepage) {
+ return WcharToChar(src.c_str(), dest, codepage);
+ }
+
+ bool CharToWchar(const char* src, std::wstring& dest, UINT codepage) {
+ int wcount, write_result;
+
+ // convert to WCHAR
+ wcount = MultiByteToWideChar(codepage, 0, src, -1, NULL, 0);
+ if (wcount <= 0) return false;
+
+ dest.resize(wcount);
+ write_result = MultiByteToWideChar(CP_UTF8, 0, src, -1, dest.data(), wcount);
+ if (write_result <= 0) return false;
+
+ return true;
+ }
+ bool CharToWchar(std::string& src, std::wstring& dest, UINT codepage) {
+ return CharToWchar(src.c_str(), dest, codepage);
+ }
+
+#else
+
+ //todo: linux implementation
+
+#endif
+
+#pragma endregion
+
+#pragma region core functions
+
+#if defined(LIBCMO_OS_WIN32)
+
+ void GetUtf8VirtoolsName(std::string& native_name, std::string& u8_name, const char* u8_encoding_spec) {
+ // switch encoding spec
+ UINT codepage = CP_ACP;
+ if (!GetWindowsCodePage(u8_encoding_spec, &codepage)) {
+ u8_name = native_name.c_str();
+ return;
+ }
+
+ // do convert
+ std::wstring intermediary;
+ if (!CharToWchar(native_name, intermediary, codepage)) {
+ u8_name = native_name.c_str();
+ return;
+ }
+ if (!WcharToChar(intermediary, u8_name, CP_UTF8)) {
+ u8_name = native_name.c_str();
+ return;
+ }
+
+ return;
+ }
+
+#else
+ //todo: linux implementation
+
+#endif
+
+#pragma endregion
+
+ }
+}
+
diff --git a/LibCmo/VTEncoding.hpp b/LibCmo/VTEncoding.hpp
index b22f372..a2eb84a 100644
--- a/LibCmo/VTEncoding.hpp
+++ b/LibCmo/VTEncoding.hpp
@@ -1,11 +1,8 @@
#pragma once
+#include "VTUtils.hpp"
#include
-#if defined(_WIN32)
-#define LIBCMO_OS_WIN32
-#endif
-
#if defined(LIBCMO_OS_WIN32)
#include
#else
@@ -19,63 +16,16 @@ namespace LibCmo {
#if defined(LIBCMO_OS_WIN32)
-#define LIBCMO_STR_EQUAL(a, b) strcmp(reinterpret_cast(a), reinterpret_cast(b)) == 0
- bool GetWindowsCodePage(const char* u8_encoding_spec, UINT* result) {
- if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_ACP")) *result = CP_ACP;
- else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_MACCP")) *result = CP_MACCP;
- else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_OEMCP")) *result = CP_OEMCP;
- else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_THREAD_ACPP")) *result = CP_THREAD_ACP;
- else if (LIBCMO_STR_EQUAL(u8_encoding_spec, u8"CP_UTF8")) *result = CP_UTF8;
- else {
- char* pend = nullptr;
- errno = 0;
- uint64_t v = std::strtoull(u8_encoding_spec, &pend, 10);
+ bool GetWindowsCodePage(const char* u8_encoding_spec, UINT* result);
- if (pend == u8_encoding_spec || errno == ERANGE) return false;
- *result = static_cast(v);
- }
- return true;
- }
-#undef LIBCMO_STR_EQUAL
+ bool WcharToChar(const wchar_t* src, std::string& dest, UINT codepage);
+ bool WcharToChar(std::wstring& src, std::string& dest, UINT codepage);
- bool WcharToChar(const wchar_t* src, std::string& dest, UINT codepage) {
- int count, write_result;
-
- //converter to CHAR
- count = WideCharToMultiByte(CP_UTF8, 0, src, -1, NULL, 0, NULL, NULL);
- if (count <= 0) return false;
-
- dest.resize(count);
- write_result = WideCharToMultiByte(CP_UTF8, 0, src, -1, dest.data(), count, NULL, NULL);
- if (write_result <= 0) return false;
-
- return true;
- }
- bool WcharToChar(std::wstring& src, std::string& dest, UINT codepage) {
- return WcharToChar(src.c_str(), dest, codepage);
- }
-
- bool CharToWchar(const char* src, std::wstring& dest, UINT codepage) {
- int wcount, write_result;
-
- // convert to WCHAR
- wcount = MultiByteToWideChar(codepage, 0, src, -1, NULL, 0);
- if (wcount <= 0) return false;
-
- dest.resize(wcount);
- write_result = MultiByteToWideChar(CP_UTF8, 0, src, -1, dest.data(), wcount);
- if (write_result <= 0) return false;
-
- return true;
- }
- bool CharToWchar(std::string& src, std::wstring& dest, UINT codepage) {
- return CharToWchar(src.c_str(), dest, codepage);
- }
+ bool CharToWchar(const char* src, std::wstring& dest, UINT codepage);
+ bool CharToWchar(std::string& src, std::wstring& dest, UINT codepage);
#else
-
- //todo: linux implementation
-
+#error NO IMPLEMENTATION FOR LINUX ENCODING!
#endif
#pragma endregion
@@ -84,32 +34,10 @@ namespace LibCmo {
#if defined(LIBCMO_OS_WIN32)
- void GetUtf8VirtoolsName(std::string& native_name, std::string& u8_name, const char* u8_encoding_spec) {
- // switch encoding spec
- UINT codepage = CP_ACP;
- if (!GetWindowsCodePage(u8_encoding_spec, &codepage)) {
- u8_name = native_name.c_str();
- return;
- }
-
- // do convert
- std::wstring intermediary;
- if (!CharToWchar(native_name, intermediary, codepage)) {
- u8_name = native_name.c_str();
- return;
- }
- if (!WcharToChar(intermediary, u8_name, CP_UTF8)) {
- u8_name = native_name.c_str();
- return;
- }
-
- return;
- }
+ void GetUtf8VirtoolsName(std::string& native_name, std::string& u8_name, const char* u8_encoding_spec);
#else
- //todo: linux implementation
#error NO IMPLEMENTATION FOR LINUX ENCODING!
-
#endif
#pragma endregion
diff --git a/LibCmo/VTReader.cpp b/LibCmo/VTReader.cpp
index 349cc31..cbacd50 100644
--- a/LibCmo/VTReader.cpp
+++ b/LibCmo/VTReader.cpp
@@ -1,13 +1,162 @@
-#include "VTReader.hpp"
+#include "VTUtils.hpp"
+#if defined(LIBCMO_OS_WIN32)
+#define ZLIB_WINAPI
+#include "zconf.h"
+#endif
+
+#include "VTStruct.hpp"
+#include
namespace LibCmo {
- CKERROR ReadFileHeaders(void) {
+ 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) {
+ result = this->LoadFileData();
+ }
+
+ return result;
+ }
+
+ CKERROR CKFile::OpenFile(CKSTRING u8_filename, CK_LOAD_FLAGS flags) {
+ this->ClearData();
+ if (u8_filename == nullptr) return CKERROR::CKERR_INVALIDPARAMETER;
+
+ this->m_FileName = u8_filename;
+ this->m_MappedFile = new VxMemoryMappedFile(this->m_FileName.c_str());
+ if (!this->m_MappedFile->IsValid()) return CKERROR::CKERR_INVALIDFILE;
+
+ return this->OpenMemory(this->m_MappedFile->GetBase(), this->m_MappedFile->GetFileSize(), flags);
+ }
+
+ CKERROR CKFile::OpenMemory(void* MemoryBuffer, size_t BufferSize, CK_LOAD_FLAGS Flags) {
+ if (MemoryBuffer == nullptr) return CKERROR::CKERR_INVALIDPARAMETER;
+ // compare magic words
+ if (BufferSize < 0x20 || memcmp(MemoryBuffer, "Nemo", 4u)) return CKERROR::CKERR_INVALIDFILE;
+
+ this->m_Parser = new CKBufferParser(MemoryBuffer, BufferSize, false);
+
+ this->m_Flags = Flags;
+ this->m_IndexByClassId.resize(static_cast(CK_CLASSID::CKCID_MAXCLASSID));
+ return this->ReadFileHeaders(&(this->m_Parser));
+ }
+
+ CKERROR CKFile::ReadFileHeaders(CKBufferParser** ParserPtr) {
+ CKBufferParser* parser = *ParserPtr;
+ this->m_IncludedFiles.clear();
+
+ // ========== read header1 ==========
+ CKDWORD fhdr1[8];
+ CKDWORD fhdr2[8];
+ if (parser->GetSize() < sizeof(fhdr1)) return CKERROR::CKERR_INVALIDFILE;
+ memcpy(fhdr1, parser->GetPtr(), sizeof(fhdr1));
+ parser->MoveCursor(sizeof(fhdr1));
+
+ if (fhdr1[5]) { // it seems that there is a ZERO checker?
+ memset(fhdr1, 0, sizeof(fhdr1));
+ }
+ // check outdated
+ if (fhdr1[4] > 9) return CKERROR::CKERR_OBSOLETEVIRTOOLS;
+
+ // ========== read header2 ==========
+ // file ver < 5 do not have second header
+ if (fhdr1[4] < 5) {
+ memset(fhdr2, 0, sizeof(fhdr2));
+ } else {
+ if (parser->GetSize() < sizeof(fhdr1) + sizeof(fhdr2)) return CKERROR::CKERR_INVALIDFILE;
+ memcpy(fhdr2, parser->GetPtr(), sizeof(fhdr2));
+ parser->MoveCursor(sizeof(fhdr2));
+ }
+
+ // forcely reset too big product ver
+ if (fhdr2[5] >= 12) {
+ fhdr2[5] = 0;
+ fhdr2[6] = 0x1010000;
+ }
+
+ // ========== assign value ==========
+ this->m_FileInfo.ProductVersion = fhdr2[5];
+ this->m_FileInfo.ProductBuild = fhdr2[6];
+ this->m_FileInfo.FileWriteMode = static_cast(fhdr1[6]);
+ this->m_FileInfo.CKVersion = fhdr1[3];
+ this->m_FileInfo.FileVersion = fhdr1[4];
+ this->m_FileInfo.FileSize = parser->GetSize();
+ this->m_FileInfo.ManagerCount = fhdr2[2];
+ this->m_FileInfo.ObjectCount = fhdr2[3];
+ this->m_FileInfo.MaxIDSaved = fhdr2[4];
+ this->m_FileInfo.Hdr1PackSize = fhdr1[7];
+ this->m_FileInfo.Hdr1UnPackSize = fhdr2[7];
+ this->m_FileInfo.DataPackSize = fhdr2[0];
+ this->m_FileInfo.DataUnPackSize = fhdr2[1];
+ this->m_FileInfo.Crc = fhdr1[3];
+
+ // ========== crc and body unpacker ==========
+ if (this->m_FileInfo.FileVersion >= 8) {
+ // crc checker for file ver >= 8
+ // reset crc field of header
+ fhdr1[2] = 0;
+
+ // compute crc
+ uLong gotten_crc = adler32(0u, reinterpret_cast(&fhdr1), sizeof(fhdr1));
+ parser->SetCursor(sizeof(fhdr1));
+ gotten_crc = adler32(gotten_crc, reinterpret_cast(parser->GetPtr()), sizeof(fhdr2));
+ parser->MoveCursor(sizeof(fhdr2));
+ gotten_crc = adler32(gotten_crc, reinterpret_cast(parser->GetPtr()), this->m_FileInfo.Hdr1PackSize);
+ parser->MoveCursor(this->m_FileInfo.Hdr1PackSize);
+ gotten_crc = adler32(gotten_crc, reinterpret_cast(parser->GetPtr()), this->m_FileInfo.DataPackSize);
+ parser->SetCursor(sizeof(fhdr1) + sizeof(fhdr2));
+
+ if (gotten_crc != static_cast(this->m_FileInfo.Crc)) return CKERROR::CKERR_FILECRCERROR;
+
+ // compare size to decide wheher use compress feature
+ void* decomp_buffer = CKUnPackData(this->m_FileInfo.Hdr1UnPackSize, parser->GetPtr(), this->m_FileInfo.Hdr1PackSize);
+ if (decomp_buffer != nullptr) {
+ parser = new CKBufferParser(decomp_buffer, this->m_FileInfo.Hdr1UnPackSize, true);
+ }
+ }
+
+ // ========== object list read ==========
+ // file ver >= 7 have this features
+ if (this->m_FileInfo.FileVersion >= 7) {
+ // apply max id saved
+ this->m_SaveIDMax = this->m_FileInfo.MaxIDSaved;
+ // resize
+ this->m_FileObject.resize(this->m_FileInfo.ObjectCount);
+
+ // read data
+ for (auto it = this->m_FileObject.begin(); it != this->m_FileObject.end(); ++it) {
+ CKFileObject* fileobj = &(*it);
+ // setup useless fields
+ fileobj->ObjPtr = nullptr;
+ fileobj->Data = nullptr;
+
+ // read basic fields
+ memcpy(&(fileobj->Object), parser->GetPtr(), sizeof(CK_ID));
+ parser->MoveCursor(sizeof(CK_ID));
+ memcpy(&(fileobj->ObjectCid), parser->GetPtr(), sizeof(CK_CLASSID));
+ parser->MoveCursor(sizeof(CK_CLASSID));
+ memcpy(&(fileobj->FileIndex), parser->GetPtr(), sizeof(CKDWORD));
+ parser->MoveCursor(sizeof(CKDWORD));
+
+ CKDWORD namelen;
+ memcpy(&namelen, parser->GetPtr(), sizeof(CKDWORD));
+ parser->MoveCursor(sizeof(CKDWORD));
+ if (namelen != 0) {
+ fileobj->Name.resize(namelen);
+ memcpy(fileobj->Name.data(), parser->GetPtr(), namelen);
+ parser->MoveCursor(namelen);
+ }
+ }
+ }
+
return CKERROR::CKERR_OK;
}
- CKERROR Load(void) {
+ CKERROR CKFile::ReadFileData(CKBufferParser** ParserPtr) {
return CKERROR::CKERR_OK;
}
+ CKERROR CKFile::LoadFileData(void/*CKObjectArray list*/) {
+ return CKERROR::CKERR_OK;
+ }
}
diff --git a/LibCmo/VTReader.hpp b/LibCmo/VTReader.hpp
deleted file mode 100644
index 4e028b2..0000000
--- a/LibCmo/VTReader.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include "VTUtils.hpp"
-#include "VTConstants.hpp"
-
-namespace LibCmo {
-
- LIBCMO_EXPORT CKERROR ReadFileHeaders(void);
- LIBCMO_EXPORT CKERROR Load(void);
-
-}
-
diff --git a/LibCmo/VTStruct.cpp b/LibCmo/VTStruct.cpp
index abf6204..603729c 100644
--- a/LibCmo/VTStruct.cpp
+++ b/LibCmo/VTStruct.cpp
@@ -1,7 +1,32 @@
+#include "VTUtils.hpp"
+#if defined(LIBCMO_OS_WIN32)
+#define ZLIB_WINAPI
+#include "zconf.h"
+#endif
+
#include "VTStruct.hpp"
+#include
+#include
namespace LibCmo {
+ void* CKUnPackData(CKINT DestSize, const void* SrcBuffer, CKINT SrcSize) {
+ char* DestBuffer = (char*)malloc(DestSize);
+ if (DestBuffer == nullptr) return nullptr;
+
+ uLongf cache = DestSize;
+ if (uncompress(
+ reinterpret_cast(DestBuffer), &cache,
+ reinterpret_cast(SrcBuffer), SrcSize) != Z_OK) {
+ free(DestBuffer);
+ return nullptr;
+ }
+
+ return DestBuffer;
+ }
+
+#pragma region VxMemoryMappedFile
+
VxMemoryMappedFile::VxMemoryMappedFile(const char* u8_filepath) :
m_szFilePath(),
m_hFile(nullptr), m_hFileMapping(nullptr),
@@ -24,7 +49,7 @@ namespace LibCmo {
// open region
this->m_hFileMapping = new boost::interprocess::mapped_region(
- this->m_hFile, boost::interprocess::read_only,
+ *(this->m_hFile), boost::interprocess::read_only,
0, 0, nullptr,
region_option
);
@@ -42,15 +67,54 @@ namespace LibCmo {
delete this->m_hFile;
}
- void* VxMemoryMappedFile::GetBase(void) { return this->m_hFileMapping->get_address(); }
- size_t VxMemoryMappedFile::GetFileSize(void) { return this->m_hFileMapping->get_size(); }
- bool VxMemoryMappedFile::IsValid(void) { return this->m_bIsValid; }
+#pragma endregion
+#pragma region CKBufferParser
- CKFile::CKFile() {
+ CKBufferParser::CKBufferParser(void* ptr, size_t rsize, bool need_manual_free) :
+ m_ReaderBegin(static_cast(ptr)),
+ m_ReaderPos(0u), m_ReaderSize(rsize),
+ m_NeedManualFree(need_manual_free) {
+ ;
+ }
+ CKBufferParser::~CKBufferParser() {
+ if (this->m_NeedManualFree) free(this->m_ReaderBegin);
+ }
+
+#pragma endregion
+
+#pragma region CKFile Misc
+
+ CKFile::CKFile(const Utils::VirtoolsContext& cfg) :
+ m_Parser(nullptr), m_MappedFile(nullptr),
+ m_UserCfg(cfg) {
+ ;
}
CKFile::~CKFile() {
}
+
+ void CKFile::ClearData(void) {
+ m_SaveIDMax = 0;
+ m_FileObject.clear();
+ m_PluginDep.clear();
+
+ memset(&m_FileInfo, 0, sizeof(CKFileInfo));
+
+ m_Flags = CK_LOAD_FLAGS::CK_LOAD_DEFAULT;
+ m_FileName.clear();
+ if (m_Parser != nullptr) {
+ delete m_Parser;
+ m_Parser = nullptr;
+ }
+ if (m_MappedFile != nullptr) {
+ delete m_MappedFile;
+ m_MappedFile = nullptr;
+ }
+ }
+
+#pragma endregion
+
+
}
diff --git a/LibCmo/VTStruct.hpp b/LibCmo/VTStruct.hpp
index 2fc05fe..9a2220d 100644
--- a/LibCmo/VTStruct.hpp
+++ b/LibCmo/VTStruct.hpp
@@ -1,17 +1,17 @@
#pragma once
+#include "VTUtils.hpp"
#include "VTConstants.hpp"
#include "VTEncoding.hpp"
#include
-// only expose boost in libcom self. do not let it be seen by any program using libcmo.
-#if defined(LIBCMO_EXPORTING)
#include
#include
-#endif
namespace LibCmo {
+ void* CKUnPackData(CKINT DestSize, const void* SrcBuffer, CKINT SrcSize);
+
struct CKGUID {
union {
struct {
@@ -22,25 +22,7 @@ namespace LibCmo {
CKGUID(CKDWORD gd1 = 0, CKDWORD gd2 = 0) { d[0] = gd1; d[1] = gd2; }
};
- // define some mapped file to make boost is invisible for
- // any program using this library
-#if defined(LIBCMO_EXPORTING)
- using P_FILE_MAPPING = boost::interprocess::file_mapping*;
- using P_MAPPED_REGION = boost::interprocess::mapped_region*;
-#else
- using P_FILE_MAPPING = void*;
- using P_MAPPED_REGION = void*;
-#endif
-
class VxMemoryMappedFile {
- public:
- VxMemoryMappedFile(const char* u8_filepath);
- ~VxMemoryMappedFile(void);
-
- void* GetBase(void);
- size_t GetFileSize(void);
- bool IsValid(void);
-
private:
#if defined(LIBCMO_OS_WIN32)
@@ -49,9 +31,18 @@ namespace LibCmo {
std::string m_szFilePath;
#endif
- P_FILE_MAPPING m_hFile;
- P_MAPPED_REGION m_hFileMapping;
+ boost::interprocess::file_mapping* m_hFile;
+ boost::interprocess::mapped_region* m_hFileMapping;
bool m_bIsValid;
+ public:
+ VxMemoryMappedFile(const char* u8_filepath);
+ VxMemoryMappedFile(const VxMemoryMappedFile&) = delete;
+ VxMemoryMappedFile& operator=(const VxMemoryMappedFile&) = delete;
+ ~VxMemoryMappedFile(void);
+
+ inline void* GetBase(void) { return this->m_hFileMapping->get_address(); }
+ inline size_t GetFileSize(void) { return this->m_hFileMapping->get_size(); }
+ inline bool IsValid(void) { return this->m_bIsValid; }
};
class CKBufferParser {
@@ -62,17 +53,12 @@ namespace LibCmo {
size_t m_ReaderSize;
public:
- CKBufferParser(void* ptr, size_t rsize, bool need_manual_free) :
- m_ReaderBegin(static_cast(ptr)),
- m_ReaderPos(0u), m_ReaderSize(rsize),
- m_NeedManualFree(need_manual_free) {
- ;
- }
- ~CKBufferParser() {
- if (this->m_NeedManualFree) free(this->m_ReaderBegin);
- }
+ CKBufferParser(void* ptr, size_t rsize, bool need_manual_free);
+ CKBufferParser(const CKBufferParser&) = delete;
+ CKBufferParser& operator=(const CKBufferParser&) = delete;
+ ~CKBufferParser();
- inline void* GetPtr(void) { return (this->m_ReaderBegin + m_ReaderPos); }
+ inline const void* GetPtr(void) { return (this->m_ReaderBegin + m_ReaderPos); }
inline size_t GetSize(void) { return this->m_ReaderSize; }
inline void MoveCursor(size_t off) { this->m_ReaderPos += off; }
inline void SetCursor(size_t off) { this->m_ReaderPos = off; }
@@ -84,7 +70,7 @@ namespace LibCmo {
CK_FILE_WRITEMODE FileWriteMode; // Options used to save this file. (CK_FILE_WRITEMODE)
CKDWORD FileVersion; // Version of file format when file was saved.
CKDWORD CKVersion; // Version of CK when file was saved.
- CKDWORD FileSize; // Size of file in bytes.
+ size_t FileSize; // Size of file in bytes.
CKDWORD ObjectCount; // Number of objects stored in the file.
CKDWORD ManagerCount; // Number of managers which saved data in the file.
CKDWORD MaxIDSaved; // Maximum Object identifier saved
@@ -117,16 +103,25 @@ namespace LibCmo {
class CKFile {
public:
- CKFile();
+ CKFile(const Utils::VirtoolsContext& cfg);
+ CKFile(const CKFile&) = delete;
+ CKFile& operator=(const CKFile&) = delete;
~CKFile();
+ void ClearData(void);
+ CKERROR Load(CKSTRING u8_filename, /*CKObjectArray list, */ CK_LOAD_FLAGS flags);
+ CKERROR OpenFile(CKSTRING u8_filename, CK_LOAD_FLAGS flags);
+ CKERROR OpenMemory(void* MemoryBuffer, size_t BufferSize, CK_LOAD_FLAGS Flags);
+ CKERROR ReadFileHeaders(CKBufferParser** ParserPtr);
+ CKERROR ReadFileData(CKBufferParser** ParserPtr);
+ CKERROR LoadFileData(void/*CKObjectArray list*/);
int32_t m_SaveIDMax;
XArray m_FileObject;
//XArray m_ManagersData;
XClassArray m_PluginDep;
- //XClassArray m_IndexByClassId;
- //XClassArray m_IncludedFiles;
+ XClassArray m_IndexByClassId;
+ XClassArray m_IncludedFiles;
CKFileInfo m_FileInfo;
@@ -137,6 +132,8 @@ namespace LibCmo {
bool m_ReadFileDataDone;
+ private:
+ Utils::VirtoolsContext m_UserCfg;
};
}
diff --git a/LibCmo/VTUtils.hpp b/LibCmo/VTUtils.hpp
index d108d88..7759159 100644
--- a/LibCmo/VTUtils.hpp
+++ b/LibCmo/VTUtils.hpp
@@ -1,9 +1,12 @@
#pragma once
+#include
+
+/*
// https://stackoverflow.com/questions/2164827/explicitly-exporting-shared-library-functions-in-linux
// generate import export macro
#if defined(_MSC_VER)
-// Microsoft
+// Microsoft
#define LIBCMO_RAW_EXPORT __declspec(dllexport)
#define LIBCMO_RAW_IMPORT __declspec(dllimport)
#elif defined(__GNUC__)
@@ -34,3 +37,20 @@
#else
#define LIBCMO_EXPORT LIBCMO_NAKED_EXPORT
#endif
+*/
+
+#if defined(_WIN32)
+#define LIBCMO_OS_WIN32
+#endif
+
+namespace LibCmo {
+ namespace Utils {
+
+ struct VirtoolsContext {
+ std::string NameEncoding;
+
+ };
+
+ }
+
+}
diff --git a/Unvirt/AccessibleValue.cpp b/Unvirt/AccessibleValue.cpp
index 96001ea..0f9cc5b 100644
--- a/Unvirt/AccessibleValue.cpp
+++ b/Unvirt/AccessibleValue.cpp
@@ -174,7 +174,6 @@ namespace Unvirt {
{ LibCmo::CK_CLASSID::CKCID_BODYPART, {"CKCID_OBJECT", "CKCID_SCENEOBJECT", "CKCID_BEOBJECT", "CKCID_3DENTITY", "CKCID_3DOBJECT", "CKCID_BODYPART"} },
{ LibCmo::CK_CLASSID::CKCID_PARAMETER, {"CKCID_OBJECT", "CKCID_PARAMETER"} },
{ LibCmo::CK_CLASSID::CKCID_PARAMETERLOCAL, {"CKCID_OBJECT", "CKCID_PARAMETER", "CKCID_PARAMETERLOCAL"} },
- { LibCmo::CK_CLASSID::CKCID_PARAMETERVARIABLE, {"CKCID_OBJECT", "CKCID_PARAMETER", "CKCID_PARAMETERLOCAL", "CKCID_PARAMETERVARIABLE"} },
{ LibCmo::CK_CLASSID::CKCID_PARAMETEROUT, {"CKCID_OBJECT", "CKCID_PARAMETER", "CKCID_PARAMETEROUT"} },
{ LibCmo::CK_CLASSID::CKCID_INTERFACEOBJECTMANAGER, {"CKCID_OBJECT", "CKCID_INTERFACEOBJECTMANAGER"} },
{ LibCmo::CK_CLASSID::CKCID_CRITICALSECTION, {"CKCID_OBJECT", "CKCID_CRITICALSECTION"} },
diff --git a/Unvirt/Unvirt.cpp b/Unvirt/Unvirt.cpp
index 25308c4..8b0236d 100644
--- a/Unvirt/Unvirt.cpp
+++ b/Unvirt/Unvirt.cpp
@@ -1,20 +1,11 @@
#include "AccessibleValue.hpp"
+#include "VTStruct.hpp"
#include
int main(int argc, char* argv[]) {
- std::string test;
- Unvirt::AccessibleValue::GetClassIdHierarchy(test, LibCmo::CK_CLASSID::CKCID_TARGETCAMERA);
- printf("%s\n", test.c_str());
- Unvirt::AccessibleValue::GetCkErrorDescription(test, LibCmo::CKERROR::CKERR_OBSOLETEVIRTOOLS);
- printf("%s\n", test.c_str());
+ LibCmo::Utils::VirtoolsContext vtctx;
+ LibCmo::CKFile vtfile(vtctx);
+ vtfile.Load("Language.old.nmo", LibCmo::CK_LOAD_FLAGS::CK_LOAD_DEFAULT);
- Unvirt::AccessibleValue::GetEnumName(Unvirt::AccessibleValue::EnumDesc::CK_FO_OPTIONS, test, LibCmo::CK_FO_OPTIONS::CK_FO_RENAMEOBJECT);
- printf("%s\n", test.c_str());
-
- Unvirt::AccessibleValue::GetFlagEnumName(Unvirt::AccessibleValue::EnumDesc::CK_LOAD_FLAGS, test, LibCmo::CK_LOAD_FLAGS::CK_LOAD_DEFAULT);
- printf("%s\n", test.c_str());
- auto v = LibCmo::EnumHelper::FlagEnumAdd(LibCmo::CK_LOAD_FLAGS::CK_LOAD_ANIMATION, LibCmo::CK_LOAD_FLAGS::CK_LOAD_ASCHARACTER);
- Unvirt::AccessibleValue::GetFlagEnumName(Unvirt::AccessibleValue::EnumDesc::CK_LOAD_FLAGS, test, v);
- printf("%s\n", test.c_str());
return 0;
}
diff --git a/Unvirt/Unvirt.vcxproj b/Unvirt/Unvirt.vcxproj
index 48c7c52..233d63e 100644
--- a/Unvirt/Unvirt.vcxproj
+++ b/Unvirt/Unvirt.vcxproj
@@ -100,14 +100,14 @@
true
_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
- ../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
+ $(BOOST_INCLUDE_PATH);$(ZLIB_PATH);../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
stdcpp20
Console
true
- sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
- $(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN32_LIB_PATH)
+ zlibwapi.lib;sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
+ $(ZLIB_PATH)\contrib\vstudio\vc14\x86\ZlibDllReleaseWithoutAsm;$(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN32_LIB_PATH)
@@ -118,7 +118,7 @@
true
_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
- ../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
+ $(BOOST_INCLUDE_PATH);$(ZLIB_PATH);../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
stdcpp20
@@ -126,8 +126,8 @@
true
true
true
- sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
- $(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN32_LIB_PATH)
+ zlibwapi.lib;sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
+ $(ZLIB_PATH)\contrib\vstudio\vc14\x86\ZlibDllReleaseWithoutAsm;$(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN32_LIB_PATH)
@@ -136,14 +136,14 @@
true
_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
- ../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
+ $(BOOST_INCLUDE_PATH);$(ZLIB_PATH);../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
stdcpp20
Console
true
- sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
- $(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN64_LIB_PATH)
+ zlibwapi.lib;sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
+ $(ZLIB_PATH)\contrib\vstudio\vc14\x64\ZlibDllReleaseWithoutAsm;$(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN64_LIB_PATH)
@@ -154,7 +154,7 @@
true
_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
- ../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
+ $(BOOST_INCLUDE_PATH);$(ZLIB_PATH);../LibCmo;$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories)
stdcpp20
@@ -162,8 +162,8 @@
true
true
true
- sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
- $(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN64_LIB_PATH)
+ zlibwapi.lib;sqlite3.lib;LibCmo.lib;%(AdditionalDependencies)
+ $(ZLIB_PATH)\contrib\vstudio\vc14\x64\ZlibDllReleaseWithoutAsm;$(SolutionDir)out\$(Platform)\$(Configuration)\LibCmo;$(SQLITE_WIN64_LIB_PATH)