diff options
| author | PavelBARABANOV <pavelbarabanov94@gmail.com> | 2026-08-30 01:46:02 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-08-30 01:46:02 +0200 |
| commit | 1f03dee12645788d45c8727c7871a0d04b9bd0b4 (patch) | |
| tree | b86c5770c062e9da84cbd871d91cd85c58e1724c /src | |
| parent | 3df41c1e7a859cf200e37d94453d63dc4a0a3232 (diff) | |
[fs] Add RenameDirectory support for same-parent directory renaming (#4312)
- [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
- [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md)
- [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
-------------------
Fixes save corruption in Warhammer 40k: Mechanicus and other games
that rename directories within the same parent folder.
- Added RenameDirectory handler in IFileSystem (command 6)
- Implemented same-parent directory renaming using RenameDir
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4312
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Samuel <lizzie@eden-emu.dev>
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/filesystem/filesystem.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp/fs_i_filesystem.h | 5 |
3 files changed, 20 insertions, 6 deletions
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index d5984f560b..20e050c8a8 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -227,12 +227,13 @@ Result VfsDirectoryServiceWrapper::RenameDirectory(const std::string& src_path_, std::string src_path(Common::FS::SanitizePath(src_path_)); std::string dest_path(Common::FS::SanitizePath(dest_path_)); auto src = GetDirectoryRelativeWrapped(backing, src_path); + if (src == nullptr) + return FileSys::ResultPathNotFound; + if (Common::FS::GetParentPath(src_path) == Common::FS::GetParentPath(dest_path)) { - // Use more-optimized vfs implementation rename. - if (src == nullptr) - return FileSys::ResultPathNotFound; - if (!src->Rename(Common::FS::GetFilename(dest_path))) { - // TODO(DarkLordZach): Find a better error code for this + std::string full_src_path = backing->GetFullPath() + "/" + src_path; + std::string full_dest_path = backing->GetFullPath() + "/" + dest_path; + if (!Common::FS::RenameDir(full_src_path, full_dest_path)) { return ResultUnknown; } return ResultSuccess; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp index d16602022a..edd381f57c 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp @@ -24,7 +24,7 @@ IFileSystem::IFileSystem(Core::System& system_, FileSys::VirtualDir dir_, SizeGe {3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"}, {4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"}, {5, D<&IFileSystem::RenameFile>, "RenameFile"}, - {6, nullptr, "RenameDirectory"}, + {6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"}, {7, D<&IFileSystem::GetEntryType>, "GetEntryType"}, {8, D<&IFileSystem::OpenFile>, "OpenFile"}, {9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"}, @@ -88,6 +88,14 @@ Result IFileSystem::RenameFile( R_RETURN(backend->RenameFile(FileSys::Path(old_path->str), FileSys::Path(new_path->str))); } +Result IFileSystem::RenameDirectory( + const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> old_path, + const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> new_path) { + LOG_DEBUG(Service_FS, "called. directory '{}' to directory '{}'", old_path->str, new_path->str); + + R_RETURN(backend->RenameDirectory(FileSys::Path(old_path->str), FileSys::Path(new_path->str))); +} + Result IFileSystem::OpenFile(OutInterface<IFile> out_interface, const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> path, u32 mode) { diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h index dd069f36f3..ed03c3ef83 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -36,6 +39,8 @@ public: const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> path); Result RenameFile(const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> old_path, const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> new_path); + Result RenameDirectory(const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> old_path, + const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> new_path); Result OpenFile(OutInterface<IFile> out_interface, const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> path, u32 mode); Result OpenDirectory(OutInterface<IDirectory> out_interface, |
