X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Fdjvu%2Fdjvu-document.c;h=5f59a8ea3ab34c27baffcf97b1de158515235c79;hb=f343927df4325959193353c52cff1ea4b20b2286;hp=f4caa7f0f36bdc8c594a0dfa5b3c4883468420da;hpb=0c06dc4d1656051c9613973e8bef9c7dbfaa151d;p=evince.git diff --git a/backend/djvu/djvu-document.c b/backend/djvu/djvu-document.c index f4caa7f0..5f59a8ea 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,25 +121,33 @@ 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 djvu_document_load (EvDocument *document, const char *uri, @@ -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); @@ -195,27 +275,38 @@ djvu_document_get_n_pages (EvDocument *document) } static void -djvu_document_get_page_size (EvDocument *document, - int page, - double *width, - double *height) +document_get_page_size (DjvuDocument *djvu_document, + gint page, + double *width, + double *height) { - DjvuDocument *djvu_document = DJVU_DOCUMENT (document); - ddjvu_pageinfo_t info; + ddjvu_pageinfo_t info; 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); + 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; } +static void +djvu_document_get_page_size (EvDocument *document, + EvPage *page, + double *width, + double *height) +{ + DjvuDocument *djvu_document = DJVU_DOCUMENT (document); + + g_return_if_fail (djvu_document->d_document); + + document_get_page_size (djvu_document, page->index, + width, height); +} + static cairo_surface_t * djvu_document_render (EvDocument *document, EvRenderContext *rc) @@ -231,10 +322,10 @@ djvu_document_render (EvDocument *document, double page_width, page_height, tmp; static const cairo_user_data_key_t key; - d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, rc->page); + 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; @@ -364,7 +455,7 @@ djvu_selection_get_selected_text (EvSelection *selection, rectangle.x2 = points->x2 / SCALE_FACTOR; rectangle.y2 = (height - points->y1) / SCALE_FACTOR; - text = djvu_text_copy (djvu_document, rc->page, &rectangle); + text = djvu_text_copy (djvu_document, rc->page->index, &rectangle); if (text == NULL) text = g_strdup (""); @@ -423,10 +514,10 @@ djvu_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, gdk_pixbuf_fill (pixbuf, 0xffffffff); pixels = gdk_pixbuf_get_pixels (pixbuf); - while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page, 1) < DDJVU_JOB_OK) - djvu_handle_events(djvu_document, TRUE); + while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page->index, 1) < DDJVU_JOB_OK) + djvu_handle_events(djvu_document, TRUE, NULL); - ddjvu_thumbnail_render (djvu_document->d_document, rc->page, + ddjvu_thumbnail_render (djvu_document->d_document, rc->page->index, &thumb_width, &thumb_height, djvu_document->thumbs_format, gdk_pixbuf_get_rowstride (pixbuf), @@ -472,7 +563,7 @@ djvu_document_file_exporter_do_page (EvFileExporter *exporter, { DjvuDocument *djvu_document = DJVU_DOCUMENT (exporter); - g_string_append_printf (djvu_document->opts, "%d,", (rc->page) + 1); + g_string_append_printf (djvu_document->opts, "%d,", (rc->page->index) + 1); } static void @@ -493,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); @@ -587,8 +678,7 @@ djvu_document_find_get_result (EvDocumentFind *document_find, if (r == NULL) return FALSE; - djvu_document_get_page_size (EV_DOCUMENT (djvu_document), - page, &width, &height); + document_get_page_size (djvu_document, page, &width, &height); rectangle->x1 = r->x1 * SCALE_FACTOR; rectangle->y1 = height - r->y2 * SCALE_FACTOR; rectangle->x2 = r->x2 * SCALE_FACTOR;