[gnome-packagekit] Add InstallPrinterDrivers into the session API



commit 5f1f696dcf2890aa342e3d6f194bc1f10892468a
Author: Tim Waugh <twaugh redhat com>
Date:   Wed Feb 3 15:02:15 2010 +0000

    Add InstallPrinterDrivers into the session API
    
    Signed-off-by: Richard Hughes <richard hughsie com>

 src/gpk-dbus-task.c                |  190 ++++++++++++++++++++++++++++++++++++
 src/gpk-dbus-task.h                |    4 +
 src/gpk-dbus.c                     |   11 ++
 src/gpk-dbus.h                     |    5 +
 src/org.freedesktop.PackageKit.xml |   42 ++++++++
 5 files changed, 252 insertions(+), 0 deletions(-)
---
diff --git a/src/gpk-dbus-task.c b/src/gpk-dbus-task.c
index 13275ca..5deb50c 100644
--- a/src/gpk-dbus-task.c
+++ b/src/gpk-dbus-task.c
@@ -2377,6 +2377,196 @@ out:
 }
 
 /**
+ * gpk_dbus_task_printer_driver_what_provides_cb:
+ **/
+static void
+gpk_dbus_task_printer_driver_what_provides_cb (PkClient *client, GAsyncResult *res, GpkDbusTask *dtask)
+{
+	GError *error = NULL;
+	GError *error_dbus = NULL;
+	PkResults *results = NULL;
+	GPtrArray *array = NULL;
+	PkError *error_code = NULL;
+	GtkResponseType button;
+	const gchar *title;
+	const gchar *message;
+
+	/* get the results */
+	results = pk_client_generic_finish (client, res, &error);
+	if (results == NULL) {
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", error->message);
+		gpk_dbus_task_dbus_return_error (dtask, error_dbus);
+		g_error_free (error);
+		g_error_free (error_dbus);
+		goto out;
+	}
+
+	/* check error code */
+	error_code = pk_results_get_error_code (results);
+	if (error_code != NULL) {
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_INTERNAL_ERROR, "failed to resolve: %s", pk_error_get_details (error_code));
+		gpk_dbus_task_dbus_return_error (dtask, error_dbus);
+		g_error_free (error_dbus);
+		goto out;
+	}
+
+	/* get results */
+	array = pk_results_get_package_array (results);
+
+	/* found nothing?  No problem*/
+	if (array->len == 0) {
+		gpk_modal_dialog_close (dtask->priv->dialog);
+		gpk_dbus_task_dbus_return_value (dtask, FALSE);
+		goto out;
+	}
+
+	/* optional */
+	if (!dtask->priv->show_confirm_install) {
+		egg_debug ("skip confirm as not allowed to interact with user");
+		goto skip_checks2;
+	}
+
+	title = ngettext ("Install the following driver", "Install the following drivers", array->len);
+	message = ngettext ("Do you want to install this package now?", "Do you want to install these packages now?", array->len);
+
+	gpk_modal_dialog_setup (dtask->priv->dialog, GPK_MODAL_DIALOG_PAGE_CONFIRM, GPK_MODAL_DIALOG_PACKAGE_LIST);
+	gpk_modal_dialog_set_package_list (dtask->priv->dialog, array);
+	gpk_modal_dialog_set_title (dtask->priv->dialog, title);
+	gpk_modal_dialog_set_message (dtask->priv->dialog, message);
+	gpk_modal_dialog_set_image (dtask->priv->dialog, "dialog-information");
+	/* TRANSLATORS: button: install printer drivers */
+	gpk_modal_dialog_set_action (dtask->priv->dialog, _("Install"));
+	gpk_modal_dialog_present_with_time (dtask->priv->dialog, dtask->priv->timestamp);
+	button = gpk_modal_dialog_run (dtask->priv->dialog);
+
+	/* close, we're going to fail the method */
+	if (button != GTK_RESPONSE_OK) {
+		gpk_modal_dialog_close (dtask->priv->dialog);
+		error_dbus = g_error_new (GPK_DBUS_ERROR, GPK_DBUS_ERROR_CANCELLED, "did not agree to download");
+		gpk_dbus_task_dbus_return_error (dtask, error_dbus);
+		g_error_free (error_dbus);
+		goto out;
+	}
+
+skip_checks2:
+	/* install with deps */
+	dtask->priv->package_ids = pk_package_array_to_strv (array);
+	gpk_dbus_task_install_package_ids (dtask);
+out:
+	if (error_code != NULL)
+		g_object_unref (error_code);
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	if (results != NULL)
+		g_object_unref (results);
+}
+
+/**
+ * gpk_dbus_task_install_printer_drivers:
+ * @task: a valid #GpkDbusTask instance
+ * @device_ids: list of Device IDs such as <literal>MFG:Foo Inc;MDL:Bar 3000;</literal>
+ * @error: a %GError to put the error code and message in, or %NULL
+ *
+ * Install printer drivers for a given set of models.
+ *
+ * Return value: %TRUE if the method succeeded
+ **/
+void
+gpk_dbus_task_install_printer_drivers (GpkDbusTask *dtask, gchar **device_ids, GpkDbusTaskFinishedCb finished_cb, gpointer userdata)
+{
+	guint i, j;
+	guint len;
+	guint n_tags;
+	guint n_fields;
+	gchar **fields;
+	gchar *mfg;
+	gchar *mdl;
+	gchar *tag;
+	gchar **tags;
+
+	g_return_if_fail (GPK_IS_DBUS_TASK (dtask));
+	g_return_if_fail (device_ids != NULL);
+
+	/* save callback information */
+	dtask->priv->finished_cb = finished_cb;
+	dtask->priv->finished_userdata = userdata;
+
+	gpk_modal_dialog_setup (dtask->priv->dialog,
+				GPK_MODAL_DIALOG_PAGE_PROGRESS,
+				GPK_MODAL_DIALOG_PACKAGE_PADDING);
+	gpk_modal_dialog_set_title (dtask->priv->dialog,
+				    _("Searching for packages"));
+	gpk_modal_dialog_set_image_status (dtask->priv->dialog,
+					   PK_STATUS_ENUM_WAIT);
+	gpk_modal_dialog_set_help_id (dtask->priv->dialog,
+				      "dialog-finding-packages");
+
+	/* setup the UI */
+	if (dtask->priv->show_progress)
+		gpk_modal_dialog_present (dtask->priv->dialog);
+
+	len = g_strv_length (device_ids);
+	if (len > 1)
+		/* hardcode for now as we only support one at a time */
+		len = 1;
+
+	/* make a list of provides tags */
+	tags = g_new0 (gchar *, len);
+	n_tags = 0;
+	for (i=0; i<len; i++) {
+		gchar *p;
+		fields = g_strsplit (device_ids[i], ";", 0);
+		n_fields = g_strv_length (fields);
+		mfg = mdl = NULL;
+		for (j=0; j<n_fields && (!mfg || !mdl); j++) {
+			if (g_str_has_prefix (fields[j], "MFG:"))
+				mfg = g_strdup (fields[j]);
+			else if (g_str_has_prefix (fields[j], "MDL:"))
+				mdl = g_strdup (fields[j]);
+		}
+		g_strfreev (fields);
+
+		if (!mfg || !mdl) {
+			egg_warning("invalid line '%s', missing field",
+				    device_ids[i]);
+			continue;
+		}
+
+		tag = g_strconcat (mfg, ";", mdl, ";", NULL);
+		g_ascii_strdown (tag, -1);
+
+		/* Replace spaces with underscores */
+		for (p = tag; *p != '\0'; p++)
+			if (*p == ' ')
+				*p = '_';
+
+		tags[n_tags++] = g_strdup (tag);
+		g_free (tag);
+	}
+
+	if (n_tags == 0) {
+		gpk_dbus_task_dbus_return_value (dtask, FALSE);
+		goto out;
+	}
+
+	tags = g_renew (gchar *, tags, n_tags);
+
+	/* get driver packages */
+	pk_client_what_provides_async (PK_CLIENT(dtask->priv->task),
+				       pk_bitfield_from_enums (PK_FILTER_ENUM_NOT_INSTALLED,
+							       PK_FILTER_ENUM_ARCH,
+							       PK_FILTER_ENUM_NEWEST,
+							       -1),
+				       PK_PROVIDES_ENUM_POSTSCRIPT_DRIVER,
+				       tags, NULL,
+				       (PkProgressCallback) gpk_dbus_task_progress_cb, dtask,
+				       (GAsyncReadyCallback) gpk_dbus_task_printer_driver_what_provides_cb, dtask);
+
+ out:
+	g_strfreev (tags);
+}
+
+/**
  * gpk_dbus_task_remove_package_ids:
  * @task: a valid #GpkDbusTask instance
  **/
