More null pointer dereference fixes
[claws.git] / src / plugins / pdf_viewer / poppler_viewer.c
index ea9e26718c1d3277efc39877e100600596b3f103..a0cecaf675f670ff8ff81a7b64c9f4fbd2c31208 100644 (file)
@@ -31,6 +31,7 @@
 #include "printing.h"
 #include "prefs_common.h"
 #include "gtk/gtkutils.h"
+#include "gtk/inputdialog.h"
 #include "mimeview.h"
 #ifndef POPPLER_WITH_GDK
 #include "stdbool.h"
@@ -388,8 +389,6 @@ static void pdf_viewer_render_selection(PdfViewer *viewer, PopplerRectangle *rec
 
        gdk_pixbuf_fill(sel_pb, SELECTION_COLOR);
 
-       page_pb = gtk_image_get_pixbuf(GTK_IMAGE(viewer->pdf_view));
-
        page_pb = gdk_pixbuf_new(GDK_COLORSPACE_RGB, 
                                        FALSE, 8, 
                                (int)(viewer->width * viewer->zoom), 
@@ -558,7 +557,7 @@ static void pdf_viewer_get_document_index(PdfViewer *viewer, PopplerIndexIter *i
                        PopplerDest *dest = poppler_document_find_dest(
                                        viewer->pdf_doc, action->goto_dest.dest->named_dest);
                        if (dest->type != POPPLER_DEST_XYZ) {
-                               g_warning("couldn't figure out link\n");
+                               g_warning("couldn't figure out link");
                                poppler_dest_free(dest);
                                continue;
                        }
@@ -568,9 +567,9 @@ static void pdf_viewer_get_document_index(PdfViewer *viewer, PopplerIndexIter *i
 #endif
                else {
 #ifdef HAVE_POPPLER_DEST_NAMED
-                       g_warning("unhandled link type %d\nplease contact developers\n", action->goto_dest.dest->type);
+                       g_warning("unhandled link type %d. please contact developers", action->goto_dest.dest->type);
 #else
-                       g_warning("unhandled link type %d\nplease upgrade libpoppler-glib to 0.5.4\n", action->goto_dest.dest->type);
+                       g_warning("unhandled link type %d. please upgrade libpoppler-glib to 0.5.4", action->goto_dest.dest->type);
 #endif
                        continue;
                }
@@ -839,7 +838,7 @@ static void pdf_viewer_button_press_events_cb(GtkWidget *widget, GdkEventButton
                                dest = poppler_document_find_dest(
                                        viewer->pdf_doc, viewer->link_action->goto_dest.dest->named_dest);
                        if (dest->type != POPPLER_DEST_XYZ) {
-                               g_warning("couldn't figure out link\n");
+                               g_warning("couldn't figure out link");
                                poppler_dest_free(dest);
                                break;
                        }
@@ -854,7 +853,7 @@ static void pdf_viewer_button_press_events_cb(GtkWidget *widget, GdkEventButton
                        dest = poppler_document_find_dest(
                                        viewer->pdf_doc, viewer->link_action->goto_remote.dest->named_dest);
                        if (dest->type != POPPLER_DEST_XYZ) {
-                               g_warning ("couldn't figure out link\n");
+                               g_warning ("couldn't figure out link");
                                poppler_dest_free(dest);
                                break;
                        }
@@ -1241,13 +1240,13 @@ static void pdf_viewer_update(MimeViewer *_viewer, gboolean reload_file, int pag
 {
 
        PdfViewer *viewer = (PdfViewer *) _viewer;
-       GError *error;
+       GError *error = NULL;
        gchar *tmpfile = NULL;
        gchar *tmp;
+       gchar *password = NULL;
 
        debug_print("pdf_viewer_update\n");
 
-       error = NULL;
        if (reload_file) {
                if (viewer->pdf_doc) {
                        g_object_unref(G_OBJECT(viewer->pdf_doc));
@@ -1301,7 +1300,7 @@ static void pdf_viewer_update(MimeViewer *_viewer, gboolean reload_file, int pag
                                        g_free(tmp);
                                } 
                                else {
-                                       g_warning("gs conversion failed: %s returned %d\n", cmdline, result);
+                                       g_warning("gs conversion failed: %s returned %d", cmdline, result);
                                        tmp = g_strdup_printf("gs: err %d", result);
                                        alertpanel_warning("%s", tmp);
                                        g_free(tmp);
@@ -1312,7 +1311,7 @@ static void pdf_viewer_update(MimeViewer *_viewer, gboolean reload_file, int pag
                                g_free(tmpfile);
                        }
                        else {
-                               g_warning("gs conversion disabled: gs binary was not found\n");
+                               g_warning("gs conversion disabled: gs binary was not found");
                                alertpanel_warning("PostScript view disabled: required gs program not found");
                                result = 1;
 
@@ -1325,6 +1324,14 @@ static void pdf_viewer_update(MimeViewer *_viewer, gboolean reload_file, int pag
                else {
                        viewer->pdf_doc = poppler_document_new_from_file( viewer->fsname, NULL, &error);
                }
+               if (error && g_error_matches(error, POPPLER_ERROR, POPPLER_ERROR_ENCRYPTED)) {
+                       g_clear_error(&error);
+                       password = input_dialog_with_invisible(_("Enter password"),
+                                       _("This document is locked and requires a password before it can be opened."),
+                                       "");
+                       viewer->pdf_doc = poppler_document_new_from_file(viewer->fsname, password, &error);
+                       g_free(password);
+               }
 
                viewer->num_pages = poppler_document_get_n_pages(viewer->pdf_doc);
 
@@ -1349,14 +1356,17 @@ static void pdf_viewer_update(MimeViewer *_viewer, gboolean reload_file, int pag
                main_window_cursor_normal(mainwindow_get_mainwindow());
        } 
        if (viewer->pdf_doc == NULL) {
-               strretchomp(error->message);
                stock_pixbuf_gdk(viewer->hbox, 
                                STOCK_PIXMAP_MIME_APPLICATION, 
                                &viewer->icon_pixbuf);
 
                gtk_image_set_from_pixbuf(GTK_IMAGE(viewer->icon_type), viewer->icon_pixbuf);
-               alertpanel_error("%s", error->message);
-
+               if (error) {
+                       strretchomp(error->message);
+                       alertpanel_error("%s", error->message);
+               } else {
+                       alertpanel_error(_("PDF rendering failed for an unknown reason."));
+               }
                pdf_viewer_show_controls(viewer, FALSE);
                g_error_free(error);
                return;
@@ -1394,7 +1404,7 @@ static void pdf_viewer_update(MimeViewer *_viewer, gboolean reload_file, int pag
                viewer->pdf_page = poppler_document_get_page(viewer->pdf_doc, page_num - 1);
 
                if (viewer->pdf_page == NULL) {
-                       g_warning("Page not found\n");
+                       g_warning("Page not found");
                        return;
                }   
 
@@ -1438,8 +1448,10 @@ static void pdf_viewer_show_mimepart(MimeViewer *_viewer, const gchar *infile,
        viewer->rotate = 0;
        viewer->to_load = partinfo;
 
+       if (messageview)
+               messageview->updating = TRUE;
+
        memset(buf, 0, sizeof(buf));
-       messageview->updating = TRUE;
        debug_print("pdf_viewer_show_mimepart\n");
 
        if (viewer->filename != NULL) {
@@ -1458,13 +1470,11 @@ static void pdf_viewer_show_mimepart(MimeViewer *_viewer, const gchar *infile,
 
        if (partinfo && !(procmime_get_part(viewer->filename, partinfo) < 0)) {
 
-               if (_viewer && _viewer->mimeview && 
-                               _viewer->mimeview->messageview->forced_charset) {
+               if (messageview && messageview->forced_charset)
                        charset = _viewer->mimeview->messageview->forced_charset;
-               }
-               else {
+               else
                        charset = procmime_mimeinfo_get_parameter(partinfo, "charset");
-               }
+
                if (charset == NULL) {
                        charset = conv_get_locale_charset_str();
                }
@@ -1476,7 +1486,8 @@ static void pdf_viewer_show_mimepart(MimeViewer *_viewer, const gchar *infile,
 
        pdf_viewer_update((MimeViewer *)viewer, TRUE, 1);
 
-       messageview->updating = FALSE;
+       if (messageview)
+               messageview->updating = FALSE;
 }
 
 static void pdf_viewer_clear(MimeViewer *_viewer)
@@ -1593,7 +1604,7 @@ static void pdf_viewer_scroll_one_line(MimeViewer *_viewer, gboolean up)
        gtk_table_set_col_spacing(GTK_TABLE(viewer->widgets_table), col, 3*BUTTON_H_PADDING); \
        col++;
 
-#if GTK_CHECK_VERSION(2,10,0) && POPPLER_HAS_CAIRO && !USE_LIBGNOMEPRINT
+#if POPPLER_HAS_CAIRO
 static PangoContext *pdf_viewer_get_pango_context(gpointer data)
 {
        return NULL;
@@ -1686,7 +1697,7 @@ static MimeViewer *pdf_viewer_create(void)
        viewer->mimeviewer.text_search = pdf_viewer_text_search;
        viewer->mimeviewer.scroll_page = pdf_viewer_scroll_page;
        viewer->mimeviewer.scroll_one_line = pdf_viewer_scroll_one_line;
-#if GTK_CHECK_VERSION(2,10,0) && POPPLER_HAS_CAIRO && !USE_LIBGNOMEPRINT
+#if POPPLER_HAS_CAIRO
        viewer->mimeviewer.print = pdf_viewer_print;
 #endif
        viewer->scrollwin = gtk_scrolled_window_new(NULL, NULL);
@@ -1720,10 +1731,6 @@ static MimeViewer *pdf_viewer_create(void)
        gtk_widget_set_size_request(viewer->frame_index, 18, -1);
        gtk_frame_set_label(GTK_FRAME(viewer->frame_index), _("Document Index"));
 
-#if !(GTK_CHECK_VERSION(2,12,0))
-       viewer->button_bar_tips = tips;
-#endif
-
        ADD_SEP_TO_TABLE
        ADD_BUTTON_TO_TABLE(viewer->first_page, GTK_STOCK_GOTO_FIRST)
        ADD_BUTTON_TO_TABLE(viewer->prev_page, GTK_STOCK_GO_BACK)