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 +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 +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 +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 +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@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 - 1.0.5-1 - Update to 1.0.5 +- Backport new missing gstreamer codecs API * Fri Feb 06 2015 Richard Hughes - 1.0.4-2 - Adapt to the new hawkey API.