libcmo21/LibCmo/CKMinContext.cpp

79 lines
2.1 KiB
C++
Raw Normal View History

2023-02-25 22:58:28 +08:00
#include "VTUtils.hpp"
#include "CKMinContext.hpp"
2023-02-26 21:48:03 +08:00
namespace LibCmo::CK2 {
2023-02-25 22:58:28 +08:00
#if defined(LIBCMO_OS_WIN32)
static wchar_t g_UniqueFolder[] = L"LibCmo";
#else
static char g_UniqueFolder[] = "LibCmo";
#endif
CKMinContext::CKMinContext() :
2023-02-26 21:48:03 +08:00
m_NameEncoding(), m_NameEncodingToken(EncodingHelper::ENCODING_TOKEN_DEFAULT),
m_TempFolder(),
m_PrintCallback(nullptr)
2023-02-25 22:58:28 +08:00
{
// preset for temp folder
2023-02-26 21:48:03 +08:00
m_TempFolder = std::filesystem::temp_directory_path();
m_TempFolder /= g_UniqueFolder;
std::filesystem::create_directory(m_TempFolder);
2023-02-25 22:58:28 +08:00
}
CKMinContext::~CKMinContext() {
}
void CKMinContext::Printf(CKSTRING fmt, ...) {
2023-02-26 21:48:03 +08:00
if (m_PrintCallback == nullptr) return;
2023-02-25 22:58:28 +08:00
va_list argptr;
va_start(argptr, fmt);
2023-02-26 21:48:03 +08:00
std::string result;
int count = std::vsnprintf(nullptr, 0, fmt, argptr);
result.resize(count);
int write_result = std::vsnprintf(result.data(), count, fmt, argptr);
if (write_result < 0 || write_result > count) return;
2023-02-25 22:58:28 +08:00
va_end(argptr);
2023-02-26 21:48:03 +08:00
m_PrintCallback(result);
}
void CKMinContext::SetPrintCallback(PrintCallback cb) {
m_PrintCallback = cb;
2023-02-25 22:58:28 +08:00
}
2023-02-26 21:48:03 +08:00
void CKMinContext::GetUtf8String(std::string& native_name, std::string& u8_name) {
EncodingHelper::GetUtf8VirtoolsName(native_name, u8_name, this->m_NameEncodingToken);
2023-02-25 22:58:28 +08:00
}
2023-02-26 21:48:03 +08:00
void CKMinContext::GetNativeString(std::string& u8_name, std::string& native_name) {
EncodingHelper::GetNativeVirtoolsName(u8_name, native_name, this->m_NameEncodingToken);
2023-02-25 22:58:28 +08:00
}
void CKMinContext::SetEncoding(CKSTRING encoding) {
2023-02-26 21:48:03 +08:00
this->m_NameEncoding = encoding;
2023-02-25 22:58:28 +08:00
this->RefetchEncodingToken();
}
void CKMinContext::SetTempPath(CKSTRING u8_temp) {
2023-02-26 21:48:03 +08:00
EncodingHelper::SetStdPathFromU8Path(this->m_TempFolder, u8_temp);
2023-02-25 22:58:28 +08:00
}
FILE* CKMinContext::OpenTempFile(CKSTRING u8_filename, bool is_read) {
std::filesystem::path stdfilename;
2023-02-26 21:48:03 +08:00
EncodingHelper::SetStdPathFromU8Path(stdfilename, u8_filename);
2023-02-25 22:58:28 +08:00
2023-02-26 21:48:03 +08:00
auto realfile = this->m_TempFolder / stdfilename;
return EncodingHelper::OpenStdPathFile(realfile, is_read);
2023-02-25 22:58:28 +08:00
}
void CKMinContext::RefetchEncodingToken(void) {
2023-02-26 21:48:03 +08:00
EncodingHelper::DestroyEncodingToken(this->m_NameEncodingToken);
this->m_NameEncodingToken = EncodingHelper::CreateEncodingToken(this->m_NameEncoding);
2023-02-25 22:58:28 +08:00
}
}