From 2cbe2dd3c0cc9e783068419f4ba9a9798e87e1c7 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Fri, 16 Dec 2022 23:15:12 +0100 Subject: [PATCH] LibFileSystemAccessClient+CrashReporter: Introduce FSAC::File and use it The new result returned just a file stream, which wasn't sufficient enough for most applications because it didn't provide a filename. This patch will make a new File object that has both a file stream and a filename. --- Userland/Applications/CrashReporter/main.cpp | 2 +- .../LibFileSystemAccessClient/Client.cpp | 7 ++++++- .../LibFileSystemAccessClient/Client.h | 21 ++++++++++++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Userland/Applications/CrashReporter/main.cpp b/Userland/Applications/CrashReporter/main.cpp index 7a89b20535..3f5ce66f19 100644 --- a/Userland/Applications/CrashReporter/main.cpp +++ b/Userland/Applications/CrashReporter/main.cpp @@ -280,7 +280,7 @@ ErrorOr serenity_main(Main::Arguments arguments) return; } - auto file = file_or_error.release_value(); + auto file = file_or_error.release_value().release_stream(); if (auto result = file->write(full_backtrace.to_byte_buffer()); result.is_error()) GUI::MessageBox::show(window, DeprecatedString::formatted("Couldn't save file: {}.", result.release_error()), "Saving backtrace failed"sv, GUI::MessageBox::Type::Error); }; diff --git a/Userland/Libraries/LibFileSystemAccessClient/Client.cpp b/Userland/Libraries/LibFileSystemAccessClient/Client.cpp index 3f6fcbcfd5..49ade60a68 100644 --- a/Userland/Libraries/LibFileSystemAccessClient/Client.cpp +++ b/Userland/Libraries/LibFileSystemAccessClient/Client.cpp @@ -205,9 +205,14 @@ void Client::handle_prompt_end(i32 request_id, i32 error, Optional co return; } - auto file_or_error = Core::Stream::File::adopt_fd(ipc_file->take_fd(), Core::Stream::OpenMode::ReadWrite); + auto file_or_error = [&]() -> ErrorOr { + auto stream = TRY(Core::Stream::File::adopt_fd(ipc_file->take_fd(), Core::Stream::OpenMode::ReadWrite)); + auto filename = TRY(String::from_deprecated_string(*chosen_file)); + return File({}, move(stream), filename); + }(); if (file_or_error.is_error()) { resolve_any_promise(file_or_error.release_error()); + return; } request_data.promise.get>()->resolve(file_or_error.release_value()); diff --git a/Userland/Libraries/LibFileSystemAccessClient/Client.h b/Userland/Libraries/LibFileSystemAccessClient/Client.h index 93e88aa24b..b0c0360f3b 100644 --- a/Userland/Libraries/LibFileSystemAccessClient/Client.h +++ b/Userland/Libraries/LibFileSystemAccessClient/Client.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include @@ -18,8 +19,26 @@ namespace FileSystemAccessClient { +class Client; +class File { +public: + File(Badge, NonnullOwnPtr stream, String filename) + : m_stream(move(stream)) + , m_filename(filename) + { + } + + Core::Stream::File& stream() const { return *m_stream; } + NonnullOwnPtr release_stream() { return move(m_stream); } + String filename() const { return m_filename; } + +private: + NonnullOwnPtr m_stream; + String m_filename; +}; + using DeprecatedResult = ErrorOr>; -using Result = ErrorOr>; +using Result = ErrorOr; class Client final : public IPC::ConnectionToServer