diff --git a/src/gpk-dbus-task.h b/src/gpk-dbus-task.h
index 08fc880..3402aac 100644
--- a/src/gpk-dbus-task.h
+++ b/src/gpk-dbus-task.h
@@ -118,6 +118,10 @@ void		 gpk_dbus_task_install_fontconfig_resources (GpkDbusTask *dtask,
 							 gchar		**fonts,
 							 GpkDbusTaskFinishedCb finished_cb,
 							 gpointer	 userdata);
+void		 gpk_dbus_task_install_printer_drivers (GpkDbusTask *dtask,
+							gchar		**ids,
+							GpkDbusTaskFinishedCb finished_cb,
+							gpointer	userdata);
 void		 gpk_dbus_task_install_package_names	(GpkDbusTask	*dtask,
 							 gchar		**packages,
 							 GpkDbusTaskFinishedCb finished_cb,
diff --git a/src/gpk-dbus.c b/src/gpk-dbus.c
index 7d60860..e7f603f 100644
--- a/src/gpk-dbus.c
+++ b/src/gpk-dbus.c
@@ -518,6 +518,17 @@ gpk_dbus_install_gstreamer_resources (GpkDbus *dbus, guint32 xid, gchar **resour
 }
 
 /**
+ * gpk_dbus_install_printer_drivers:
+ **/
+void
+gpk_dbus_install_printer_drivers (GpkDbus *dbus, guint32 xid, gchar **device_ids, const gchar *interaction, DBusGMethodInvocation *context)
+{
+	GpkDbusTask *task;
+	task = gpk_dbus_create_task (dbus, xid, interaction, context);
+	gpk_dbus_task_install_printer_drivers (task, device_ids, (GpkDbusTaskFinishedCb) gpk_dbus_task_finished_cb, dbus);
+}
+
+/**
  * gpk_dbus_class_init:
  * @klass: The GpkDbusClass
  **/
diff --git a/src/gpk-dbus.h b/src/gpk-dbus.h
index 1cdccae..37450f7 100644
--- a/src/gpk-dbus.h
+++ b/src/gpk-dbus.h
@@ -118,6 +118,11 @@ void		 gpk_dbus_remove_package_by_file	(GpkDbus	*dbus,
 							 const gchar	*interaction,
 							 DBusGMethodInvocation *context);
 
+void		 gpk_dbus_install_printer_drivers	(GpkDbus 	*dbus,
+							 guint32	 xid,
+							 gchar		**device_ids,
+							 const gchar	*interaction,
+							 DBusGMethodInvocation *context);
 G_END_DECLS
 
 #endif /* __GPK_DBUS_H */
diff --git a/src/org.freedesktop.PackageKit.xml b/src/org.freedesktop.PackageKit.xml
index 12d41ec..f0903d4 100644
--- a/src/org.freedesktop.PackageKit.xml
+++ b/src/org.freedesktop.PackageKit.xml
@@ -450,6 +450,48 @@
         </doc:doc>
       </arg>
     </method>
+
+    <method name="InstallPrinterDrivers">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Installs printer drivers from a configured software source.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="u" name="xid" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The X window handle ID, used for focus stealing prevention and setting modality.
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="as" name="resources" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              An array of printer model descriptors in IEEE 1284
+              Device ID format,
+              e.g. <doc:tt>MFG:Hewlett-Packard;MDL:HP LaserJet
+              6MP;</doc:tt>.
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+      <arg type="s" name="interaction" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              An optional interaction mode, e.g.
+              <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+    </method>
   </interface>
 </node>
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]