[gnome-documents] pdf-loader: try to install unoconv trough PackageKit if missing
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-documents] pdf-loader: try to install unoconv trough PackageKit if missing
- Date: Wed, 19 Dec 2012 11:59:29 +0000 (UTC)
commit 0a1e8bea61a0fca269f621dc224d8c8e97809a99
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Wed Dec 19 12:55:25 2012 +0100
pdf-loader: try to install unoconv trough PackageKit if missing
When trying to open a LibreOffice document, and unoconv is not
installed, instead of failing immediately, use PackageKit and try
installing it first.
https://bugzilla.gnome.org/show_bug.cgi?id=685095
src/lib/gd-pdf-loader.c | 67 ++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 63 insertions(+), 4 deletions(-)
---
diff --git a/src/lib/gd-pdf-loader.c b/src/lib/gd-pdf-loader.c
index dcbe774..fc20dac 100644
--- a/src/lib/gd-pdf-loader.c
+++ b/src/lib/gd-pdf-loader.c
@@ -24,6 +24,8 @@
#include <string.h>
#include <gdata/gdata.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
#include <evince-document.h>
#include <evince-view.h>
#include <glib/gstdio.h>
@@ -656,6 +658,66 @@ unoconv_child_watch_cb (GPid pid,
}
static void
+openoffice_missing_unoconv_ready_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ PdfLoadJob *job = user_data;
+ GError *error = NULL;
+
+ g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), res, &error);
+ if (error != NULL) {
+ GError *local_error;
+
+ /* can't install unoconv with packagekit - nothing else we can do */
+ g_warning ("unoconv not found, and PackageKit failed to install it with error %s",
+ error->message);
+ local_error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
+ _("LibreOffice is required to view this document"));
+
+ pdf_load_job_complete_error (job, local_error);
+ g_error_free (error);
+ return;
+ }
+
+ /* now that we have unoconv installed, try again refreshing the cache */
+ pdf_load_job_openoffice_refresh_cache (job);
+}
+
+static void
+pdf_load_job_openoffice_missing_unoconv (PdfLoadJob *job)
+{
+ GApplication *app = g_application_get_default ();
+ GtkWidget *widget = GTK_WIDGET (gtk_application_get_active_window (GTK_APPLICATION (app)));
+ GDBusConnection *connection = g_application_get_dbus_connection (app);
+ guint xid = 0;
+ GdkWindow *gdk_window;
+ const gchar *unoconv_path[2];
+
+ gdk_window = gtk_widget_get_window (widget);
+ if (gdk_window != NULL)
+ xid = GDK_WINDOW_XID (gdk_window);
+
+ unoconv_path[0] = "/usr/bin/unoconv";
+ unoconv_path[1] = NULL;
+
+ g_dbus_connection_call (connection,
+ "org.freedesktop.PackageKit",
+ "/org/freedesktop/PackageKit",
+ "org.freedesktop.PackageKit.Modify",
+ "InstallProvideFiles",
+ g_variant_new ("(u^ass)",
+ xid,
+ unoconv_path,
+ "hide-confirm-deps"),
+ NULL, G_DBUS_CALL_FLAGS_NONE,
+ G_MAXINT,
+ job->cancellable,
+ openoffice_missing_unoconv_ready_cb,
+ job);
+}
+
+static void
pdf_load_job_openoffice_refresh_cache (PdfLoadJob *job)
{
gchar *doc_path, *cmd, *quoted_path, *unoconv_path;
@@ -668,10 +730,7 @@ pdf_load_job_openoffice_refresh_cache (PdfLoadJob *job)
unoconv_path = g_find_program_in_path ("unoconv");
if (unoconv_path == NULL)
{
- error = g_error_new_literal (G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("Cannot find \"unoconv\", please check your LibreOffice installation"));
- pdf_load_job_complete_error (job, error);
+ pdf_load_job_openoffice_missing_unoconv (job);
return;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]