Config.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include <cpp3ds/System/FileSystem.hpp>
  2. #include <fstream>
  3. #include <rapidjson/ostreamwrapper.h>
  4. #include <rapidjson/writer.h>
  5. #include <cpp3ds/System/FileInputStream.hpp>
  6. #include "Config.hpp"
  7. #include "Util.hpp"
  8. namespace {
  9. // Matches with Config::Key enum in Config.hpp
  10. const char *keyStrings[] = {
  11. "version",
  12. "cache_version",
  13. "trigger_update",
  14. "show_news",
  15. // Filter
  16. "filter_region",
  17. "filter_genre",
  18. "filter_language",
  19. "filter_platform",
  20. // Sort
  21. // Update
  22. "auto-update",
  23. "last_updated",
  24. "download_title_keys",
  25. "key_urls",
  26. // Download
  27. "download_timeout",
  28. "download_buffer_size",
  29. "play_sound_after_download",
  30. "power_off_after_download",
  31. "power_off_time",
  32. // Music
  33. "music_mode",
  34. "music_filename",
  35. // Other
  36. "sleep_mode",
  37. "language",
  38. };
  39. }
  40. namespace FreeShop {
  41. Config::Config()
  42. {
  43. static_assert(KEY_COUNT == sizeof(keyStrings)/sizeof(*keyStrings), "Key string count must match the enum count.");
  44. loadDefaults();
  45. }
  46. Config &Config::getInstance()
  47. {
  48. static Config config;
  49. return config;
  50. }
  51. bool Config::loadFromFile(const std::string &filename)
  52. {
  53. rapidjson::Document &json = getInstance().m_json;
  54. std::string path = cpp3ds::FileSystem::getFilePath(filename);
  55. std::string jsonString;
  56. cpp3ds::FileInputStream file;
  57. if (!file.open(filename))
  58. return false;
  59. jsonString.resize(file.getSize());
  60. file.read(&jsonString[0], jsonString.size());
  61. json.Parse(jsonString.c_str());
  62. getInstance().loadDefaults();
  63. return !json.HasParseError();
  64. }
  65. void Config::saveToFile(const std::string &filename)
  66. {
  67. std::string path = cpp3ds::FileSystem::getFilePath(filename);
  68. std::ofstream file(path);
  69. rapidjson::OStreamWrapper osw(file);
  70. rapidjson::Writer<rapidjson::OStreamWrapper> writer(osw);
  71. getInstance().m_json.Accept(writer);
  72. }
  73. bool Config::keyExists(const char *key)
  74. {
  75. return getInstance().m_json.HasMember(key);
  76. }
  77. const rapidjson::Value &Config::get(Key key)
  78. {
  79. return getInstance().m_json[keyStrings[key]];
  80. }
  81. #define ADD_DEFAULT(key, val) \
  82. if (!m_json.HasMember(keyStrings[key])) \
  83. m_json.AddMember(rapidjson::StringRef(keyStrings[key]), val, m_json.GetAllocator());
  84. void Config::loadDefaults()
  85. {
  86. if (!m_json.IsObject())
  87. m_json.SetObject();
  88. ADD_DEFAULT(Version, "");
  89. ADD_DEFAULT(CacheVersion, "");
  90. ADD_DEFAULT(TriggerUpdateFlag, false);
  91. ADD_DEFAULT(ShowNews, true);
  92. // Filter
  93. ADD_DEFAULT(FilterRegion, rapidjson::kArrayType);
  94. ADD_DEFAULT(FilterGenre, rapidjson::kArrayType);
  95. ADD_DEFAULT(FilterLanguage, rapidjson::kArrayType);
  96. ADD_DEFAULT(FilterPlatform, rapidjson::kArrayType);
  97. // Update
  98. ADD_DEFAULT(AutoUpdate, true);
  99. ADD_DEFAULT(LastUpdatedTime, 0);
  100. ADD_DEFAULT(DownloadTitleKeys, false);
  101. ADD_DEFAULT(KeyURLs, rapidjson::kArrayType);
  102. // Download
  103. ADD_DEFAULT(DownloadTimeout, 6.f);
  104. ADD_DEFAULT(DownloadBufferSize, 128u);
  105. ADD_DEFAULT(PlaySoundAfterDownload, true);
  106. ADD_DEFAULT(PowerOffAfterDownload, false);
  107. ADD_DEFAULT(PowerOffTime, 120);
  108. // Music
  109. ADD_DEFAULT(MusicMode, "eshop");
  110. ADD_DEFAULT(MusicFilename, "");
  111. // Other
  112. ADD_DEFAULT(SleepMode, true);
  113. ADD_DEFAULT(Language, "auto");
  114. }
  115. void Config::set(Key key, const char *val)
  116. {
  117. rapidjson::Value v(val, getInstance().m_json.GetAllocator());
  118. set(key, v);
  119. }
  120. void Config::set(Key key, rapidjson::Value &val)
  121. {
  122. const char *keyStr = keyStrings[key];
  123. if (keyExists(keyStr))
  124. getInstance().m_json[keyStr] = val;
  125. else
  126. getInstance().m_json.AddMember(rapidjson::StringRef(keyStr), val, getInstance().m_json.GetAllocator());
  127. }
  128. rapidjson::Document::AllocatorType &Config::getAllocator()
  129. {
  130. return getInstance().m_json.GetAllocator();
  131. }
  132. } // namespace FreeShop