aboutsummaryrefslogtreecommitdiff
path: root/src/frontend_common/data_manager.cpp
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/data_manager.cpp
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/data_manager.cpp')
-rw-r--r--src/frontend_common/data_manager.cpp77
1 files changed, 77 insertions, 0 deletions
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;
+}
+
+}