socsvn commit: r253078 - soc2013/mattbw/dummy

mattbw at FreeBSD.org mattbw at FreeBSD.org
Mon Jun 17 12:52:15 UTC 2013


Author: mattbw
Date: Mon Jun 17 12:52:15 2013
New Revision: 253078
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253078

Log:
  Adds dummy from packagekit, this will probably become the base for the pkg backend.

Added:
  soc2013/mattbw/dummy/
  soc2013/mattbw/dummy/Makefile.am
  soc2013/mattbw/dummy/pk-backend-dummy.c

Added: soc2013/mattbw/dummy/Makefile.am
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/mattbw/dummy/Makefile.am	Mon Jun 17 12:52:15 2013	(r253078)
@@ -0,0 +1,12 @@
+AM_CPPFLAGS = \
+	-DG_LOG_DOMAIN=\"PackageKit-Dummy\"
+
+plugindir = $(PK_PLUGIN_DIR)
+plugin_LTLIBRARIES = libpk_backend_dummy.la
+libpk_backend_dummy_la_SOURCES = pk-backend-dummy.c
+libpk_backend_dummy_la_LIBADD = $(PK_PLUGIN_LIBS)
+libpk_backend_dummy_la_LDFLAGS = -module -avoid-version
+libpk_backend_dummy_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(WARNINGFLAGS_C)
+
+
+-include $(top_srcdir)/git.mk

