mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	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