mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-31 06:46:40 +08:00 
			
		
		
		
	service: set: Fix GetSettingsItemValue
This commit is contained in:
		
							parent
							
								
									05f94dc5fc
								
							
						
					
					
						commit
						9fccccedee
					
				| @ -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); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user