]> www.fi.muni.cz Git - evince.git/blobdiff - backend/ev-document-factory.c
Use always "Document Viewer" in about dialog.
[evince.git] / backend / ev-document-factory.c
index d31506db8b4fb64056c3be9b7184edcbe9bf447c..78be656cf1ff0cb7f9e6095321f1f22bba103da1 100644 (file)
 
 /* The various document type backends: */
 #include "ev-poppler.h"
-#include "pixbuf-document.h"
-#include "tiff-document.h"
+
 #ifdef ENABLE_PS
 #include "ps-document.h"
 #endif
+#ifdef ENABLE_TIFF
+#include "tiff-document.h"
+#endif
 #ifdef ENABLE_DVI
 #include "dvi-document.h"
 #endif
+#ifdef ENABLE_PIXBUF
+#include "pixbuf-document.h"
+#endif
 #ifdef ENABLE_DJVU
 #include "djvu-document.h"
 #endif
 #ifdef ENABLE_COMICS
 #include "comics-document.h"
 #endif
+#ifdef ENABLE_IMPRESS
+#include "impress-document.h"
+#endif
 
 #include <string.h>
 #include <glib/gi18n.h>
@@ -57,8 +65,10 @@ struct _EvDocumentType
 };
 
 const EvDocumentType document_types[] = {
+#ifdef ENABLE_PDF
        /* PDF: */
        {"application/pdf",            EV_BACKEND_PDF,  pdf_document_get_type},
+#endif
 
 #ifdef ENABLE_PS
        /* Postscript: */
@@ -87,6 +97,13 @@ const EvDocumentType document_types[] = {
        {"application/x-cbr",           EV_BACKEND_COMICS,  comics_document_get_type},
        {"application/x-cbz",           EV_BACKEND_COMICS,  comics_document_get_type},
 #endif
+
+#ifdef ENABLE_IMPRESS
+       /* Impress slides: */
+       {"application/vnd.sun.xml.impress", EV_BACKEND_IMPRESS, impress_document_get_type},
+       {"application/vnd.oasis.opendocument.presentation", EV_BACKEND_IMPRESS, impress_document_get_type},
+#endif
+
 };
 
 #ifdef ENABLE_PIXBUF
@@ -259,14 +276,14 @@ get_document_from_uri (const char *uri, gboolean slow, GError **error)
                gnome_vfs_file_info_unref (info);
                return NULL;
        }
-       
+
        document = ev_document_factory_get_from_mime (info->mime_type);
                
        if (document == NULL) {
                g_set_error (error,
                             EV_DOCUMENT_ERROR, 
                             0,
-                            _("Unhandled MIME type: '%s'"), info->mime_type);
+                            _("Unhandled MIME type: ā€œ%sā€"), info->mime_type);
                gnome_vfs_file_info_unref (info);
                return NULL;
        }                       
@@ -280,17 +297,31 @@ EvDocument *
 ev_document_factory_get_document (const char *uri, GError **error)
 {
        EvDocument *document;
-       
+       int result;
+
        document = get_document_from_uri (uri, FALSE, error);
 
        if (*error == NULL) {
-               ev_document_load (document, uri, error);
+               result = ev_document_load (document, uri, error);
+
+               if (result == FALSE || *error) {
+                       if (*error &&
+                           (*error)->domain == EV_DOCUMENT_ERROR &&
+                           (*error)->code == EV_DOCUMENT_ERROR_ENCRYPTED)
+                               return document;
+               } else {
+                       return document;
+               }
        }
        
-       if (*error) {
+       /* Try again with slow mime detection */
+       if (document)
+               g_object_unref (document);
+       document = NULL;
+
+       if (*error)
                g_error_free (*error);
-               *error = NULL;
-       }
+       *error = NULL;
 
        document = get_document_from_uri (uri, TRUE, error);
 
@@ -298,8 +329,24 @@ ev_document_factory_get_document (const char *uri, GError **error)
                return NULL;
        }
 
-       ev_document_load (document, uri, error);
+       result = ev_document_load (document, uri, error);
+
+       if (result == FALSE) {
+               if (*error == NULL) {
+                       g_set_error (error,
+                                    EV_DOCUMENT_ERROR,
+                                    0,
+                                    _("Unknown MIME Type"));
+               } else if ((*error)->domain == EV_DOCUMENT_ERROR &&
+                          (*error)->code == EV_DOCUMENT_ERROR_ENCRYPTED) {
+                       return document;
+               }
 
+               if (document)
+                       g_object_unref (document);
+               document = NULL;
+       }
+       
        return document;
 }
 
@@ -345,6 +392,7 @@ ev_document_factory_add_filters (GtkWidget *chooser, EvDocument *document)
        }
 #endif
 
+#ifdef ENABLE_PDF
        if (document == NULL || backend == EV_BACKEND_PDF) {
                default_filter = filter = gtk_file_filter_new ();
                gtk_file_filter_set_name (filter, _("PDF Documents"));
@@ -352,6 +400,7 @@ ev_document_factory_add_filters (GtkWidget *chooser, EvDocument *document)
                file_filter_add_mime_list_and_free (filter, mime_types);
                gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
        }
+#endif
 
 #ifdef ENABLE_PIXBUF
        if (document == NULL || backend == EV_BACKEND_PIXBUF) {
@@ -393,6 +442,16 @@ ev_document_factory_add_filters (GtkWidget *chooser, EvDocument *document)
        }
 #endif 
 
+#ifdef ENABLE_IMPRESS
+       if (document == NULL || backend == EV_BACKEND_IMPRESS) {
+               default_filter = filter = gtk_file_filter_new ();
+               gtk_file_filter_set_name (filter, _("Impress Slides"));
+               mime_types = ev_document_factory_get_mime_types (EV_BACKEND_IMPRESS);
+               file_filter_add_mime_list_and_free (filter, mime_types);
+               gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
+       }
+#endif 
+
        filter = gtk_file_filter_new ();
        gtk_file_filter_set_name (filter, _("All Files"));
        gtk_file_filter_add_pattern (filter, "*");