From b058d9843b15e3ab3b77b4acc4d72f3ffb332578 Mon Sep 17 00:00:00 2001 From: Jens Georg Date: Mon, 28 Mar 2022 10:56:58 +0200 Subject: all: Fix inconsistency regarding action errors The current async api is a bit weird, you need try to get results from the action to capture SOAP errors --- src/av-cp/renderer-controls.c | 26 +++++++++++++++++++++----- src/network-light/upnp.c | 13 ++++++++++--- src/upload/transfer.c | 11 ++++++++--- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/av-cp/renderer-controls.c b/src/av-cp/renderer-controls.c index e1250e7..3e03b03 100644 --- a/src/av-cp/renderer-controls.c +++ b/src/av-cp/renderer-controls.c @@ -221,10 +221,18 @@ set_av_transport_uri_cb (GObject *object, GAsyncResult *res, gpointer user_data) udn = gupnp_service_info_get_udn (GUPNP_SERVICE_INFO (object)); - gupnp_service_proxy_call_action_finish (GUPNP_SERVICE_PROXY (object), - res, - &error); - + GUPnPServiceProxyAction *action; + action = gupnp_service_proxy_call_action_finish ( + GUPNP_SERVICE_PROXY (object), + res, + &error); + + // The above call will only catch issues with the HTTP transport, not + // with the call itself. So we need to call an empty get on the action + // as well to get any SOAP error + if (error == NULL) { + gupnp_service_proxy_action_get_result (action, &error, NULL); + } if (error != NULL) { g_warning ("Failed to set URI '%s' on %s: %s", gupnp_didl_lite_resource_get_uri (data->resource), @@ -707,9 +715,17 @@ set_volume_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GError *error; GUPnPServiceProxy *proxy = GUPNP_SERVICE_PROXY (object); + GUPnPServiceProxyAction *action; error = NULL; - if (!gupnp_service_proxy_call_action_finish (proxy, res, &error)) { + action = gupnp_service_proxy_call_action_finish (proxy, res, &error); + + if (error == NULL) { + // No transport error, check for SOAP error + gupnp_service_proxy_action_get_result (action, &error, NULL); + } + + if (error != NULL) { const char *udn; udn = gupnp_service_info_get_udn (GUPNP_SERVICE_INFO (object)); diff --git a/src/network-light/upnp.c b/src/network-light/upnp.c index 1536d6c..f02b077 100644 --- a/src/network-light/upnp.c +++ b/src/network-light/upnp.c @@ -440,10 +440,17 @@ on_service_proxy_action_ret (GObject *object, gpointer user_data) { GError *error = NULL; + GUPnPServiceProxyAction *action; - gupnp_service_proxy_call_action_finish (GUPNP_SERVICE_PROXY (object), - result, - &error); + action = gupnp_service_proxy_call_action_finish ( + GUPNP_SERVICE_PROXY (object), + result, + &error); + + if (error == NULL) { + // Check for SOAP transport error + gupnp_service_proxy_action_get_result (action, &error, NULL); + } if (error != NULL) { GUPnPServiceInfo *info = GUPNP_SERVICE_INFO (object); diff --git a/src/upload/transfer.c b/src/upload/transfer.c index d493a3b..64e645b 100644 --- a/src/upload/transfer.c +++ b/src/upload/transfer.c @@ -44,15 +44,20 @@ get_transfer_progress_cb (GObject *object, TrackTransferData *data; guint64 total, length; gchar *status; + GUPnPServiceProxyAction *action; data = (TrackTransferData *) user_data; error = NULL; total = length = 0; status = NULL; - gupnp_service_proxy_call_action_finish (GUPNP_SERVICE_PROXY (object), - result, - &error); + action = gupnp_service_proxy_call_action_finish ( + GUPNP_SERVICE_PROXY (object), + result, + &error); + if (error == NULL) { + gupnp_service_proxy_action_get_result (action, &error, NULL); + } if (error != NULL) { g_critical ("Failed to track file transfer: %s", error->message); -- cgit v1.2.1