Added: soc2013/mattbw/dummy/pk-backend-dummy.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/mattbw/dummy/pk-backend-dummy.c	Mon Jun 17 12:52:15 2013	(r253078)
@@ -0,0 +1,1742 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007-2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <gmodule.h>
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <gio/gunixsocketaddress.h>
+
+#include <pk-backend.h>
+#include <pk-backend-job.h>
+
+typedef struct {
+	gboolean	 has_signature;
+	gboolean	 repo_enabled_devel;
+	gboolean	 repo_enabled_fedora;
+	gboolean	 repo_enabled_livna;
+	gboolean	 repo_enabled_local;
+	gboolean	 updated_gtkhtml;
+	gboolean	 updated_kernel;
+	gboolean	 updated_powertop;
+	gboolean	 use_blocked;
+	gboolean	 use_distro_upgrade;
+	gboolean	 use_eula;
+	gboolean	 use_gpg;
+	gboolean	 use_media;
+	gboolean	 use_trusted;
+	gchar		**package_ids;
+	gchar		**values;
+	PkBitfield	 filters;
+	gboolean	 fake_db_locked;
+} PkBackendDummyPrivate;
+
+typedef struct {
+	guint		 progress_percentage;
+	GSocket		*socket;
+	guint		 socket_listen_id;
+	GCancellable	*cancellable;
+	gulong		 signal_timeout;
+} PkBackendDummyJobData;
+
+static PkBackendDummyPrivate *priv;
+
+/**
+ * pk_backend_initialize:
+ */
+void
+pk_backend_initialize (PkBackend *backend)
+{
+	/* create private area */
+	priv = g_new0 (PkBackendDummyPrivate, 1);
+	priv->repo_enabled_fedora = TRUE;
+	priv->repo_enabled_devel = TRUE;
+	priv->repo_enabled_livna = TRUE;
+	priv->use_trusted = TRUE;
+}
+
+/**
+ * pk_backend_destroy:
+ */
+void
+pk_backend_destroy (PkBackend *backend)
+{
+	g_free (priv);
+}
+
+/**
+ * pk_backend_get_groups:
+ */
+PkBitfield
+pk_backend_get_groups (PkBackend *backend)
+{
+	return pk_bitfield_from_enums (PK_GROUP_ENUM_ACCESSIBILITY,
+		PK_GROUP_ENUM_GAMES,
+		PK_GROUP_ENUM_SYSTEM,
+		-1);
+}
+
+/**
+ * pk_backend_get_filters:
+ */
+PkBitfield
+pk_backend_get_filters (PkBackend *backend)
+{
+	return pk_bitfield_from_enums (PK_FILTER_ENUM_GUI,
+		PK_FILTER_ENUM_INSTALLED,
+		PK_FILTER_ENUM_DEVELOPMENT,
+		-1);
+}
+
+/**
+ * pk_backend_get_mime_types:
+ */
+gchar **
+pk_backend_get_mime_types (PkBackend *backend)
+{
+	const gchar *mime_types[] = {
+				"application/x-rpm",
+				"application/x-deb",
+				NULL };
+	return g_strdupv ((gchar **) mime_types);
+}
+
+/**
+ * pk_backend_cancel_timeout:
+ */
+static gboolean
+pk_backend_cancel_timeout (gpointer data)
+{
+	PkBackendJob *job = (PkBackendJob *) data;
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	/* we can now cancel again */
+	job_data->signal_timeout = 0;
+
+	/* now mark as finished */
+	pk_backend_job_error_code (job, PK_ERROR_ENUM_TRANSACTION_CANCELLED,
+				   "The task was stopped successfully");
+	pk_backend_job_finished (job);
+	return FALSE;
+}
+
+/**
+ * pk_backend_cancel:
+ */
+void
+pk_backend_cancel (PkBackend *backend, PkBackendJob *job)
+{
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	/* try to cancel the transaction */
+	g_debug ("cancelling transaction");
+	g_cancellable_cancel (job_data->cancellable);
+	if (job_data->signal_timeout != 0) {
+		g_source_remove (job_data->signal_timeout);
+
+		/* emulate that it takes us a few ms to cancel */
+		g_timeout_add (1500, pk_backend_cancel_timeout, job);
+	}
+}
+
+/**
+ * pk_backend_get_depends:
+ */
+void
+pk_backend_get_depends (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **package_ids, gboolean recursive)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+
+	if (g_strcmp0 (package_ids[0], "scribus;1.3.4-1.fc8;i386;fedora") == 0) {
+		pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+					"scribus-clipart;1.3.4-1.fc8;i386;fedora", "Clipart for scribus");
+	} else {
+		pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+					"glib2;2.14.0;i386;fedora", "The GLib library");
+		pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+					"gtk2;gtk2-2.11.6-6.fc8;i386;fedora", "GTK+ Libraries for GIMP");
+	}
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_get_details:
+ */
+void
+pk_backend_get_details (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
+{
+	guint i;
+	guint len;
+	const gchar *package_id;
+
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_set_percentage (job, 0);
+
+	/* each one has a different detail for testing */
+	len = g_strv_length (package_ids);
+	for (i=0; i<len; i++) {
+		package_id = package_ids[i];
+		if (g_strcmp0 (package_id, "powertop;1.8-1.fc8;i386;fedora") == 0) {
+			pk_backend_job_details (job, "powertop;1.8-1.fc8;i386;fedora", "GPL2", PK_GROUP_ENUM_PROGRAMMING,
+						"PowerTOP is a tool that finds the software component(s) that make your "
+						"computer use more power than necessary while it is idle.", "http://live.gnome.org/powertop", 101*1024);
+		} else if (g_strcmp0 (package_id, "kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed") == 0) {
+			pk_backend_job_details (job, "kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed", "GPL2", PK_GROUP_ENUM_PROGRAMMING,
+						"The kernel package contains the Linux kernel (vmlinuz), the core of any "
+						"Linux operating system.  The kernel handles the basic functions of the "
+						"operating system: memory allocation, process allocation, device input "
+						"and output, etc.", "http://www.kernel.org", 33*1024*1024);
+		} else if (g_strcmp0 (package_id, "gtkhtml2;2.19.1-4.fc8;i386;fedora") == 0) {
+			pk_backend_job_details (job, "gtkhtml2;2.19.1-4.fc8;i386;fedora", "GPL2", PK_GROUP_ENUM_PROGRAMMING,
+						"GtkHTML2 (sometimes called libgtkhtml) is a widget for displaying html "
+						"pages.", "http://live.gnome.org/gtkhtml", 133*1024);
+		} else if (g_strcmp0 (package_id, "vino;2.24.2.fc9;i386;fedora") == 0) {
+			pk_backend_job_details (job, "vino;2.24.2.fc9;i386;fedora", "GPL2", PK_GROUP_ENUM_PROGRAMMING,
+						"Vino is a VNC server for GNOME. It allows remote users to "
+						"connect to a running GNOME session using VNC.", "http://live.gnome.org/powertop", 3*1024*1024);
+		} else if (g_strcmp0 (package_id, "gnome-power-manager;2.6.19;i386;fedora") == 0) {
+			pk_backend_job_details (job, "gnome-power-manager;2.6.19;i386;fedora", "GPL2", PK_GROUP_ENUM_PROGRAMMING,
+						"GNOME Power Manager uses the information and facilities provided by HAL "
+						"displaying icons and handling user callbacks in an interactive GNOME session.\n"
+						"GNOME Power Preferences allows authorised users to set policy and "
+						"change preferences.", "http://projects.gnome.org/gnome-power-manager/", 13*1024*1024);
+		//TODO: add other packages
+		} else {
+			pk_backend_job_details (job, "scribus;1.3.4-1.fc8;i386;fedora", "GPL2", PK_GROUP_ENUM_PROGRAMMING,
+						"Scribus is an desktop *open source* page layöut program with "
+						"the aim of producing commercial grade output in **PDF** and "
+						"**Postscript**, primarily, though not exclusively for Linux.\n"
+						"\n"
+						"While the goals of the program are for ease of use and simple easy to "
+						"understand tools, Scribus offers support for professional publishing "
+						"features, such as CMYK color, easy PDF creation, Encapsulated Postscript "
+						"import/export and creation of color separations.", "http://live.gnome.org/scribus", 44*1024*1024);
+		}
+	}
+	pk_backend_job_set_percentage (job, 100);
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_get_distro_upgrades:
+ */
+void
+pk_backend_get_distro_upgrades (PkBackend *backend, PkBackendJob *job)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	if (!priv->use_distro_upgrade)
+		goto out;
+	pk_backend_job_distro_upgrade (job, PK_DISTRO_UPGRADE_ENUM_STABLE,
+				       "fedora-9", "Fedora 9");
+	pk_backend_job_distro_upgrade (job, PK_DISTRO_UPGRADE_ENUM_UNSTABLE,
+				       "fedora-10-rc1", "Fedora 10 RC1");
+out:
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_get_files:
+ */
+void
+pk_backend_get_files (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
+{
+	guint i;
+	guint len;
+	const gchar *package_id;
+
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+
+	len = g_strv_length (package_ids);
+	for (i=0; i<len; i++) {
+		package_id = package_ids[i];
+		if (g_strcmp0 (package_id, "powertop;1.8-1.fc8;i386;fedora") == 0)
+			pk_backend_job_files (job, package_id, "/usr/share/man/man1/boo;/usr/bin/xchat-gnome");
+		else if (g_strcmp0 (package_id, "kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed") == 0)
+			pk_backend_job_files (job, package_id, "/usr/share/man/man1;/usr/share/man/man1/gnome-power-manager.1.gz;/usr/lib/firefox-3.5.7/firefox");
+		else if (g_strcmp0 (package_id, "gtkhtml2;2.19.1-4.fc8;i386;fedora") == 0)
+			pk_backend_job_files (job, package_id, "/usr/share/man/man1;/usr/bin/ck-xinit-session;/lib/libselinux.so.1");
+		else
+			pk_backend_job_files (job, package_id, "/usr/share/gnome-power-manager;/usr/bin/ck-xinit-session");
+	}
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_get_requires:
+ */
+void
+pk_backend_get_requires (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **package_ids, gboolean recursive)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+				"glib2;2.14.0;i386;fedora", "The GLib library");
+	pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+				"gtk2;gtk2-2.11.6-6.fc8;i386;fedora", "GTK+ Libraries for GIMP");
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_get_update_detail_timeout:
+ **/
+static gboolean
+pk_backend_get_update_detail_timeout (gpointer data)
+{
+	guint i;
+	guint len;
+	const gchar *package_id;
+	PkBackendJob *job = (PkBackendJob *) data;
+	const gchar *changelog;
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	/* dummy */
+	changelog = "**Thu Mar 12 2009** Adam Jackson <ajax at redhat.com> 1.6.0-13\n"
+		    "- xselinux-1.6.0-selinux-nlfd.patch: Acquire the netlink socket from selinux,\n"
+		    "  check it ourselves rather than having libselinux bang on it all the time.\n"
+		    "\n"
+		    "**Wed Mar 11 2009** Adam Jackson <ajax at redhat.com> 1.6.0-10\n"
+		    "- xserver-1.6.0-selinux-less.patch: Don't init selinux unless the policy\n"
+		    "  says to be an object manager.\n"
+		    "\n"
+		    "**Wed Mar 11 2009** Adam Jackson <ajax at redhat.com> 1.6.0-11\n"
+		    "- xserver-1.6.0-less-acpi-brokenness.patch: Don't build the (broken)\n"
+		    "  ACPI code.\n"
+		    "\n"
+		    "**Wed Mar 11 2009** Adam Jackson <ajax at redhat.com> 1.6.0-12\n"
+		    "- Requires: pixman >= 0.14.0\n"
+		    "\n"
+		    "**Fri Mar  6 2009** Adam Jackson <ajax at redhat.com> 1.6.0-8\n"
+		    "- xserver-1.6.0-primary.patch: Really, only look at VGA devices. (#488869)\n";
+
+	/* each one has a different detail for testing */
+	pk_backend_job_set_percentage (job, 0);
+	len = g_strv_length (priv->package_ids);
+	for (i=0; i<len; i++) {
+		const gchar *to_array1[] = { NULL, NULL, NULL };
+		const gchar *to_array2[] = { NULL, NULL, NULL };
+		const gchar *to_array3[] = { NULL, NULL, NULL };
+		const gchar *to_array4[] = { NULL, NULL, NULL };
+		package_id = priv->package_ids[i];
+		if (g_strcmp0 (package_id, "powertop;1.8-1.fc8;i386;fedora") == 0) {
+			to_array1[0] = "powertop;1.7-1.fc8;i386;installed";
+			to_array2[0] = "http://www.distro-update.org/page?moo";
+			to_array3[0] = "http://bgzilla.fd.org/result.php?#12344";
+			pk_backend_job_update_detail (job, package_id,
+						      (gchar**) to_array1,
+						      NULL,
+						      (gchar**) to_array2,
+						      (gchar**) to_array3,
+						      NULL,
+						      PK_RESTART_ENUM_NONE,
+						      "Update to newest upstream source",
+						      changelog, PK_UPDATE_STATE_ENUM_STABLE,
+						      "2009-11-17T09:19:00", "2009-11-19T09:19:00");
+		} else if (g_strcmp0 (package_id, "kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed") == 0) {
+			to_array1[0] = "kernel;2.6.22-0.104.rc3.git6.fc8;i386;installed";
+			to_array1[1] = "kernel;2.6.22-0.105.rc3.git7.fc8;i386;installed";
+			to_array2[0] = "http://www.distro-update.org/page?moo";
+			to_array3[0] = "http://bgzilla.fd.org/result.php?#12344";
+			to_array3[1] = "http://bgzilla.gnome.org/result.php?#9876";
+			to_array4[0] = "http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-3381;CVE-2007-3381";
+			pk_backend_job_update_detail (job, package_id,
+						      (gchar**) to_array1,
+						      NULL,
+						      (gchar**) to_array2,
+						      (gchar**) to_array3,
+						      (gchar**) to_array4,
+						      PK_RESTART_ENUM_SYSTEM,
+						      "Update to newest upstream version.\n"
+						      "* This should fix many driver bugs when using nouveau\n"
+						      " * This also introduces the new `frobnicator` driver for *vibrating* rabbit hardware.",
+						      changelog,
+						      PK_UPDATE_STATE_ENUM_UNSTABLE,
+						      "2008-06-28T09:19:00",
+						      NULL);
+		} else if (g_strcmp0 (package_id, "gtkhtml2;2.19.1-4.fc8;i386;fedora") == 0) {
+			to_array1[0] = "gtkhtml2;2.18.1-22.fc8;i386;installed";
+			to_array2[0] = "http://www.distro-update.org/page?moo";
+			to_array3[0] = "http://bgzilla.gnome.org/result.php?#9876";
+			pk_backend_job_update_detail (job, package_id,
+						      (gchar**) to_array1,
+						      NULL,
+						      (gchar**) to_array2,
+						      (gchar**) to_array3,
+						      NULL,
+						      PK_RESTART_ENUM_SESSION,
+						      "Update to latest *whizz* **bang** version\n"
+						      "* support this new thing\n"
+						      "* something else\n"
+						      "- and that new thing",
+						      changelog,
+						      PK_UPDATE_STATE_ENUM_UNKNOWN,
+						      "2008-07-25T09:19:00",
+						      NULL);
+
+		} else if (g_strcmp0 (package_id, "vino;2.24.2.fc9;i386;fedora") == 0) {
+			to_array1[0] = "vino;2.24.1.fc9;i386;fedora";
+			pk_backend_job_update_detail (job, package_id,
+						      (gchar**) to_array1,
+						      NULL,
+						      NULL,
+						      NULL,
+						      NULL,
+						      PK_RESTART_ENUM_NONE,
+						      "Cannot get update as update conflics with vncviewer",
+						      changelog,
+						      PK_UPDATE_STATE_ENUM_UNKNOWN,
+						      "2008-07-25",
+						      NULL);
+		} else {
+			/* signal to UI */
+			pk_backend_job_error_code (job,
+						   PK_ERROR_ENUM_INTERNAL_ERROR,
+						   "the package update detail was not found for %s",
+						   package_id);
+		}
+	}
+	pk_backend_job_set_percentage (job, 100);
+	pk_backend_job_finished (job);
+	job_data->signal_timeout = 0;
+	return FALSE;
+}
+
+/**
+ * pk_backend_get_update_detail:
+ */
+void
+pk_backend_get_update_detail (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
+{
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	priv->package_ids = package_ids;
+	job_data->signal_timeout = g_timeout_add (500, pk_backend_get_update_detail_timeout, job);
+}
+
+/**
+ * pk_backend_get_updates_timeout:
+ **/
+static gboolean
+pk_backend_get_updates_timeout (gpointer data)
+{
+	PkBackendJob *job = (PkBackendJob *) data;
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	if (priv->use_blocked) {
+		if (!priv->updated_powertop && !priv->updated_kernel && !priv->updated_gtkhtml) {
+			pk_backend_job_package (job, PK_INFO_ENUM_BLOCKED,
+						"vino;2.24.2.fc9;i386;fedora",
+						"Remote desktop server for the desktop");
+		}
+	}
+	if (!priv->updated_powertop) {
+		pk_backend_job_package (job, PK_INFO_ENUM_NORMAL,
+					"powertop;1.8-1.fc8;i386;fedora",
+					"Power consumption monitor");
+	}
+	if (!priv->updated_kernel) {
+		pk_backend_job_package (job, PK_INFO_ENUM_BUGFIX,
+					"kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed",
+					"The Linux kernel (the core of the Linux operating system)");
+	}
+	if (!priv->updated_gtkhtml) {
+		pk_backend_job_package (job, PK_INFO_ENUM_SECURITY,
+					"gtkhtml2;2.19.1-4.fc8;i386;fedora",
+					"An HTML widget for GTK+ 2.0");
+	}
+	pk_backend_job_finished (job);
+	job_data->signal_timeout = 0;
+	return FALSE;
+}
+
+/**
+ * pk_backend_get_updates:
+ */
+void
+pk_backend_get_updates (PkBackend *backend, PkBackendJob *job, PkBitfield filters)
+{
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_set_percentage (job, PK_BACKEND_PERCENTAGE_INVALID);
+	/* check network state */
+	if (!pk_backend_is_online (backend)) {
+		pk_backend_job_error_code (job, PK_ERROR_ENUM_NO_NETWORK, "Cannot check when offline");
+		pk_backend_job_finished (job);
+		return;
+	}
+	job_data->signal_timeout = g_timeout_add (1000, pk_backend_get_updates_timeout, job);
+}
+
+/**
+ * pk_backend_install_thread:
+ */
+static void
+pk_backend_install_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	gchar **package_ids;
+	PkBitfield transaction_flags;
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	g_variant_get (params, "(t^a&s)",
+		       &transaction_flags,
+		       &package_ids);
+
+	while (TRUE) {
+
+		/* check cancelled */
+		if (g_cancellable_is_cancelled (job_data->cancellable)) {
+			pk_backend_job_error_code (job,
+						   PK_ERROR_ENUM_TRANSACTION_CANCELLED,
+						   "The task was stopped successfully");
+			pk_backend_job_finished (job);
+			break;
+		}
+
+		if (job_data->progress_percentage == 100) {
+			pk_backend_job_finished (job);
+			break;
+		}
+
+		if (job_data->progress_percentage == 30) {
+			pk_backend_job_set_allow_cancel (job, FALSE);
+			pk_backend_job_package (job, PK_INFO_ENUM_INSTALLING,
+						"gtkhtml2;2.19.1-4.fc8;i386;fedora",
+						"An HTML widget for GTK+ 2.0");
+			pk_backend_job_set_status (job, PK_STATUS_ENUM_INSTALL);
+		}
+
+		if (job_data->progress_percentage == 50) {
+			pk_backend_job_package (job, PK_INFO_ENUM_INSTALLING,
+						"gtkhtml2-devel;2.19.1-0.fc8;i386;fedora",
+						"Devel files for gtkhtml");
+			/* this duplicate package should be ignored */
+			pk_backend_job_package (job, PK_INFO_ENUM_INSTALLING,
+						"gtkhtml2-devel;2.19.1-0.fc8;i386;fedora", NULL);
+			pk_backend_job_set_status (job, PK_STATUS_ENUM_INSTALL);
+		}
+
+		job_data->progress_percentage += 1;
+		pk_backend_job_set_percentage (job, job_data->progress_percentage);
+
+		/* sleep 100 milliseconds */
+		g_usleep (100000);
+	}
+
+	/* unlock backend again */
+	priv->fake_db_locked = FALSE;
+	pk_backend_job_set_locked (job, FALSE);
+}
+
+/**
+ * pk_backend_install_packages:
+ */
+void
+pk_backend_install_packages (PkBackend *backend, PkBackendJob *job, PkBitfield transaction_flags, gchar **package_ids)
+{
+	const gchar *license_agreement;
+	const gchar *eula_id;
+	gboolean has_eula;
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	/* simulate */
+	if (pk_bitfield_contain (transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) {
+		pk_backend_job_set_status (job, PK_STATUS_ENUM_DEP_RESOLVE);
+
+		pk_backend_job_package (job, PK_INFO_ENUM_REMOVING,
+					"powertop;1.8-1.fc8;i386;fedora", "Power consumption monitor");
+
+		pk_backend_job_package (job, PK_INFO_ENUM_INSTALLING,
+					"gtk2;2.11.6-6.fc8;i386;fedora", "GTK+ Libraries for GIMP");
+
+		pk_backend_job_package (job, PK_INFO_ENUM_UPDATING,
+					"lib7;7.0.1-6.fc13;i386;fedora", "C Libraries");
+
+		pk_backend_job_package (job, PK_INFO_ENUM_REINSTALLING,
+					"libssl;3.5.7-2.fc13;i386;fedora", "SSL Libraries");
+
+		pk_backend_job_package (job, PK_INFO_ENUM_DOWNGRADING,
+					"kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed", "The Linux kernel (the core of the Linux operating system)");
+
+		pk_backend_job_package (job, PK_INFO_ENUM_UPDATING,
+					"gtkhtml2;2.19.1-4.fc8;i386;fedora", "An HTML widget for GTK+ 2.0");
+
+		pk_backend_job_finished (job);
+		return;
+	}
+
+	if (g_strcmp0 (package_ids[0], "vips-doc;7.12.4-2.fc8;noarch;linva") == 0) {
+		if (priv->use_gpg && !priv->has_signature) {
+			pk_backend_job_repo_signature_required (job, package_ids[0], "updates",
+								"http://example.com/gpgkey",
+								"Test Key (Fedora) fedora at example.com",
+								"BB7576AC",
+								"D8CC 06C2 77EC 9C53 372F C199 B1EE 1799 F24F 1B08",
+								"2007-10-04", PK_SIGTYPE_ENUM_GPG);
+			pk_backend_job_error_code (job, PK_ERROR_ENUM_GPG_FAILURE,
+						   "GPG signed package could not be verified");
+			pk_backend_job_finished (job);
+			return;
+		}
+		eula_id = "eula_hughsie_dot_com";
+		has_eula = pk_backend_is_eula_valid (backend, eula_id);
+		if (priv->use_eula && !has_eula) {
+			license_agreement = "Narrator: In A.D. 2101, war was beginning.\n"
+					    "Captain: What happen ?\n"
+					    "Mechanic: Somebody set up us the bomb.\n\n"
+					    "Operator: We get signal.\n"
+					    "Captain: What !\n"
+					    "Operator: Main screen turn on.\n"
+					    "Captain: It's you !!\n"
+					    "CATS: How are you gentlemen !!\n"
+					    "CATS: All your base are belong to us.\n"
+					    "CATS: You are on the way to destruction.\n\n"
+					    "Captain: What you say !!\n"
+					    "CATS: You have no chance to survive make your time.\n"
+					    "CATS: Ha Ha Ha Ha ....\n\n"
+					    "Operator: Captain!! *\n"
+					    "Captain: Take off every 'ZIG' !!\n"
+					    "Captain: You know what you doing.\n"
+					    "Captain: Move 'ZIG'.\n"
+					    "Captain: For great justice.\n";
+			pk_backend_job_eula_required (job, eula_id, package_ids[0],
+						      "CATS Inc.", license_agreement);
+			pk_backend_job_error_code (job, PK_ERROR_ENUM_NO_LICENSE_AGREEMENT,
+						   "licence not installed so cannot install");
+			pk_backend_job_finished (job);
+			return;
+		}
+		if (priv->use_media) {
+			priv->use_media = FALSE;
+			pk_backend_job_media_change_required (job, PK_MEDIA_TYPE_ENUM_DVD, "linux-disk-1of7", "Linux Disc 1 of 7");
+			pk_backend_job_error_code (job, PK_ERROR_ENUM_MEDIA_CHANGE_REQUIRED,
+						   "additional media linux-disk-1of7 required");
+			pk_backend_job_finished (job);
+			return;
+		}
+	}
+
+	if ((g_strcmp0 (package_ids[0], "foobar;1.1.0;i386;debian") != 0) && (g_strcmp0 (package_ids[0], "libawesome;42;i386;debian") != 0)) {
+		if (priv->use_trusted && pk_bitfield_contain (transaction_flags, PK_TRANSACTION_FLAG_ENUM_ONLY_TRUSTED)) {
+			pk_backend_job_error_code (job, PK_ERROR_ENUM_CANNOT_INSTALL_REPO_UNSIGNED,
+						"Can't install as untrusted");
+			pk_backend_job_finished (job);
+			return;
+		}
+	}
+
+	/* check if something else locked the "fake-db" */
+	if (priv->fake_db_locked) {
+		pk_backend_job_error_code (job, PK_ERROR_ENUM_LOCK_REQUIRED,
+						   "we require lock");
+		pk_backend_job_finished (job);
+		return;
+	}
+
+	/* we're now locked */
+	priv->fake_db_locked = TRUE;
+	pk_backend_job_set_locked (job, TRUE);
+
+	pk_backend_job_set_allow_cancel (job, TRUE);
+	job_data->progress_percentage = 0;
+	pk_backend_job_package (job, PK_INFO_ENUM_DOWNLOADING,
+				"gtkhtml2;2.19.1-4.fc8;i386;fedora",
+				"An HTML widget for GTK+ 2.0");
+
+	pk_backend_job_thread_create (job, pk_backend_install_thread, NULL, NULL);
+}
+
+/**
+ * pk_backend_install_signature:
+ */
+void
+pk_backend_install_signature (PkBackend *backend, PkBackendJob *job, PkSigTypeEnum type,
+			   const gchar *key_id, const gchar *package_id)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_INSTALL);
+	if (type == PK_SIGTYPE_ENUM_GPG &&
+	    /* egg_strequal (package_id, "vips-doc;7.12.4-2.fc8;noarch;linva") && */
+	    g_strcmp0 (key_id, "BB7576AC") == 0) {
+		g_debug ("installed signature %s for %s", key_id, package_id);
+		priv->has_signature = TRUE;
+	} else {
+		pk_backend_job_error_code (job, PK_ERROR_ENUM_GPG_FAILURE,
+					   "GPG key %s not recognised for package_id %s",
+					   key_id, package_id);
+	}
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_refresh_cache_timeout:
+ */
+static gboolean
+pk_backend_install_files_timeout (gpointer data)
+{
+	PkBackendJob *job = (PkBackendJob *) data;
+	pk_backend_job_finished (job);
+	return FALSE;
+}
+
+/**
+ * pk_backend_install_files:
+ */
+void
+pk_backend_install_files (PkBackend *backend, PkBackendJob *job, PkBitfield transaction_flags, gchar **full_paths)
+{
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_INSTALL);
+	pk_backend_job_set_percentage (job, 101);
+	job_data->signal_timeout = g_timeout_add (2000, pk_backend_install_files_timeout, job);
+}
+
+/**
+ * pk_backend_refresh_cache_thread:
+ */
+static void
+pk_backend_refresh_cache_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	gboolean force;
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	g_variant_get (params, "(b)",
+		       &force);
+
+	while (TRUE) {
+
+		/* check cancelled */
+		if (g_cancellable_is_cancelled (job_data->cancellable)) {
+			pk_backend_job_error_code (job,
+						   PK_ERROR_ENUM_TRANSACTION_CANCELLED,
+						   "The task was stopped successfully");
+			pk_backend_job_finished (job);
+			break;
+		}
+
+		if (job_data->progress_percentage == 100) {
+			pk_backend_job_finished (job);
+			break;
+		}
+
+		if (job_data->progress_percentage == 80)
+			pk_backend_job_set_allow_cancel (job, FALSE);
+		job_data->progress_percentage += 10;
+		pk_backend_job_set_percentage (job, job_data->progress_percentage);
+
+		/* sleep 500 milliseconds */
+		g_usleep (500000);
+	}
+
+	/* unlock backend again */
+	priv->fake_db_locked = FALSE;
+	pk_backend_job_set_locked (job, FALSE);
+}
+
+/**
+ * pk_backend_refresh_cache:
+ */
+void
+pk_backend_refresh_cache (PkBackend *backend, PkBackendJob *job, gboolean force)
+{
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+	job_data->progress_percentage = 0;
+
+	/* reset */
+	priv->updated_gtkhtml = FALSE;
+	priv->updated_kernel = FALSE;
+	priv->updated_powertop = FALSE;
+
+	pk_backend_job_set_allow_cancel (job, TRUE);
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_REFRESH_CACHE);
+
+	/* check if some other action has lock */
+	if (priv->fake_db_locked) {
+		pk_backend_job_error_code (job, PK_ERROR_ENUM_LOCK_REQUIRED,
+						   "we require lock");
+		pk_backend_job_finished (job);
+		return;
+	}
+
+	/* we're now locked */
+	priv->fake_db_locked = TRUE;
+	pk_backend_job_set_locked (job, TRUE);
+
+	pk_backend_job_thread_create (job, pk_backend_refresh_cache_thread, NULL, NULL);
+}
+
+/**
+ * pk_backend_resolve_thread:
+ */
+static void
+pk_backend_resolve_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	gchar **search;
+	guint i;
+	guint len;
+	PkBitfield filters;
+
+	g_variant_get (params, "(t^a&s)",
+		       &filters,
+		       &search);
+
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_set_percentage (job, 0);
+
+	/* each one has a different detail for testing */
+	len = g_strv_length (search);
+	for (i=0; i<len; i++) {
+		if (g_strcmp0 (search[i], "vips-doc") == 0 || g_strcmp0 (search[i], "vips-doc;7.12.4-2.fc8;noarch;linva") == 0) {
+			if (!pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED)) {
+				pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+							"vips-doc;7.12.4-2.fc8;noarch;linva",
+							"The vips documentation package.");
+			}
+		} else if (g_strcmp0 (search[i], "glib2") == 0 || g_strcmp0 (search[i], "glib2;2.14.0;i386;fedora") == 0) {
+			if (!pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED)) {
+				pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+							"glib2;2.14.0;i386;fedora",
+							"The GLib library");
+			}
+		} else if (g_strcmp0 (search[i], "powertop") == 0 || g_strcmp0 (search[i], "powertop;1.8-1.fc8;i386;fedora") == 0)
+			pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+						"powertop;1.8-1.fc8;i386;fedora",
+						"Power consumption monitor");
+		else if (g_strcmp0 (search[i], "kernel") == 0 || g_strcmp0 (search[i], "kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed") == 0)
+			pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+						"kernel;2.6.23-0.115.rc3.git1.fc8;i386;installed",
+						"The Linux kernel (the core of the Linux operating system)");
+		else if (g_strcmp0 (search[i], "gtkhtml2") == 0 || g_strcmp0 (search[i], "gtkhtml2;2.19.1-4.fc8;i386;fedora") == 0)
+			pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+						"gtkhtml2;2.19.1-4.fc8;i386;fedora",
+						"An HTML widget for GTK+ 2.0");
+		else if (g_strcmp0 (search[i], "foobar") == 0 || g_strcmp0 (search[i], "foobar;1.1.0;i386;debian") == 0) {
+			if (!pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED)) {
+				pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+							"foobar;1.1.0;i386;debian",
+							"The awesome FooBar application");
+			}
+		} else if (g_strcmp0 (search[i], "libawesome") == 0 || g_strcmp0 (search[i], "libawesome;42;i386;debian") == 0) {
+			if (!pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED)) {
+				pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+							"libawesome;42;i386;debian",
+							"Simple library for warping reality");
+			}
+		}
+	}
+	pk_backend_job_set_percentage (job, 100);
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_resolve:
+ */
+void
+pk_backend_resolve (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **packages)
+{
+	pk_backend_job_thread_create (job, pk_backend_resolve_thread, NULL, NULL);
+}
+
+/**
+ * pk_backend_remove_packages:
+ */
+void
+pk_backend_remove_packages (PkBackend *backend, PkBackendJob *job,
+			    PkBitfield transaction_flags,
+			    gchar **package_ids,
+			    gboolean allow_deps,
+			    gboolean autoremove)
+{
+	/* check if something else locked the "fake-db" */
+	if (priv->fake_db_locked) {
+		pk_backend_job_error_code (job, PK_ERROR_ENUM_LOCK_REQUIRED,
+						   "we require lock");
+		pk_backend_job_finished (job);
+		return;
+	}
+
+	/* we're now locked */
+	priv->fake_db_locked = TRUE;
+	pk_backend_job_set_locked (job, TRUE);
+
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_REMOVE);
+	pk_backend_job_error_code (job, PK_ERROR_ENUM_NO_NETWORK, "No network connection available");
+	pk_backend_job_finished (job);
+
+	/* unlock backend again */
+	priv->fake_db_locked = FALSE;
+	pk_backend_job_set_locked (job, FALSE);
+}
+
+/**
+ * pk_backend_search_details_thread:
+ **/
+static void
+pk_backend_search_details_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_set_allow_cancel (job, TRUE);
+	pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+				"vips-doc;7.12.4-2.fc8;noarch;linva",
+				"The vips \"documentation\" package.");
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_search_details:
+ */
+void
+pk_backend_search_details (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
+{
+	pk_backend_job_thread_create (job, pk_backend_search_details_thread, NULL, NULL);
+}
+
+/**
+ * pk_backend_search_files:
+ */
+void
+pk_backend_search_files (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_set_allow_cancel (job, TRUE);
+	if (!pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED))
+		pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+					"vips-doc;7.12.4-2.fc8;noarch;linva",
+					"The vips documentation package");
+	else
+		pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+					"vips-doc;7.12.4-2.fc8;noarch;linva",
+					"The vips documentation package");
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_search_groups:
+ */
+void
+pk_backend_search_groups (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_set_allow_cancel (job, TRUE);
+	pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+				"vips-doc;7.12.4-2.fc8;noarch;linva",
+				"The vips documentation package.");
+	pk_backend_job_package (job, PK_INFO_ENUM_AVAILABLE,
+				"bǣwulf-utf8;0.1;noarch;hughsie",
+				"The bǣwulf server test name.");
+	pk_backend_job_finished (job);
+}
+
+/**
+ * pk_backend_search_names_thread:
+ **/
+static void
+pk_backend_search_names_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	guint i;
+	gchar *locale;
+	PkRoleEnum role;
+	gchar **search;
+	PkBitfield filters;
+	PkBackendDummyJobData *job_data = pk_backend_job_get_user_data (job);
+
+	role = pk_backend_job_get_role (job);
+	if (role == PK_ROLE_ENUM_GET_PACKAGES) {
+		g_variant_get (params, "(t)",
+			       &filters);
+	} else {
+		g_variant_get (params, "(t^a&s)",
+			       &filters,
+			       &search);
+	}
+
+	/* delay, checking cancelled */
+	for (i = 0; i < 1000; i++) {
+		if (g_cancellable_is_cancelled (job_data->cancellable)) {
+			pk_backend_job_error_code (job,
+						   PK_ERROR_ENUM_TRANSACTION_CANCELLED,
+						   "The task was stopped successfully");
+			goto out;
+		}
+		g_usleep (2000);
+	}
+
+	locale = pk_backend_job_get_locale (job);
+	if (g_strcmp0 (locale, "en_GB.utf8") != 0) {
+		pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+					"evince;0.9.3-5.fc8;i386;installed",

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-soc-all mailing list