[gnome-documents/wip/owncloud: 1/6] lib: support loading non-file:// GVfs URIs
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-documents/wip/owncloud: 1/6] lib: support loading non-file:// GVfs URIs
- Date: Tue, 20 Aug 2013 07:26:25 +0000 (UTC)
commit bd7080183e60bb2cfee8a50b37cea43b428889c4
Author: Debarshi Ray <debarshir gnome org>
Date: Mon Aug 19 12:01:40 2013 +0200
lib: support loading non-file:// GVfs URIs
Even though libview has EvJobLoadGFile, it doesn't really work. eg.,
PDFs fail to load over WebDAV. So, we download the files and convert
them to PDF using unoconv, if needed, before showing them.
https://bugzilla.gnome.org/show_bug.cgi?id=686527
src/lib/gd-pdf-loader.c | 153 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 153 insertions(+), 0 deletions(-)
---
diff --git a/src/lib/gd-pdf-loader.c b/src/lib/gd-pdf-loader.c
index 5d3437f..a4d713b 100644
--- a/src/lib/gd-pdf-loader.c
+++ b/src/lib/gd-pdf-loader.c
@@ -1022,12 +1022,165 @@ pdf_load_job_from_regular_file (PdfLoadJob *job)
}
static void
+remote_file_copy_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ PdfLoadJob *job = user_data;
+ GError *error = NULL;
+ char *uri;
+
+ g_file_copy_finish (G_FILE (source), res, &error);
+ if (error != NULL) {
+ pdf_load_job_complete_error (job, error);
+ return;
+ }
+
+ pdf_load_job_cache_set_attributes (job);
+}
+
+static void
+pdf_load_job_remote_refresh_cache (PdfLoadJob *job)
+{
+ GFile *remote_file;
+
+ remote_file = g_file_new_for_uri (job->uri);
+ g_file_copy_async (remote_file,
+ job->download_file,
+ G_FILE_COPY_OVERWRITE,
+ G_PRIORITY_DEFAULT,
+ job->cancellable,
+ NULL,
+ NULL,
+ remote_file_copy_cb,
+ job);
+
+ g_object_unref (remote_file);
+}
+
+static void
+remote_cache_query_info_ready_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ PdfLoadJob *job = user_data;
+ GError *error = NULL;
+ GFileInfo *info;
+
+ info = g_file_query_info_finish (G_FILE (source), res, &error);
+
+ if (error != NULL) {
+ /* create/invalidate cache */
+ pdf_load_job_remote_refresh_cache (job);
+ g_error_free (error);
+
+ return;
+ }
+
+ job->pdf_cache_mtime =
+ g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
+ g_object_unref (info);
+
+ if (job->original_file_mtime != job->pdf_cache_mtime) {
+ pdf_load_job_remote_refresh_cache (job);
+ } else {
+ job->from_old_cache = TRUE;
+
+ /* load the cached file */
+ pdf_load_job_from_pdf (job);
+ }
+}
+
+static void
+remote_query_info_ready_cb (GObject *obj,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ PdfLoadJob *job = user_data;
+ GError *error = NULL;
+ GFile *pdf_file;
+ GFileInfo *info;
+ const gchar *content_type;
+ gchar *tmp_name;
+ gchar *tmp_path;
+
+ info = g_file_query_info_finish (G_FILE (obj),
+ res, &error);
+
+ if (error != NULL) {
+ pdf_load_job_complete_error (job, error);
+ return;
+ }
+
+ job->original_file_mtime =
+ g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
+
+ tmp_name = g_strdup_printf ("gnome-documents-%u.pdf", g_str_hash (job->uri));
+ tmp_path = g_build_filename (g_get_user_cache_dir (), "gnome-documents", NULL);
+ job->pdf_path =
+ g_build_filename (tmp_path, tmp_name, NULL);
+ g_mkdir_with_parents (tmp_path, 0700);
+
+ content_type = g_file_info_get_content_type (info);
+ if (!content_type_is_native (content_type))
+ {
+ GFileIOStream *iostream;
+
+ job->download_file = g_file_new_tmp (NULL, &iostream, &error);
+ if (error != NULL) {
+ pdf_load_job_complete_error (job, error);
+ return;
+ }
+
+ /* We don't need the iostream. */
+ g_io_stream_close (G_IO_STREAM (iostream), NULL, NULL);
+ }
+ else
+ job->download_file = g_file_new_for_path (job->pdf_path);
+
+ pdf_file = g_file_new_for_path (job->pdf_path);
+
+ g_file_query_info_async (pdf_file,
+ G_FILE_ATTRIBUTE_TIME_MODIFIED,
+ G_FILE_QUERY_INFO_NONE,
+ G_PRIORITY_DEFAULT,
+ job->cancellable,
+ remote_cache_query_info_ready_cb,
+ job);
+
+ g_free (tmp_name);
+ g_free (tmp_path);
+ g_object_unref (pdf_file);
+ g_object_unref (info);
+}
+
+static void
+pdf_load_job_from_remote_file (PdfLoadJob *job)
+{
+ GFile *remote_file;
+
+ remote_file = g_file_new_for_uri (job->uri);
+ g_file_query_info_async (remote_file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
+ G_FILE_ATTRIBUTE_TIME_MODIFIED,
+ G_FILE_QUERY_INFO_NONE,
+ G_PRIORITY_DEFAULT,
+ job->cancellable,
+ remote_query_info_ready_cb,
+ job);
+
+ g_object_unref (remote_file);
+}
+
+static void
pdf_load_job_start (PdfLoadJob *job)
{
if (job->gdata_entry != NULL)
pdf_load_job_from_google_documents (job);
else if (job->zpj_entry != NULL)
pdf_load_job_from_skydrive (job);
+ else if (!g_str_has_prefix (job->uri, "file://"))
+ pdf_load_job_from_remote_file (job);
else
pdf_load_job_from_regular_file (job);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]