summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar german772024-02-24 13:27:57 -0600
committerGravatar german772024-02-24 14:44:21 -0600
commit9fccccedee481953451054138fe4a2c6b133677c (patch)
treee7589e51b5bf334aef78658b2e7efddcce3578dd /src/core
parentMerge pull request #13153 from german77/defaultset (diff)
downloadyuzu-9fccccedee481953451054138fe4a2c6b133677c.tar.gz
yuzu-9fccccedee481953451054138fe4a2c6b133677c.tar.xz
yuzu-9fccccedee481953451054138fe4a2c6b133677c.zip
service: set: Fix GetSettingsItemValue
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/glue/time/worker.cpp7
-rw-r--r--src/core/hle/service/set/system_settings_server.cpp13
-rw-r--r--src/core/hle/service/set/system_settings_server.h21
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{};
26template <typename T> 26template <typename T>
27T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys, 27T 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
717Result ISystemSettingsServer::GetSettingsItemValue( 717Result 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
729Result ISystemSettingsServer::GetTvSettings(Out<TvSettings> out_tv_settings) { 729Result 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
1366Result ISystemSettingsServer::GetSettingsItemValueImpl(std::vector<u8>& out_value, 1366Result 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
53public: 50public:
@@ -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);