]> www.fi.muni.cz Git - evince.git/blobdiff - backend/pdf/ev-poppler.cc
backends: Fix several security issues in the dvi-backend.
[evince.git] / backend / pdf / ev-poppler.cc
index d68c7b173a97219f9fe2d2f9231bbfffba5e6e4b..ced3ef79fb9284149dd9eb08726fdda7ed2a378d 100644 (file)
@@ -109,7 +109,6 @@ struct _PdfDocument
 
        PdfPrintContext *print_ctx;
 
-       GList *layers;
        GHashTable *annots;
 };
 
@@ -198,11 +197,6 @@ pdf_document_dispose (GObject *object)
                poppler_fonts_iter_free (pdf_document->fonts_iter);
        }
 
-       if (pdf_document->layers) {
-               g_list_foreach (pdf_document->layers, (GFunc)g_object_unref, NULL);
-               g_list_free (pdf_document->layers);
-       }
-
        G_OBJECT_CLASS (pdf_document_parent_class)->dispose (object);
 }
 
@@ -728,6 +722,9 @@ pdf_document_get_info (EvDocument *document)
        PopplerPermissions permissions;
        EvPage *page;
        char *metadata;
+#ifdef HAVE_POPPLER_DOCUMENT_IS_LINEARIZED
+       gboolean linearized;
+#endif
 
        info = g_new0 (EvDocumentInfo, 1);
 
@@ -764,7 +761,11 @@ pdf_document_get_info (EvDocument *document)
                      "producer", &(info->producer),
                      "creation-date", &(info->creation_date),
                      "mod-date", &(info->modified_date),
+#ifdef HAVE_POPPLER_DOCUMENT_IS_LINEARIZED
+                     "linearized", &linearized,
+#else
                      "linearized", &(info->linearized),
+#endif
                      "metadata", &metadata,
                      NULL);
 
@@ -870,6 +871,10 @@ pdf_document_get_info (EvDocument *document)
                info->security = g_strdup (_("No"));
        }
 
+#ifdef HAVE_POPPLER_DOCUMENT_IS_LINEARIZED
+       info->linearized = linearized ? g_strdup (_("Yes")) : g_strdup (_("No"));
+#endif
+
        return info;
 }
 
@@ -1218,8 +1223,47 @@ ev_link_from_action (PdfDocument   *pdf_document,
                case POPPLER_ACTION_RENDITION:
                        unimplemented_action = "POPPLER_ACTION_RENDITION";
                        break;
-               case POPPLER_ACTION_OCG_STATE:
-                       unimplemented_action = "POPPLER_ACTION_OCG_STATE";
+               case POPPLER_ACTION_OCG_STATE: {
+                       GList *on_list = NULL;
+                       GList *off_list = NULL;
+                       GList *toggle_list = NULL;
+                       GList *l, *m;
+
+                       for (l = action->ocg_state.state_list; l; l = g_list_next (l)) {
+                               PopplerActionLayer *action_layer = (PopplerActionLayer *)l->data;
+
+                               for (m = action_layer->layers; m; m = g_list_next (m)) {
+                                       PopplerLayer *layer = (PopplerLayer *)m->data;
+                                       EvLayer      *ev_layer;
+
+                                       ev_layer = ev_layer_new (poppler_layer_is_parent (layer),
+                                                                poppler_layer_get_radio_button_group_id (layer));
+                                       g_object_set_data_full (G_OBJECT (ev_layer),
+                                                               "poppler-layer",
+                                                               g_object_ref (layer),
+                                                               (GDestroyNotify)g_object_unref);
+
+                                       switch (action_layer->action) {
+                                       case POPPLER_ACTION_LAYER_ON:
+                                               on_list = g_list_prepend (on_list, ev_layer);
+                                               break;
+                                       case POPPLER_ACTION_LAYER_OFF:
+                                               off_list = g_list_prepend (off_list, ev_layer);
+                                               break;
+                                       case POPPLER_ACTION_LAYER_TOGGLE:
+                                               toggle_list = g_list_prepend (toggle_list, ev_layer);
+                                               break;
+                                       }
+                               }
+                       }
+
+                       /* The action takes the ownership of the lists */
+                       ev_action = ev_link_action_new_layers_state (g_list_reverse (on_list),
+                                                                    g_list_reverse (off_list),
+                                                                    g_list_reverse (toggle_list));
+
+
+               }
                        break;
 #endif
                case POPPLER_ACTION_UNKNOWN:
@@ -3149,11 +3193,12 @@ build_layers_tree (PdfDocument       *pdf_document,
                        markup = g_markup_escape_text (poppler_layer_get_title (layer), -1);
                        visible = poppler_layer_is_visible (layer);
                        rb_group = poppler_layer_get_radio_button_group_id (layer);
-                       pdf_document->layers = g_list_append (pdf_document->layers,
-                                                             g_object_ref (layer));
-                       ev_layer = ev_layer_new (g_list_length (pdf_document->layers) - 1,
-                                                poppler_layer_is_parent (layer),
+                       ev_layer = ev_layer_new (poppler_layer_is_parent (layer),
                                                 rb_group);
+                       g_object_set_data_full (G_OBJECT (ev_layer),
+                                               "poppler-layer",
+                                               g_object_ref (layer),
+                                               (GDestroyNotify) g_object_unref);
                } else {
                        gchar *title;
 
@@ -3211,30 +3256,33 @@ static void
 pdf_document_layers_show_layer (EvDocumentLayers *document,
                                EvLayer          *layer)
 {
-       PdfDocument *pdf_document = PDF_DOCUMENT (document);
-       guint        layer_id = ev_layer_get_id (layer);
+       PdfDocument  *pdf_document = PDF_DOCUMENT (document);
+       PopplerLayer *poppler_layer;
 
-       poppler_layer_show (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+       poppler_layer = POPPLER_LAYER (g_object_get_data (G_OBJECT (layer), "poppler-layer"));
+       poppler_layer_show (poppler_layer);
 }
 
 static void
 pdf_document_layers_hide_layer (EvDocumentLayers *document,
                                EvLayer          *layer)
 {
-       PdfDocument *pdf_document = PDF_DOCUMENT (document);
-       guint        layer_id = ev_layer_get_id (layer);
+       PdfDocument  *pdf_document = PDF_DOCUMENT (document);
+       PopplerLayer *poppler_layer;
 
-       poppler_layer_hide (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+       poppler_layer = POPPLER_LAYER (g_object_get_data (G_OBJECT (layer), "poppler-layer"));
+       poppler_layer_hide (poppler_layer);
 }
 
 static gboolean
 pdf_document_layers_layer_is_visible (EvDocumentLayers *document,
                                      EvLayer          *layer)
 {
-       PdfDocument *pdf_document = PDF_DOCUMENT (document);
-       guint        layer_id = ev_layer_get_id (layer);
+       PdfDocument  *pdf_document = PDF_DOCUMENT (document);
+       PopplerLayer *poppler_layer;
 
-       return poppler_layer_is_visible (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+       poppler_layer = POPPLER_LAYER (g_object_get_data (G_OBJECT (layer), "poppler-layer"));
+       return poppler_layer_is_visible (poppler_layer);
 }
 
 static void