]> www.fi.muni.cz Git - evince.git/commitdiff
Check whether there are missing files in indirect multipage djvu
authorCarlos Garcia Campos <carlosgc@gnome.org>
Sat, 10 Feb 2007 19:51:47 +0000 (19:51 +0000)
committerCarlos Garcia Campos <carlosgc@src.gnome.org>
Sat, 10 Feb 2007 19:51:47 +0000 (19:51 +0000)
2007-02-10  Carlos Garcia Campos  <carlosgc@gnome.org>
* po/POTFILES.in:
* backend/djvu/djvu-document.c: (djvu_document_load):
Check whether there are missing files in indirect multipage djvu
documents. Fixes bug #361683.

svn path=/trunk/; revision=2306

ChangeLog
backend/djvu/djvu-document.c
po/POTFILES.in

index 66678853da6fa7e7c0bad9efdf5c310f1b1c65b8..18469c1d466ccb4b522b3edf564753db2a1f0416 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-02-10  Carlos Garcia Campos  <carlosgc@gnome.org>
+
+       * po/POTFILES.in:
+       * backend/djvu/djvu-document.c: (djvu_document_load):
+
+       Check whether there are missing files in indirect multipage djvu
+       documents. Fixes bug #361683. 
+
 2007-02-07  Nickolay V. Shmyrev  <nshmyrev@yandex.ru>
 
        * test/Makefile.am:
index ad18555960a6332d7720dc2e686b4f9ceb495d64..df5ecb345949cb9ed3c1732871b497c07275c5f2 100644 (file)
@@ -28,8 +28,8 @@
 
 #include <libdjvu/ddjvuapi.h>
 #include <libdjvu/miniexp.h>
-#include <gtk/gtk.h>
 #include <gdk-pixbuf/gdk-pixbuf-core.h>
+#include <glib/gi18n.h>
 #include <glib/gunicode.h>
 #include <string.h>
 
@@ -67,10 +67,13 @@ djvu_handle_events (DjvuDocument *djvu_document, int wait)
 {
        ddjvu_context_t *ctx = djvu_document->d_context;
        const ddjvu_message_t *msg;
+       
        if (!ctx)
                return;
+
        if (wait)
                msg = ddjvu_message_wait (ctx);
+
        while ((msg = ddjvu_message_peek (ctx))) {
                switch (msg->m_any.tag) {
                        case DDJVU_ERROR:
@@ -80,6 +83,7 @@ djvu_handle_events (DjvuDocument *djvu_document, int wait)
                                        g_warning ("DjvuLibre error: %s:%d", 
                                                   msg->m_error.filename,
                                                   msg->m_error.lineno);
+                               break;
                        default:
                                break;
                }
@@ -95,6 +99,7 @@ djvu_document_load (EvDocument  *document,
        DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
        ddjvu_document_t *doc;
        gchar *filename;
+       gboolean missing_files = FALSE;
 
        /* FIXME: We could actually load uris  */
        filename = g_filename_from_uri (uri, NULL, error);
@@ -103,7 +108,10 @@ djvu_document_load (EvDocument  *document,
        
        doc = ddjvu_document_create_by_filename (djvu_document->d_context, filename, TRUE);
 
-       if (!doc) return FALSE;
+       if (!doc) {
+               g_free (filename);
+               return FALSE;
+       }
 
        if (djvu_document->d_document)
            ddjvu_document_release (djvu_document->d_document);
@@ -111,10 +119,51 @@ djvu_document_load (EvDocument  *document,
        djvu_document->d_document = doc;
 
        while (!ddjvu_document_decoding_done (djvu_document->d_document)) 
-               djvu_handle_events(djvu_document, TRUE);
+               djvu_handle_events (djvu_document, TRUE);
        g_free (djvu_document->uri);
        djvu_document->uri = g_strdup (uri);
 
+       if (ddjvu_document_get_type (djvu_document->d_document) == DDJVU_DOCTYPE_INDIRECT) {
+               gint n_files;
+               gint i;
+               gchar *base;
+
+               base = g_path_get_dirname (filename);
+
+               n_files = ddjvu_document_get_filenum (djvu_document->d_document);
+               for (i = 0; i < n_files; i++) {
+                       struct ddjvu_fileinfo_s fileinfo;
+                       gchar *file;
+                       
+                       ddjvu_document_get_fileinfo (djvu_document->d_document,
+                                                    i, &fileinfo);
+
+                       if (fileinfo.type != 'P')
+                               continue;
+
+                       file = g_build_filename (base, fileinfo.id, NULL);
+                       if (!g_file_test (file, G_FILE_TEST_EXISTS)) {
+                               missing_files = TRUE;
+                               g_free (file);
+                               
+                               break;
+                       }
+                       g_free (file);
+               }
+               g_free (base);
+       }
+       g_free (filename);
+
+       if (missing_files) {
+               g_set_error (error,
+                            G_FILE_ERROR,
+                            G_FILE_ERROR_EXIST,
+                            _("The document is composed by several files. "
+                              "One or more of such files cannot be accessed."));
+
+               return FALSE;
+       }
+
        return TRUE;
 }
 
@@ -150,7 +199,7 @@ djvu_document_get_page_size (EvDocument   *document,
        ddjvu_status_t r;
        
        g_return_if_fail (djvu_document->d_document);
-       
+
        while ((r = ddjvu_document_get_pageinfo(djvu_document->d_document, page, &info)) < DDJVU_JOB_OK)
                djvu_handle_events(djvu_document, TRUE);
 
index 6761e52eb18fd2672b82c3bc3fed395ea7c759f1..0716f98f5bc6cecc487ebb129f26f9e2fdf807de 100644 (file)
@@ -2,6 +2,7 @@
 # Please keep this file sorted alphabetically.
 [encoding: UTF-8]
 backend/comics/comics-document.c
+backend/djvu/djvu-document.c
 backend/dvi/dvi-document.c
 backend/pdf/ev-poppler.cc
 backend/impress/zip.c