Merge pull request #13155 from german77/GetSettingsItemValue
service: set: Fix GetSettingsItemValue
This commit is contained in:
		| @@ -26,12 +26,9 @@ Service::PSC::Time::SystemClockContext g_report_ephemeral_clock_context{}; | ||||
| template <typename T> | ||||
| T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys, | ||||
|                        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{}; | ||||
|     std::memcpy(&v, interval_buf.data(), sizeof(T)); | ||||
|     auto res = set_sys->GetSettingsItemValueImpl(v, category, name); | ||||
|     ASSERT(res == ResultSuccess); | ||||
|     return v; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -308,7 +308,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | ||||
|     SetupSettings(); | ||||
|  | ||||
|     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 | ||||
|     EulaVersion eula_version{ | ||||
| @@ -715,7 +715,7 @@ Result ISystemSettingsServer::GetSettingsItemValueSize( | ||||
| } | ||||
|  | ||||
| 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_name_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); | ||||
|  | ||||
|     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) { | ||||
| @@ -1363,13 +1363,16 @@ void ISystemSettingsServer::SetSaveNeeded() { | ||||
|     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& name) { | ||||
|     auto settings{GetSettings()}; | ||||
|     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(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -34,20 +34,17 @@ public: | ||||
|     explicit ISystemSettingsServer(Core::System& system_); | ||||
|     ~ISystemSettingsServer() override; | ||||
|  | ||||
|     Result GetSettingsItemValueImpl(std::vector<u8>& out_value, const std::string& category, | ||||
|                                     const std::string& name); | ||||
|     Result GetSettingsItemValueImpl(std::span<u8> out_value, u64& out_size, | ||||
|                                     const std::string& category, const std::string& name); | ||||
|  | ||||
|     template <typename T> | ||||
|     Result GetSettingsItemValueImpl(T& value, const std::string& category, | ||||
|     Result GetSettingsItemValueImpl(T& out_value, const std::string& category, | ||||
|                                     const std::string& name) { | ||||
|         std::vector<u8> data; | ||||
|         const auto result = GetSettingsItemValueImpl(data, category, name); | ||||
|         if (result.IsError()) { | ||||
|             return result; | ||||
|         } | ||||
|         ASSERT(data.size() >= sizeof(T)); | ||||
|         std::memcpy(&value, data.data(), sizeof(T)); | ||||
|         return result; | ||||
|         u64 data_size{}; | ||||
|         std::vector<u8> data(sizeof(T)); | ||||
|         R_TRY(GetSettingsItemValueImpl(data, data_size, category, name)); | ||||
|         std::memcpy(&out_value, data.data(), data_size); | ||||
|         R_SUCCEED(); | ||||
|     } | ||||
|  | ||||
| public: | ||||
| @@ -84,7 +81,7 @@ public: | ||||
|         InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer, | ||||
|         InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buf); | ||||
|     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_name_buffer); | ||||
|     Result GetTvSettings(Out<TvSettings> out_tv_settings); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user