[PackageKit] Backport new missing gstreamer codecs API
Kalev Lember
kalev at fedoraproject.org
Sat Feb 21 16:47:43 UTC 2015
commit 180c50082d56a51b12e158f55a481bf2e9ba699a
Author: Kalev Lember <kalevlember at gmail.com>
Date: Sat Feb 21 17:28:38 2015 +0100
Backport new missing gstreamer codecs API
PackageKit-new-missing-codecs-API.patch | 362 ++++++++++++++++++++++++++++++++
PackageKit.spec | 4 +
2 files changed, 366 insertions(+)
---
diff --git a/PackageKit-new-missing-codecs-API.patch b/PackageKit-new-missing-codecs-API.patch
new file mode 100644
index 0000000..07dbaac
--- /dev/null
+++ b/PackageKit-new-missing-codecs-API.patch
@@ -0,0 +1,362 @@
+From 07376458f5c490f2e6bfa682692fbe1b2dc07784 Mon Sep 17 00:00:00 2001
+From: Kalev Lember <kalevlember at gmail.com>
+Date: Mon, 2 Feb 2015 13:57:17 +0100
+Subject: [PATCH 1/4] gstreamer plugin: Add support for v2 of the PK session
+ service interface
+
+This adds support for the Modify2 interface, but keeps the older
+interface supported as a fallback.
+---
+ contrib/gstreamer-plugin/pk-gstreamer-install.c | 115 +++++++++++++++++-------
+ 1 file changed, 85 insertions(+), 30 deletions(-)
+
+diff --git a/contrib/gstreamer-plugin/pk-gstreamer-install.c b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+index ad6cf98..c2a5cfe 100644
+--- a/contrib/gstreamer-plugin/pk-gstreamer-install.c
++++ b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+@@ -259,6 +259,76 @@ out:
+ return suffix;
+ }
+
++static gboolean
++pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, guint timestamp, GError **error)
++{
++ _cleanup_object_unref_ GDBusProxy *proxy = NULL;
++ _cleanup_variant_unref_ GVariant *value = NULL;
++
++ /* get proxy */
++ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
++ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
++ NULL,
++ "org.freedesktop.PackageKit",
++ "/org/freedesktop/PackageKit",
++ "org.freedesktop.PackageKit.Modify2",
++ NULL,
++ error);
++ if (proxy != NULL) {
++ /* invoke the method */
++ value = g_dbus_proxy_call_sync (proxy,
++ "InstallGStreamerResources",
++ g_variant_new ("(^a&sssu)",
++ resources,
++ "hide-finished",
++ desktop_id,
++ timestamp),
++ G_DBUS_CALL_FLAGS_NONE,
++ 60 * 60 * 1000, /* 1 hour */
++ NULL,
++ error);
++ if (value != NULL)
++ return TRUE;
++ }
++
++ return FALSE;
++}
++
++static gboolean
++pk_gst_dbus_install_resources_compat (gchar **resources, gint xid, GError **error)
++{
++ _cleanup_object_unref_ GDBusProxy *proxy = NULL;
++ _cleanup_variant_unref_ GVariant *value = NULL;
++
++ /* get proxy */
++ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
++ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
++ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
++ NULL,
++ "org.freedesktop.PackageKit",
++ "/org/freedesktop/PackageKit",
++ "org.freedesktop.PackageKit.Modify",
++ NULL,
++ error);
++ if (proxy != NULL) {
++ /* invoke the method */
++ value = g_dbus_proxy_call_sync (proxy,
++ "InstallGStreamerResources",
++ g_variant_new ("(u^a&ss)",
++ xid,
++ resources,
++ "hide-finished"),
++ G_DBUS_CALL_FLAGS_NONE,
++ 60 * 60 * 1000, /* 1 hour */
++ NULL,
++ error);
++ if (value != NULL)
++ return TRUE;
++ }
++
++ return FALSE;
++}
+
+ /**
+ * main:
+@@ -269,18 +339,21 @@ main (int argc, gchar **argv)
+ GOptionContext *context;
+ guint i;
+ guint len;
++ gboolean ret;
+ gchar **codecs = NULL;
+ gint xid = 0;
++ guint timestamp = 0;
+ const gchar *suffix;
+ gchar *resource;
+ _cleanup_error_free_ GError *error = NULL;
+- _cleanup_object_unref_ GDBusProxy *proxy = NULL;
++ _cleanup_free_ gchar *desktop_id = NULL;
+ _cleanup_ptrarray_unref_ GPtrArray *array = NULL;
+ _cleanup_strv_free_ gchar **resources = NULL;
+- _cleanup_variant_unref_ GVariant *value = NULL;
+
+ const GOptionEntry options[] = {
+ { "transient-for", '\0', 0, G_OPTION_ARG_INT, &xid, "The XID of the parent window", NULL },
++ { "desktop-id", '\0', 0, G_OPTION_ARG_STRING, &desktop_id, "The desktop ID of the calling application", NULL },
++ { "timestamp", '\0', 0, G_OPTION_ARG_INT, ×tamp, "The timestamp of the user interaction that triggered this call", NULL },
+ { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &codecs, "GStreamer install infos", NULL },
+ { NULL }
+ };
+@@ -307,22 +380,7 @@ main (int argc, gchar **argv)
+
+ /* this is our parent window */
+ g_message ("PackageKit: xid = %i", xid);
+-
+- /* get proxy */
+- proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+- G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
+- NULL,
+- "org.freedesktop.PackageKit",
+- "/org/freedesktop/PackageKit",
+- "org.freedesktop.PackageKit.Modify",
+- NULL,
+- &error);
+- if (proxy == NULL) {
+- g_warning ("Cannot connect to PackageKit session service: %s",
+- error->message);
+- return GST_INSTALL_PLUGINS_ERROR;
+- }
++ g_message ("PackageKit: desktop_id = %s", desktop_id);
+
+ /* use a ()(64bit) suffix for 64 bit */
+ suffix = pk_gst_get_arch_suffix ();
+@@ -384,18 +442,15 @@ main (int argc, gchar **argv)
+ /* convert to a GStrv */
+ resources = pk_ptr_array_to_strv (array);
+
+- /* invoke the method */
+- value = g_dbus_proxy_call_sync (proxy,
+- "InstallGStreamerResources",
+- g_variant_new ("(u^a&ss)",
+- xid,
+- resources,
+- "hide-finished"),
+- G_DBUS_CALL_FLAGS_NONE,
+- 60 * 60 * 1000, /* 1 hour */
+- NULL,
+- &error);
+- if (value == NULL) {
++ /* first try the new interface */
++ ret = pk_gst_dbus_install_resources (resources, desktop_id, timestamp, &error);
++ if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) {
++ /* ... and if that fails, fall back to the compat interface */
++ g_clear_error (&error);
++ g_message ("PackageKit: falling back to compat dbus interface");
++ ret = pk_gst_dbus_install_resources_compat (resources, xid, &error);
++ }
++ if (!ret) {
+ /* use the error string to return a good GStreamer exit code */
+ g_message ("PackageKit: Did not install codec: %s", error->message);
+ if (g_strrstr (error->message, "did not agree to search") != NULL)
+--
+2.3.0
+
+From aa8b11490e1ef3c687c85dbef126d23320c8deca Mon Sep 17 00:00:00 2001
+From: Kalev Lember <kalevlember at gmail.com>
+Date: Tue, 10 Feb 2015 13:33:06 +0100
+Subject: [PATCH 2/4] gstreamer plugin: Add a new --interaction command line
+ option
+
+This allows passing in e.g --interaction=hide-confirm-search which would
+tell the PK session service implementation that it shouldn't ask for
+confirmation again, since the app has already done that.
+---
+ contrib/gstreamer-plugin/pk-gstreamer-install.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/contrib/gstreamer-plugin/pk-gstreamer-install.c b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+index c2a5cfe..a89d8a4 100644
+--- a/contrib/gstreamer-plugin/pk-gstreamer-install.c
++++ b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+@@ -260,7 +260,7 @@ out:
+ }
+
+ static gboolean
+-pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, guint timestamp, GError **error)
++pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, guint timestamp, const gchar *interaction, GError **error)
+ {
+ _cleanup_object_unref_ GDBusProxy *proxy = NULL;
+ _cleanup_variant_unref_ GVariant *value = NULL;
+@@ -281,7 +281,7 @@ pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, guint
+ "InstallGStreamerResources",
+ g_variant_new ("(^a&sssu)",
+ resources,
+- "hide-finished",
++ interaction,
+ desktop_id,
+ timestamp),
+ G_DBUS_CALL_FLAGS_NONE,
+@@ -347,6 +347,7 @@ main (int argc, gchar **argv)
+ gchar *resource;
+ _cleanup_error_free_ GError *error = NULL;
+ _cleanup_free_ gchar *desktop_id = NULL;
++ _cleanup_free_ gchar *interaction = NULL;
+ _cleanup_ptrarray_unref_ GPtrArray *array = NULL;
+ _cleanup_strv_free_ gchar **resources = NULL;
+
+@@ -354,6 +355,7 @@ main (int argc, gchar **argv)
+ { "transient-for", '\0', 0, G_OPTION_ARG_INT, &xid, "The XID of the parent window", NULL },
+ { "desktop-id", '\0', 0, G_OPTION_ARG_STRING, &desktop_id, "The desktop ID of the calling application", NULL },
+ { "timestamp", '\0', 0, G_OPTION_ARG_INT, ×tamp, "The timestamp of the user interaction that triggered this call", NULL },
++ { "interaction", '\0', 0, G_OPTION_ARG_STRING, &interaction, "Interaction mode specifying which UI elements should be shown", NULL },
+ { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &codecs, "GStreamer install infos", NULL },
+ { NULL }
+ };
+@@ -443,7 +445,7 @@ main (int argc, gchar **argv)
+ resources = pk_ptr_array_to_strv (array);
+
+ /* first try the new interface */
+- ret = pk_gst_dbus_install_resources (resources, desktop_id, timestamp, &error);
++ ret = pk_gst_dbus_install_resources (resources, desktop_id, timestamp, interaction, &error);
+ if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) {
+ /* ... and if that fails, fall back to the compat interface */
+ g_clear_error (&error);
+--
+2.3.0
+
+From 3bbea278b8f1b8208a937be779905978a6326e77 Mon Sep 17 00:00:00 2001
+From: Kalev Lember <kalevlember at gmail.com>
+Date: Fri, 13 Feb 2015 14:00:31 +0100
+Subject: [PATCH 3/4] gstreamer plugin: Adapt to gstreamer missing plugin
+ changes
+
+The final version that went into upstream gst-plugins-base passes
+--startup-notification-id instead of --timestamp.
+---
+ contrib/gstreamer-plugin/pk-gstreamer-install.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/contrib/gstreamer-plugin/pk-gstreamer-install.c b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+index a89d8a4..99b85f3 100644
+--- a/contrib/gstreamer-plugin/pk-gstreamer-install.c
++++ b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+@@ -260,7 +260,7 @@ out:
+ }
+
+ static gboolean
+-pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, guint timestamp, const gchar *interaction, GError **error)
++pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, const gchar *startup_id, const gchar *interaction, GError **error)
+ {
+ _cleanup_object_unref_ GDBusProxy *proxy = NULL;
+ _cleanup_variant_unref_ GVariant *value = NULL;
+@@ -279,11 +279,11 @@ pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, guint
+ /* invoke the method */
+ value = g_dbus_proxy_call_sync (proxy,
+ "InstallGStreamerResources",
+- g_variant_new ("(^a&sssu)",
++ g_variant_new ("(^a&ssss)",
+ resources,
+ interaction,
+ desktop_id,
+- timestamp),
++ startup_id),
+ G_DBUS_CALL_FLAGS_NONE,
+ 60 * 60 * 1000, /* 1 hour */
+ NULL,
+@@ -342,20 +342,20 @@ main (int argc, gchar **argv)
+ gboolean ret;
+ gchar **codecs = NULL;
+ gint xid = 0;
+- guint timestamp = 0;
+ const gchar *suffix;
+ gchar *resource;
+ _cleanup_error_free_ GError *error = NULL;
+ _cleanup_free_ gchar *desktop_id = NULL;
+ _cleanup_free_ gchar *interaction = NULL;
++ _cleanup_free_ gchar *startup_id = NULL;
+ _cleanup_ptrarray_unref_ GPtrArray *array = NULL;
+ _cleanup_strv_free_ gchar **resources = NULL;
+
+ const GOptionEntry options[] = {
+ { "transient-for", '\0', 0, G_OPTION_ARG_INT, &xid, "The XID of the parent window", NULL },
+ { "desktop-id", '\0', 0, G_OPTION_ARG_STRING, &desktop_id, "The desktop ID of the calling application", NULL },
+- { "timestamp", '\0', 0, G_OPTION_ARG_INT, ×tamp, "The timestamp of the user interaction that triggered this call", NULL },
+ { "interaction", '\0', 0, G_OPTION_ARG_STRING, &interaction, "Interaction mode specifying which UI elements should be shown", NULL },
++ { "startup-notification-id", '\0', 0, G_OPTION_ARG_STRING, &startup_id, "The startup notification ID for focus stealing prevention", NULL },
+ { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &codecs, "GStreamer install infos", NULL },
+ { NULL }
+ };
+@@ -445,7 +445,7 @@ main (int argc, gchar **argv)
+ resources = pk_ptr_array_to_strv (array);
+
+ /* first try the new interface */
+- ret = pk_gst_dbus_install_resources (resources, desktop_id, timestamp, interaction, &error);
++ ret = pk_gst_dbus_install_resources (resources, desktop_id, startup_id, interaction, &error);
+ if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) {
+ /* ... and if that fails, fall back to the compat interface */
+ g_clear_error (&error);
+--
+2.3.0
+
+From 0b2f0c75df4896ff96f07e5cf63356596f5106b4 Mon Sep 17 00:00:00 2001
+From: Kalev Lember <kalevlember at gmail.com>
+Date: Mon, 16 Feb 2015 17:57:08 +0100
+Subject: [PATCH 4/4] gstreamer plugin: Adapt to gnome-software session service
+ changes
+
+---
+ contrib/gstreamer-plugin/pk-gstreamer-install.c | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/contrib/gstreamer-plugin/pk-gstreamer-install.c b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+index 99b85f3..4cae3ba 100644
+--- a/contrib/gstreamer-plugin/pk-gstreamer-install.c
++++ b/contrib/gstreamer-plugin/pk-gstreamer-install.c
+@@ -259,6 +259,21 @@ out:
+ return suffix;
+ }
+
++static GVariant *
++make_platform_data (const gchar *startup_id)
++{
++ GVariantBuilder builder;
++
++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
++
++ if (startup_id && g_utf8_validate (startup_id, -1, NULL)) {
++ g_variant_builder_add (&builder, "{sv}",
++ "desktop-startup-id", g_variant_new_string (startup_id));
++ }
++
++ return g_variant_builder_end (&builder);
++}
++
+ static gboolean
+ pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, const gchar *startup_id, const gchar *interaction, GError **error)
+ {
+@@ -279,11 +294,11 @@ pk_gst_dbus_install_resources (gchar **resources, const gchar *desktop_id, const
+ /* invoke the method */
+ value = g_dbus_proxy_call_sync (proxy,
+ "InstallGStreamerResources",
+- g_variant_new ("(^a&ssss)",
++ g_variant_new ("(^a&sss at a{sv})",
+ resources,
+ interaction,
+ desktop_id,
+- startup_id),
++ make_platform_data (startup_id)),
+ G_DBUS_CALL_FLAGS_NONE,
+ 60 * 60 * 1000, /* 1 hour */
+ NULL,
+--
+2.3.0
+
diff --git a/PackageKit.spec b/PackageKit.spec
index 5ca3aaf..d6dd2f3 100644
--- a/PackageKit.spec
+++ b/PackageKit.spec
@@ -17,6 +17,8 @@ Source1: cached-metadata.tar
# Fedora-specific: set Vendor.conf up for Fedora.
Patch0: PackageKit-0.3.8-Fedora-Vendor.conf.patch
+# Backported from upstream
+Patch1: PackageKit-new-missing-codecs-API.patch
Requires: %{name}-glib%{?_isa} = %{version}-%{release}
Requires: shared-mime-info
@@ -173,6 +175,7 @@ using PackageKit.
%prep
%setup -q
%patch0 -p1 -b .fedora
+%patch1 -p1 -b .new-missing-codecs-API
%build
%configure \
@@ -313,6 +316,7 @@ systemctl disable packagekit-offline-update.service > /dev/null 2>&1 || :
%changelog
* Sat Feb 21 2015 Kalev Lember <kalevlember at gmail.com> - 1.0.5-1
- Update to 1.0.5
+- Backport new missing gstreamer codecs API
* Fri Feb 06 2015 Richard Hughes <rhughes at redhat.com> - 1.0.4-2
- Adapt to the new hawkey API.
More information about the scm-commits
mailing list