diff --git a/Userland/Applications/PDFViewer/CMakeLists.txt b/Userland/Applications/PDFViewer/CMakeLists.txt index 57f89c52599..387699194e2 100644 --- a/Userland/Applications/PDFViewer/CMakeLists.txt +++ b/Userland/Applications/PDFViewer/CMakeLists.txt @@ -13,4 +13,4 @@ set(SOURCES ) serenity_app(PDFViewer ICON app-pdf-viewer) -target_link_libraries(PDFViewer LibGUI LibPDF) +target_link_libraries(PDFViewer LibGUI LibPDF LibFileSystemAccessClient) diff --git a/Userland/Applications/PDFViewer/PDFViewerWidget.cpp b/Userland/Applications/PDFViewer/PDFViewerWidget.cpp index 2a1a8259852..9b818680ca7 100644 --- a/Userland/Applications/PDFViewer/PDFViewerWidget.cpp +++ b/Userland/Applications/PDFViewer/PDFViewerWidget.cpp @@ -1,11 +1,13 @@ /* * Copyright (c) 2021, Matthew Olsson + * Copyright (c) 2021, Mustafa Quraish * * SPDX-License-Identifier: BSD-2-Clause */ #include "PDFViewerWidget.h" #include +#include #include #include #include @@ -39,9 +41,15 @@ void PDFViewerWidget::initialize_menubar(GUI::Window& window) { auto& file_menu = window.add_menu("&File"); file_menu.add_action(GUI::CommonActions::make_open_action([&](auto&) { - Optional open_path = GUI::FilePicker::get_open_filepath(&window); - if (open_path.has_value()) - open_file(open_path.value()); + auto response = FileSystemAccessClient::Client::the().open_file(window.window_id()); + + if (response.error != 0) { + if (response.error != -1) + GUI::MessageBox::show_error(&window, String::formatted("Opening \"{}\" failed: {}", *response.chosen_file, strerror(response.error))); + return; + } + + open_file(*response.fd, *response.chosen_file); })); file_menu.add_separator(); file_menu.add_action(GUI::CommonActions::make_quit_action([](auto&) { @@ -103,16 +111,16 @@ void PDFViewerWidget::create_toolbar() m_total_page_label = toolbar.add(); } -void PDFViewerWidget::open_file(const String& path) +void PDFViewerWidget::open_file(int fd, String const& path) { - window()->set_title(String::formatted("{} - PDF Viewer", path)); - auto file_result = Core::File::open(path, Core::OpenMode::ReadOnly); - if (file_result.is_error()) { - GUI::MessageBox::show_error(nullptr, String::formatted("Couldn't open file: {}", path)); + auto file = Core::File::construct(); + if (!file->open(fd, Core::OpenMode::ReadOnly, Core::File::ShouldCloseFileDescriptor::Yes) && file->error() != ENOENT) { + GUI::MessageBox::show(window(), String::formatted("Opening \"{}\" failed: {}", path, strerror(errno)), "Error", GUI::MessageBox::Type::Error); return; } + window()->set_title(String::formatted("{} - PDF Viewer", path)); - m_buffer = file_result.value()->read_all(); + m_buffer = file->read_all(); auto document = PDF::Document::create(m_buffer); if (!document) { GUI::MessageBox::show_error(nullptr, String::formatted("Couldn't load PDF: {}", path)); diff --git a/Userland/Applications/PDFViewer/PDFViewerWidget.h b/Userland/Applications/PDFViewer/PDFViewerWidget.h index 86c7dbfc540..6fff9905364 100644 --- a/Userland/Applications/PDFViewer/PDFViewerWidget.h +++ b/Userland/Applications/PDFViewer/PDFViewerWidget.h @@ -23,7 +23,7 @@ public: void initialize_menubar(GUI::Window&); void create_toolbar(); - void open_file(const String& path); + void open_file(int fd, const String& path); private: PDFViewerWidget(); diff --git a/Userland/Applications/PDFViewer/main.cpp b/Userland/Applications/PDFViewer/main.cpp index 61dada80f18..fc1d042a798 100644 --- a/Userland/Applications/PDFViewer/main.cpp +++ b/Userland/Applications/PDFViewer/main.cpp @@ -1,13 +1,16 @@ /* * Copyright (c) 2021, Matthew Olsson + * Copyright (c) 2021, Mustafa Quraish * * SPDX-License-Identifier: BSD-2-Clause */ #include "PDFViewerWidget.h" +#include #include #include #include +#include #include int main(int argc, char** argv) @@ -19,6 +22,21 @@ int main(int argc, char** argv) window->set_title("PDF Viewer"); window->resize(640, 400); + if (unveil("/res", "r") < 0) { + perror("unveil"); + return 1; + } + + if (unveil("/tmp/portal/filesystemaccess", "rw") < 0) { + perror("unveil"); + return 1; + } + + if (unveil(nullptr, nullptr) < 0) { + perror("unveil"); + return 1; + } + auto& pdf_viewer_widget = window->set_main_widget(); pdf_viewer_widget.initialize_menubar(*window); @@ -26,8 +44,16 @@ int main(int argc, char** argv) window->show(); window->set_icon(app_icon.bitmap_for_size(16)); - if (argc >= 2) - pdf_viewer_widget.open_file(argv[1]); + if (argc >= 2) { + auto response = FileSystemAccessClient::Client::the().request_file(window->window_id(), argv[1], Core::OpenMode::ReadOnly); + + if (response.error != 0) { + if (response.error != -1) + GUI::MessageBox::show_error(window, String::formatted("Opening \"{}\" failed: {}", *response.chosen_file, strerror(response.error))); + return 1; + } + pdf_viewer_widget.open_file(*response.fd, *response.chosen_file); + } return app->exec(); }