/* * Copyright (c) 2021, timmot * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace FileSystemAccessClient { struct Result { i32 error; Optional fd; Optional chosen_file; }; using FileResult = ErrorOr>; class Client final : public IPC::ServerConnection , public FileSystemAccessClientEndpoint { IPC_CLIENT_CONNECTION(Client, "/tmp/portal/filesystemaccess") public: Result request_file_read_only_approved(i32 parent_window_id, String const& path); Result request_file(i32 parent_window_id, String const& path, Core::OpenMode mode); Result open_file(i32 parent_window_id, String const& window_title = {}, StringView path = Core::StandardPaths::home_directory(), Core::OpenMode requested_access = Core::OpenMode::ReadOnly); Result save_file(i32 parent_window_id, String const& name, String const ext, Core::OpenMode requested_access = Core::OpenMode::WriteOnly | Core::OpenMode::Truncate); FileResult try_request_file_read_only_approved(GUI::Window* parent_window, String const& path); FileResult try_request_file(GUI::Window* parent_window, String const& path, Core::OpenMode mode); FileResult try_open_file(GUI::Window* parent_window, String const& window_title = {}, StringView path = Core::StandardPaths::home_directory(), Core::OpenMode requested_access = Core::OpenMode::ReadOnly); FileResult try_save_file(GUI::Window* parent_window, String const& name, String const ext, Core::OpenMode requested_access = Core::OpenMode::WriteOnly | Core::OpenMode::Truncate); static Client& the(); protected: void die() override; private: explicit Client(NonnullOwnPtr socket) : IPC::ServerConnection(*this, move(socket)) { } virtual void handle_prompt_end(i32 error, Optional const& fd, Optional const& chosen_file) override; RefPtr> m_promise; RefPtr> m_file_promise; GUI::Window* m_parent_window { nullptr }; }; }