[evince/wip/bug654832] libview: Add EvJobLoad API to load from streams and gfile
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince/wip/bug654832] libview: Add EvJobLoad API to load from streams and gfile
- Date: Sun, 13 May 2012 18:58:27 +0000 (UTC)
commit 0dbea4f45ec023fc64eeef3dfa7ea29e15c1b6ef
Author: Christian Persch <chpe gnome org>
Date: Sun May 13 20:49:51 2012 +0200
libview: Add EvJobLoad API to load from streams and gfile
help/reference/libview/libevview-sections.txt | 5 +
libview/ev-jobs.c | 190 +++++++++++++++++++++----
libview/ev-jobs.h | 19 +++-
libview/ev-view.h | 1 +
4 files changed, 183 insertions(+), 32 deletions(-)
---
diff --git a/help/reference/libview/libevview-sections.txt b/help/reference/libview/libevview-sections.txt
index fe50b2e..774fa4a 100644
--- a/help/reference/libview/libevview-sections.txt
+++ b/help/reference/libview/libevview-sections.txt
@@ -172,7 +172,12 @@ ev_job_page_data_new
ev_job_thumbnail_new
ev_job_fonts_new
ev_job_load_new
+ev_job_load_new_from_stream
+ev_job_load_new_from_gfile
ev_job_load_set_uri
+ev_job_load_set_stream
+ev_job_load_set_gfile
+ev_job_load_set_load_flags
ev_job_load_set_password
ev_job_save_new
ev_job_find_new
diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c
index 23ee586..f32d4cc 100644
--- a/libview/ev-jobs.c
+++ b/libview/ev-jobs.c
@@ -71,6 +71,12 @@ static void ev_job_print_init (EvJobPrint *job);
static void ev_job_print_class_init (EvJobPrintClass *class);
enum {
+ LOAD_URI,
+ LOAD_STREAM,
+ LOAD_GFILE
+};
+
+enum {
CANCELLED,
FINISHED,
LAST_SIGNAL
@@ -942,19 +948,25 @@ ev_job_load_dispose (GObject *object)
{
EvJobLoad *job = EV_JOB_LOAD (object);
- ev_debug_message (DEBUG_JOBS, "%s", job->uri);
-
- if (job->uri) {
- g_free (job->uri);
- job->uri = NULL;
- }
+ switch (job->type) {
+ case LOAD_URI:
+ g_free (job->data.uri);
+ job->data.uri = NULL;
+ break;
+ case LOAD_STREAM:
+ g_object_unref (job->data.stream);
+ job->data.stream = NULL;
+ break;
+ case LOAD_GFILE:
+ g_object_unref (job->data.gfile);
+ job->data.gfile = NULL;
+ break;
+ }
- if (job->password) {
- g_free (job->password);
- job->password = NULL;
- }
+ g_free (job->password);
+ job->password = NULL;
- (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object);
+ G_OBJECT_CLASS (ev_job_load_parent_class)->dispose (object);
}
static gboolean
@@ -963,7 +975,7 @@ ev_job_load_run (EvJob *job)
EvJobLoad *job_load = EV_JOB_LOAD (job);
GError *error = NULL;
- ev_debug_message (DEBUG_JOBS, "%s", job_load->uri);
+ ev_debug_message (DEBUG_JOBS, "%s", job-load->type == LOAD_URI ? job_load->uri : "");
ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
ev_document_fc_mutex_lock ();
@@ -972,8 +984,6 @@ ev_job_load_run (EvJob *job)
because, e.g., a password is required - if so, just reload rather than
creating a new instance */
if (job->document) {
- const gchar *uncompressed_uri;
-
if (job_load->password) {
ev_document_security_set_password (EV_DOCUMENT_SECURITY (job->document),
job_load->password);
@@ -983,14 +993,52 @@ ev_job_load_run (EvJob *job)
job->finished = FALSE;
g_clear_error (&job->error);
- uncompressed_uri = g_object_get_data (G_OBJECT (job->document),
- "uri-uncompressed");
- ev_document_load (job->document,
- uncompressed_uri ? uncompressed_uri : job_load->uri,
- &error);
+ switch (job_load->type) {
+ case LOAD_URI: {
+ const gchar *uncompressed_uri;
+
+ uncompressed_uri = g_object_get_data (G_OBJECT (job->document),
+ "uri-uncompressed");
+ ev_document_load (job->document,
+ uncompressed_uri ? uncompressed_uri : job_load->data.uri,
+ &error);
+ break;
+ }
+ case LOAD_STREAM:
+ ev_document_load_stream_sync (job->document,
+ job_load->data.stream,
+ job_load->load_flags,
+ job->cancellable,
+ &error);
+ break;
+ case LOAD_GFILE:
+ ev_document_load_gfile_sync (job->document,
+ job_load->data.gfile,
+ job_load->load_flags,
+ job->cancellable,
+ &error);
+ break;
+ }
} else {
- job->document = ev_document_factory_get_document (job_load->uri,
- &error);
+ switch (job_load->type) {
+ case LOAD_URI:
+ job->document = ev_document_factory_get_document (job_load->data.uri,
+ &error);
+ break;
+ case LOAD_STREAM:
+ job->document = ev_document_factory_get_document_for_stream (job_load->data.stream,
+ NULL /* mime-type FIXME! */,
+ job_load->load_flags,
+ job->cancellable,
+ &error);
+ break;
+ case LOAD_GFILE:
+ job->document = ev_document_factory_get_document_for_gfile (job_load->data.gfile,
+ job_load->load_flags,
+ job->cancellable,
+ &error);
+ break;
+ }
}
ev_document_fc_mutex_unlock ();
@@ -1023,7 +1071,8 @@ ev_job_load_new (const gchar *uri)
ev_debug_message (DEBUG_JOBS, "%s", uri);
job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
- job->uri = g_strdup (uri);
+ job->type = LOAD_URI;
+ job->data.uri = g_strdup (uri);
return EV_JOB (job);
}
@@ -1031,11 +1080,15 @@ ev_job_load_new (const gchar *uri)
void
ev_job_load_set_uri (EvJobLoad *job, const gchar *uri)
{
+ g_return_if_fail (job->type != LOAD_URI);
+
ev_debug_message (DEBUG_JOBS, "%s", uri);
-
- if (job->uri)
- g_free (job->uri);
- job->uri = g_strdup (uri);
+
+ if (uri == job->data.uri)
+ return;
+
+ g_free (job->data.uri);
+ job->data.uri = g_strdup (uri);
}
void
@@ -1043,9 +1096,84 @@ ev_job_load_set_password (EvJobLoad *job, const gchar *password)
{
ev_debug_message (DEBUG_JOBS, NULL);
- if (job->password)
- g_free (job->password);
- job->password = password ? g_strdup (password) : NULL;
+ if (job->password == password)
+ return;
+
+ g_free (job->password);
+ job->password = g_strdup (password);
+}
+
+EvJob *
+ev_job_load_new_from_stream (GInputStream *stream,
+ EvDocumentLoadFlags flags)
+{
+ EvJobLoad *job;
+
+ g_return_val_if_fail (G_IS_INPUT_STREAM (stream), NULL);
+
+ ev_debug_message (DEBUG_JOBS, "stream");
+
+ job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
+ job->type = LOAD_STREAM;
+ job->data.stream = g_object_ref (stream);
+ job->load_flags = flags;
+
+ return EV_JOB (job);
+}
+
+void
+ev_job_load_set_stream (EvJobLoad *job,
+ GInputStream *stream)
+{
+ g_return_if_fail (job != NULL);
+ g_return_if_fail (job->type != LOAD_STREAM);
+ g_return_if_fail (G_IS_INPUT_STREAM (stream));
+
+ g_object_ref (stream);
+ if (job->data.stream)
+ g_object_unref (job->data.stream);
+ job->data.stream = stream;
+}
+
+EvJob *
+ev_job_load_new_from_gfile (GFile *file,
+ EvDocumentLoadFlags flags)
+{
+ EvJobLoad *job;
+
+ g_return_val_if_fail (G_IS_FILE (file), NULL);
+
+ ev_debug_message (DEBUG_JOBS, "gfile");
+
+ job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
+ job->type = LOAD_GFILE;
+ job->data.gfile = g_object_ref (file);
+ job->load_flags = flags;
+
+ return EV_JOB (job);
+}
+
+void
+ev_job_load_set_gfile (EvJobLoad *job,
+ GFile *file)
+{
+ g_return_if_fail (job != NULL);
+ g_return_if_fail (job->type != LOAD_GFILE);
+ g_return_if_fail (G_IS_FILE (file));
+
+ g_object_ref (file);
+ if (job->data.gfile)
+ g_object_unref (job->data.gfile);
+ job->data.gfile = file;
+}
+void
+ev_job_load_set_load_flags (EvJobLoad *job,
+ EvDocumentLoadFlags flags)
+{
+ g_return_if_fail (job != NULL);
+ g_return_if_fail (job->type != LOAD_STREAM && job->type != LOAD_GFILE);
+
+ job->load_flags = flags;
}
/* EvJobSave */
diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h
index 7596d76..02e3d2f 100644
--- a/libview/ev-jobs.h
+++ b/libview/ev-jobs.h
@@ -313,7 +313,13 @@ struct _EvJobLoad
{
EvJob parent;
- gchar *uri;
+ int type;
+ union {
+ gchar *uri;
+ GInputStream *stream;
+ GFile *gfile;
+ } data;
+ EvDocumentLoadFlags load_flags;
gchar *password;
};
@@ -462,6 +468,17 @@ void ev_job_load_set_uri (EvJobLoad *load,
void ev_job_load_set_password (EvJobLoad *job,
const gchar *password);
+EvJob *ev_job_load_new_from_stream (GInputStream *stream,
+ EvDocumentLoadFlags flags);
+void ev_job_load_set_stream (EvJobLoad *job,
+ GInputStream *stream);
+EvJob *ev_job_load_new_from_gfile (GFile *file,
+ EvDocumentLoadFlags flags);
+void ev_job_load_set_gfile (EvJobLoad *job,
+ GFile *file);
+void ev_job_load_set_load_flags (EvJobLoad *job,
+ EvDocumentLoadFlags flags);
+
/* EvJobSave */
GType ev_job_save_get_type (void) G_GNUC_CONST;
EvJob *ev_job_save_new (EvDocument *document,
diff --git a/libview/ev-view.h b/libview/ev-view.h
index 06f5b30..8867003 100644
--- a/libview/ev-view.h
+++ b/libview/ev-view.h
@@ -25,6 +25,7 @@
#define __EV_VIEW_H__
#include <gtk/gtk.h>
+#include <gio/gio.h>
#include <evince-document.h>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]