Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2008-04-29 19:09:39 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2008-04-29 19:09:39 (GMT)
commitb319a23ddba7c54078aefaae57a036d25a1e5c4b (patch)
tree1c620f25390786dd65054cd0b934b94f60285c85
parent840b2e3dae4b898d1e1fdbc3e7ef0529f36d6745 (diff)
Make sure load job doesn't finish successfully when the document is not
2008-04-29 Carlos Garcia Campos <carlosgc@gnome.org> * backend/djvu/djvu-document-private.h: * backend/djvu/djvu-links.c: * backend/djvu/djvu-text.c: * backend/djvu/djvu-document.c: (djvu_handle_events), (djvu_wait_for_message), (djvu_document_load), (document_get_page_size), (djvu_document_render), (djvu_document_thumbnails_get_thumbnail), (djvu_document_file_exporter_end): Make sure load job doesn't finish successfully when the document is not successfully decoded by libdjvu. Fixes bug #530202. svn path=/trunk/; revision=3027
-rw-r--r--ChangeLog14
-rw-r--r--backend/djvu/djvu-document-private.h3
-rw-r--r--backend/djvu/djvu-document.c124
-rw-r--r--backend/djvu/djvu-links.c8
-rw-r--r--backend/djvu/djvu-text.c4
5 files changed, 124 insertions, 29 deletions
diff --git a/ChangeLog b/ChangeLog
index e4d89da..b5ff07d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-04-29 Carlos Garcia Campos <carlosgc@gnome.org>
+
+ * backend/djvu/djvu-document-private.h:
+ * backend/djvu/djvu-links.c:
+ * backend/djvu/djvu-text.c:
+ * backend/djvu/djvu-document.c: (djvu_handle_events),
+ (djvu_wait_for_message), (djvu_document_load),
+ (document_get_page_size), (djvu_document_render),
+ (djvu_document_thumbnails_get_thumbnail),
+ (djvu_document_file_exporter_end):
+
+ Make sure load job doesn't finish successfully when the document
+ is not successfully decoded by libdjvu. Fixes bug #530202.
+
2008-04-27 Carlos Garcia Campos <carlosgc@gnome.org>
* configure.ac:
diff --git a/backend/djvu/djvu-document-private.h b/backend/djvu/djvu-document-private.h
index 3e7deed..30810bb 100644
--- a/backend/djvu/djvu-document-private.h
+++ b/backend/djvu/djvu-document-private.h
@@ -45,6 +45,7 @@ struct _DjvuDocument {
int djvu_document_get_n_pages (EvDocument *document);
void djvu_handle_events (DjvuDocument *djvu_document,
- int wait);
+ int wait,
+ GError **error);
#endif /* __DJVU_DOCUMENT_INTERNAL_H__ */
diff --git a/backend/djvu/djvu-document.c b/backend/djvu/djvu-document.c
index 392a7dc..5f59a8e 100644
--- a/backend/djvu/djvu-document.c
+++ b/backend/djvu/djvu-document.c
@@ -68,8 +68,51 @@ EV_BACKEND_REGISTER_WITH_CODE (DjvuDocument, djvu_document,
});
-void
-djvu_handle_events (DjvuDocument *djvu_document, int wait)
+#define EV_DJVU_ERROR ev_djvu_error_quark ()
+
+static GQuark
+ev_djvu_error_quark (void)
+{
+ static GQuark q = 0;
+ if (q == 0)
+ q = g_quark_from_static_string ("ev-djvu-quark");
+
+ return q;
+}
+
+static void
+handle_message (const ddjvu_message_t *msg, GError **error)
+{
+ switch (msg->m_any.tag) {
+ case DDJVU_ERROR: {
+ gchar *error_str;
+
+ if (msg->m_error.filename) {
+ error_str = g_strdup_printf ("DjvuLibre error: %s:%d",
+ msg->m_error.filename,
+ msg->m_error.lineno);
+ } else {
+ error_str = g_strdup_printf ("DjvuLibre error: %s",
+ msg->m_error.message);
+ }
+
+ if (error) {
+ g_set_error (error, EV_DJVU_ERROR, 0, error_str);
+ } else {
+ g_warning (error_str);
+ }
+
+ g_free (error_str);
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void
+djvu_handle_events (DjvuDocument *djvu_document, int wait, GError **error)
{
ddjvu_context_t *ctx = djvu_document->d_context;
const ddjvu_message_t *msg;
@@ -78,23 +121,31 @@ djvu_handle_events (DjvuDocument *djvu_document, int wait)
return;
if (wait)
- msg = ddjvu_message_wait (ctx);
+ ddjvu_message_wait (ctx);
while ((msg = ddjvu_message_peek (ctx))) {
- switch (msg->m_any.tag) {
- case DDJVU_ERROR:
- g_warning ("DjvuLibre error: %s",
- msg->m_error.message);
- if (msg->m_error.filename)
- g_warning ("DjvuLibre error: %s:%d",
- msg->m_error.filename,
- msg->m_error.lineno);
- break;
- default:
- break;
- }
+ handle_message (msg, error);
+ ddjvu_message_pop (ctx);
+ if (error && *error)
+ return;
+ }
+}
+
+static void
+djvu_wait_for_message (DjvuDocument *djvu_document, ddjvu_message_tag_t message, GError **error)
+{
+ ddjvu_context_t *ctx = djvu_document->d_context;
+ const ddjvu_message_t *msg;
+
+ ddjvu_message_wait (ctx);
+ while ((msg = ddjvu_message_peek (ctx)) && (msg->m_any.tag != message)) {
+ handle_message (msg, error);
ddjvu_message_pop (ctx);
+ if (error && *error)
+ return;
}
+ if (msg && msg->m_any.tag == message)
+ ddjvu_message_pop (ctx);
}
static gboolean
@@ -106,6 +157,7 @@ djvu_document_load (EvDocument *document,
ddjvu_document_t *doc;
gchar *filename;
gboolean missing_files = FALSE;
+ GError *djvu_error = NULL;
/* FIXME: We could actually load uris */
filename = g_filename_from_uri (uri, NULL, error);
@@ -124,8 +176,36 @@ 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_wait_for_message (djvu_document, DDJVU_DOCINFO, &djvu_error);
+ if (djvu_error) {
+ g_set_error (error,
+ EV_DOCUMENT_ERROR,
+ EV_DOCUMENT_ERROR_INVALID,
+ djvu_error->message);
+ g_error_free (djvu_error);
+ g_free (filename);
+ ddjvu_document_release (djvu_document->d_document);
+ djvu_document->d_document = NULL;
+
+ return FALSE;
+ }
+
+ if (ddjvu_document_decoding_error (djvu_document->d_document))
+ djvu_handle_events (djvu_document, TRUE, &djvu_error);
+
+ if (djvu_error) {
+ g_set_error (error,
+ EV_DOCUMENT_ERROR,
+ EV_DOCUMENT_ERROR_INVALID,
+ djvu_error->message);
+ g_error_free (djvu_error);
+ g_free (filename);
+ ddjvu_document_release (djvu_document->d_document);
+ djvu_document->d_document = NULL;
+
+ return FALSE;
+ }
+
g_free (djvu_document->uri);
djvu_document->uri = g_strdup (uri);
@@ -204,10 +284,10 @@ document_get_page_size (DjvuDocument *djvu_document,
ddjvu_status_t r;
while ((r = ddjvu_document_get_pageinfo(djvu_document->d_document, page, &info)) < DDJVU_JOB_OK)
- djvu_handle_events(djvu_document, TRUE);
+ djvu_handle_events(djvu_document, TRUE, NULL);
if (r >= DDJVU_JOB_FAILED)
- djvu_handle_events(djvu_document, TRUE);
+ djvu_handle_events(djvu_document, TRUE, NULL);
*width = info.width * SCALE_FACTOR;
*height = info.height * SCALE_FACTOR;
@@ -245,7 +325,7 @@ djvu_document_render (EvDocument *document,
d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, rc->page->index);
while (!ddjvu_page_decoding_done (d_page))
- djvu_handle_events(djvu_document, TRUE);
+ djvu_handle_events(djvu_document, TRUE, NULL);
page_width = ddjvu_page_get_width (d_page) * rc->scale * SCALE_FACTOR + 0.5;
page_height = ddjvu_page_get_height (d_page) * rc->scale * SCALE_FACTOR + 0.5;
@@ -435,7 +515,7 @@ djvu_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
pixels = gdk_pixbuf_get_pixels (pixbuf);
while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page->index, 1) < DDJVU_JOB_OK)
- djvu_handle_events(djvu_document, TRUE);
+ djvu_handle_events(djvu_document, TRUE, NULL);
ddjvu_thumbnail_render (djvu_document->d_document, rc->page->index,
&thumb_width, &thumb_height,
@@ -504,7 +584,7 @@ djvu_document_file_exporter_end (EvFileExporter *exporter)
ddjvu_job_t * job = ddjvu_document_print(djvu_document->d_document, fn, d_optc, d_optv);
while (!ddjvu_job_done(job)) {
- djvu_handle_events (djvu_document, TRUE);
+ djvu_handle_events (djvu_document, TRUE, NULL);
}
fclose(fn);
diff --git a/backend/djvu/djvu-links.c b/backend/djvu/djvu-links.c
index 4e3578e..d54c410 100644
--- a/backend/djvu/djvu-links.c
+++ b/backend/djvu/djvu-links.c
@@ -344,7 +344,7 @@ djvu_links_has_document_links (EvDocumentLinks *document_links)
miniexp_t outline;
while ((outline = ddjvu_document_get_outline (djvu_document->d_document)) == miniexp_dummy)
- djvu_handle_events (djvu_document, TRUE);
+ djvu_handle_events (djvu_document, TRUE, NULL);
if (outline) {
ddjvu_miniexp_release (djvu_document->d_document, outline);
@@ -367,10 +367,10 @@ djvu_links_get_links (EvDocumentLinks *document_links,
ddjvu_pageinfo_t page_info;
while ((page_annotations = ddjvu_document_get_pageanno (djvu_document->d_document, page)) == miniexp_dummy)
- djvu_handle_events (djvu_document, TRUE);
+ djvu_handle_events (djvu_document, TRUE, NULL);
while (ddjvu_document_get_pageinfo (djvu_document->d_document, page, &page_info) < DDJVU_JOB_OK)
- djvu_handle_events(djvu_document, TRUE);
+ djvu_handle_events(djvu_document, TRUE, NULL);
if (page_annotations) {
hyperlinks = ddjvu_anno_get_hyperlinks (page_annotations);
@@ -417,7 +417,7 @@ djvu_links_get_links_model (EvDocumentLinks *document_links)
miniexp_t outline = miniexp_nil;
while ((outline = ddjvu_document_get_outline (djvu_document->d_document)) == miniexp_dummy)
- djvu_handle_events (djvu_document, TRUE);
+ djvu_handle_events (djvu_document, TRUE, NULL);
if (outline) {
model = (GtkTreeModel *) gtk_tree_store_new (EV_DOCUMENT_LINKS_COLUMN_NUM_COLUMNS,
diff --git a/backend/djvu/djvu-text.c b/backend/djvu/djvu-text.c
index 8c7c4aa..e87dbb1 100644
--- a/backend/djvu/djvu-text.c
+++ b/backend/djvu/djvu-text.c
@@ -62,7 +62,7 @@ djvu_text_idle_callback (void *data)
ddjvu_document_get_pagetext (djvu_document->d_document,
djvu_text->search_page,
"char")) == miniexp_dummy)
- djvu_handle_events (djvu_document, TRUE);
+ djvu_handle_events (djvu_document, TRUE, NULL);
if (page_text != miniexp_nil) {
DjvuTextPage *page = djvu_text_page_new (page_text);
@@ -168,7 +168,7 @@ djvu_text_copy (DjvuDocument *djvu_document,
while ((page_text =
ddjvu_document_get_pagetext (djvu_document->d_document,
page, "char")) == miniexp_dummy)
- djvu_handle_events (djvu_document, TRUE);
+ djvu_handle_events (djvu_document, TRUE, NULL);
if (page_text != miniexp_nil) {
DjvuTextPage *page = djvu_text_page_new (page_text);