From d0bc6f17b779c7989ceea67da10dbc70043e8ca2 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Fri, 10 Mar 2023 20:30:53 +0100 Subject: [PATCH] Use utf8 json --- src/common/utils/properties.cpp | 71 +++++++++++++++------------------ src/common/utils/properties.hpp | 2 - 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/common/utils/properties.cpp b/src/common/utils/properties.cpp index f0ee3775..22ac1561 100644 --- a/src/common/utils/properties.cpp +++ b/src/common/utils/properties.cpp @@ -16,11 +16,8 @@ namespace utils::properties { namespace { - typedef rapidjson::GenericDocument> WDocument; - typedef rapidjson::GenericValue> WValue; - - typedef rapidjson::EncodedOutputStream, rapidjson::FileWriteStream> OutputStream; - typedef rapidjson::EncodedInputStream, rapidjson::FileReadStream> InputStream; + typedef rapidjson::EncodedOutputStream, rapidjson::FileWriteStream> OutputStream; + typedef rapidjson::EncodedInputStream, rapidjson::FileReadStream> InputStream; std::filesystem::path get_properties_folder() { @@ -34,12 +31,12 @@ namespace utils::properties return props; } - WDocument load_properties() + rapidjson::Document load_properties() { - WDocument default_doc{}; + rapidjson::Document default_doc{}; 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(); @@ -50,14 +47,20 @@ namespace utils::properties return default_doc; } + const auto _ = finally([&] + { + if (fp) + { + fclose(fp); + } + }); + // This will handle the BOM rapidjson::FileReadStream bis(fp, read_buffer, sizeof(read_buffer)); InputStream eis(bis); - WDocument doc{}; - const rapidjson::ParseResult result = doc.ParseStream>(eis); - - fclose(fp); + rapidjson::Document doc{}; + const rapidjson::ParseResult result = doc.ParseStream>(eis); if (!result || !doc.IsObject()) { @@ -67,9 +70,9 @@ namespace utils::properties 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(); io::create_directory(get_properties_folder()); @@ -81,13 +84,19 @@ namespace utils::properties return; } + const auto _ = finally([&] + { + if (fp) + { + fclose(fp); + } + }); + rapidjson::FileWriteStream bos(fp, write_buffer, sizeof(write_buffer)); - OutputStream eos(bos, true); // Write BOM + OutputStream eos(bos); - rapidjson::Writer, rapidjson::UTF16LE<>> writer(eos); + rapidjson::Writer writer(eos); doc.Accept(writer); - - fclose(fp); } } @@ -114,7 +123,7 @@ namespace utils::properties return std::unique_lock{mutex}; } - std::optional load(const std::wstring& name) + std::optional load(const std::string& name) { const auto _ = lock(); const auto doc = load_properties(); @@ -130,21 +139,10 @@ namespace utils::properties return {}; } - return {std::wstring{value.GetString()}}; + return {std::string{value.GetString()}}; } - std::optional load(const std::string& name) - { - const auto result = load(string::convert(name)); - if (!result) - { - return {}; - } - - return {string::convert(*result)}; - } - - void store(const std::wstring& name, const std::wstring& value) + void store(const std::string& name, const std::string& value) { const auto _ = lock(); auto doc = load_properties(); @@ -154,19 +152,14 @@ namespace utils::properties doc.RemoveMember(name); } - WValue key{}; + rapidjson::Value key{}; key.SetString(name, doc.GetAllocator()); - WValue member{}; + rapidjson::Value member{}; member.SetString(value, doc.GetAllocator()); doc.AddMember(key, member, doc.GetAllocator()); store_properties(doc); } - - void store(const std::string& name, const std::string& value) - { - store(string::convert(name), string::convert(value)); - } } diff --git a/src/common/utils/properties.hpp b/src/common/utils/properties.hpp index 4fcb0500..0532048e 100644 --- a/src/common/utils/properties.hpp +++ b/src/common/utils/properties.hpp @@ -11,9 +11,7 @@ namespace utils::properties std::unique_lock lock(); - std::optional load(const std::wstring& name); std::optional 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); }