diff --git a/src/common/layered_settings_interface.cpp b/src/common/layered_settings_interface.cpp index b69b2209f..134097252 100644 --- a/src/common/layered_settings_interface.cpp +++ b/src/common/layered_settings_interface.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #include "layered_settings_interface.h" @@ -9,7 +9,7 @@ LayeredSettingsInterface::LayeredSettingsInterface() = default; LayeredSettingsInterface::~LayeredSettingsInterface() = default; -bool LayeredSettingsInterface::Save() +bool LayeredSettingsInterface::Save(Error* error /* = nullptr */) { Panic("Attempting to save layered settings interface"); } diff --git a/src/common/layered_settings_interface.h b/src/common/layered_settings_interface.h index ec46ca56a..689593393 100644 --- a/src/common/layered_settings_interface.h +++ b/src/common/layered_settings_interface.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #pragma once @@ -23,7 +23,7 @@ public: SettingsInterface* GetLayer(Layer layer) const { return m_layers[layer]; } void SetLayer(Layer layer, SettingsInterface* sif) { m_layers[layer] = sif; } - bool Save() override; + bool Save(Error* error = nullptr) override; void Clear() override; diff --git a/src/common/memory_settings_interface.cpp b/src/common/memory_settings_interface.cpp index d7ff180ec..5b2d09ef1 100644 --- a/src/common/memory_settings_interface.cpp +++ b/src/common/memory_settings_interface.cpp @@ -1,16 +1,19 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #include "memory_settings_interface.h" + #include "common/assert.h" +#include "common/error.h" #include "common/string_util.h" MemorySettingsInterface::MemorySettingsInterface() = default; MemorySettingsInterface::~MemorySettingsInterface() = default; -bool MemorySettingsInterface::Save() +bool MemorySettingsInterface::Save(Error* error /* = nullptr */) { + Error::SetStringView(error, "Memory settings cannot be saved."); return false; } diff --git a/src/common/memory_settings_interface.h b/src/common/memory_settings_interface.h index 84344dd2a..aab5bccf4 100644 --- a/src/common/memory_settings_interface.h +++ b/src/common/memory_settings_interface.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #pragma once @@ -12,7 +12,7 @@ public: MemorySettingsInterface(); ~MemorySettingsInterface(); - bool Save() override; + bool Save(Error* error = nullptr) override; void Clear() override; diff --git a/src/common/settings_interface.h b/src/common/settings_interface.h index 9ba4c96b7..d7378c5cf 100644 --- a/src/common/settings_interface.h +++ b/src/common/settings_interface.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #pragma once @@ -8,12 +8,14 @@ #include #include +class Error; + class SettingsInterface { public: virtual ~SettingsInterface() = default; - virtual bool Save() = 0; + virtual bool Save(Error* error = nullptr) = 0; virtual void Clear() = 0; virtual bool GetIntValue(const char* section, const char* key, s32* value) const = 0; diff --git a/src/util/ini_settings_interface.cpp b/src/util/ini_settings_interface.cpp index 758546e1d..715c4821b 100644 --- a/src/util/ini_settings_interface.cpp +++ b/src/util/ini_settings_interface.cpp @@ -1,14 +1,18 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #include "ini_settings_interface.h" + #include "common/file_system.h" #include "common/log.h" #include "common/path.h" #include "common/string_util.h" +#include "common/error.h" + #include #include #include + Log_SetChannel(INISettingsInterface); #ifdef _WIN32 @@ -64,15 +68,18 @@ bool INISettingsInterface::Load() return (err == SI_OK); } -bool INISettingsInterface::Save() +bool INISettingsInterface::Save(Error* error /* = nullptr */) { if (m_filename.empty()) + { + Error::SetStringView(error, "Filename is not set."); return false; + } std::unique_lock lock(s_ini_load_save_mutex); std::string temp_filename(GetTemporaryFileName(m_filename)); SI_Error err = SI_FAIL; - std::FILE* fp = FileSystem::OpenCFile(temp_filename.c_str(), "wb"); + std::FILE* fp = FileSystem::OpenCFile(temp_filename.c_str(), "wb", error); if (fp) { err = m_ini.SaveFile(fp, false); @@ -80,10 +87,12 @@ bool INISettingsInterface::Save() if (err != SI_OK) { + Error::SetStringFmt(error, "INI SaveFile() failed: {}", static_cast(err)); + // remove temporary file FileSystem::DeleteFile(temp_filename.c_str()); } - else if (!FileSystem::RenamePath(temp_filename.c_str(), m_filename.c_str())) + else if (!FileSystem::RenamePath(temp_filename.c_str(), m_filename.c_str(), error)) { Log_ErrorPrintf("Failed to rename '%s' to '%s'", temp_filename.c_str(), m_filename.c_str()); FileSystem::DeleteFile(temp_filename.c_str()); diff --git a/src/util/ini_settings_interface.h b/src/util/ini_settings_interface.h index 8aa178db3..7a72b2dfd 100644 --- a/src/util/ini_settings_interface.h +++ b/src/util/ini_settings_interface.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #pragma once @@ -19,7 +19,7 @@ public: const std::string& GetFileName() const { return m_filename; } bool Load(); - bool Save() override; + bool Save(Error* error = nullptr) override; void Clear() override;