Merge pull request #13155 from german77/GetSettingsItemValue

service: set: Fix GetSettingsItemValue
This commit is contained in:
liamwhite 2024-02-24 16:24:01 -05:00 committed by GitHub
commit a93d249ac1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 22 deletions

View File

@ -26,12 +26,9 @@ Service::PSC::Time::SystemClockContext g_report_ephemeral_clock_context{};
template <typename T> template <typename T>
T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys, T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys,
const char* category, const char* name) { const char* category, const char* name) {
std::vector<u8> interval_buf;
auto res = set_sys->GetSettingsItemValueImpl(interval_buf, category, name);
ASSERT(res == ResultSuccess);
T v{}; T v{};
std::memcpy(&v, interval_buf.data(), sizeof(T)); auto res = set_sys->GetSettingsItemValueImpl(v, category, name);
ASSERT(res == ResultSuccess);
return v; return v;
} }

View File

@ -308,7 +308,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
SetupSettings(); SetupSettings();
m_system_settings.region_code = m_system_settings.region_code =
static_cast<SystemRegionCode>(Settings::values.region_index.GetValue()); static_cast<SystemRegionCode>(::Settings::values.region_index.GetValue());
// TODO: Remove this when starter applet is fully functional // TODO: Remove this when starter applet is fully functional
EulaVersion eula_version{ EulaVersion eula_version{
@ -715,7 +715,7 @@ Result ISystemSettingsServer::GetSettingsItemValueSize(
} }
Result ISystemSettingsServer::GetSettingsItemValue( Result ISystemSettingsServer::GetSettingsItemValue(
OutBuffer<BufferAttr_HipcMapAlias> out_data, Out<u64> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_data,
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer) { InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer) {
const std::string setting_category{Common::StringFromBuffer(*setting_category_buffer)}; const std::string setting_category{Common::StringFromBuffer(*setting_category_buffer)};
@ -723,7 +723,7 @@ Result ISystemSettingsServer::GetSettingsItemValue(
LOG_INFO(Service_SET, "called, category={}, name={}", setting_category, setting_name); LOG_INFO(Service_SET, "called, category={}, name={}", setting_category, setting_name);
R_RETURN(GetSettingsItemValueImpl(out_data, setting_category, setting_name)); R_RETURN(GetSettingsItemValueImpl(out_data, *out_size, setting_category, setting_name));
} }
Result ISystemSettingsServer::GetTvSettings(Out<TvSettings> out_tv_settings) { Result ISystemSettingsServer::GetTvSettings(Out<TvSettings> out_tv_settings) {
@ -1363,13 +1363,16 @@ void ISystemSettingsServer::SetSaveNeeded() {
m_save_needed = true; m_save_needed = true;
} }
Result ISystemSettingsServer::GetSettingsItemValueImpl(std::vector<u8>& out_value, Result ISystemSettingsServer::GetSettingsItemValueImpl(std::span<u8> out_value, u64& out_size,
const std::string& category, const std::string& category,
const std::string& name) { const std::string& name) {
auto settings{GetSettings()}; auto settings{GetSettings()};
R_UNLESS(settings.contains(category) && settings[category].contains(name), ResultUnknown); R_UNLESS(settings.contains(category) && settings[category].contains(name), ResultUnknown);
out_value = settings[category][name]; ASSERT_MSG(out_value.size() >= settings[category][name].size(),
"Stored type is bigger than requested type");
out_size = std::min<u64>(settings[category][name].size(), out_value.size());
std::memcpy(out_value.data(), settings[category][name].data(), out_size);
R_SUCCEED(); R_SUCCEED();
} }

View File

@ -34,20 +34,17 @@ public:
explicit ISystemSettingsServer(Core::System& system_); explicit ISystemSettingsServer(Core::System& system_);
~ISystemSettingsServer() override; ~ISystemSettingsServer() override;
Result GetSettingsItemValueImpl(std::vector<u8>& out_value, const std::string& category, Result GetSettingsItemValueImpl(std::span<u8> out_value, u64& out_size,
const std::string& name); const std::string& category, const std::string& name);
template <typename T> template <typename T>
Result GetSettingsItemValueImpl(T& value, const std::string& category, Result GetSettingsItemValueImpl(T& out_value, const std::string& category,
const std::string& name) { const std::string& name) {
std::vector<u8> data; u64 data_size{};
const auto result = GetSettingsItemValueImpl(data, category, name); std::vector<u8> data(sizeof(T));
if (result.IsError()) { R_TRY(GetSettingsItemValueImpl(data, data_size, category, name));
return result; std::memcpy(&out_value, data.data(), data_size);
} R_SUCCEED();
ASSERT(data.size() >= sizeof(T));
std::memcpy(&value, data.data(), sizeof(T));
return result;
} }
public: public:
@ -84,7 +81,7 @@ public:
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buf); InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buf);
Result GetSettingsItemValue( Result GetSettingsItemValue(
OutBuffer<BufferAttr_HipcMapAlias> out_data, Out<u64> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_data,
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer); InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer);
Result GetTvSettings(Out<TvSettings> out_tv_settings); Result GetTvSettings(Out<TvSettings> out_tv_settings);