mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:22:45 +00:00 
			
		
		
		
	PDFViewer: Use FileSystemAccessClient to open files
This commit is contained in:
		
							parent
							
								
									d645f637f1
								
							
						
					
					
						commit
						eae21c7e31
					
				
					 4 changed files with 47 additions and 13 deletions
				
			
		|  | @ -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) | ||||
|  |  | |||
|  | @ -1,11 +1,13 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2021, Matthew Olsson <mattco@serenityos.org> | ||||
|  * Copyright (c) 2021, Mustafa Quraish <mustafa@cs.toronto.edu> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #include "PDFViewerWidget.h" | ||||
| #include <LibCore/File.h> | ||||
| #include <LibFileSystemAccessClient/Client.h> | ||||
| #include <LibGUI/Application.h> | ||||
| #include <LibGUI/BoxLayout.h> | ||||
| #include <LibGUI/FilePicker.h> | ||||
|  | @ -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<String> 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<GUI::Label>(); | ||||
| } | ||||
| 
 | ||||
| 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)); | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -1,13 +1,16 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2021, Matthew Olsson <mattco@serenityos.org> | ||||
|  * Copyright (c) 2021, Mustafa Quraish <mustafa@cs.toronto.edu> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #include "PDFViewerWidget.h" | ||||
| #include <LibFileSystemAccessClient/Client.h> | ||||
| #include <LibGUI/Application.h> | ||||
| #include <LibGUI/Icon.h> | ||||
| #include <LibGUI/Menubar.h> | ||||
| #include <LibGUI/MessageBox.h> | ||||
| #include <LibGUI/Window.h> | ||||
| 
 | ||||
| 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<PDFViewerWidget>(); | ||||
| 
 | ||||
|     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(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mustafa Quraish
						Mustafa Quraish