From 53d25856dc1f8997ce4d142486e2c720fe0e2100 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Wed, 19 Jan 2005 06:12:27 +0000 Subject: Add initial support for password-supported dialogs. This could be a lot Wed Jan 19 01:10:57 2005 Jonathan Blandford * backend/Makefile.am: * backend/ev-document-links.h: * backend/ev-document-security.c: (ev_document_security_get_type), (ev_document_security_has_document_security), (ev_document_security_set_password): * backend/ev-document-security.h: * backend/ev-document.c: (ev_document_error_quark): * backend/ev-document.h: * data/Makefile.am: * data/evince-password.glade: * pdf/xpdf/pdf-document.cc: * shell/Makefile.am: * shell/ev-password.c: (ev_password_set_bad_password_label), (ev_window_password_entry_changed_cb), (ev_password_dialog_new), (ev_password_dialog_get_password), (ev_password_dialog_set_bad_pass): * shell/ev-password.h: * shell/ev-window.c: (ev_window_get_attribute), (ev_window_set_property), (update_action_sensitivity), (ev_window_is_empty), (mime_type_supported_by_gdk_pixbuf), (ev_window_setup_document), (ev_window_get_password), (ev_window_open), (ev_window_cmd_save_as), (using_postscript_printer), (ev_window_print), (find_not_supported_dialog), (ev_window_cmd_edit_find), (update_fullscreen_popup), (ev_window_fullscreen), (ev_window_unfullscreen), (ev_window_cmd_view_fullscreen), (ev_window_focus_out_cb), (ev_window_cmd_help_about), (menu_item_select_cb), (find_bar_search_changed_cb), (ev_window_dispose), (ev_window_init): Add initial support for password-supported dialogs. This could be a lot cooler, but it'll do for now. --- (limited to 'pdf') diff --git a/pdf/xpdf/pdf-document.cc b/pdf/xpdf/pdf-document.cc index 36ad374..0a70edb 100644 --- a/pdf/xpdf/pdf-document.cc +++ b/pdf/xpdf/pdf-document.cc @@ -26,6 +26,7 @@ #include "gpdf-g-switch.h" #include "ev-document-links.h" #include "ev-document-misc.h" +#include "ev-document-security.h" #include "ev-document-thumbnails.h" #include "GlobalParams.h" @@ -33,6 +34,7 @@ #include "SplashBitmap.h" #include "PDFDoc.h" #include "Outline.h" +#include "ErrorCodes.h" #include "UnicodeMap.h" #include "GlobalParams.h" #include "GfxState.h" @@ -87,18 +89,21 @@ struct _PdfDocument Links *links; UnicodeMap *umap; + gchar *password; gboolean page_valid; PdfDocumentSearch *search; }; -static void pdf_document_document_links_iface_init (EvDocumentLinksIface *iface); +static void pdf_document_document_links_iface_init (EvDocumentLinksIface *iface); static void pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface); static void pdf_document_document_iface_init (EvDocumentIface *iface); -static void pdf_document_ps_exporter_iface_init (EvPSExporterIface *iface); -static void pdf_document_find_iface_init (EvDocumentFindIface *iface); -static void pdf_document_search_free (PdfDocumentSearch *search); -static void pdf_document_search_page_changed (PdfDocumentSearch *search); +static void pdf_document_ps_exporter_iface_init (EvPSExporterIface *iface); +static void pdf_document_find_iface_init (EvDocumentFindIface *iface); +static void pdf_document_security_iface_init (EvDocumentSecurityIface *iface); +static void pdf_document_search_free (PdfDocumentSearch *search); +static void pdf_document_search_page_changed (PdfDocumentSearch *search); + G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, { @@ -112,6 +117,8 @@ G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, pdf_document_ps_exporter_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, pdf_document_find_iface_init); + G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_SECURITY, + pdf_document_security_iface_init); }); static void @@ -184,18 +191,27 @@ pdf_document_load (EvDocument *document, g_free (filename); // open the PDF file, assumes ownership of filename_g - newDoc = new PDFDoc(filename_g, 0, 0); + GString *password = NULL; + if (pdf_document->password) + password = new GString (pdf_document->password); + newDoc = new PDFDoc(filename_g, password, password); + if (password) + delete password; if (!newDoc->isOk()) { err = newDoc->getErrorCode(); delete newDoc; - - /* FIXME: Add a real error enum to EvDocument */ - g_set_error (error, G_FILE_ERROR, - G_FILE_ERROR_FAILED, - "Failed to load document (error %d) '%s'\n", - err, - uri); + if (err == errEncrypted) { + g_set_error (error, EV_DOCUMENT_ERROR, + EV_DOCUMENT_ERROR_ENCRYPTED, + "Document is encrypted."); + } else { + g_set_error (error, G_FILE_ERROR, + G_FILE_ERROR_FAILED, + "Failed to load document (error %d) '%s'\n", + err, + uri); + } return FALSE; } @@ -660,6 +676,25 @@ pdf_document_search_free (PdfDocumentSearch *search) g_free (search); } +static gboolean +pdf_document_has_document_security (EvDocumentSecurity *document_security) +{ + /* FIXME: do we really need to have this? */ + return FALSE; +} + +static void +pdf_document_set_password (EvDocumentSecurity *document_security, + const char *password) +{ + PdfDocument *document = PDF_DOCUMENT (document_security); + + if (document->password) + g_free (document->password); + + document->password = g_strdup (password); +} + static void pdf_document_ps_export_begin (EvPSExporter *exporter, const char *filename) { @@ -1082,6 +1117,13 @@ pdf_document_find_iface_init (EvDocumentFindIface *iface) } static void +pdf_document_security_iface_init (EvDocumentSecurityIface *iface) +{ + iface->has_document_security = pdf_document_has_document_security; + iface->set_password = pdf_document_set_password; +} + +static void pdf_document_document_links_iface_init (EvDocumentLinksIface *iface) { iface->has_document_links = pdf_document_links_has_document_links; @@ -1285,5 +1327,6 @@ pdf_document_init (PdfDocument *pdf_document) pdf_document->scale = 1.; pdf_document->page_valid = FALSE; + pdf_document->password = NULL; } -- cgit v0.9.1