|
@@ -101,6 +101,81 @@ void SET_SYS::SetColorSetId(Kernel::HLERequestContext& ctx) {
|
|
|
rb.Push(ResultSuccess);
|
|
rb.Push(ResultSuccess);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// FIXME: implement support for the real system_settings.ini
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+static std::vector<u8> ToBytes(const T& value) {
|
|
|
|
|
+ static_assert(std::is_trivially_copyable_v<T>);
|
|
|
|
|
+
|
|
|
|
|
+ const auto* begin = reinterpret_cast<const u8*>(&value);
|
|
|
|
|
+ const auto* end = begin + sizeof(T);
|
|
|
|
|
+
|
|
|
|
|
+ return std::vector<u8>(begin, end);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+using Settings =
|
|
|
|
|
+ std::map<std::string, std::map<std::string, std::vector<u8>, std::less<>>, std::less<>>;
|
|
|
|
|
+
|
|
|
|
|
+static Settings GetSettings() {
|
|
|
|
|
+ Settings ret;
|
|
|
|
|
+
|
|
|
|
|
+ ret["hbloader"]["applet_heap_size"] = ToBytes(u64{0x0});
|
|
|
|
|
+ ret["hbloader"]["applet_heap_reservation_size"] = ToBytes(u64{0x8600000});
|
|
|
|
|
+
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void SET_SYS::GetSettingsItemValueSize(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ LOG_DEBUG(Service_SET, "called");
|
|
|
|
|
+
|
|
|
|
|
+ // The category of the setting. This corresponds to the top-level keys of
|
|
|
|
|
+ // system_settings.ini.
|
|
|
|
|
+ const auto setting_category_buf{ctx.ReadBuffer(0)};
|
|
|
|
|
+ const std::string setting_category{setting_category_buf.begin(), setting_category_buf.end()};
|
|
|
|
|
+
|
|
|
|
|
+ // The name of the setting. This corresponds to the second-level keys of
|
|
|
|
|
+ // system_settings.ini.
|
|
|
|
|
+ const auto setting_name_buf{ctx.ReadBuffer(1)};
|
|
|
|
|
+ const std::string setting_name{setting_name_buf.begin(), setting_name_buf.end()};
|
|
|
|
|
+
|
|
|
|
|
+ auto settings{GetSettings()};
|
|
|
|
|
+ u64 response_size{0};
|
|
|
|
|
+
|
|
|
|
|
+ if (settings.contains(setting_category) && settings[setting_category].contains(setting_name)) {
|
|
|
|
|
+ response_size = settings[setting_category][setting_name].size();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
+ rb.Push(response_size == 0 ? ResultUnknown : ResultSuccess);
|
|
|
|
|
+ rb.Push(response_size);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void SET_SYS::GetSettingsItemValue(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ LOG_DEBUG(Service_SET, "called");
|
|
|
|
|
+
|
|
|
|
|
+ // The category of the setting. This corresponds to the top-level keys of
|
|
|
|
|
+ // system_settings.ini.
|
|
|
|
|
+ const auto setting_category_buf{ctx.ReadBuffer(0)};
|
|
|
|
|
+ const std::string setting_category{setting_category_buf.begin(), setting_category_buf.end()};
|
|
|
|
|
+
|
|
|
|
|
+ // The name of the setting. This corresponds to the second-level keys of
|
|
|
|
|
+ // system_settings.ini.
|
|
|
|
|
+ const auto setting_name_buf{ctx.ReadBuffer(1)};
|
|
|
|
|
+ const std::string setting_name{setting_name_buf.begin(), setting_name_buf.end()};
|
|
|
|
|
+
|
|
|
|
|
+ auto settings{GetSettings()};
|
|
|
|
|
+ Result response{ResultUnknown};
|
|
|
|
|
+
|
|
|
|
|
+ if (settings.contains(setting_category) && settings[setting_category].contains(setting_name)) {
|
|
|
|
|
+ auto setting_value = settings[setting_category][setting_name];
|
|
|
|
|
+ ctx.WriteBuffer(setting_value.data(), setting_value.size());
|
|
|
|
|
+ response = ResultSuccess;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(response);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
|
SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
|
|
// clang-format off
|
|
// clang-format off
|
|
|
static const FunctionInfo functions[] = {
|
|
static const FunctionInfo functions[] = {
|
|
@@ -138,8 +213,8 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
|
|
{32, nullptr, "SetAccountNotificationSettings"},
|
|
{32, nullptr, "SetAccountNotificationSettings"},
|
|
|
{35, nullptr, "GetVibrationMasterVolume"},
|
|
{35, nullptr, "GetVibrationMasterVolume"},
|
|
|
{36, nullptr, "SetVibrationMasterVolume"},
|
|
{36, nullptr, "SetVibrationMasterVolume"},
|
|
|
- {37, nullptr, "GetSettingsItemValueSize"},
|
|
|
|
|
- {38, nullptr, "GetSettingsItemValue"},
|
|
|
|
|
|
|
+ {37, &SET_SYS::GetSettingsItemValueSize, "GetSettingsItemValueSize"},
|
|
|
|
|
+ {38, &SET_SYS::GetSettingsItemValue, "GetSettingsItemValue"},
|
|
|
{39, nullptr, "GetTvSettings"},
|
|
{39, nullptr, "GetTvSettings"},
|
|
|
{40, nullptr, "SetTvSettings"},
|
|
{40, nullptr, "SetTvSettings"},
|
|
|
{41, nullptr, "GetEdid"},
|
|
{41, nullptr, "GetEdid"},
|