123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /*
- * Copyright (c) 2021, timmot <tiwwot@protonmail.com>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- // FIXME: LibIPC Decoder and Encoder are sensitive to include order here
- // clang-format off
- #include <LibGUI/WindowServerConnection.h>
- // clang-format on
- #include <LibFileSystemAccessClient/Client.h>
- #include <LibGUI/Window.h>
- namespace FileSystemAccessClient {
- static RefPtr<Client> s_the = nullptr;
- Client& Client::the()
- {
- if (!s_the || !s_the->is_open())
- s_the = Client::construct();
- return *s_the;
- }
- Result Client::request_file(i32 parent_window_id, String const& path, Core::OpenMode mode)
- {
- m_promise = Core::Promise<Result>::construct();
- auto parent_window_server_client_id = GUI::WindowServerConnection::the().expose_client_id();
- auto child_window_server_client_id = expose_window_server_client_id();
- GUI::WindowServerConnection::the().async_add_window_stealing_for_client(child_window_server_client_id, parent_window_id);
- ScopeGuard guard([parent_window_id, child_window_server_client_id] {
- GUI::WindowServerConnection::the().async_remove_window_stealing_for_client(child_window_server_client_id, parent_window_id);
- });
- async_request_file(parent_window_server_client_id, parent_window_id, path, mode);
- return m_promise->await();
- }
- Result Client::open_file(i32 parent_window_id, String const& window_title, StringView const& path)
- {
- m_promise = Core::Promise<Result>::construct();
- auto parent_window_server_client_id = GUI::WindowServerConnection::the().expose_client_id();
- auto child_window_server_client_id = expose_window_server_client_id();
- GUI::WindowServerConnection::the().async_add_window_stealing_for_client(child_window_server_client_id, parent_window_id);
- ScopeGuard guard([parent_window_id, child_window_server_client_id] {
- GUI::WindowServerConnection::the().async_remove_window_stealing_for_client(child_window_server_client_id, parent_window_id);
- });
- async_prompt_open_file(parent_window_server_client_id, parent_window_id, window_title, path, Core::OpenMode::ReadOnly);
- return m_promise->await();
- }
- Result Client::save_file(i32 parent_window_id, String const& name, String const ext)
- {
- m_promise = Core::Promise<Result>::construct();
- auto parent_window_server_client_id = GUI::WindowServerConnection::the().expose_client_id();
- auto child_window_server_client_id = expose_window_server_client_id();
- GUI::WindowServerConnection::the().async_add_window_stealing_for_client(child_window_server_client_id, parent_window_id);
- ScopeGuard guard([parent_window_id, child_window_server_client_id] {
- GUI::WindowServerConnection::the().async_remove_window_stealing_for_client(child_window_server_client_id, parent_window_id);
- });
- async_prompt_save_file(parent_window_server_client_id, parent_window_id, name.is_null() ? "Untitled" : name, ext.is_null() ? "txt" : ext, Core::StandardPaths::home_directory(), Core::OpenMode::Truncate | Core::OpenMode::WriteOnly);
- return m_promise->await();
- }
- void Client::handle_prompt_end(i32 error, Optional<IPC::File> const& fd, Optional<String> const& chosen_file)
- {
- VERIFY(m_promise);
- if (error == 0) {
- m_promise->resolve({ error, fd->take_fd(), *chosen_file });
- } else {
- m_promise->resolve({ error, {}, chosen_file });
- }
- }
- void Client::die()
- {
- if (m_promise)
- handle_prompt_end(ECONNRESET, {}, "");
- }
- }
|