aboutsummaryrefslogtreecommitdiff
path: root/src/frontend_common
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2025-10-15 04:54:41 +0200
committercrueter <crueter@eden-emu.dev>2025-10-15 04:54:41 +0200
commit5f9dba40a0fe71ccd7014ae37a2fbfd8f225396e (patch)
tree4a0258d989bb795dd68fc2067fb01a7d7703868b /src/frontend_common
parent0a54ac63f00782605b74044e1661569d931354fe (diff)
[desktop] Data Manager, data import/export (#2700)
This adds a "Data Manager" dialog to the Tools menu. The Data Manager allows for the following operations: - Open w/ system file manager - Clear - Export - Import On any of the following directories: - Save (w/ profile selector) - UserNAND - SysNAND - Mods - Shaders TODO for the future: - "Cleanup" for each directory - TitleID -> Game name--let users clean data for a specific game if applicable Signed-off-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2700 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/frontend_common')
-rw-r--r--src/frontend_common/CMakeLists.txt4
-rw-r--r--src/frontend_common/data_manager.cpp77
-rw-r--r--src/frontend_common/data_manager.h24
3 files changed, 105 insertions, 0 deletions
diff --git a/src/frontend_common/CMakeLists.txt b/src/frontend_common/CMakeLists.txt
index 70e142bb0c..aa44740596 100644
--- a/src/frontend_common/CMakeLists.txt
+++ b/src/frontend_common/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,6 +10,7 @@ add_library(frontend_common STATIC
content_manager.h
firmware_manager.h
firmware_manager.cpp
+ data_manager.h data_manager.cpp
)
create_target_directory_groups(frontend_common)
diff --git a/src/frontend_common/data_manager.cpp b/src/frontend_common/data_manager.cpp
new file mode 100644
index 0000000000..83eccbde17
--- /dev/null
+++ b/src/frontend_common/data_manager.cpp
@@ -0,0 +1,77 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "data_manager.h"
+#include "common/assert.h"
+#include "common/fs/path_util.h"
+#include <filesystem>
+#include <fmt/format.h>
+
+namespace FrontendCommon::DataManager {
+
+namespace fs = std::filesystem;
+
+const std::string GetDataDir(DataDir dir, const std::string &user_id)
+{
+ const fs::path nand_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir);
+
+ switch (dir) {
+ case DataDir::Saves:
+ return (nand_dir / "user" / "save" / "0000000000000000" / user_id).string();
+ case DataDir::UserNand:
+ return (nand_dir / "user" / "Contents" / "registered").string();
+ case DataDir::SysNand:
+ // NB: do NOT delete save
+ // that contains profile data and other stuff
+ return (nand_dir / "system" / "Contents" / "registered").string();
+ case DataDir::Mods:
+ return Common::FS::GetEdenPathString(Common::FS::EdenPath::LoadDir);
+ case DataDir::Shaders:
+ return Common::FS::GetEdenPathString(Common::FS::EdenPath::ShaderDir);
+ default:
+ UNIMPLEMENTED();
+ }
+
+ return "";
+}
+
+u64 ClearDir(DataDir dir, const std::string &user_id)
+{
+ fs::path data_dir = GetDataDir(dir, user_id);
+ u64 result = fs::remove_all(data_dir);
+
+ // mkpath at the end just so it actually exists
+ fs::create_directories(data_dir);
+ return result;
+}
+
+const std::string ReadableBytesSize(u64 size)
+{
+ static constexpr std::array units{"B", "KiB", "MiB", "GiB", "TiB", "PiB"};
+ if (size == 0) {
+ return "0 B";
+ }
+
+ const int digit_groups = (std::min) (static_cast<int>(std::log10(size) / std::log10(1024)),
+ static_cast<int>(units.size()));
+ return fmt::format("{:.1f} {}", size / std::pow(1024, digit_groups), units[digit_groups]);
+}
+
+u64 DataDirSize(DataDir dir)
+{
+ fs::path data_dir = GetDataDir(dir);
+ u64 size = 0;
+
+ if (!fs::exists(data_dir))
+ return 0;
+
+ for (const auto& entry : fs::recursive_directory_iterator(data_dir)) {
+ if (!entry.is_directory()) {
+ size += entry.file_size();
+ }
+ }
+
+ return size;
+}
+
+}
diff --git a/src/frontend_common/data_manager.h b/src/frontend_common/data_manager.h
new file mode 100644
index 0000000000..d67bd20467
--- /dev/null
+++ b/src/frontend_common/data_manager.h
@@ -0,0 +1,24 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef DATA_MANAGER_H
+#define DATA_MANAGER_H
+
+#include "common/common_types.h"
+#include <string>
+
+namespace FrontendCommon::DataManager {
+
+enum class DataDir { Saves, UserNand, SysNand, Mods, Shaders };
+
+const std::string GetDataDir(DataDir dir, const std::string &user_id = "");
+
+u64 ClearDir(DataDir dir, const std::string &user_id = "");
+
+const std::string ReadableBytesSize(u64 size);
+
+u64 DataDirSize(DataDir dir);
+
+}; // namespace FrontendCommon::DataManager
+
+#endif // DATA_MANAGER_H