Service/FS: implement IFileSystem::RenameFile
This commit is contained in:
parent
07dc0bbf3e
commit
a0179e5ca5
|
@ -67,10 +67,16 @@ ResultCode Disk_FileSystem::DeleteFile(const std::string& path) const {
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode Disk_FileSystem::RenameFile(const Path& src_path, const Path& dest_path) const {
|
ResultCode Disk_FileSystem::RenameFile(const std::string& src_path,
|
||||||
LOG_WARNING(Service_FS, "(STUBBED) called");
|
const std::string& dest_path) const {
|
||||||
|
const std::string full_src_path = base_directory + src_path;
|
||||||
|
const std::string full_dest_path = base_directory + dest_path;
|
||||||
|
|
||||||
|
if (!FileUtil::Exists(full_src_path)) {
|
||||||
|
return ERROR_PATH_NOT_FOUND;
|
||||||
|
}
|
||||||
// TODO(wwylele): Use correct error code
|
// TODO(wwylele): Use correct error code
|
||||||
return ResultCode(-1);
|
return FileUtil::Rename(full_src_path, full_dest_path) ? RESULT_SUCCESS : ResultCode(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode Disk_FileSystem::DeleteDirectory(const Path& path) const {
|
ResultCode Disk_FileSystem::DeleteDirectory(const Path& path) const {
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
ResultVal<std::unique_ptr<StorageBackend>> OpenFile(const std::string& path,
|
ResultVal<std::unique_ptr<StorageBackend>> OpenFile(const std::string& path,
|
||||||
Mode mode) const override;
|
Mode mode) const override;
|
||||||
ResultCode DeleteFile(const std::string& path) const override;
|
ResultCode DeleteFile(const std::string& path) const override;
|
||||||
ResultCode RenameFile(const Path& src_path, const Path& dest_path) const override;
|
ResultCode RenameFile(const std::string& src_path, const std::string& dest_path) const override;
|
||||||
ResultCode DeleteDirectory(const Path& path) const override;
|
ResultCode DeleteDirectory(const Path& path) const override;
|
||||||
ResultCode DeleteDirectoryRecursively(const Path& path) const override;
|
ResultCode DeleteDirectoryRecursively(const Path& path) const override;
|
||||||
ResultCode CreateFile(const std::string& path, u64 size) const override;
|
ResultCode CreateFile(const std::string& path, u64 size) const override;
|
||||||
|
|
|
@ -126,7 +126,8 @@ public:
|
||||||
* @param dest_path Destination path relative to the archive
|
* @param dest_path Destination path relative to the archive
|
||||||
* @return Result of the operation
|
* @return Result of the operation
|
||||||
*/
|
*/
|
||||||
virtual ResultCode RenameFile(const Path& src_path, const Path& dest_path) const = 0;
|
virtual ResultCode RenameFile(const std::string& src_path,
|
||||||
|
const std::string& dest_path) const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rename a Directory specified by its path
|
* Rename a Directory specified by its path
|
||||||
|
|
|
@ -27,7 +27,8 @@ ResultCode RomFS_FileSystem::DeleteFile(const std::string& path) const {
|
||||||
return ResultCode(-1);
|
return ResultCode(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode RomFS_FileSystem::RenameFile(const Path& src_path, const Path& dest_path) const {
|
ResultCode RomFS_FileSystem::RenameFile(const std::string& src_path,
|
||||||
|
const std::string& dest_path) const {
|
||||||
LOG_CRITICAL(Service_FS, "Attempted to rename a file within an ROMFS archive (%s).",
|
LOG_CRITICAL(Service_FS, "Attempted to rename a file within an ROMFS archive (%s).",
|
||||||
GetName().c_str());
|
GetName().c_str());
|
||||||
// TODO(wwylele): Use correct error code
|
// TODO(wwylele): Use correct error code
|
||||||
|
|
|
@ -32,7 +32,7 @@ public:
|
||||||
ResultVal<std::unique_ptr<StorageBackend>> OpenFile(const std::string& path,
|
ResultVal<std::unique_ptr<StorageBackend>> OpenFile(const std::string& path,
|
||||||
Mode mode) const override;
|
Mode mode) const override;
|
||||||
ResultCode DeleteFile(const std::string& path) const override;
|
ResultCode DeleteFile(const std::string& path) const override;
|
||||||
ResultCode RenameFile(const Path& src_path, const Path& dest_path) const override;
|
ResultCode RenameFile(const std::string& src_path, const std::string& dest_path) const override;
|
||||||
ResultCode DeleteDirectory(const Path& path) const override;
|
ResultCode DeleteDirectory(const Path& path) const override;
|
||||||
ResultCode DeleteDirectoryRecursively(const Path& path) const override;
|
ResultCode DeleteDirectoryRecursively(const Path& path) const override;
|
||||||
ResultCode CreateFile(const std::string& path, u64 size) const override;
|
ResultCode CreateFile(const std::string& path, u64 size) const override;
|
||||||
|
|
|
@ -239,7 +239,7 @@ public:
|
||||||
{2, &IFileSystem::CreateDirectory, "CreateDirectory"},
|
{2, &IFileSystem::CreateDirectory, "CreateDirectory"},
|
||||||
{3, nullptr, "DeleteDirectory"},
|
{3, nullptr, "DeleteDirectory"},
|
||||||
{4, nullptr, "DeleteDirectoryRecursively"},
|
{4, nullptr, "DeleteDirectoryRecursively"},
|
||||||
{5, nullptr, "RenameFile"},
|
{5, &IFileSystem::RenameFile, "RenameFile"},
|
||||||
{6, nullptr, "RenameDirectory"},
|
{6, nullptr, "RenameDirectory"},
|
||||||
{7, &IFileSystem::GetEntryType, "GetEntryType"},
|
{7, &IFileSystem::GetEntryType, "GetEntryType"},
|
||||||
{8, &IFileSystem::OpenFile, "OpenFile"},
|
{8, &IFileSystem::OpenFile, "OpenFile"},
|
||||||
|
@ -300,6 +300,26 @@ public:
|
||||||
rb.Push(backend->CreateDirectory(name));
|
rb.Push(backend->CreateDirectory(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenameFile(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
|
||||||
|
std::vector<u8> buffer;
|
||||||
|
buffer.resize(ctx.BufferDescriptorX()[0].Size());
|
||||||
|
Memory::ReadBlock(ctx.BufferDescriptorX()[0].Address(), buffer.data(), buffer.size());
|
||||||
|
auto end = std::find(buffer.begin(), buffer.end(), '\0');
|
||||||
|
std::string src_name(buffer.begin(), end);
|
||||||
|
|
||||||
|
buffer.resize(ctx.BufferDescriptorX()[1].Size());
|
||||||
|
Memory::ReadBlock(ctx.BufferDescriptorX()[1].Address(), buffer.data(), buffer.size());
|
||||||
|
end = std::find(buffer.begin(), buffer.end(), '\0');
|
||||||
|
std::string dst_name(buffer.begin(), end);
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_FS, "called file '%s' to file '%s'", src_name.c_str(), dst_name.c_str());
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(backend->RenameFile(src_name, dst_name));
|
||||||
|
}
|
||||||
|
|
||||||
void OpenFile(Kernel::HLERequestContext& ctx) {
|
void OpenFile(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
|
|
||||||
|
|
Reference in New Issue