diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/glue/time/worker.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/service/set/system_settings_server.cpp | 13 | ||||
| -rw-r--r-- | src/core/hle/service/set/system_settings_server.h | 21 |
3 files changed, 19 insertions, 22 deletions
diff --git a/src/core/hle/service/glue/time/worker.cpp b/src/core/hle/service/glue/time/worker.cpp index b28569b68..b6bbd7965 100644 --- a/src/core/hle/service/glue/time/worker.cpp +++ b/src/core/hle/service/glue/time/worker.cpp | |||
| @@ -26,12 +26,9 @@ Service::PSC::Time::SystemClockContext g_report_ephemeral_clock_context{}; | |||
| 26 | template <typename T> | 26 | template <typename T> |
| 27 | T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys, | 27 | T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys, |
| 28 | const char* category, const char* name) { | 28 | const char* category, const char* name) { |
| 29 | std::vector<u8> interval_buf; | ||
| 30 | auto res = set_sys->GetSettingsItemValueImpl(interval_buf, category, name); | ||
| 31 | ASSERT(res == ResultSuccess); | ||
| 32 | |||
| 33 | T v{}; | 29 | T v{}; |
| 34 | std::memcpy(&v, interval_buf.data(), sizeof(T)); | 30 | auto res = set_sys->GetSettingsItemValueImpl(v, category, name); |
| 31 | ASSERT(res == ResultSuccess); | ||
| 35 | return v; | 32 | return v; |
| 36 | } | 33 | } |
| 37 | 34 | ||
diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp index 6a7ea83fd..900d5408f 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp | |||
| @@ -308,7 +308,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | |||
| 308 | SetupSettings(); | 308 | SetupSettings(); |
| 309 | 309 | ||
| 310 | m_system_settings.region_code = | 310 | m_system_settings.region_code = |
| 311 | static_cast<SystemRegionCode>(Settings::values.region_index.GetValue()); | 311 | static_cast<SystemRegionCode>(::Settings::values.region_index.GetValue()); |
| 312 | 312 | ||
| 313 | // TODO: Remove this when starter applet is fully functional | 313 | // TODO: Remove this when starter applet is fully functional |
| 314 | EulaVersion eula_version{ | 314 | EulaVersion eula_version{ |
| @@ -715,7 +715,7 @@ Result ISystemSettingsServer::GetSettingsItemValueSize( | |||
| 715 | } | 715 | } |
| 716 | 716 | ||
| 717 | Result ISystemSettingsServer::GetSettingsItemValue( | 717 | Result ISystemSettingsServer::GetSettingsItemValue( |
| 718 | OutBuffer<BufferAttr_HipcMapAlias> out_data, | 718 | Out<u64> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_data, |
| 719 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, | 719 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, |
| 720 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer) { | 720 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer) { |
| 721 | const std::string setting_category{Common::StringFromBuffer(*setting_category_buffer)}; | 721 | const std::string setting_category{Common::StringFromBuffer(*setting_category_buffer)}; |
| @@ -723,7 +723,7 @@ Result ISystemSettingsServer::GetSettingsItemValue( | |||
| 723 | 723 | ||
| 724 | LOG_INFO(Service_SET, "called, category={}, name={}", setting_category, setting_name); | 724 | LOG_INFO(Service_SET, "called, category={}, name={}", setting_category, setting_name); |
| 725 | 725 | ||
| 726 | R_RETURN(GetSettingsItemValueImpl(out_data, setting_category, setting_name)); | 726 | R_RETURN(GetSettingsItemValueImpl(out_data, *out_size, setting_category, setting_name)); |
| 727 | } | 727 | } |
| 728 | 728 | ||
| 729 | Result ISystemSettingsServer::GetTvSettings(Out<TvSettings> out_tv_settings) { | 729 | Result ISystemSettingsServer::GetTvSettings(Out<TvSettings> out_tv_settings) { |
| @@ -1363,13 +1363,16 @@ void ISystemSettingsServer::SetSaveNeeded() { | |||
| 1363 | m_save_needed = true; | 1363 | m_save_needed = true; |
| 1364 | } | 1364 | } |
| 1365 | 1365 | ||
| 1366 | Result ISystemSettingsServer::GetSettingsItemValueImpl(std::vector<u8>& out_value, | 1366 | Result ISystemSettingsServer::GetSettingsItemValueImpl(std::span<u8> out_value, u64& out_size, |
| 1367 | const std::string& category, | 1367 | const std::string& category, |
| 1368 | const std::string& name) { | 1368 | const std::string& name) { |
| 1369 | auto settings{GetSettings()}; | 1369 | auto settings{GetSettings()}; |
| 1370 | R_UNLESS(settings.contains(category) && settings[category].contains(name), ResultUnknown); | 1370 | R_UNLESS(settings.contains(category) && settings[category].contains(name), ResultUnknown); |
| 1371 | 1371 | ||
| 1372 | out_value = settings[category][name]; | 1372 | ASSERT_MSG(out_value.size() >= settings[category][name].size(), |
| 1373 | "Stored type is bigger than requested type"); | ||
| 1374 | out_size = std::min<u64>(settings[category][name].size(), out_value.size()); | ||
| 1375 | std::memcpy(out_value.data(), settings[category][name].data(), out_size); | ||
| 1373 | R_SUCCEED(); | 1376 | R_SUCCEED(); |
| 1374 | } | 1377 | } |
| 1375 | 1378 | ||
diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h index 46e06c8ea..9a1154ad6 100644 --- a/src/core/hle/service/set/system_settings_server.h +++ b/src/core/hle/service/set/system_settings_server.h | |||
| @@ -34,20 +34,17 @@ public: | |||
| 34 | explicit ISystemSettingsServer(Core::System& system_); | 34 | explicit ISystemSettingsServer(Core::System& system_); |
| 35 | ~ISystemSettingsServer() override; | 35 | ~ISystemSettingsServer() override; |
| 36 | 36 | ||
| 37 | Result GetSettingsItemValueImpl(std::vector<u8>& out_value, const std::string& category, | 37 | Result GetSettingsItemValueImpl(std::span<u8> out_value, u64& out_size, |
| 38 | const std::string& name); | 38 | const std::string& category, const std::string& name); |
| 39 | 39 | ||
| 40 | template <typename T> | 40 | template <typename T> |
| 41 | Result GetSettingsItemValueImpl(T& value, const std::string& category, | 41 | Result GetSettingsItemValueImpl(T& out_value, const std::string& category, |
| 42 | const std::string& name) { | 42 | const std::string& name) { |
| 43 | std::vector<u8> data; | 43 | u64 data_size{}; |
| 44 | const auto result = GetSettingsItemValueImpl(data, category, name); | 44 | std::vector<u8> data(sizeof(T)); |
| 45 | if (result.IsError()) { | 45 | R_TRY(GetSettingsItemValueImpl(data, data_size, category, name)); |
| 46 | return result; | 46 | std::memcpy(&out_value, data.data(), data_size); |
| 47 | } | 47 | R_SUCCEED(); |
| 48 | ASSERT(data.size() >= sizeof(T)); | ||
| 49 | std::memcpy(&value, data.data(), sizeof(T)); | ||
| 50 | return result; | ||
| 51 | } | 48 | } |
| 52 | 49 | ||
| 53 | public: | 50 | public: |
| @@ -84,7 +81,7 @@ public: | |||
| 84 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, | 81 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, |
| 85 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buf); | 82 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buf); |
| 86 | Result GetSettingsItemValue( | 83 | Result GetSettingsItemValue( |
| 87 | OutBuffer<BufferAttr_HipcMapAlias> out_data, | 84 | Out<u64> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_data, |
| 88 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, | 85 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, |
| 89 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer); | 86 | InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer); |
| 90 | Result GetTvSettings(Out<TvSettings> out_tv_settings); | 87 | Result GetTvSettings(Out<TvSettings> out_tv_settings); |