[evince/wip/bug654832] libview: Add EvJobLoad API to load from streams and gfile



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]