diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.cpp b/rpcs3/Emu/Cell/lv2/sys_fs.cpp index a9a9feaa73..d8f8538cd4 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_fs.cpp @@ -23,6 +23,55 @@ lv2_fs_mount_point g_mp_sys_dev_flash{"", 512, 8192, lv2_mp_flag::read_only + lv lv2_fs_mount_point g_mp_sys_dev_flash2{ "", 512, 8192, lv2_mp_flag::no_uid_gid }; // TODO confirm lv2_fs_mount_point g_mp_sys_dev_flash3{ "", 512, 8192, lv2_mp_flag::read_only + lv2_mp_flag::no_uid_gid }; // TODO confirm +template<> +void fmt_class_string::format(std::string& out, u64 arg) +{ + const auto& file = get_object(arg); + + std::string_view type_s; + switch (file.type) + { + case lv2_file_type::regular: type_s = "Regular file"; break; + case lv2_file_type::sdata: type_s = "SDATA"; break; + case lv2_file_type::edata: type_s = "EDATA"; break; + } + + auto get_size = [](u64 size) -> std::string + { + if (size == umax) + { + return "N/A"; + } + + std::string size_str = fmt::format("0x%05x ", size); + switch (std::bit_width(size) / 10 * 10) + { + case 64: size_str = "0"s; break; + case 0: fmt::append(size_str, "(%u)", size); break; + case 10: fmt::append(size_str, "(%gKB)", size / 1024.); break; + case 20: fmt::append(size_str, "(%gMB)", size / (1024. * 1024)); break; + + default: + case 30: fmt::append(size_str, "(%gGB)", size / (1024. * 1024 * 1024)); break; + } + + return size_str; + }; + + const usz pos = file.file ? file.file.pos() : umax; + const usz size = file.file ? file.file.size() : umax; + + fmt::append(out, u8"%s, “%s”, Mode: 0x%x, Flags: 0x%x, Pos: %s, Size: %s", type_s, file.name.data(), file.mode, file.flags, get_size(pos), get_size(size)); +} + +template<> +void fmt_class_string::format(std::string& out, u64 arg) +{ + const auto& dir = get_object(arg); + + fmt::append(out, u8"Directory, “%s”, Entries: %u/%u", dir.name.data(), std::min(dir.pos, dir.entries.size()), dir.entries.size()); +} + bool verify_mself(const fs::file& mself_file) { FsMselfHeader mself_header; diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.h b/rpcs3/Emu/Cell/lv2/sys_fs.h index 08b4f2d04c..7399725ad3 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.h +++ b/rpcs3/Emu/Cell/lv2/sys_fs.h @@ -166,18 +166,18 @@ struct lv2_fs_object // File Name (max 1055) const std::array name; +protected: lv2_fs_object(lv2_fs_mount_point* mp, std::string_view filename) : mp(mp) , name(get_name(filename)) { } +public: lv2_fs_object(const lv2_fs_object&) = delete; lv2_fs_object& operator=(const lv2_fs_object&) = delete; - virtual ~lv2_fs_object() = default; - static lv2_fs_mount_point* get_mp(std::string_view filename); static std::array get_name(std::string_view filename) @@ -193,8 +193,6 @@ struct lv2_fs_object name[filename.size()] = 0; return name; } - - virtual std::string to_string() const { return {}; } }; struct lv2_file final : lv2_fs_object @@ -276,19 +274,6 @@ struct lv2_file final : lv2_fs_object // Make file view from lv2_file object (for MSELF support) static fs::file make_view(const std::shared_ptr& _file, u64 offset); - - virtual std::string to_string() const override - { - std::string_view type_s; - switch (type) - { - case lv2_file_type::regular: type_s = "Regular file"; break; - case lv2_file_type::sdata: type_s = "SDATA"; break; - case lv2_file_type::edata: type_s = "EDATA"; break; - } - - return fmt::format(u8"%s, “%s”, Mode: 0x%x, Flags: 0x%x", type_s, name.data(), mode, flags); - } }; struct lv2_dir final : lv2_fs_object @@ -314,11 +299,6 @@ struct lv2_dir final : lv2_fs_object return nullptr; } - - virtual std::string to_string() const override - { - return fmt::format(u8"Directory, “%s”, Entries: %u/%u", name.data(), std::min(pos, entries.size()), entries.size()); - } }; // sys_fs_fcntl arg base class (left empty for PODness) diff --git a/rpcs3/rpcs3qt/kernel_explorer.cpp b/rpcs3/rpcs3qt/kernel_explorer.cpp index c096913354..49655e23de 100644 --- a/rpcs3/rpcs3qt/kernel_explorer.cpp +++ b/rpcs3/rpcs3qt/kernel_explorer.cpp @@ -813,7 +813,22 @@ void kernel_explorer::Update() idm::select([&](u32 id, lv2_fs_object& fo) { - add_leaf(find_node(root, additional_nodes::file_descriptors), qstr(fmt::format("FD %u: %s", id, fo.to_string()))); + const std::string str = fmt::format("FD %u: %s", id, [&]() -> std::string + { + if (idm::check_unlocked(id)) + { + return fmt::format("%s", static_cast(fo)); + } + + if (idm::check_unlocked(id)) + { + return fmt::format("%s", static_cast(fo)); + } + + return "Unknown object!"; + }()); + + add_leaf(find_node(root, additional_nodes::file_descriptors), qstr(str)); }); std::function final_touches;