Use utf8 json

This commit is contained in:
momo5502 2023-03-10 20:30:53 +01:00
parent d3e7d2fa3d
commit d0bc6f17b7
2 changed files with 32 additions and 41 deletions

View File

@ -16,11 +16,8 @@ namespace utils::properties
{ {
namespace namespace
{ {
typedef rapidjson::GenericDocument<rapidjson::UTF16LE<>> WDocument; typedef rapidjson::EncodedOutputStream<rapidjson::UTF8<>, rapidjson::FileWriteStream> OutputStream;
typedef rapidjson::GenericValue<rapidjson::UTF16LE<>> WValue; typedef rapidjson::EncodedInputStream<rapidjson::UTF8<>, rapidjson::FileReadStream> InputStream;
typedef rapidjson::EncodedOutputStream<rapidjson::UTF16LE<>, rapidjson::FileWriteStream> OutputStream;
typedef rapidjson::EncodedInputStream<rapidjson::UTF16LE<>, rapidjson::FileReadStream> InputStream;
std::filesystem::path get_properties_folder() std::filesystem::path get_properties_folder()
{ {
@ -34,12 +31,12 @@ namespace utils::properties
return props; return props;
} }
WDocument load_properties() rapidjson::Document load_properties()
{ {
WDocument default_doc{}; rapidjson::Document default_doc{};
default_doc.SetObject(); default_doc.SetObject();
char read_buffer[256]; // Raw buffer for reading char read_buffer[256]{0}; // Raw buffer for reading
const std::wstring& props = get_properties_file(); const std::wstring& props = get_properties_file();
@ -50,14 +47,20 @@ namespace utils::properties
return default_doc; return default_doc;
} }
const auto _ = finally([&]
{
if (fp)
{
fclose(fp);
}
});
// This will handle the BOM // This will handle the BOM
rapidjson::FileReadStream bis(fp, read_buffer, sizeof(read_buffer)); rapidjson::FileReadStream bis(fp, read_buffer, sizeof(read_buffer));
InputStream eis(bis); InputStream eis(bis);
WDocument doc{}; rapidjson::Document doc{};
const rapidjson::ParseResult result = doc.ParseStream<rapidjson::kParseNoFlags, rapidjson::UTF16LE<>>(eis); const rapidjson::ParseResult result = doc.ParseStream<rapidjson::kParseNoFlags, rapidjson::UTF8<>>(eis);
fclose(fp);
if (!result || !doc.IsObject()) if (!result || !doc.IsObject())
{ {
@ -67,9 +70,9 @@ namespace utils::properties
return doc; return doc;
} }
void store_properties(const WDocument& doc) void store_properties(const rapidjson::Document& doc)
{ {
char write_buffer[256]; // Raw buffer for writing char write_buffer[256]{0}; // Raw buffer for writing
const std::wstring& props = get_properties_file(); const std::wstring& props = get_properties_file();
io::create_directory(get_properties_folder()); io::create_directory(get_properties_folder());
@ -81,14 +84,20 @@ namespace utils::properties
return; return;
} }
rapidjson::FileWriteStream bos(fp, write_buffer, sizeof(write_buffer)); const auto _ = finally([&]
OutputStream eos(bos, true); // Write BOM {
if (fp)
rapidjson::Writer<OutputStream, rapidjson::UTF16LE<>, rapidjson::UTF16LE<>> writer(eos); {
doc.Accept(writer);
fclose(fp); fclose(fp);
} }
});
rapidjson::FileWriteStream bos(fp, write_buffer, sizeof(write_buffer));
OutputStream eos(bos);
rapidjson::Writer writer(eos);
doc.Accept(writer);
}
} }
std::filesystem::path get_appdata_path() std::filesystem::path get_appdata_path()
@ -114,7 +123,7 @@ namespace utils::properties
return std::unique_lock{mutex}; return std::unique_lock{mutex};
} }
std::optional<std::wstring> load(const std::wstring& name) std::optional<std::string> load(const std::string& name)
{ {
const auto _ = lock(); const auto _ = lock();
const auto doc = load_properties(); const auto doc = load_properties();
@ -130,21 +139,10 @@ namespace utils::properties
return {}; return {};
} }
return {std::wstring{value.GetString()}}; return {std::string{value.GetString()}};
} }
std::optional<std::string> load(const std::string& name) void store(const std::string& name, const std::string& value)
{
const auto result = load(string::convert(name));
if (!result)
{
return {};
}
return {string::convert(*result)};
}
void store(const std::wstring& name, const std::wstring& value)
{ {
const auto _ = lock(); const auto _ = lock();
auto doc = load_properties(); auto doc = load_properties();
@ -154,19 +152,14 @@ namespace utils::properties
doc.RemoveMember(name); doc.RemoveMember(name);
} }
WValue key{}; rapidjson::Value key{};
key.SetString(name, doc.GetAllocator()); key.SetString(name, doc.GetAllocator());
WValue member{}; rapidjson::Value member{};
member.SetString(value, doc.GetAllocator()); member.SetString(value, doc.GetAllocator());
doc.AddMember(key, member, doc.GetAllocator()); doc.AddMember(key, member, doc.GetAllocator());
store_properties(doc); store_properties(doc);
} }
void store(const std::string& name, const std::string& value)
{
store(string::convert(name), string::convert(value));
}
} }

View File

@ -11,9 +11,7 @@ namespace utils::properties
std::unique_lock<named_mutex> lock(); std::unique_lock<named_mutex> lock();
std::optional<std::wstring> load(const std::wstring& name);
std::optional<std::string> load(const std::string& name); std::optional<std::string> load(const std::string& name);
void store(const std::wstring& name, const std::wstring& value);
void store(const std::string& name, const std::string& value); void store(const std::string& name, const std::string& value);
} }