Hello community, here is the log from the commit of package gupnp for openSUSE:Factory checked in at 2020-01-08 19:32:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gupnp (Old) and /work/SRC/openSUSE:Factory/.gupnp.new.6675 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gupnp" Wed Jan 8 19:32:10 2020 rev:61 rq:761006 version:1.2.2 Changes: -------- --- /work/SRC/openSUSE:Factory/gupnp/gupnp.changes 2019-06-24 21:47:54.451852352 +0200 +++ /work/SRC/openSUSE:Factory/.gupnp.new.6675/gupnp.changes 2020-01-08 19:32:14.792594678 +0100 @@ -1,0 +2,17 @@ +Thu Jan 2 13:05:39 UTC 2020 - Bjørn Lie <[email protected]> + +- Update to version 1.2.2: + + Fix macOS dylib versioning. + + Fix endless loop on early notify. + + Several documentation fixes. + + Implement version-independent type registration in + ResourceFactory. + + Fix an issue with implementation of the depracted functions. + + Fix an issue with including net/if.h and linux/if.h. + + Add async introspection functions matching the usual GIO + function pattern. + + Go through main loop if introspection fails before the actual + network request. + + Bump required GLib version to 2.58. + +------------------------------------------------------------------- Old: ---- gupnp-1.2.1.tar.xz New: ---- gupnp-1.2.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gupnp.spec ++++++ --- /var/tmp/diff_new_pack.9Tt9hX/_old 2020-01-08 19:32:15.240594532 +0100 +++ /var/tmp/diff_new_pack.9Tt9hX/_new 2020-01-08 19:32:15.244594531 +0100 @@ -1,7 +1,7 @@ # # spec file for package gupnp # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -21,7 +21,7 @@ %define sover 1.2 Name: gupnp -Version: 1.2.1 +Version: 1.2.2 Release: 0 Summary: Implementation of the UPnP specification License: LGPL-2.0-or-later @@ -33,10 +33,10 @@ BuildRequires: gtk-doc BuildRequires: meson BuildRequires: pkgconfig -BuildRequires: pkgconfig(gio-2.0) >= 2.44 -BuildRequires: pkgconfig(glib-2.0) >= 2.44 -BuildRequires: pkgconfig(gmodule-2.0) >= 2.44 -BuildRequires: pkgconfig(gobject-2.0) >= 2.44 +BuildRequires: pkgconfig(gio-2.0) >= 2.58 +BuildRequires: pkgconfig(glib-2.0) >= 2.58 +BuildRequires: pkgconfig(gmodule-2.0) >= 2.58 +BuildRequires: pkgconfig(gobject-2.0) >= 2.58 BuildRequires: pkgconfig(gobject-introspection-1.0) >= 0.6.4 BuildRequires: pkgconfig(gssdp-1.2) >= 1.1.3 BuildRequires: pkgconfig(libsoup-2.4) >= 2.48.0 @@ -120,6 +120,7 @@ %{_libdir}/girepository-1.0/GUPnP-%{sover}.typelib %files -n libgupnp-devel +%{_mandir}/man1/gupnp-binding-tool-1.2.1%{?ext_man} %{_bindir}/gupnp-binding-tool-%{sover} %{_includedir}/%{name}-%{sover} %{_libdir}/*.so ++++++ gupnp-1.2.1.tar.xz -> gupnp-1.2.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/NEWS new/gupnp-1.2.2/NEWS --- old/gupnp-1.2.1/NEWS 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/NEWS 2020-01-02 13:07:01.000000000 +0100 @@ -1,3 +1,26 @@ +1.2.2 +===== +- Fix macOS dylib versioning +- Fix endless loop on early notify +- Several documentation fixes +- Implement version-independent type registration in ResourceFactory +- Fix an issue with implementation of the depracted functions +- Fix an issue with including net/if.h and linux/if.h +- Add async introspection functions matching the usual GIO function pattern +- Go through main loop if introspection fails before the actual network request +- Bump required GLib version to 2.58 + +Bugs fixed in this release: + - https://bugzilla.gnome.org/show_bug.cgi?id=764498 + - https://gitlab.gnome.org/GNOME/gupnp/issues/5 + - https://gitlab.gnome.org/GNOME/gupnp/issues/6 + - https://gitlab.gnome.org/GNOME/gupnp/issues/8 + +All contributors to this release: + - Jens Georg <[email protected]> + - Fabrice Fontaine <[email protected]> + - Tom Schoonjans <[email protected]> + 1.2.1 ===== - Fix a deadlock when cancelling an action diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/doc/gupnp-binding-tool.xml new/gupnp-1.2.2/doc/gupnp-binding-tool.xml --- old/gupnp-1.2.1/doc/gupnp-binding-tool.xml 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/doc/gupnp-binding-tool.xml 2020-01-02 13:07:01.000000000 +0100 @@ -3,20 +3,20 @@ <refentry id="gupnp-binding-tool" xmlns:xi="http://www.w3.org/2003/XInclude"> <refmeta> - <refentrytitle>gupnp-binding-tool</refentrytitle> + <refentrytitle>gupnp-binding-tool-1.2</refentrytitle> <manvolnum>1</manvolnum> <refmiscinfo class="source">GUPnP</refmiscinfo> - <refmiscinfo class="version"><xi:include href="version.xml" parse="text"/></refmiscinfo> + <refmiscinfo class="version"><xi:include href="version.xml" parse="text"><xi:fallback /></xi:include></refmiscinfo> </refmeta> <refnamediv> - <refname>gupnp-binding-tool</refname> + <refname>gupnp-binding-tool-1.2</refname> <refpurpose>creates C convenience wrappers for UPnP services</refpurpose> </refnamediv> <refsynopsisdiv> <cmdsynopsis> - <command>gupnp-binding-tool</command> + <command>gupnp-binding-tool-1.2</command> <arg choice="opt">--prefix <arg choice="req">PREFIX</arg></arg> <arg choice="opt">--mode <arg choice="req">client|server</arg></arg> <arg choice="req">SCPD file</arg> @@ -26,7 +26,7 @@ <refsect1> <title>Description</title> <para> - <command>gupnp-binding-tool</command> takes a <glossterm + <command>gupnp-binding-tool-1.2</command> takes a <glossterm linkend="scpd">SCPD file</glossterm> and generates convenience C functions which call the actual GUPnP functions. The client-side bindings can be seen as a service-specific version of the GUPnPServiceProxy API and the @@ -81,7 +81,7 @@ the argument direction. </para> <para> - <command>gupnp-binding-tool</command> generates both synchronous and + <command>gupnp-binding-tool-1.2</command> generates both synchronous and asynchronous wrappers. The <function>igd_delete_port_mapping</function> example above is the synchronous form, the asynchronous form is as follows: </para> @@ -126,7 +126,7 @@ gpointer userdata);</programlisting> <para> - All of the examples were produced with <filename>gupnp-binding-tool + All of the examples were produced with <filename>gupnp-binding-tool-1.2 --prefix igd --mode client WANIPConnection.xml</filename>. </para> </refsect1> @@ -169,7 +169,7 @@ variable value. </para> <para> - All of the examples were produced with <filename>gupnp-binding-tool + All of the examples were produced with <filename>gupnp-binding-tool-1.2 --prefix igd --mode server WANIPConnection.xml</filename>. </para> </refsect1> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/doc/meson.build new/gupnp-1.2.2/doc/meson.build --- old/gupnp-1.2.1/doc/meson.build 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/doc/meson.build 2020-01-02 13:07:01.000000000 +0100 @@ -1,6 +1,6 @@ entities = configuration_data() entities.set('VERSION', meson.project_version()) -configure_file(input: 'version.xml.in', +version_xml = configure_file(input: 'version.xml.in', output: 'version.xml', configuration: entities) @@ -26,3 +26,35 @@ 'gupnp-types-private.h' ], install : true) + +xsltproc = find_program('xsltproc', required: false) +if xsltproc.found() + xlstproc_flags = [ + '--nonet', + '--xinclude', + '--path', '@0@:@1@'.format(meson.current_source_dir(), meson.current_build_dir()), + '--stringparam', 'man.output.quietly', '1', + '--stringparam', 'funcsynopsis.style', 'ansi', + '--stringparam', 'man.th.extra1.suppress', '1', + '--stringparam', 'man.authors.section.enabled', '1', + '--stringparam', 'man.copyright.section.enabled', '1', + ] + + xsltproc_args = [ + xsltproc, + xlstproc_flags, + '-o', '@OUTPUT@', + 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl', + '@INPUT@' + ] + + custom_target( + 'man 1 pages', + input: 'gupnp-binding-tool.xml', + output: 'gupnp-binding-tool-1.2.1', + command: xsltproc_args, + depend_files : version_xml, + install: true, + install_dir: join_paths(get_option('mandir'), 'man1') + ) +endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/gupnp-linux-context-manager.c new/gupnp-1.2.2/libgupnp/gupnp-linux-context-manager.c --- old/gupnp-1.2.1/libgupnp/gupnp-linux-context-manager.c 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/libgupnp/gupnp-linux-context-manager.c 2020-01-02 13:07:01.000000000 +0100 @@ -47,9 +47,10 @@ #include <sys/socket.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> -#include <net/if.h> #ifdef HAVE_LINUX_WIRELESS_H #include <linux/wireless.h> +#else +#include <net/if.h> #endif #include <sys/ioctl.h> #include <errno.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/gupnp-resource-factory.c new/gupnp-1.2.2/libgupnp/gupnp-resource-factory.c --- old/gupnp-1.2.1/libgupnp/gupnp-resource-factory.c 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/libgupnp/gupnp-resource-factory.c 2020-01-02 13:07:01.000000000 +0100 @@ -133,6 +133,59 @@ return default_factory; } +static GType +lookup_type_with_fallback (GHashTable *resource_types, + const char *requested_type, + const char *child_node, + xmlNode *element, + GType fallback) +{ + GType type = fallback; + char *upnp_type = NULL; + + if (requested_type == NULL) { + g_debug ("Looking up type from XML"); + upnp_type = xml_util_get_child_element_content_glib (element, + child_node); + } else { + g_debug ("Using passed type %s", requested_type); + upnp_type = g_strdup (requested_type); + } + + + if (upnp_type != NULL) { + g_debug ("Found type from XML: %s", upnp_type); + gpointer value; + char *needle = NULL; + + value = g_hash_table_lookup (resource_types, upnp_type); + + if (value == NULL) { + g_debug ("Trying to use version-less type..."); + needle = g_strrstr (upnp_type, ":"); + if (needle != NULL) { + *needle = '\0'; + g_debug ("Version-less type is %s", upnp_type); + + value = g_hash_table_lookup (resource_types, upnp_type); + } + } + + if (value != NULL) { + type = GPOINTER_TO_SIZE (value); + } + + g_debug ("Will return type %s for UPnP type %s", g_type_name (type), upnp_type); + g_free (upnp_type); + } else { + g_debug ("Will return fall-back type %s", upnp_type); + } + + + return type; +} + + /** * gupnp_resource_factory_create_device_proxy: * @factory: A #GUPnPResourceFactory @@ -160,7 +213,6 @@ const SoupURI *url_base) { GUPnPDeviceProxy *proxy; - char *upnp_type; GType proxy_type = GUPNP_TYPE_DEVICE_PROXY; GUPnPResourceFactoryPrivate *priv; @@ -173,18 +225,11 @@ priv = gupnp_resource_factory_get_instance_private (factory); - upnp_type = xml_util_get_child_element_content_glib (element, - "deviceType"); - if (upnp_type) { - gpointer value; - - value = g_hash_table_lookup (priv->proxy_type_hash, - upnp_type); - if (value) - proxy_type = GPOINTER_TO_SIZE (value); - - g_free (upnp_type); - } + proxy_type = lookup_type_with_fallback (priv->proxy_type_hash, + NULL, + "deviceType", + element, + GUPNP_TYPE_DEVICE_PROXY); proxy = g_object_new (proxy_type, "resource-factory", factory, @@ -204,7 +249,7 @@ * @factory: A #GUPnPResourceFactory * @context: A #GUPnPContext * @doc: A #GUPnPXMLDoc - * @element: The #xmlNode ponting to the right service element + * @element: The #xmlNode pointing to the right service element * @location: The location of the service description file * @udn: The UDN of the device the service is contained in * @service_type: (allow-none): The service type, or %NULL to use service @@ -227,7 +272,6 @@ const char *location, const SoupURI *url_base) { - char *type_from_xml = NULL; GUPnPServiceProxy *proxy; GType proxy_type = GUPNP_TYPE_SERVICE_PROXY; GUPnPResourceFactoryPrivate *priv; @@ -241,21 +285,11 @@ priv = gupnp_resource_factory_get_instance_private (factory); - if (!service_type) { - type_from_xml = - xml_util_get_child_element_content_glib (element, - "serviceType"); - service_type = type_from_xml; - } - - if (service_type) { - gpointer value; - - value = g_hash_table_lookup (priv->proxy_type_hash, - service_type); - if (value) - proxy_type = GPOINTER_TO_SIZE (value); - } + proxy_type = lookup_type_with_fallback (priv->proxy_type_hash, + service_type, + "serviceType", + element, + GUPNP_TYPE_SERVICE_PROXY); proxy = g_object_new (proxy_type, "context", context, @@ -267,8 +301,6 @@ "element", element, NULL); - g_free (type_from_xml); - return proxy; } @@ -298,7 +330,6 @@ const SoupURI *url_base) { GUPnPDevice *device; - char *upnp_type; GType device_type = GUPNP_TYPE_DEVICE; GUPnPResourceFactoryPrivate *priv; @@ -310,18 +341,11 @@ priv = gupnp_resource_factory_get_instance_private (factory); - upnp_type = xml_util_get_child_element_content_glib (element, - "deviceType"); - if (upnp_type) { - gpointer value; - - value = g_hash_table_lookup (priv->resource_type_hash, - upnp_type); - if (value) - device_type = GPOINTER_TO_SIZE (value); - - g_free (upnp_type); - } + device_type = lookup_type_with_fallback (priv->resource_type_hash, + NULL, + "deviceType", + element, + GUPNP_TYPE_DEVICE); device = g_object_new (device_type, "resource-factory", factory, @@ -362,7 +386,6 @@ const SoupURI *url_base) { GUPnPService *service; - char *upnp_type; GType service_type = GUPNP_TYPE_SERVICE; GUPnPResourceFactoryPrivate *priv; @@ -375,18 +398,11 @@ priv = gupnp_resource_factory_get_instance_private (factory); - upnp_type = xml_util_get_child_element_content_glib (element, - "serviceType"); - if (upnp_type) { - gpointer value; - - value = g_hash_table_lookup (priv->resource_type_hash, - upnp_type); - if (value) - service_type = GPOINTER_TO_SIZE (value); - - g_free (upnp_type); - } + service_type = lookup_type_with_fallback (priv->resource_type_hash, + NULL, + "serviceType", + element, + GUPNP_TYPE_SERVICE); service = g_object_new (service_type, "context", context, @@ -410,6 +426,11 @@ * this call, the factory @factory will create object of GType @type each time * it is asked to create a resource object for UPnP type @upnp_type. * + * You can either register a type for a concrete version of a device or service + * such as urn:schemas-upnp-org:service:AVTransport:2 or version-independently, + * urn:schemas-upnp-org:service:AVTransport. If you register for an explicit + * version of a service, it will be an exact match. + * * Note: GType @type must be a derived type of #GUPNP_TYPE_DEVICE if resource is * a device or #GUPNP_TYPE_SERVICE if its a service. **/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/gupnp-service-info.c new/gupnp-1.2.2/libgupnp/gupnp-service-info.c --- old/gupnp-1.2.1/libgupnp/gupnp-service-info.c 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/libgupnp/gupnp-service-info.c 2020-01-02 13:07:01.000000000 +0100 @@ -85,6 +85,7 @@ gulong cancelled_id; SoupMessage *message; + GError *error; } GetSCPDURLData; static void @@ -672,6 +673,18 @@ get_scpd_url_data_free (data); } +static gboolean +introspection_error_cb (gpointer user_data) +{ + GetSCPDURLData *data = (GetSCPDURLData *)user_data; + + data->callback (data->info, NULL, data->error, data->user_data); + g_error_free (data->error); + g_slice_free (GetSCPDURLData, data); + + return FALSE; +} + /** * gupnp_service_info_get_introspection_async: * @info: A #GUPnPServiceInfo @@ -744,26 +757,32 @@ g_free (local_scpd_url); } + data->info = info; + data->callback = callback; + data->user_data = user_data; + if (data->message == NULL) { GError *error; + GSource *idle_source; error = g_error_new (GUPNP_SERVER_ERROR, GUPNP_SERVER_ERROR_INVALID_URL, "No valid SCPD URL defined"); + data->error = error; - callback (info, NULL, error, user_data); - - g_error_free (error); + idle_source = g_idle_source_new (); + g_source_set_callback (idle_source, + introspection_error_cb, + data, NULL); + g_source_attach (idle_source, + g_main_context_get_thread_default ()); - g_slice_free (GetSCPDURLData, data); + return; return; } - data->info = info; - data->callback = callback; - data->user_data = user_data; /* Send off the message */ priv = gupnp_service_info_get_instance_private (info); @@ -786,3 +805,75 @@ NULL); } } + +static void +prv_introspection_cb (GUPnPServiceInfo *info, + GUPnPServiceIntrospection *introspection, + const GError *error, + gpointer user_data) +{ + if (error != NULL) { + g_task_return_error (G_TASK (user_data), + g_error_copy (error)); + } else { + g_task_return_pointer (G_TASK (user_data), + introspection, + g_object_unref); + } + + g_object_unref (G_OBJECT (user_data)); +} + +/** + * gupnp_service_info_introspect_async: + * @info: A #GUPnPServiceInfo + * @cancellable: (allow-none) : #GCancellable that can be used to cancel the call, or %NULL. + * @callback: (scope async) : callback to be called when introspeciton object is ready. + * @user_data: user_data to be passed to the callback. + * + * Note that introspection object is created from the information in service + * description document (SCPD) provided by the service so it can not be created + * if the service does not provide an SCPD. + * + * If @cancellable is used to cancel the call, @callback will be called with + * error code %G_IO_ERROR_CANCELLED. + * + * Since: 1.2.2 + **/ +void +gupnp_service_info_introspect_async (GUPnPServiceInfo *info, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task = g_task_new (info, cancellable, callback, user_data); + + gupnp_service_info_get_introspection_async_full (info, + prv_introspection_cb, + cancellable, + task); +} + +/** + * gupnp_service_info_introspect_finish: + * @info: A GUPnPServiceInfo + * @res: A #GAsyncResult + * @error: (allow-none): Return location for a #GError, or %NULL + * + * Finish an asynchronous call initiated with + * gupnp_service_info_introspect_async(). + * + * Returns: (transfer full): %NULL, if the call had an error, a + * #GUPnPServiceIntrospection object otherwise. + * + * Since: 1.2.2 + */ +GUPnPServiceIntrospection * +gupnp_service_info_introspect_finish (GUPnPServiceInfo *info, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, info), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/gupnp-service-info.h new/gupnp-1.2.2/libgupnp/gupnp-service-info.h --- old/gupnp-1.2.1/libgupnp/gupnp-service-info.h 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/libgupnp/gupnp-service-info.h 2020-01-02 13:07:01.000000000 +0100 @@ -104,6 +104,17 @@ GCancellable *cancellable, gpointer user_data); +void +gupnp_service_info_introspect_async (GUPnPServiceInfo *info, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GUPnPServiceIntrospection * +gupnp_service_info_introspect_finish (GUPnPServiceInfo *info, + GAsyncResult *res, + GError **error); + G_END_DECLS #endif /* GUPNP_SERVICE_INFO_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/gupnp-service-private.h new/gupnp-1.2.2/libgupnp/gupnp-service-private.h --- old/gupnp-1.2.1/libgupnp/gupnp-service-private.h 1970-01-01 01:00:00.000000000 +0100 +++ new/gupnp-1.2.2/libgupnp/gupnp-service-private.h 2020-01-02 13:07:01.000000000 +0100 @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2019 Jens Georg. + * + * Author: Jens Georg <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef GUPNP_SERVICE_PRIVATE_H +#define GUPNP_SERVICE_PRIVATE_H + +struct _GUPnPServiceAction { + GUPnPContext *context; + + char *name; + + SoupMessage *msg; + gboolean accept_gzip; + + GUPnPXMLDoc *doc; + xmlNode *node; + + GString *response_str; + + guint argument_count; +}; + +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/gupnp-service-proxy.c new/gupnp-1.2.2/libgupnp/gupnp-service-proxy.c --- old/gupnp-1.2.1/libgupnp/gupnp-service-proxy.c 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/libgupnp/gupnp-service-proxy.c 2020-01-02 13:07:01.000000000 +0100 @@ -456,7 +456,7 @@ handle = gupnp_service_proxy_action_new_from_list (action_name, in_names, in_values); - if (gupnp_service_proxy_call_action (proxy, handle, NULL, error) != NULL) { + if (gupnp_service_proxy_call_action (proxy, handle, NULL, error) == NULL) { result = FALSE; goto out; } @@ -522,7 +522,7 @@ handle = gupnp_service_proxy_action_new_from_list (action, in_names, in_values); - if (gupnp_service_proxy_call_action (proxy, handle, NULL, error) != NULL) { + if (gupnp_service_proxy_call_action (proxy, handle, NULL, error) == NULL) { result = FALSE; goto out; @@ -1606,9 +1606,10 @@ return; } + priv = gupnp_service_proxy_get_instance_private (proxy); /* Get root propertyset element */ node = xmlDocGetRootElement (doc); - if (node == NULL || strcmp ((char *) node->name, "propertyset")) { + if (node == NULL || strcmp ((char *) node->name, "propertyset") || priv->sid == NULL) { /* Empty or unsupported */ xmlFreeDoc (doc); @@ -1624,7 +1625,6 @@ */ emit_notify_data = emit_notify_data_new (hdr, seq, doc); - priv = gupnp_service_proxy_get_instance_private (proxy); priv->pending_notifies = g_list_append (priv->pending_notifies, emit_notify_data); if (!priv->notify_idle_src) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/gupnp-service.c new/gupnp-1.2.2/libgupnp/gupnp-service.c --- old/gupnp-1.2.1/libgupnp/gupnp-service.c 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/libgupnp/gupnp-service.c 2020-01-02 13:07:01.000000000 +0100 @@ -38,6 +38,7 @@ #include "gupnp-error.h" #include "gupnp-acl.h" #include "gupnp-uuid.h" +#include "gupnp-service-private.h" #include "http-headers.h" #include "gena-protocol.h" #include "xml-util.h" @@ -96,6 +97,9 @@ gpointer user_data); GUPnPServiceAction * +gupnp_service_action_new (); + +GUPnPServiceAction * gupnp_service_action_ref (GUPnPServiceAction *action); void @@ -210,49 +214,35 @@ g_slice_free (NotifyData, data); } -struct _GUPnPServiceAction { - volatile gint ref_count; - - GUPnPContext *context; - - char *name; - - SoupMessage *msg; - gboolean accept_gzip; - - GUPnPXMLDoc *doc; - xmlNode *node; - - GString *response_str; - - guint argument_count; -}; +GUPnPServiceAction * +gupnp_service_action_new () +{ + return g_atomic_rc_box_new0 (GUPnPServiceAction); +} GUPnPServiceAction * gupnp_service_action_ref (GUPnPServiceAction *action) { g_return_val_if_fail (action, NULL); - g_return_val_if_fail (action->ref_count > 0, NULL); - g_atomic_int_inc (&action->ref_count); + return g_atomic_rc_box_acquire (action); +} - return action; +static void +action_dispose (GUPnPServiceAction *action) +{ + g_free (action->name); + g_object_unref (action->msg); + g_object_unref (action->context); + g_object_unref (action->doc); } void gupnp_service_action_unref (GUPnPServiceAction *action) { g_return_if_fail (action); - g_return_if_fail (action->ref_count > 0); - - if (g_atomic_int_dec_and_test (&action->ref_count)) { - g_free (action->name); - g_object_unref (action->msg); - g_object_unref (action->context); - g_object_unref (action->doc); - g_slice_free (GUPnPServiceAction, action); - } + g_atomic_rc_box_release_full (action, (GDestroyNotify) action_dispose); } /** @@ -1012,9 +1002,7 @@ } /* Create action structure */ - action = g_slice_new0 (GUPnPServiceAction); - - action->ref_count = 1; + action = gupnp_service_action_new (); action->name = g_strdup (action_name); action->msg = g_object_ref (msg); action->doc = gupnp_xml_doc_new(doc); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/libgupnp/meson.build new/gupnp-1.2.2/libgupnp/meson.build --- old/gupnp-1.2.1/libgupnp/meson.build 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/libgupnp/meson.build 2020-01-02 13:07:01.000000000 +0100 @@ -90,10 +90,20 @@ 'xml-util.c' ) +version = '0.0.0' +version_arr = version.split('.') +major_version = version_arr[0].to_int() +minor_version = version_arr[1].to_int() +micro_version = version_arr[2].to_int() +current = major_version + minor_version + 1 +interface_age = micro_version +darwin_versions = [current, '@0@.@1@'.format(current, interface_age)] + libgupnp = library( 'gupnp-1.2', sources + context_manager_impl + enums, - version : '0.0.0', + version : version, + darwin_versions : darwin_versions, dependencies : dependencies + system_deps, c_args : context_manager_args, include_directories: include_directories('..'), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/meson.build new/gupnp-1.2.2/meson.build --- old/gupnp-1.2.1/meson.build 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/meson.build 2020-01-02 13:07:01.000000000 +0100 @@ -1,4 +1,4 @@ -project('gupnp', 'c', version : '1.2.1') +project('gupnp', 'c', version : '1.2.2', meson_version : '>= 0.48.0') gnome = import('gnome') pkg = import('pkgconfig') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gupnp-1.2.1/tests/gtest/test-bugs.c new/gupnp-1.2.2/tests/gtest/test-bugs.c --- old/gupnp-1.2.1/tests/gtest/test-bugs.c 2019-05-01 23:02:02.000000000 +0200 +++ new/gupnp-1.2.2/tests/gtest/test-bugs.c 2020-01-02 13:07:01.000000000 +0100 @@ -24,26 +24,7 @@ #endif #include <libgupnp/gupnp.h> - - -struct _GUPnPServiceAction { - volatile gint ref_count; - - GUPnPContext *context; - - char *name; - - SoupMessage *msg; - gboolean accept_gzip; - - GUPnPXMLDoc *doc; - xmlNode *node; - - GString *response_str; - - guint argument_count; -}; - +#include <libgupnp/gupnp-service-private.h> typedef struct _TestBgo678701Service { GUPnPServiceProxy parent_instance;
