]> www.fi.muni.cz Git - evince.git/blobdiff - backend/comics/comics-document.c
svn path=/trunk/; revision=3469
[evince.git] / backend / comics / comics-document.c
index 2d8404e064fc6ad8fbeb4b0e12f7a3ca173ecf9f..dc5a8b0dde79300b24ed5888bb8c0800ab40e00b 100644 (file)
@@ -22,7 +22,7 @@
 #include <config.h>
 #include <unistd.h>
 #include <string.h>
 #include <config.h>
 #include <unistd.h>
 #include <string.h>
-#include <glib/gi18n.h>
+#include <glib/gi18n-lib.h>
 #include <gio/gio.h>
 
 #include "comics-document.h"
 #include <gio/gio.h>
 
 #include "comics-document.h"
@@ -109,44 +109,67 @@ comics_document_load (EvDocument *document,
 {
        ComicsDocument *comics_document = COMICS_DOCUMENT (document);
        GSList *supported_extensions;
 {
        ComicsDocument *comics_document = COMICS_DOCUMENT (document);
        GSList *supported_extensions;
-       GFile *file;
-       GFileInfo *file_info;
        gchar *list_files_command = NULL, *std_out, *quoted_file;
        gchar *list_files_command = NULL, *std_out, *quoted_file;
-       const gchar *mime_type = NULL;
+       gchar *mime_type;
        gchar **cbr_files;
        gboolean success;
        int i, retval;
        gchar **cbr_files;
        gboolean success;
        int i, retval;
+       GError *err = NULL;
 
        comics_document->archive = g_filename_from_uri (uri, NULL, error);
 
        comics_document->archive = g_filename_from_uri (uri, NULL, error);
-       g_return_val_if_fail (comics_document->archive != NULL, FALSE);
+       if (!comics_document->archive)
+               return FALSE;
 
 
-       quoted_file = g_shell_quote (comics_document->archive);
-       file = g_file_new_for_uri (uri);
-       file_info = g_file_query_info (file,
-                                      G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
-                                      0, NULL, NULL);
-       if (file_info != NULL) {
-               mime_type = g_file_info_get_content_type (file_info);
+       mime_type = ev_file_get_mime_type (uri, FALSE, &err);
+       if (!mime_type) {
+               if (err) {
+                       g_propagate_error (error, err);
+               } else {
+                       g_set_error_literal (error,
+                                             EV_DOCUMENT_ERROR,
+                                             EV_DOCUMENT_ERROR_INVALID,
+                                             _("Unknown MIME Type"));
+               }
+
+               return FALSE;
        }
        }
-       g_object_unref (file);
+
+       quoted_file = g_shell_quote (comics_document->archive);
 
        /* FIXME, use proper cbr/cbz mime types once they're
         * included in shared-mime-info */
 
        /* FIXME, use proper cbr/cbz mime types once they're
         * included in shared-mime-info */
-       if (!strcmp (mime_type, "application/x-cbr")) {
+       if (!strcmp (mime_type, "application/x-cbr") ||
+           !strcmp (mime_type, "application/x-rar")) {
                comics_document->extract_command =
                        g_strdup ("unrar p -c- -ierr");
                list_files_command =
                        g_strdup_printf ("unrar vb -c- -- %s", quoted_file);
                comics_document->regex_arg = FALSE;
                comics_document->extract_command =
                        g_strdup ("unrar p -c- -ierr");
                list_files_command =
                        g_strdup_printf ("unrar vb -c- -- %s", quoted_file);
                comics_document->regex_arg = FALSE;
-       } else if (!strcmp (mime_type, "application/x-cbz")) {
+       } else if (!strcmp (mime_type, "application/x-cbz") ||
+                  !strcmp (mime_type, "application/zip")) {
                comics_document->extract_command =
                        g_strdup ("unzip -p -C");
                list_files_command = 
                        g_strdup_printf ("zipinfo -1 -- %s", quoted_file);
                comics_document->regex_arg = TRUE;
                comics_document->extract_command =
                        g_strdup ("unzip -p -C");
                list_files_command = 
                        g_strdup_printf ("zipinfo -1 -- %s", quoted_file);
                comics_document->regex_arg = TRUE;
+       } else if (!strcmp (mime_type, "application/x-cb7")) {
+               comics_document->extract_command =
+                       g_strdup ("7zr x -so");
+               list_files_command = 
+                       g_strdup_printf ("7zr l -- %s", quoted_file);
+               comics_document->regex_arg = TRUE;
+       } else {
+               g_set_error (error,
+                            EV_DOCUMENT_ERROR,
+                            EV_DOCUMENT_ERROR_INVALID,
+                            _("Not a comic book MIME type: %s"),
+                            mime_type);
+               g_free (mime_type);
+               g_free (quoted_file);
+               return FALSE;
        }
 
        }
 
-       g_object_unref (file_info);
+       g_free (mime_type);
        g_free (quoted_file);
 
        /* Get list of files in archive */
        g_free (quoted_file);
 
        /* Get list of files in archive */
@@ -157,14 +180,25 @@ comics_document_load (EvDocument *document,
        if (!success) {
                return FALSE;
        } else if (retval != 0) {
        if (!success) {
                return FALSE;
        } else if (retval != 0) {
-               g_set_error (error,
-                            EV_DOCUMENT_ERROR,
-                            EV_DOCUMENT_ERROR_INVALID,
-                            _("File corrupted."));
+               g_set_error_literal (error,
+                                     EV_DOCUMENT_ERROR,
+                                     EV_DOCUMENT_ERROR_INVALID,
+                                     _("File corrupted."));
                return FALSE;
        }
 
                return FALSE;
        }
 
+       /* FIXME: is this safe against filenames containing \n in the archive ? */
        cbr_files = g_strsplit (std_out, "\n", 0);
        cbr_files = g_strsplit (std_out, "\n", 0);
+       g_free (std_out);
+
+       if (!cbr_files) {
+               g_set_error_literal (error,
+                                    EV_DOCUMENT_ERROR,
+                                    EV_DOCUMENT_ERROR_INVALID,
+                                    _("No files in archive."));
+               return FALSE;
+       }
+
        supported_extensions = get_supported_image_extensions ();
        for (i = 0; cbr_files[i] != NULL; i++) {
                gchar *suffix = g_strrstr (cbr_files[i], ".");
        supported_extensions = get_supported_image_extensions ();
        for (i = 0; cbr_files[i] != NULL; i++) {
                gchar *suffix = g_strrstr (cbr_files[i], ".");
@@ -185,7 +219,6 @@ comics_document_load (EvDocument *document,
                g_free (suffix);
        }
 
                g_free (suffix);
        }
 
-       g_free (std_out);
        g_strfreev (cbr_files);
        g_slist_foreach (supported_extensions, (GFunc) g_free, NULL);
        g_slist_free (supported_extensions);
        g_strfreev (cbr_files);
        g_slist_foreach (supported_extensions, (GFunc) g_free, NULL);
        g_slist_free (supported_extensions);