From 934e420e36e817c673a839e2a417785906bfe91c Mon Sep 17 00:00:00 2001 From: FearlessTobi Date: Sat, 10 Feb 2024 20:58:43 +0100 Subject: fs: Refactor to use cmif serialization --- src/core/hle/service/filesystem/fsp/fs_i_file.cpp | 78 ++++++++--------------- 1 file changed, 28 insertions(+), 50 deletions(-) (limited to 'src/core/hle/service/filesystem/fsp/fs_i_file.cpp') diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp index 8fb8620de..a355d46ae 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp @@ -2,86 +2,64 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/file_sys/errors.h" +#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/filesystem/fsp/fs_i_file.h" -#include "core/hle/service/ipc_helpers.h" namespace Service::FileSystem { IFile::IFile(Core::System& system_, FileSys::VirtualFile file_) : ServiceFramework{system_, "IFile"}, backend{std::make_unique(file_)} { + // clang-format off static const FunctionInfo functions[] = { - {0, &IFile::Read, "Read"}, - {1, &IFile::Write, "Write"}, - {2, &IFile::Flush, "Flush"}, - {3, &IFile::SetSize, "SetSize"}, - {4, &IFile::GetSize, "GetSize"}, + {0, D<&IFile::Read>, "Read"}, + {1, D<&IFile::Write>, "Write"}, + {2, D<&IFile::Flush>, "Flush"}, + {3, D<&IFile::SetSize>, "SetSize"}, + {4, D<&IFile::GetSize>, "GetSize"}, {5, nullptr, "OperateRange"}, {6, nullptr, "OperateRangeWithBuffer"}, }; + // clang-format on RegisterHandlers(functions); } -void IFile::Read(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const u64 option = rp.Pop(); - const s64 offset = rp.Pop(); - const s64 length = rp.Pop(); - - LOG_DEBUG(Service_FS, "called, option={}, offset=0x{:X}, length={}", option, offset, length); +Result IFile::Read( + FileSys::ReadOption option, Out out_size, s64 offset, + const OutBuffer out_buffer, + s64 size) { + LOG_DEBUG(Service_FS, "called, option={}, offset=0x{:X}, length={}", option.value, offset, + size); // Read the data from the Storage backend - std::vector output(length); - std::size_t bytes_read; - const auto result = backend->Read(&bytes_read, offset, output.data(), length); - - // Write the data to memory - ctx.WriteBuffer(output); - - IPC::ResponseBuilder rb{ctx, 4}; - rb.Push(result); - rb.Push(static_cast(bytes_read)); + R_RETURN( + backend->Read(reinterpret_cast(out_size.Get()), offset, out_buffer.data(), size)); } -void IFile::Write(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto option = rp.PopRaw(); - [[maybe_unused]] const u32 unused = rp.Pop(); - const s64 offset = rp.Pop(); - const s64 length = rp.Pop(); - +Result IFile::Write( + const InBuffer buffer, + FileSys::WriteOption option, s64 offset, s64 size) { LOG_DEBUG(Service_FS, "called, option={}, offset=0x{:X}, length={}", option.value, offset, - length); - - const auto data = ctx.ReadBuffer(); + size); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(backend->Write(offset, data.data(), length, option)); + R_RETURN(backend->Write(offset, buffer.data(), size, option)); } -void IFile::Flush(HLERequestContext& ctx) { +Result IFile::Flush() { LOG_DEBUG(Service_FS, "called"); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(backend->Flush()); + R_RETURN(backend->Flush()); } -void IFile::SetSize(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const u64 size = rp.Pop(); +Result IFile::SetSize(s64 size) { LOG_DEBUG(Service_FS, "called, size={}", size); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(backend->SetSize(size)); + R_RETURN(backend->SetSize(size)); } -void IFile::GetSize(HLERequestContext& ctx) { - s64 size; - const auto result = backend->GetSize(&size); - LOG_DEBUG(Service_FS, "called, size={}", size); +Result IFile::GetSize(Out out_size) { + LOG_DEBUG(Service_FS, "called"); - IPC::ResponseBuilder rb{ctx, 4}; - rb.Push(result); - rb.Push(size); + R_RETURN(backend->GetSize(out_size)); } } // namespace Service::FileSystem -- cgit v1.2.3