From 6ff85cec3cad2fa87e9372892b82c3ac9a08ef45 Mon Sep 17 00:00:00 2001 From: Jens Georg <mail@jensge.org> Date: Mon, 23 May 2022 19:34:29 +0200 Subject: [PATCH 1/2] Remove deprecaed GUPnP calls --- libdleyna/server/async.c | 4 - libdleyna/server/device.c | 1834 ++++++++++++++++-------------------- libdleyna/server/manager.c | 47 +- libdleyna/server/manager.h | 3 +- libdleyna/server/props.c | 6 +- libdleyna/server/server.c | 20 +- libdleyna/server/upnp.c | 16 +- 7 files changed, 878 insertions(+), 1052 deletions(-) diff --git a/libdleyna/server/async.c b/libdleyna/server/async.c index d682329..5b81469 100755 --- a/libdleyna/server/async.c +++ b/libdleyna/server/async.c @@ -82,10 +82,6 @@ void dls_async_task_cancelled_cb(GCancellable *cancellable, gpointer user_data) { dls_async_task_t *cb_data = user_data; - if (cb_data->proxy != NULL) - gupnp_service_proxy_cancel_action(cb_data->proxy, - cb_data->action); - if (!cb_data->error) cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, DLEYNA_ERROR_CANCELLED, diff --git a/libdleyna/server/device.c b/libdleyna/server/device.c index 2d58f9d..c05c77f 100644 --- a/libdleyna/server/device.c +++ b/libdleyna/server/device.c @@ -20,6 +20,8 @@ * */ +#include <config.h> + #include <string.h> #include <stdint.h> #include <stdio.h> @@ -45,7 +47,7 @@ #include <libdleyna/core/core.h> #include <libdleyna/core/error.h> #include <libdleyna/core/log.h> -#include <libdleyna/core/service-task.h> +#include <libdleyna/core/gasync-task.h> #include "device.h" #include "interface.h" @@ -165,13 +167,12 @@ static void prv_upload_job_delete(gpointer up); static void prv_get_sr_token_for_props(GUPnPServiceProxy *proxy, const dls_device_t *device, dls_async_task_t *cb_data); -static void prv_browse_objects_end_action_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, +static void prv_browse_objects_end_action_cb(GObject *target, + GAsyncResult *res, gpointer user_data); -static GUPnPServiceProxyAction *prv_browse_objects_begin_action_cb( - dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed); +static gboolean prv_browse_objects_begin_action_cb( + dleyna_gasync_task_t *task, + GObject *target); static void prv_get_sleeping_for_props(GUPnPServiceProxy *proxy, const dls_device_t *device, @@ -1232,49 +1233,52 @@ on_exit: g_error_free(error); } -static void prv_get_feature_list_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, +static void prv_get_feature_list_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - gchar *result = NULL; - gboolean end; - GError *error = NULL; - prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data; + g_autofree gchar *result = NULL; + g_autoptr(GError) error = NULL; + dleyna_gasync_task_t *task = user_data; + prv_new_device_ct_t *priv_t = + (prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task); + g_autoptr(GUPnPServiceProxyAction) action = NULL; + + action = gupnp_service_proxy_call_action_finish( + GUPNP_SERVICE_PROXY(source), res, &error); + + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } priv_t->dev->construct_step++; - end = gupnp_service_proxy_end_action(proxy, action, &error, + if (error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, "FeatureList", G_TYPE_STRING, &result, NULL); - - if (!end || (result == NULL)) { - DLEYNA_LOG_WARNING("GetFeatureList operation failed: %s", - ((error != NULL) ? error->message - : "Invalid result")); - goto on_error; } - DLEYNA_LOG_DEBUG("GetFeatureList result: %s", result); - - prv_get_feature_list_analyze(priv_t->dev, result); + if (error != NULL) { + DLEYNA_LOG_WARNING("GetFeatureList operation failed: %s", + error->message); + } else { + DLEYNA_LOG_DEBUG("GetFeatureList result: %s", result); -on_error: - if (error != NULL) - g_error_free(error); + prv_get_feature_list_analyze(priv_t->dev, result); + } - g_free(result); + dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id); } -static GUPnPServiceProxyAction *prv_get_feature_list( - dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_get_feature_list(dleyna_gasync_task_t *task, GObject *proxy) { - *failed = FALSE; + GUPnPServiceProxyAction *action = + gupnp_service_proxy_action_new("GetFeatureList", NULL); + + gupnp_service_proxy_call_action_async( + GUPNP_SERVICE_PROXY(proxy), action, dleyna_gasync_task_get_cancellable(task), + prv_get_feature_list_cb, task); - return gupnp_service_proxy_begin_action( - proxy, "GetFeatureList", - dleyna_service_task_begin_action_cb, - task, NULL); + return FALSE; } static void prv_get_sort_ext_capabilities_analyze(dls_device_t *device, @@ -1310,51 +1314,56 @@ static void prv_get_sort_ext_capabilities_analyze(dls_device_t *device, #endif } -static void prv_get_sort_ext_capabilities_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_get_sort_ext_capabilities_cb(GObject *source, GAsyncResult *res, + gpointer user_data) { - gchar *result = NULL; - gboolean end; - GError *error = NULL; - prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data; + g_autofree gchar *result = NULL; + g_autoptr(GError) error = NULL; + dleyna_gasync_task_t *task = user_data; + prv_new_device_ct_t *priv_t = + (prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task); + g_autoptr(GUPnPServiceProxyAction) action; - priv_t->dev->construct_step++; - end = gupnp_service_proxy_end_action(proxy, action, &error, - "SortExtensionCaps", - G_TYPE_STRING, &result, NULL); + action = gupnp_service_proxy_call_action_finish( + GUPNP_SERVICE_PROXY(source), res, &error); - if (!end || (result == NULL)) { - DLEYNA_LOG_WARNING( - "GetSortExtensionCapabilities operation failed: %s", - ((error != NULL) ? error->message : "Invalid result")); - goto on_error; + g_print("Sort ext\n"); + + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; } - DLEYNA_LOG_DEBUG("GetSortExtensionCapabilities result: %s", result); + priv_t->dev->construct_step++; + + if (error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, "SortCaps", + G_TYPE_STRING, &result, NULL); + } - prv_get_sort_ext_capabilities_analyze(priv_t->dev, result); + if (error!= NULL) { + DLEYNA_LOG_WARNING("GetSortCapabilitiesExt operation failed: %s", + error->message); -on_error: + } else { + DLEYNA_LOG_DEBUG("GetSortCapabilities result: %s", result); - if (error) - g_error_free(error); + prv_get_sort_ext_capabilities_analyze(priv_t->dev, result); + } - g_free(result); + dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id); } -static GUPnPServiceProxyAction *prv_get_sort_ext_capabilities( - dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_get_sort_ext_capabilities(dleyna_gasync_task_t *task, + GObject *target) { - *failed = FALSE; + GUPnPServiceProxyAction *action = + gupnp_service_proxy_action_new("GetSortExtensionCapabilities", NULL); + gupnp_service_proxy_call_action_async( + GUPNP_SERVICE_PROXY(target), action, + dleyna_gasync_task_get_cancellable(task), + prv_get_sort_ext_capabilities_cb, task); - return gupnp_service_proxy_begin_action( - proxy, - "GetSortExtensionCapabilities", - dleyna_service_task_begin_action_cb, - task, NULL); + return FALSE; } static void prv_get_capabilities_analyze(GHashTable *property_map, @@ -1405,117 +1414,125 @@ static void prv_get_capabilities_analyze(GHashTable *property_map, #endif } -static void prv_get_sort_capabilities_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, +static void prv_get_sort_capabilities_cb(GObject *source, + GAsyncResult *res, gpointer user_data) { - gchar *result = NULL; - gboolean end; - GError *error = NULL; - prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data; + g_autofree gchar *result = NULL; + g_autoptr(GError) error = NULL; + dleyna_gasync_task_t *task = user_data; + prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task); + g_autoptr(GUPnPServiceProxyAction) action; + + action = gupnp_service_proxy_call_action_finish( + GUPNP_SERVICE_PROXY(source), res, &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } priv_t->dev->construct_step++; - end = gupnp_service_proxy_end_action(proxy, action, &error, "SortCaps", - G_TYPE_STRING, &result, NULL); - if (!end || (result == NULL)) { - DLEYNA_LOG_WARNING("GetSortCapabilities operation failed: %s", - ((error != NULL) ? error->message - : "Invalid result")); - goto on_error; + if (error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, "SortCaps", + G_TYPE_STRING, &result, NULL); } - DLEYNA_LOG_DEBUG("GetSortCapabilities result: %s", result); - - prv_get_capabilities_analyze(priv_t->property_map, result, - &priv_t->dev->sort_caps); + if (error!= NULL) { + DLEYNA_LOG_WARNING("GetSortCapabilities operation failed: %s", + error->message); -on_error: + } else { + DLEYNA_LOG_DEBUG("GetSortCapabilities result: %s", result); - if (error) - g_error_free(error); + prv_get_capabilities_analyze(priv_t->property_map, result, + &priv_t->dev->sort_caps); + } - g_free(result); + dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id); } -static GUPnPServiceProxyAction *prv_get_sort_capabilities( - dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_get_sort_capabilities(dleyna_gasync_task_t *task, + GObject *target) { - *failed = FALSE; + GUPnPServiceProxyAction *action = + gupnp_service_proxy_action_new("GetSortCapabilities", NULL); + gupnp_service_proxy_call_action_async( + GUPNP_SERVICE_PROXY(target), action, + dleyna_gasync_task_get_cancellable(task), + prv_get_sort_capabilities_cb, task); - return gupnp_service_proxy_begin_action( - proxy, - "GetSortCapabilities", - dleyna_service_task_begin_action_cb, - task, NULL); + return FALSE; } -static void prv_get_search_capabilities_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, +static void prv_get_search_capabilities_cb(GObject *source, + GAsyncResult *res, gpointer user_data) { - gchar *result = NULL; - gboolean end; - GError *error = NULL; - prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data; + g_autofree gchar *result = NULL; + g_autoptr(GError) error = NULL; + dleyna_gasync_task_t *task = user_data; + prv_new_device_ct_t *priv_t = + (prv_new_device_ct_t *) dleyna_gasync_task_get_user_data(task); - priv_t->dev->construct_step++; - end = gupnp_service_proxy_end_action(proxy, action, &error, - "SearchCaps", G_TYPE_STRING, - &result, NULL); + g_autoptr(GUPnPServiceProxyAction) action = + gupnp_service_proxy_call_action_finish( + GUPNP_SERVICE_PROXY(source), res, &error); - if (!end || (result == NULL)) { - DLEYNA_LOG_WARNING("GetSearchCapabilities operation failed: %s", - ((error != NULL) ? error->message - : "Invalid result")); - goto on_error; + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; } - DLEYNA_LOG_DEBUG("GetSearchCapabilities result: %s", result); + if (error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "SearchCaps", G_TYPE_STRING, &result, + NULL); + } - prv_get_capabilities_analyze(priv_t->property_map, result, - &priv_t->dev->search_caps); + priv_t->dev->construct_step++; + if (error != NULL) { + DLEYNA_LOG_WARNING("GetSearchCapabilities operation failed: %s", + error->message); - if (g_hash_table_lookup(priv_t->property_map, "upnp:objectUpdateID")) - priv_t->dev->has_last_change = TRUE; + } else { + DLEYNA_LOG_DEBUG("GetSearchCapabilities result: %s", result); -on_error: + prv_get_capabilities_analyze(priv_t->property_map, result, + &priv_t->dev->search_caps); - if (error) - g_error_free(error); + if(g_hash_table_lookup(priv_t->property_map, + "upnp:objectUpdateID")) + priv_t->dev->has_last_change = TRUE; + } - g_free(result); + dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id); } -static GUPnPServiceProxyAction *prv_get_search_capabilities( - dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_get_search_capabilities( + dleyna_gasync_task_t *task, + GObject *target) { - *failed = FALSE; + GUPnPServiceProxyAction *action = + gupnp_service_proxy_action_new("GetSearchCapabilities", NULL); + + gupnp_service_proxy_call_action_async( + GUPNP_SERVICE_PROXY(target), action, dleyna_gasync_task_get_cancellable(task), + prv_get_search_capabilities_cb, task); - return gupnp_service_proxy_begin_action( - proxy, "GetSearchCapabilities", - dleyna_service_task_begin_action_cb, - task, NULL); + return FALSE; } -static GUPnPServiceProxyAction *prv_subscribe(dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_subscribe(dleyna_gasync_task_t *task, GObject *target) { dls_device_t *device; - device = (dls_device_t *)dleyna_service_task_get_user_data(task); + device = (dls_device_t *)dleyna_gasync_task_get_user_data(task); device->construct_step++; dls_device_subscribe_to_service_changes(device); - *failed = FALSE; + dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id); - return NULL; + return FALSE; } static gboolean prv_subtree_interface_filter(const gchar *object_path, @@ -1553,15 +1570,13 @@ static gboolean prv_subtree_interface_filter(const gchar *object_path, return retval; } -static GUPnPServiceProxyAction *prv_declare(dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_declare(dleyna_gasync_task_t *task, GObject *target) { guint id; dls_device_t *device; prv_new_device_ct_t *priv_t; - priv_t = (prv_new_device_ct_t *)dleyna_service_task_get_user_data(task); + priv_t = (prv_new_device_ct_t *)dleyna_gasync_task_get_user_data(task); device = priv_t->dev; device->construct_step++; @@ -1588,9 +1603,9 @@ static GUPnPServiceProxyAction *prv_declare(dleyna_service_task_t *task, DLEYNA_LOG_WARNING("dleyna_connector_publish_subtree FAILED"); } - *failed = (!id); + dleyna_task_queue_task_completed (((dleyna_task_atom_t *) task)->queue_id); - return NULL; + return !id; } void dls_device_construct( @@ -1614,36 +1629,39 @@ void dls_device_construct( priv_t->property_map = property_map; s_proxy = context->cds.proxy; + GCancellable *cancellable = g_cancellable_new(); if (dev->construct_step < 1) - dleyna_service_task_add(queue_id, prv_get_search_capabilities, - s_proxy, - prv_get_search_capabilities_cb, NULL, + dleyna_gasync_task_add(queue_id, + prv_get_search_capabilities, + G_OBJECT(s_proxy), + cancellable, + NULL, priv_t); if (dev->construct_step < 2) - dleyna_service_task_add(queue_id, prv_get_sort_capabilities, - s_proxy, - prv_get_sort_capabilities_cb, NULL, - priv_t); + dleyna_gasync_task_add(queue_id, prv_get_sort_capabilities, + G_OBJECT(s_proxy), cancellable, NULL, + priv_t); if (dev->construct_step < 3) - dleyna_service_task_add(queue_id, prv_get_sort_ext_capabilities, - s_proxy, - prv_get_sort_ext_capabilities_cb, NULL, + dleyna_gasync_task_add(queue_id, prv_get_sort_ext_capabilities, + G_OBJECT(s_proxy), + cancellable, NULL, priv_t); if (dev->construct_step < 4) - dleyna_service_task_add(queue_id, prv_get_feature_list, s_proxy, - prv_get_feature_list_cb, NULL, priv_t); + dleyna_gasync_task_add(queue_id, prv_get_feature_list, + G_OBJECT(s_proxy), cancellable, NULL, + priv_t); /* The following task should always be completed */ - dleyna_service_task_add(queue_id, prv_subscribe, s_proxy, - NULL, NULL, dev); + dleyna_gasync_task_add(queue_id, prv_subscribe, G_OBJECT(s_proxy), + cancellable, NULL, dev); if (dev->construct_step < 6) - dleyna_service_task_add(queue_id, prv_declare, s_proxy, - NULL, g_free, priv_t); + dleyna_gasync_task_add(queue_id, prv_declare, G_OBJECT(s_proxy), + cancellable, g_free, priv_t); dleyna_task_queue_start(queue_id); } @@ -1885,32 +1903,35 @@ static void prv_retrieve_child_count_for_list(dls_async_task_t *cb_data) cb_task_data->get_children_cb(cb_data); } -static void prv_get_children_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_get_children_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - gchar *result = NULL; - const gchar *message; - gboolean end; - GUPnPDIDLLiteParser *parser = NULL; - GError *error = NULL; + g_autofree char *result = NULL; + g_autoptr(GUPnPDIDLLiteParser) parser = NULL; + g_autoptr(GError) error = NULL; dls_async_task_t *cb_data = user_data; dls_async_bas_t *cb_task_data = &cb_data->ut.bas; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, "Result", - G_TYPE_STRING, &result, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (result == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Browse operation failed: %s", message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "Result", G_TYPE_STRING, &result, NULL); + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Browse operation failed: %s", - message); + if(error != NULL) { + DLEYNA_LOG_WARNING("Browse operation failed: %s", + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Browse operation failed: %s", error->message); goto on_error; } @@ -1949,18 +1970,8 @@ static void prv_get_children_cb(GUPnPServiceProxy *proxy, on_error: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); no_complete: - - if (error) - g_error_free(error); - - if (parser) - g_object_unref(parser); - - g_free(result); - DLEYNA_LOG_DEBUG("Exit"); } @@ -1980,27 +1991,22 @@ void dls_device_get_children(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = - gupnp_service_proxy_begin_action(cb_data->proxy, - "Browse", - prv_get_children_cb, - cb_data, - "ObjectID", G_TYPE_STRING, - task->target.id, - - "BrowseFlag", G_TYPE_STRING, - "BrowseDirectChildren", - - "Filter", G_TYPE_STRING, - upnp_filter, - - "StartingIndex", G_TYPE_INT, - task->ut.get_children.start, - "RequestedCount", G_TYPE_INT, - task->ut.get_children.count, - "SortCriteria", G_TYPE_STRING, - sort_by, - NULL); + cb_data->action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, task->target.id, + + "BrowseFlag", G_TYPE_STRING, "BrowseDirectChildren", + + "Filter", G_TYPE_STRING, upnp_filter, + + "StartingIndex", G_TYPE_INT, task->ut.get_children.start, + "RequestedCount", G_TYPE_INT, task->ut.get_children.count, + "SortCriteria", G_TYPE_STRING, sort_by, NULL); + + gupnp_service_proxy_call_action_async(cb_data->proxy, + cb_data->action, + cb_data->cancellable, + prv_get_children_cb, + cb_data); cb_data->cancel_id = g_cancellable_connect( cb_data->cancellable, @@ -2142,32 +2148,34 @@ static gboolean prv_cds_subscribed(const dls_device_t *device) return subscribed; } -static void prv_system_update_id_for_prop_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_system_update_id_for_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gboolean end; + g_autoptr(GError) error = NULL; guint id = G_MAXUINT32; dls_async_task_t *cb_data = user_data; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(proxy, action, &error, - "Id", G_TYPE_UINT, &id, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (id == G_MAXUINT32)) { - message = (error != NULL) ? error->message : "Invalid result"; + if(error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, "Id", + G_TYPE_UINT, &id, NULL); + } + + if(error != NULL) { DLEYNA_LOG_WARNING("Unable to retrieve SystemUpdateID: %s", - message); + error->message); cb_data->error = g_error_new( - DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Unable to retrieve SystemUpdateID: %s", - message); - + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Unable to retrieve SystemUpdateID: %s", + error->message); goto on_complete; } @@ -2176,10 +2184,6 @@ static void prv_system_update_id_for_prop_cb(GUPnPServiceProxy *proxy, on_complete: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - if (error) - g_error_free(error); DLEYNA_LOG_DEBUG("Exit"); } @@ -2203,51 +2207,51 @@ static void prv_get_system_update_id_for_prop(GUPnPServiceProxy *proxy, goto on_complete; } - cb_data->action = gupnp_service_proxy_begin_action( - proxy, "GetSystemUpdateID", - prv_system_update_id_for_prop_cb, - cb_data, - NULL); + cb_data->action = gupnp_service_proxy_action_new("GetSystemUpdateID", NULL); cb_data->proxy = proxy; g_object_add_weak_pointer((G_OBJECT(proxy)), (gpointer *)&cb_data->proxy); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + gupnp_service_proxy_call_action_async( + proxy, cb_data->action, cb_data->cancellable, + prv_system_update_id_for_prop_cb, cb_data); on_complete: DLEYNA_LOG_DEBUG("Exit"); } -static void prv_system_update_id_for_props_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_system_update_id_for_props_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gboolean end; + g_autoptr(GError) error = NULL; guint id = G_MAXUINT32; dls_async_task_t *cb_data = user_data; dls_async_get_all_t *cb_task_data = &cb_data->ut.get_all; + g_autoptr(GUPnPServiceProxyAction) action = NULL; + DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(proxy, action, &error, - "Id", G_TYPE_UINT, &id, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } + + if(error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, "Id", + G_TYPE_UINT, &id, NULL); + } - if (!end || (id == G_MAXUINT32)) { - message = (error != NULL) ? error->message : "Invalid result"; + if(error != NULL) { DLEYNA_LOG_WARNING("Unable to retrieve SystemUpdateID: %s", - message); + error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Unable to retrieve SystemUpdateID: %s", - message); + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Unable to retrieve SystemUpdateID: %s", + error->message); goto on_complete; } @@ -2259,19 +2263,14 @@ static void prv_system_update_id_for_props_cb(GUPnPServiceProxy *proxy, on_complete: if (!cb_data->error) - prv_get_sr_token_for_props(proxy, cb_data->task.target.device, + prv_get_sr_token_for_props(GUPNP_SERVICE_PROXY (source), cb_data->task.target.device, cb_data); else { cb_data->task.result = g_variant_ref_sink(g_variant_builder_end( cb_task_data->vb)); (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, - cb_data->cancel_id); } - if (error) - g_error_free(error); - DLEYNA_LOG_DEBUG("Exit"); } @@ -2298,11 +2297,8 @@ static void prv_get_system_update_id_for_props(GUPnPServiceProxy *proxy, goto on_complete; } - cb_data->action = gupnp_service_proxy_begin_action( - proxy, "GetSystemUpdateID", - prv_system_update_id_for_props_cb, - cb_data, - NULL); + cb_data->action = + gupnp_service_proxy_action_new("GetSystemUpdateID", NULL); if (cb_data->proxy != NULL) g_object_remove_weak_pointer((G_OBJECT(cb_data->proxy)), @@ -2310,15 +2306,13 @@ static void prv_get_system_update_id_for_props(GUPnPServiceProxy *proxy, cb_data->proxy = proxy; + gupnp_service_proxy_call_action_async( + proxy, cb_data->action, cb_data->cancellable, + prv_system_update_id_for_props_cb, cb_data); + g_object_add_weak_pointer((G_OBJECT(proxy)), (gpointer *)&cb_data->proxy); - if (!cb_data->cancel_id) - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); - on_complete: DLEYNA_LOG_DEBUG("Exit"); @@ -2341,34 +2335,36 @@ static gboolean prv_ems_subscribed(const dls_device_t *device) return subscribed; } -static void prv_sleeping_for_props_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_sleeping_for_props_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gchar *info = NULL; - gboolean end; + g_autoptr(GError) error = NULL; + g_autofree gchar *info = NULL; dls_async_task_t *cb_data = user_data; dls_async_get_all_t *cb_task_data; gboolean sleeping; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(proxy, action, &error, - "NetworkInterfaceInfo", - G_TYPE_STRING, - &info, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (info == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "NetworkInterfaceInfo", G_TYPE_STRING, + &info, NULL); + } + + if (error != NULL) { DLEYNA_LOG_WARNING("NetworkInterfaceInfo retrieval failed: %s", - message); + error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "GetInterfaceInfo failed: %s", - message); + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "GetInterfaceInfo failed: %s", error->message); goto on_complete; } @@ -2384,15 +2380,9 @@ static void prv_sleeping_for_props_cb(GUPnPServiceProxy *proxy, cb_task_data->vb)); } - g_free(info); - on_complete: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - if (error) - g_error_free(error); DLEYNA_LOG_DEBUG("Exit"); } @@ -2421,27 +2411,25 @@ static void prv_get_sleeping_for_props(GUPnPServiceProxy *proxy, goto on_complete; } - cb_data->action = gupnp_service_proxy_begin_action( - proxy, "GetInterfaceInfo", - prv_sleeping_for_props_cb, - cb_data, - NULL); if (cb_data->proxy != NULL) g_object_remove_weak_pointer((G_OBJECT(cb_data->proxy)), (gpointer *)&cb_data->proxy); + cb_data->action = gupnp_service_proxy_action_new ("GetInterfaceInfo", NULL); + + + cb_data->proxy = proxy; g_object_add_weak_pointer((G_OBJECT(proxy)), (gpointer *)&cb_data->proxy); - if (!cb_data->cancel_id) - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); - + gupnp_service_proxy_call_action_async( + proxy, cb_data->action, + cb_data->cancellable, + prv_sleeping_for_props_cb, + cb_data); return; on_complete: @@ -2476,31 +2464,34 @@ on_error: return -1; } -static void prv_service_reset_for_prop_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_service_reset_for_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gchar *token = NULL; - gboolean end; + g_autoptr(GError) error = NULL; + g_autofree gchar *token = NULL; dls_async_task_t *cb_data = user_data; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(proxy, action, &error, - "ResetToken", G_TYPE_STRING, + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } + + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error,"ResetToken", G_TYPE_STRING, &token, NULL); + } - if (!end || (token == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; + if (error != NULL) { DLEYNA_LOG_WARNING("Unable to retrieve ServiceResetToken: %s", - message); + error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "GetServiceResetToken failed: %s", - message); + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "GetServiceResetToken failed: %s", error->message); goto on_complete; } @@ -2509,15 +2500,9 @@ static void prv_service_reset_for_prop_cb(GUPnPServiceProxy *proxy, DLEYNA_LOG_DEBUG("Service Reset %s", token); - g_free(token); - on_complete: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - if (error) - g_error_free(error); DLEYNA_LOG_DEBUG("Exit"); } @@ -2538,65 +2523,59 @@ static void prv_get_sr_token_for_prop(GUPnPServiceProxy *proxy, goto on_error; } - cb_data->action = gupnp_service_proxy_begin_action( - proxy, "GetServiceResetToken", - prv_service_reset_for_prop_cb, - cb_data, - NULL); cb_data->proxy = proxy; g_object_add_weak_pointer((G_OBJECT(proxy)), (gpointer *)&cb_data->proxy); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + cb_data->action = gupnp_service_proxy_action_new("GetServiceResetToken", NULL); + + gupnp_service_proxy_call_action_async( + proxy, cb_data->action, cb_data->cancellable, + prv_service_reset_for_prop_cb, cb_data); on_error: DLEYNA_LOG_DEBUG("Exit"); } -static void prv_service_reset_for_props_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_service_reset_for_props_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gchar *token = NULL; - gboolean end; + g_autoptr(GError) error = NULL; + g_autofree gchar *token = NULL; dls_async_task_t *cb_data = user_data; dls_async_get_all_t *cb_task_data; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); cb_task_data = &cb_data->ut.get_all; - end = gupnp_service_proxy_end_action(proxy, action, &error, - "ResetToken", G_TYPE_STRING, - &token, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error,"ResetToken", G_TYPE_STRING, + &token, NULL); + } - if (!end || (token == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; + if (error != NULL) { DLEYNA_LOG_WARNING("Unable to retrieve ServiceResetToken: %s", - message); + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "GetServiceResetToken failed: %s", error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "GetServiceResetToken failed: %s", - message); goto on_complete; } - g_variant_builder_add(cb_task_data->vb, "{sv}", - DLS_INTERFACE_PROP_SV_SERVICE_RESET_TOKEN, - g_variant_new_string(token)); DLEYNA_LOG_DEBUG("Service Reset %s", token); - g_free(token); - on_complete: if ((!cb_data->error) && (cb_task_data->proxy)) @@ -2608,13 +2587,8 @@ on_complete: cb_task_data->vb)); (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, - cb_data->cancel_id); } - if (error) - g_error_free(error); - DLEYNA_LOG_DEBUG("Exit"); } @@ -2635,11 +2609,6 @@ static void prv_get_sr_token_for_props(GUPnPServiceProxy *proxy, goto on_exit; /* No error here, just skip the property */ } - cb_data->action = gupnp_service_proxy_begin_action( - proxy, "GetServiceResetToken", - prv_service_reset_for_props_cb, - cb_data, - NULL); if (cb_data->proxy != NULL) g_object_remove_weak_pointer((G_OBJECT(cb_data->proxy)), @@ -2649,11 +2618,10 @@ static void prv_get_sr_token_for_props(GUPnPServiceProxy *proxy, g_object_add_weak_pointer((G_OBJECT(proxy)), (gpointer *)&cb_data->proxy); - if (!cb_data->cancel_id) - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + cb_data->action = gupnp_service_proxy_action_new("GetServiceResetToken", NULL); + gupnp_service_proxy_call_action_async( + proxy, cb_data->action, cb_data->cancellable, + prv_service_reset_for_props_cb, cb_data); on_exit: @@ -2662,34 +2630,36 @@ on_exit: return; } -static void prv_sleeping_for_prop_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_sleeping_for_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gchar *info = NULL; - gboolean end; + g_autoptr(GError) error = NULL; + g_autofree gchar *info = NULL; dls_async_task_t *cb_data = user_data; gboolean sleeping; + g_autoptr(GUPnPServiceProxyAction) action = NULL; + DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(proxy, action, &error, - "NetworkInterfaceInfo", - G_TYPE_STRING, - &info, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (info == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("NetworkInterfaceInfo retrieval failed: %s", - message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "NetworkInterfaceInfo", G_TYPE_STRING, + &info, NULL); + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "GetInterfaceInfo failed: %s", - message); + if (error != NULL) { + DLEYNA_LOG_WARNING("NetworkInterfaceInfo retrieval failed: %s", + error->message); + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "GetInterfaceInfo failed: %s", error->message); goto on_complete; } @@ -2700,15 +2670,9 @@ static void prv_sleeping_for_prop_cb(GUPnPServiceProxy *proxy, g_variant_new_boolean(sleeping)); } - g_free(info); - on_complete: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - if (error) - g_error_free(error); DLEYNA_LOG_DEBUG("Exit"); } @@ -2740,21 +2704,17 @@ static void prv_get_sleeping_for_prop(GUPnPServiceProxy *proxy, goto on_complete; } - cb_data->action = gupnp_service_proxy_begin_action( - proxy, "GetInterfaceInfo", - prv_sleeping_for_prop_cb, - cb_data, - NULL); - cb_data->proxy = proxy; g_object_add_weak_pointer((G_OBJECT(proxy)), - (gpointer *)&cb_data->proxy); + (gpointer *) &cb_data->proxy); + + cb_data->action = + gupnp_service_proxy_action_new("GetInterfaceInfo", NULL); + gupnp_service_proxy_call_action_async( + proxy, cb_data->action, cb_data->cancellable, + prv_sleeping_for_prop_cb, cb_data); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); on_complete: DLEYNA_LOG_DEBUG("Exit"); @@ -2777,32 +2737,35 @@ static gboolean prv_get_all_child_count_cb(dls_async_task_t *cb_data, return !cb_task_data->device_object; } -static void prv_get_all_ms2spec_props_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_get_all_ms2spec_props_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gchar *result = NULL; - gboolean end; - GUPnPDIDLLiteParser *parser = NULL; + g_autoptr(GError) error = NULL; + g_autofree gchar *result = NULL; + g_autoptr(GUPnPDIDLLiteParser) parser = NULL; dls_async_task_t *cb_data = user_data; dls_async_get_all_t *cb_task_data = &cb_data->ut.get_all; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, "Result", - G_TYPE_STRING, &result, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (result == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Browse operation failed: %s", message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "Result", G_TYPE_STRING, &result, NULL); + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Browse operation failed: %s", - message); + if(error != NULL) { + DLEYNA_LOG_WARNING("Browse operation failed: %s", + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Browse operation failed: %s", error->message); goto on_error; } @@ -2847,7 +2810,7 @@ static void prv_get_all_ms2spec_props_cb(GUPnPServiceProxy *proxy, goto no_complete; } else if (cb_data->task.type == DLS_TASK_GET_ALL_PROPS && cb_task_data->device_object) { - prv_get_system_update_id_for_props(proxy, + prv_get_system_update_id_for_props(GUPNP_SERVICE_PROXY(source), cb_data->task.target.device, cb_data); @@ -2860,18 +2823,8 @@ static void prv_get_all_ms2spec_props_cb(GUPnPServiceProxy *proxy, on_error: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); no_complete: - - if (error) - g_error_free(error); - - if (parser) - g_object_unref(parser); - - g_free(result); - DLEYNA_LOG_DEBUG("Exit"); } @@ -2904,27 +2857,22 @@ static void prv_get_all_ms2spec_props(dls_device_context_t *context, goto on_error; } - cb_data->action = gupnp_service_proxy_begin_action( - context->cds.proxy, "Browse", - prv_get_all_ms2spec_props_cb, cb_data, - "ObjectID", G_TYPE_STRING, task->target.id, - "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", - "Filter", G_TYPE_STRING, "*", - "StartingIndex", G_TYPE_INT, 0, - "RequestedCount", G_TYPE_INT, 0, - "SortCriteria", G_TYPE_STRING, - "", NULL); + cb_data->action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, task->target.id, + "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter", + G_TYPE_STRING, "*", "StartingIndex", G_TYPE_INT, 0, + "RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING, + "", NULL); + + gupnp_service_proxy_call_action_async( + context->cds.proxy, cb_data->action, cb_data->cancellable, + prv_get_all_ms2spec_props_cb, cb_data); cb_data->proxy = context->cds.proxy; g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); - DLEYNA_LOG_DEBUG("Exit with SUCCESS"); return; @@ -3096,33 +3044,34 @@ static gboolean prv_get_child_count_cb(dls_async_task_t *cb_data, return TRUE; } -static void prv_count_children_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) -{ +static void prv_count_children_cb(GObject *source, GAsyncResult *res, gpointer user_data){ dls_device_count_data_t *count_data = user_data; dls_async_task_t *cb_data = count_data->cb_data; - GError *error = NULL; - const gchar *message; + g_autoptr(GError) error = NULL; guint count = G_MAXUINT32; gboolean complete = FALSE; - gboolean end; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, - "TotalMatches", G_TYPE_UINT, &count, - NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (count == G_MAXUINT32)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Browse operation failed: %s", message); + if(error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, "TotalMatches", + G_TYPE_UINT, &count, NULL); + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Browse operation failed: %s", - message); + if(error != NULL) { + DLEYNA_LOG_WARNING("Browse operation failed: %s", + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Browse operation failed: %s", error->message); goto on_error; } @@ -3134,13 +3083,8 @@ on_error: if (cb_data->error || complete) { (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, - cb_data->cancel_id); } - if (error) - g_error_free(error); - DLEYNA_LOG_DEBUG("Exit"); } @@ -3152,62 +3096,59 @@ static void prv_get_child_count(dls_async_task_t *cb_data, DLEYNA_LOG_DEBUG("Enter"); prv_count_data_new(cb_data, cb, &count_data); - cb_data->action = - gupnp_service_proxy_begin_action(cb_data->proxy, - "Browse", - prv_count_children_cb, - count_data, - "ObjectID", G_TYPE_STRING, id, - - "BrowseFlag", G_TYPE_STRING, - "BrowseDirectChildren", + cb_data->action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, id, - "Filter", G_TYPE_STRING, "", + "BrowseFlag", G_TYPE_STRING, "BrowseDirectChildren", - "StartingIndex", G_TYPE_INT, - 0, + "Filter", G_TYPE_STRING, "", - "RequestedCount", G_TYPE_INT, - 1, + "StartingIndex", G_TYPE_INT, 0, - "SortCriteria", G_TYPE_STRING, - "", + "RequestedCount", G_TYPE_INT, 1, - NULL); + "SortCriteria", G_TYPE_STRING, "", NULL); + gupnp_service_proxy_call_action_async( + cb_data->proxy, cb_data->action, cb_data->cancellable, + prv_count_children_cb, count_data); DLEYNA_LOG_DEBUG("Exit with SUCCESS"); } -static void prv_get_ms2spec_prop_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_get_ms2spec_prop_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; - gchar *result = NULL; - gboolean end; - GUPnPDIDLLiteParser *parser = NULL; + g_autoptr(GError) error = NULL; + g_autofree gchar *result = NULL; + g_autoptr(GUPnPDIDLLiteParser) parser = NULL; dls_async_task_t *cb_data = user_data; dls_async_get_prop_t *cb_task_data = &cb_data->ut.get_prop; dls_task_get_prop_t *task_data = &cb_data->task.ut.get_prop; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, "Result", - G_TYPE_STRING, &result, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (result == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Browse operation failed: %s", message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "Result", G_TYPE_STRING, &result, NULL); + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Browse operation failed: %s", - message); + if(error != NULL) { + DLEYNA_LOG_WARNING("Browse operation failed: %s", + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Browse operation failed: %s", error->message); goto on_error; } + DLEYNA_LOG_DEBUG("GetMS2SpecProp result: %s", result); parser = gupnp_didl_lite_parser_new(); @@ -3257,18 +3198,8 @@ on_error: cb_data->task.target.id); } else { (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, - cb_data->cancel_id); } - if (error) - g_error_free(error); - - if (parser) - g_object_unref(parser); - - g_free(result); - DLEYNA_LOG_DEBUG("Exit"); } @@ -3319,24 +3250,16 @@ static void prv_get_ms2spec_prop(dls_device_context_t *context, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "Browse", - prv_get_ms2spec_prop_cb, - cb_data, - "ObjectID", G_TYPE_STRING, cb_data->task.target.id, - "BrowseFlag", G_TYPE_STRING, - "BrowseMetadata", - "Filter", G_TYPE_STRING, filter, - "StartingIndex", G_TYPE_INT, 0, - "RequestedCount", G_TYPE_INT, 0, - "SortCriteria", G_TYPE_STRING, - "", - NULL); + cb_data->action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, cb_data->task.target.id, + "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter", + G_TYPE_STRING, filter, "StartingIndex", G_TYPE_INT, 0, + "RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING, + "", NULL); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action, + cb_data->cancellable, + prv_get_ms2spec_prop_cb, cb_data); DLEYNA_LOG_DEBUG("Exit with SUCCESS"); @@ -3552,35 +3475,38 @@ on_error: DLEYNA_LOG_DEBUG("Exit with FAIL"); } -static void prv_search_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_search_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - gchar *result = NULL; - const gchar *message; - gboolean end; + g_autofree gchar *result = NULL; guint count = G_MAXUINT32; - GUPnPDIDLLiteParser *parser = NULL; - GError *error = NULL; + g_autoptr(GUPnPDIDLLiteParser) parser = NULL; + g_autoptr(GError) error = NULL; dls_async_task_t *cb_data = user_data; dls_async_bas_t *cb_task_data = &cb_data->ut.bas; + g_autoptr(GUPnPServiceProxyAction) action = NULL; + DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, - "Result", G_TYPE_STRING, &result, - "TotalMatches", G_TYPE_UINT, - &count, NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (result == NULL) || (count == G_MAXUINT32)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Search operation failed %s", message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "Result", G_TYPE_STRING, &result, + "TotalMatches", G_TYPE_UINT, &count, NULL); + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Search operation failed: %s", - message); + if(error != NULL) { + DLEYNA_LOG_WARNING("Search operation failed: %s", + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Search operation failed: %s", error->message); goto on_error; } @@ -3628,18 +3554,9 @@ static void prv_search_cb(GUPnPServiceProxy *proxy, on_error: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); no_complete: - if (parser) - g_object_unref(parser); - - g_free(result); - - if (error) - g_error_free(error); - DLEYNA_LOG_DEBUG("Exit"); } @@ -3660,22 +3577,18 @@ void dls_device_search(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "Search", - prv_search_cb, - cb_data, - "ContainerID", G_TYPE_STRING, task->target.id, - "SearchCriteria", G_TYPE_STRING, upnp_query, - "Filter", G_TYPE_STRING, upnp_filter, - "StartingIndex", G_TYPE_INT, task->ut.search.start, - "RequestedCount", G_TYPE_INT, task->ut.search.count, - "SortCriteria", G_TYPE_STRING, sort_by, - NULL); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + cb_data->action = gupnp_service_proxy_action_new( + "Search", "ContainerID", G_TYPE_STRING, task->target.id, + "SearchCriteria", G_TYPE_STRING, upnp_query, "Filter", + G_TYPE_STRING, upnp_filter, "StartingIndex", G_TYPE_INT, + task->ut.search.start, "RequestedCount", G_TYPE_INT, + task->ut.search.count, "SortCriteria", G_TYPE_STRING, sort_by, + NULL); + + gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action, + cb_data->cancellable, + prv_search_cb, cb_data); DLEYNA_LOG_DEBUG("Exit"); } @@ -3722,26 +3635,35 @@ static void prv_browse_objects_add_error_result(dls_async_browse_objects_t *bo, g_variant_builder_add(bo->avb, "@a{sv}", gv_result); } -static void prv_get_child_count_end_action_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, +static void prv_get_child_count_end_action_cb(GObject *source, + GAsyncResult *res, gpointer user_data) { - GError *error = NULL; - const gchar *message; + g_autoptr(GError) error = NULL; guint count = G_MAXUINT32; - gboolean end; + const char *message = NULL; dls_async_browse_objects_t *cb_task_data; - dls_async_task_t *cb_data = user_data; + dls_async_task_t *cb_data = dleyna_gasync_task_get_user_data(user_data); + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(proxy, action, &error, - "TotalMatches", G_TYPE_UINT, - &count, NULL); + action = gupnp_service_proxy_call_action_finish( + GUPNP_SERVICE_PROXY(source), res, &error); - cb_task_data = &((dls_async_task_t *)user_data)->ut.browse_objects; + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } + + if (error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, + "TotalMatches", G_TYPE_UINT, + &count, NULL); + } + + cb_task_data = &(cb_data)->ut.browse_objects; - if (!end || (count == G_MAXUINT32)) { + if (error != NULL || count == G_MAXUINT32) { message = (error != NULL) ? error->message : "Invalid result"; DLEYNA_LOG_WARNING("Browse operation failed: %s", message); @@ -3777,34 +3699,29 @@ on_complete: } if (cb_task_data->index < cb_task_data->object_count) - dleyna_service_task_add(cb_task_data->queue_id, - prv_browse_objects_begin_action_cb, - proxy, - prv_browse_objects_end_action_cb, - NULL, user_data); - - if (error) - g_error_free(error); + dleyna_gasync_task_add( + cb_task_data->queue_id, + prv_browse_objects_begin_action_cb, source, + dleyna_gasync_task_get_user_data(user_data), NULL, + cb_data); DLEYNA_LOG_DEBUG("Exit"); } -static GUPnPServiceProxyAction *prv_get_child_count_begin_action_cb( - dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_get_child_count_begin_action_cb(dleyna_gasync_task_t *task, + GObject *target) { GUPnPServiceProxyAction *action; dls_task_t *user_data; const gchar *path; - gchar *root_path = NULL; - gchar *id = NULL; + g_autofree gchar *root_path = NULL; + g_autofree gchar *id = NULL; dls_async_browse_objects_t *cb_task_data; - GError *error = NULL; + g_autoptr(GError) error = NULL; DLEYNA_LOG_DEBUG("Enter"); - user_data = (dls_task_t *)dleyna_service_task_get_user_data(task); + user_data = (dls_task_t *)dleyna_gasync_task_get_user_data(task); cb_task_data = &((dls_async_task_t *)user_data)->ut.browse_objects; path = cb_task_data->objects_id[cb_task_data->index - 1]; @@ -3814,9 +3731,7 @@ static GUPnPServiceProxyAction *prv_get_child_count_begin_action_cb( if (error != NULL) goto exit; - action = gupnp_service_proxy_begin_action( - proxy, "Browse", - dleyna_service_task_begin_action_cb, task, + action = gupnp_service_proxy_action_new ("Browse", "ObjectID", G_TYPE_STRING, id, "BrowseFlag", G_TYPE_STRING, "BrowseDirectChildren", "Filter", G_TYPE_STRING, "", @@ -3825,12 +3740,12 @@ static GUPnPServiceProxyAction *prv_get_child_count_begin_action_cb( "SortCriteria", G_TYPE_STRING, "", NULL); - g_free(root_path); - g_free(id); + gupnp_service_proxy_call_action_async( + GUPNP_SERVICE_PROXY(target), action, + dleyna_gasync_task_get_cancellable(task), + prv_get_child_count_end_action_cb, task); exit: - *failed = FALSE; - if (error != NULL) { DLEYNA_LOG_WARNING("%s: %s", path, error->message); action = NULL; @@ -3843,46 +3758,51 @@ exit: } if (cb_task_data->index < cb_task_data->object_count) - dleyna_service_task_add( + dleyna_gasync_task_add( cb_task_data->queue_id, prv_browse_objects_begin_action_cb, - proxy, - prv_browse_objects_end_action_cb, + target, + dleyna_gasync_task_get_cancellable(task), NULL, user_data); - g_error_free(error); } - return action; + return FALSE; } -static void prv_browse_objects_end_action_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, +static void prv_browse_objects_end_action_cb(GObject *source, + GAsyncResult *res, gpointer user_data) { GError *error = NULL; - dls_async_task_t *cb_data = user_data; + dleyna_gasync_task_t *task = user_data; + dls_async_task_t *cb_data = dleyna_gasync_task_get_user_data(task); dls_async_browse_objects_t *cb_task_data = &cb_data->ut.browse_objects; dls_async_get_all_t *cb_all_data = &cb_data->ut.browse_objects.get_all; GUPnPDIDLLiteParser *parser = NULL; gchar *result = NULL; - const gchar *message; - gboolean end; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(proxy, action, &error, - "Result", G_TYPE_STRING, &result, - NULL); + g_autoptr(GUPnPServiceProxyAction) action; - if (!end || (result == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; + action = gupnp_service_proxy_call_action_finish( + GUPNP_SERVICE_PROXY(source), res, &error); + + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } + + gupnp_service_proxy_action_get_result(action, &error, "Result", + G_TYPE_STRING, &result, NULL); + + if (error != NULL) { DLEYNA_LOG_WARNING("Browse Object operation failed: %s", - message); + error->message); cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, "Browse operation failed: %s", - message); + error->message); goto on_exit; } @@ -3924,11 +3844,11 @@ static void prv_browse_objects_end_action_cb(GUPnPServiceProxy *proxy, if (cb_all_data->need_child_count && (cb_all_data->filter_mask & DLS_UPNP_MASK_PROP_CHILD_COUNT)) { DLEYNA_LOG_DEBUG("Need Child Count"); - dleyna_service_task_add(cb_task_data->queue_id, - prv_get_child_count_begin_action_cb, - cb_data->proxy, - prv_get_child_count_end_action_cb, - NULL, cb_data); + dleyna_gasync_task_add(cb_task_data->queue_id, + prv_get_child_count_begin_action_cb, + G_OBJECT(cb_data->proxy), + dleyna_gasync_task_get_cancellable(task), + NULL, cb_data); goto no_complete; } @@ -3938,7 +3858,7 @@ static void prv_browse_objects_end_action_cb(GUPnPServiceProxy *proxy, on_exit: if (cb_data->error != NULL) { - message = cb_task_data->objects_id[cb_task_data->index - 1]; + const char *message = cb_task_data->objects_id[cb_task_data->index - 1]; prv_browse_objects_add_error_result(cb_task_data, message, cb_data->error); g_error_free(cb_data->error); @@ -3951,11 +3871,11 @@ on_exit: } if (cb_task_data->index < cb_task_data->object_count) - dleyna_service_task_add(cb_task_data->queue_id, - prv_browse_objects_begin_action_cb, - cb_data->proxy, - prv_browse_objects_end_action_cb, - NULL, cb_data); + dleyna_gasync_task_add(cb_task_data->queue_id, + prv_browse_objects_begin_action_cb, + G_OBJECT(cb_data->proxy), + dleyna_gasync_task_get_cancellable(task), + NULL, cb_data); no_complete: if (parser) @@ -3969,10 +3889,8 @@ no_complete: DLEYNA_LOG_DEBUG("Exit"); } -static GUPnPServiceProxyAction *prv_browse_objects_begin_action_cb( - dleyna_service_task_t *task, - GUPnPServiceProxy *proxy, - gboolean *failed) +static gboolean prv_browse_objects_begin_action_cb(dleyna_gasync_task_t *task, + GObject *target) { GUPnPServiceProxyAction *action; dls_task_t *user_data; @@ -3984,7 +3902,7 @@ static GUPnPServiceProxyAction *prv_browse_objects_begin_action_cb( DLEYNA_LOG_DEBUG("Enter called"); - user_data = (dls_task_t *)dleyna_service_task_get_user_data(task); + user_data = (dls_task_t *)dleyna_gasync_task_get_user_data(task); cb_task_data = &((dls_async_task_t *)user_data)->ut.browse_objects; path = cb_task_data->objects_id[cb_task_data->index]; @@ -3999,22 +3917,22 @@ static GUPnPServiceProxyAction *prv_browse_objects_begin_action_cb( DLEYNA_LOG_DEBUG("Browse Metadata for path [id]: %s [%s]", path, id); - action = gupnp_service_proxy_begin_action( - proxy, "Browse", - dleyna_service_task_begin_action_cb, task, - "ObjectID", G_TYPE_STRING, id, - "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", - "Filter", G_TYPE_STRING, cb_task_data->upnp_filter, - "StartingIndex", G_TYPE_INT, 0, - "RequestedCount", G_TYPE_INT, 0, - "SortCriteria", G_TYPE_STRING, "", NULL); + action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, id, "BrowseFlag", + G_TYPE_STRING, "BrowseMetadata", "Filter", G_TYPE_STRING, + cb_task_data->upnp_filter, "StartingIndex", G_TYPE_INT, 0, + "RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING, + "", NULL); + + gupnp_service_proxy_call_action_async( + GUPNP_SERVICE_PROXY(target), action, + dleyna_gasync_task_get_cancellable(task), + prv_browse_objects_end_action_cb, task); g_free(root_path); g_free(id); exit: - *failed = FALSE; - /* It's the ONLY place where index is incremented */ cb_task_data->index++; @@ -4026,28 +3944,14 @@ exit: g_error_free(error); if (cb_task_data->index < cb_task_data->object_count) - dleyna_service_task_add( - cb_task_data->queue_id, - prv_browse_objects_begin_action_cb, - proxy, - prv_browse_objects_end_action_cb, - NULL, user_data); + dleyna_gasync_task_add( + cb_task_data->queue_id, + prv_browse_objects_begin_action_cb, target, + dleyna_gasync_task_get_cancellable(task), NULL, + user_data); } - return action; -} - -static void prv_browse_objects_chain_cancelled(GCancellable *cancellable, - gpointer user_data) -{ - dls_async_task_t *cb_data = user_data; - - DLEYNA_LOG_DEBUG("Enter"); - - dleyna_task_processor_cancel_queue(cb_data->ut.browse_objects.queue_id); - dls_async_task_cancelled_cb(cancellable, user_data); - - DLEYNA_LOG_DEBUG("Exit"); + return FALSE; } static void prv_browse_objects_chain_end(gboolean cancelled, gpointer data) @@ -4108,12 +4012,12 @@ void dls_device_browse_objects(dls_client_t *client, dls_task_t *task) queue_id = dleyna_task_processor_add_queue( dls_server_get_task_processor(), - dleyna_service_task_create_source(), + dleyna_gasync_task_create_source(), DLS_SERVER_SINK, DLEYNA_TASK_QUEUE_FLAG_AUTO_REMOVE, - dleyna_service_task_process_cb, - dleyna_service_task_cancel_cb, - dleyna_service_task_delete_cb); + dleyna_gasync_task_process_cb, + dleyna_gasync_task_cancel_cb, + dleyna_gasync_task_delete_cb); dleyna_task_queue_set_finally(queue_id, prv_browse_objects_chain_end); dleyna_task_queue_set_user_data(queue_id, task); @@ -4130,16 +4034,9 @@ void dls_device_browse_objects(dls_client_t *client, dls_task_t *task) g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(prv_browse_objects_chain_cancelled), - cb_data, NULL); - - dleyna_service_task_add(queue_id, - prv_browse_objects_begin_action_cb, - cb_data->proxy, - prv_browse_objects_end_action_cb, - NULL, cb_data); + dleyna_gasync_task_add(queue_id, prv_browse_objects_begin_action_cb, + G_OBJECT(cb_data->proxy), cb_data->cancellable, NULL, + cb_data); dleyna_task_queue_start(queue_id); @@ -4170,21 +4067,15 @@ void dls_device_get_resource(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "Browse", - prv_get_all_ms2spec_props_cb, cb_data, - "ObjectID", G_TYPE_STRING, task->target.id, - "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", - "Filter", G_TYPE_STRING, upnp_filter, - "StartingIndex", G_TYPE_INT, 0, - "RequestedCount", G_TYPE_INT, 0, - "SortCriteria", G_TYPE_STRING, - "", NULL); - - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + cb_data->action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, task->target.id, + "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter", + G_TYPE_STRING, upnp_filter, "StartingIndex", G_TYPE_INT, 0, + "RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING, + "", NULL); + gupnp_service_proxy_call_action_async( + cb_data->proxy, cb_data->action, cb_data->cancellable, + prv_get_all_ms2spec_props_cb, cb_data); DLEYNA_LOG_DEBUG("Exit"); } @@ -4373,18 +4264,15 @@ static void prv_extract_import_uri(GUPnPDIDLLiteParser *parser, } } -static void prv_upload_delete_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_upload_delete_cb(GObject *source, GAsyncResult *res, gpointer user_data) { dls_async_task_t *cb_data = user_data; DLEYNA_LOG_DEBUG("Enter"); - (void) gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - NULL, NULL); + gupnp_service_proxy_call_action_finish(cb_data->proxy, res, NULL); + (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); DLEYNA_LOG_DEBUG("Exit"); } @@ -4481,7 +4369,7 @@ static void prv_post_finished(SoupSession *session, SoupMessage *msg, &upload_job->upload_id); if (upload) { upload_job->remove_idle = - g_timeout_add(30000, prv_remove_update_job, user_data); + g_timeout_add_seconds(30, prv_remove_update_job, user_data); if (SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { upload->status = DLS_UPLOAD_STATUS_COMPLETED; @@ -4634,35 +4522,36 @@ on_error: return NULL; } -static void prv_create_container_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_create_container_cb(GObject *source, GAsyncResult *res, gpointer user_data) { dls_async_task_t *cb_data = user_data; - const gchar *message; - GError *error = NULL; - gchar *result = NULL; - gchar *object_id = NULL; - gchar *object_path; - gboolean end; + g_autoptr(GError) error = NULL; + g_autofree gchar *result = NULL; + g_autofree gchar *object_id = NULL; + g_autofree gchar *object_path = NULL; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, "ObjectID", - G_TYPE_STRING, &object_id, - "Result", G_TYPE_STRING, &result, - NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); - if (!end || (object_id == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Create Object operation failed: %s", - message); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Create Object operation failed: %s", - message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "ObjectID", G_TYPE_STRING, &object_id, + "Result", G_TYPE_STRING, &result, NULL); + } + + if(error != NULL) { + DLEYNA_LOG_WARNING("Create Object operation failed: %s", error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Create Object operation failed: %s", error->message); goto on_error; } @@ -4670,59 +4559,56 @@ static void prv_create_container_cb(GUPnPServiceProxy *proxy, object_id); cb_data->task.result = g_variant_ref_sink(g_variant_new_object_path( object_path)); - g_free(object_path); - on_error: - (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - g_free(object_id); - g_free(result); - - if (error) - g_error_free(error); DLEYNA_LOG_DEBUG("Exit"); } -static void prv_generic_upload_cb(dls_async_task_t *cb_data, - char *file_path, - gchar *body, - gsize body_length, - const gchar *mime_type) +static void prv_create_object_upload_cb(GObject *source, GAsyncResult *res, + gpointer user_data) { - gchar *object_id = NULL; - gchar *result = NULL; + dls_async_task_t *cb_data = user_data; + char *file_path = cb_data->task.ut.upload.file_path; + gchar *body = NULL; + gsize body_length = 0; + const gchar *mime_type = cb_data->ut.upload.mime_type; + gchar *import_uri = NULL; - gchar *object_path; - const gchar *message; - GError *error = NULL; gboolean delete_needed = FALSE; - gboolean end; gint *upload_id; - GUPnPDIDLLiteParser *parser = NULL; + g_autoptr(GUPnPDIDLLiteParser) parser = NULL; GVariant *out_p[2]; dls_device_upload_t *upload; dls_device_upload_job_t *upload_job; + g_autoptr(GError) error = NULL; + g_autofree gchar *result = NULL; + g_autofree gchar *object_id = NULL; + g_autofree gchar *object_path = NULL; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, "ObjectID", - G_TYPE_STRING, &object_id, - "Result", G_TYPE_STRING, &result, - NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (object_id == NULL) || (result == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "ObjectID", G_TYPE_STRING, &object_id, + "Result", G_TYPE_STRING, &result, NULL); + } + + if(error != NULL) { DLEYNA_LOG_WARNING("Create Object operation failed: %s", - message); + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Create Object operation failed: %s", error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Create Object operation failed: %s", - message); goto on_error; } @@ -4796,8 +4682,6 @@ static void prv_generic_upload_cb(dls_async_task_t *cb_data, if (cb_data->task.target.device->upload_id > G_MAXINT) cb_data->task.target.device->upload_id = 0; - g_free(object_path); - on_error: if (cb_data->error && delete_needed) { @@ -4805,49 +4689,28 @@ on_error: "Upload failed deleting created object with id %s", object_id); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "DestroyObject", - prv_upload_delete_cb, cb_data, - "ObjectID", G_TYPE_STRING, object_id, - NULL); + cb_data->action = gupnp_service_proxy_action_new( + "DestroyObject", "ObjectID", G_TYPE_STRING, object_id, + NULL); + gupnp_service_proxy_call_action_async( + cb_data->proxy, cb_data->action, cb_data->cancellable, + prv_upload_delete_cb, cb_data); + + // Fire and forget operation, we unref the action here. + gupnp_service_proxy_action_unref (cb_data->action); } else { (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, - cb_data->cancel_id); } - g_free(object_id); - g_free(import_uri); - - if (parser) - g_object_unref(parser); - - g_free(result); - - if (error) - g_error_free(error); - DLEYNA_LOG_DEBUG("Exit"); } -static void prv_create_object_upload_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) -{ - dls_async_task_t *cb_data = user_data; - - prv_generic_upload_cb(cb_data, - cb_data->task.ut.upload.file_path, - NULL, 0, - cb_data->ut.upload.mime_type); -} - void dls_device_upload(dls_client_t *client, dls_task_t *task, const gchar *parent_id) { dls_async_task_t *cb_data = (dls_async_task_t *)task; dls_device_context_t *context; - gchar *didl; + g_autofree gchar *didl; dls_async_upload_t *cb_task_data; DLEYNA_LOG_DEBUG("Enter"); @@ -4869,19 +4732,13 @@ void dls_device_upload(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "CreateObject", - prv_create_object_upload_cb, cb_data, - "ContainerID", G_TYPE_STRING, parent_id, - "Elements", G_TYPE_STRING, didl, - NULL); - - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + cb_data->action = gupnp_service_proxy_action_new( + "CreateObject", "ContainerID", G_TYPE_STRING, parent_id, + "Elements", G_TYPE_STRING, didl, NULL); - g_free(didl); + gupnp_service_proxy_call_action_async( + cb_data->proxy, cb_data->action, cb_data->cancellable, + prv_create_object_upload_cb, cb_data); DLEYNA_LOG_DEBUG("Exit"); } @@ -4977,32 +4834,37 @@ on_error: return retval; } -static void prv_destroy_object_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_destroy_object_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *upnp_error = NULL; + g_autoptr(GError) upnp_error = NULL; dls_async_task_t *cb_data = user_data; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - if (!gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &upnp_error, - NULL)) { - DLEYNA_LOG_WARNING("Destroy Object operation failed: %s", + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &upnp_error); + + if(g_error_matches(upnp_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } + + if(upnp_error == NULL) { + gupnp_service_proxy_action_get_result(action, &upnp_error, + NULL); + } + + if(upnp_error != NULL) { + DLEYNA_LOG_WARNING("Create Object operation failed: %s", upnp_error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Destroy Object operation failed: %s", - upnp_error->message); + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Create Object operation failed: %s", + upnp_error->message); } (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - if (upnp_error) - g_error_free(upnp_error); DLEYNA_LOG_DEBUG("Exit"); } @@ -5022,15 +4884,12 @@ void dls_device_delete_object(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "DestroyObject", - prv_destroy_object_cb, cb_data, - "ObjectID", G_TYPE_STRING, task->target.id, - NULL); - - cb_data->cancel_id = g_cancellable_connect(cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + cb_data->action = gupnp_service_proxy_action_new( + "DestroyObject", "ObjectID", G_TYPE_STRING, task->target.id, + NULL); + gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action, + cb_data->cancellable, + prv_destroy_object_cb, cb_data); DLEYNA_LOG_DEBUG("Exit"); } @@ -5041,7 +4900,7 @@ void dls_device_create_container(dls_client_t *client, { dls_async_task_t *cb_data = (dls_async_task_t *)task; dls_device_context_t *context; - gchar *didl; + g_autofree gchar *didl = NULL; DLEYNA_LOG_DEBUG("Enter"); @@ -5064,19 +4923,13 @@ void dls_device_create_container(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "CreateObject", - prv_create_container_cb, cb_data, - "ContainerID", G_TYPE_STRING, parent_id, - "Elements", G_TYPE_STRING, didl, - NULL); + cb_data->action = gupnp_service_proxy_action_new( + "CreateObject", "ContainerID", G_TYPE_STRING, parent_id, + "Elements", G_TYPE_STRING, didl, NULL); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); - - g_free(didl); + gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action, + cb_data->cancellable, + prv_create_container_cb, cb_data); on_error: @@ -5085,33 +4938,36 @@ on_error: return; } -static void prv_update_object_update_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_update_object_update_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *upnp_error = NULL; + g_autoptr(GError) upnp_error = NULL; dls_async_task_t *cb_data = user_data; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - if (!gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &upnp_error, - NULL)) { + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &upnp_error); + if(g_error_matches(upnp_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } + + if(upnp_error == NULL) { + gupnp_service_proxy_action_get_result(action, &upnp_error, + NULL); + } + + if(upnp_error != NULL) { DLEYNA_LOG_WARNING("Update Object operation failed: %s", upnp_error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Update Object operation " - " failed: %s", - upnp_error->message); + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Update Object operation failed: %s", + upnp_error->message); } (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - if (upnp_error) - g_error_free(upnp_error); DLEYNA_LOG_DEBUG("Exit"); } @@ -5305,34 +5161,36 @@ static void prv_get_xml_fragments(GUPnPDIDLLiteParser *parser, DLEYNA_LOG_DEBUG("Exit"); } -static void prv_update_object_browse_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_update_object_browse_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; + g_autoptr(GError) error = NULL; dls_async_task_t *cb_data = user_data; dls_async_update_t *cb_task_data = &cb_data->ut.update; - GUPnPDIDLLiteParser *parser = NULL; - gchar *result = NULL; - const gchar *message; - gboolean end; + g_autoptr(GUPnPDIDLLiteParser) parser = NULL; + g_autofree gchar *result = NULL; + g_autoptr(GUPnPServiceProxyAction) action = NULL; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, - "Result", G_TYPE_STRING, &result, - NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (result == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Browse Object operation failed: %s", - message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "Result", G_TYPE_STRING, &result, NULL); + } + + if(error != NULL) { + DLEYNA_LOG_WARNING("Browse operation failed: %s", + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Browse operation failed: %s", error->message); - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Browse operation failed: %s", - message); goto on_error; } @@ -5367,32 +5225,24 @@ static void prv_update_object_browse_cb(GUPnPServiceProxy *proxy, goto on_error; } - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "UpdateObject", - prv_update_object_update_cb, cb_data, - "ObjectID", G_TYPE_STRING, cb_data->task.target.id, - "CurrentTagValue", G_TYPE_STRING, - cb_task_data->current_tag_value, - "NewTagValue", G_TYPE_STRING, cb_task_data->new_tag_value, - NULL); + cb_data->action = gupnp_service_proxy_action_new( + "UpdateObject", "ObjectID", G_TYPE_STRING, + cb_data->task.target.id, "CurrentTagValue", G_TYPE_STRING, + cb_task_data->current_tag_value, "NewTagValue", G_TYPE_STRING, + cb_task_data->new_tag_value, NULL); + + gupnp_service_proxy_call_action_async( + cb_data->proxy, cb_data->action, cb_data->cancellable, + prv_update_object_update_cb, cb_data); goto no_complete; on_error: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); no_complete: - if (parser) - g_object_unref(parser); - - g_free(result); - - if (error) - g_error_free(error); - DLEYNA_LOG_DEBUG("Exit"); } @@ -5412,50 +5262,48 @@ void dls_device_update_object(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "Browse", - prv_update_object_browse_cb, cb_data, - "ObjectID", G_TYPE_STRING, task->target.id, - "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", - "Filter", G_TYPE_STRING, upnp_filter, - "StartingIndex", G_TYPE_INT, 0, - "RequestedCount", G_TYPE_INT, 0, - "SortCriteria", G_TYPE_STRING, - "", NULL); - - cb_data->cancel_id = g_cancellable_connect(cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + + cb_data->action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, task->target.id, + "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter", + G_TYPE_STRING, upnp_filter, "StartingIndex", G_TYPE_INT, 0, + "RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING, + "", NULL); + + gupnp_service_proxy_call_action_async( + cb_data->proxy, cb_data->action, cb_data->cancellable, + prv_update_object_browse_cb, cb_data); DLEYNA_LOG_DEBUG("Exit"); } -static void prv_get_object_metadata_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_get_object_metadata_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; + g_autoptr(GError) error = NULL; dls_async_task_t *cb_data = user_data; - gchar *result = NULL; - const gchar *message; - gboolean end; + g_autofree gchar *result = NULL; + g_autoptr(GUPnPServiceProxyAction) action; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, - "Result", G_TYPE_STRING, &result, - NULL); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - if (!end || (result == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("Browse Object operation failed: %s", - message); + if(error == NULL) { + gupnp_service_proxy_action_get_result( + action, &error, "Result", G_TYPE_STRING, &result, NULL); + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Browse operation failed: %s", - message); + if(error != NULL) { + DLEYNA_LOG_WARNING("Browse operation failed: %s", + error->message); + + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "Browse operation failed: %s", error->message); goto on_complete; } @@ -5463,15 +5311,9 @@ static void prv_get_object_metadata_cb(GUPnPServiceProxy *proxy, DLEYNA_LOG_DEBUG("prv_get_object_metadata_cb result: %s", result); - g_free(result); - on_complete: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - if (error) - g_error_free(error); DLEYNA_LOG_DEBUG("Exit"); } @@ -5492,52 +5334,50 @@ void dls_device_get_object_metadata(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "Browse", - prv_get_object_metadata_cb, cb_data, - "ObjectID", G_TYPE_STRING, task->target.id, - "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", - "Filter", G_TYPE_STRING, "*", - "StartingIndex", G_TYPE_INT, 0, - "RequestedCount", G_TYPE_INT, 0, - "SortCriteria", G_TYPE_STRING, "", - NULL); + cb_data->action = gupnp_service_proxy_action_new( + "Browse", "ObjectID", G_TYPE_STRING, task->target.id, + "BrowseFlag", G_TYPE_STRING, "BrowseMetadata", "Filter", + G_TYPE_STRING, "*", "StartingIndex", G_TYPE_INT, 0, + "RequestedCount", G_TYPE_INT, 0, "SortCriteria", G_TYPE_STRING, + "", NULL); + + gupnp_service_proxy_call_action_async( + cb_data->proxy, cb_data->action, cb_data->cancellable, + prv_get_object_metadata_cb, cb_data); - cb_data->cancel_id = g_cancellable_connect(cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); DLEYNA_LOG_DEBUG("Exit"); } -static void prv_create_reference_cb(GUPnPServiceProxy *proxy, - GUPnPServiceProxyAction *action, - gpointer user_data) +static void prv_create_reference_cb(GObject *source, GAsyncResult *res, gpointer user_data) { - GError *error = NULL; + g_autoptr(GError) error = NULL; dls_async_task_t *cb_data = user_data; - const gchar *message; - gchar *object_id = NULL; - gchar *object_path; - gboolean end; + g_autofree gchar *object_id = NULL; + g_autofree gchar *object_path = NULL; + g_autoptr(GUPnPServiceProxyAction) action; DLEYNA_LOG_DEBUG("Enter"); - end = gupnp_service_proxy_end_action(cb_data->proxy, cb_data->action, - &error, - "NewID", G_TYPE_STRING, &object_id, - NULL); - if (!end || (object_id == NULL)) { - message = (error != NULL) ? error->message : "Invalid result"; - DLEYNA_LOG_WARNING("CreateReference operation failed: %s", - message); + action = gupnp_service_proxy_call_action_finish(cb_data->proxy, res, + &error); + if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + return; + } - cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, - DLEYNA_ERROR_OPERATION_FAILED, - "Update Object operation " - " failed: %s", - message); + if(error == NULL) { + gupnp_service_proxy_action_get_result(action, &error, "NewID", + G_TYPE_STRING, &object_id, + NULL); + } + + if(error != NULL) { + DLEYNA_LOG_WARNING("CreateReference operation failed: %s", + error->message); + cb_data->error = g_error_new( + DLEYNA_SERVER_ERROR, DLEYNA_ERROR_OPERATION_FAILED, + "CreateReference operation failed: %s", error->message); goto on_error; } @@ -5548,17 +5388,9 @@ static void prv_create_reference_cb(GUPnPServiceProxy *proxy, cb_data->task.result = g_variant_ref_sink(g_variant_new_object_path( object_path)); - g_free(object_path); - on_error: (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); - - g_free(object_id); - - if (error != NULL) - g_error_free(error); DLEYNA_LOG_DEBUG("Exit"); } @@ -5568,8 +5400,8 @@ void dls_device_create_reference(dls_client_t *client, { dls_async_task_t *cb_data = (dls_async_task_t *)task; dls_device_context_t *context; - gchar *i_root = NULL; - gchar *i_id = NULL; + g_autofree gchar *i_root = NULL; + g_autofree gchar *i_id = NULL; gchar *path = cb_data->task.ut.create_reference.item_path; DLEYNA_LOG_DEBUG("Enter"); @@ -5594,23 +5426,15 @@ void dls_device_create_reference(dls_client_t *client, g_object_add_weak_pointer((G_OBJECT(context->cds.proxy)), (gpointer *)&cb_data->proxy); - cb_data->action = gupnp_service_proxy_begin_action( - cb_data->proxy, "CreateReference", - prv_create_reference_cb, cb_data, - "ContainerID", G_TYPE_STRING, task->target.id, - "ObjectID", G_TYPE_STRING, i_id, - NULL); + cb_data->action = gupnp_service_proxy_action_new( + "CreateReference", "ContainerID", G_TYPE_STRING, + task->target.id, "ObjectID", G_TYPE_STRING, i_id, NULL); - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); + gupnp_service_proxy_call_action_async(cb_data->proxy, cb_data->action, + cb_data->cancellable, + prv_create_reference_cb, cb_data); on_error: - - g_free(i_root); - g_free(i_id); - DLEYNA_LOG_DEBUG("Exit"); } diff --git a/libdleyna/server/manager.c b/libdleyna/server/manager.c index 9dc59d6..2462b25 100644 --- a/libdleyna/server/manager.c +++ b/libdleyna/server/manager.c @@ -20,13 +20,14 @@ * */ +#include <config.h> + #include <glib.h> #include <string.h> #include <libdleyna/core/error.h> #include <libdleyna/core/log.h> -#include <libdleyna/core/service-task.h> -#include <libdleyna/core/white-list.h> +#include <libdleyna/core/context-filter.h> #include "interface.h" #include "manager.h" @@ -35,10 +36,10 @@ struct dls_manager_t_ { dleyna_connector_id_t connection; GUPnPContextManager *cm; - dleyna_white_list_t *wl; + dleyna_context_filter_t *cf; }; -static void prv_wl_notify_prop(dls_manager_t *manager, +static void prv_cf_notify_prop(dls_manager_t *manager, const gchar *prop_name, GVariant *prop_val) { @@ -64,13 +65,13 @@ dls_manager_t *dls_manager_new(dleyna_connector_id_t connection, GUPnPContextManager *connection_manager) { dls_manager_t *manager = g_new0(dls_manager_t, 1); - GUPnPWhiteList *gupnp_wl; + GUPnPContextFilter *gupnp_cf; - gupnp_wl = gupnp_context_manager_get_white_list(connection_manager); + gupnp_cf = gupnp_context_manager_get_context_filter(connection_manager); manager->connection = connection; manager->cm = connection_manager; - manager->wl = dleyna_white_list_new(gupnp_wl); + manager->cf = dleyna_context_filter_new(gupnp_cf); return manager; } @@ -78,14 +79,14 @@ dls_manager_t *dls_manager_new(dleyna_connector_id_t connection, void dls_manager_delete(dls_manager_t *manager) { if (manager != NULL) { - dleyna_white_list_delete(manager->wl); + dleyna_context_filter_delete(manager->cf); g_free(manager); } } -dleyna_white_list_t *dls_manager_get_white_list(dls_manager_t *manager) +dleyna_context_filter_t *dls_manager_get_context_filter(dls_manager_t *manager) { - return manager->wl; + return manager->cf; } void dls_manager_get_all_props(dls_manager_t *manager, @@ -188,7 +189,7 @@ static void prv_set_prop_never_quit(dls_manager_t *manager, if (*error == NULL) { prop_val = g_variant_new_boolean(never_quit); - prv_wl_notify_prop(manager, + prv_cf_notify_prop(manager, DLS_INTERFACE_PROP_NEVER_QUIT, prop_val); } @@ -198,7 +199,7 @@ exit: return; } -static void prv_set_prop_wl_enabled(dls_manager_t *manager, +static void prv_set_prop_cf_enabled(dls_manager_t *manager, dleyna_settings_t *settings, gboolean enabled, GError **error) @@ -208,20 +209,20 @@ static void prv_set_prop_wl_enabled(dls_manager_t *manager, DLEYNA_LOG_DEBUG("Enter %d", enabled); - old_val = dleyna_settings_is_white_list_enabled(settings); + old_val = dleyna_settings_is_context_filter_enabled(settings); if (old_val == enabled) goto exit; /* If no error, the white list will be updated in the reload callack */ - dleyna_settings_set_white_list_enabled(settings, enabled, error); + dleyna_settings_set_context_filter_enabled(settings, enabled, error); if (*error == NULL) { - dleyna_white_list_enable(manager->wl, enabled); + dleyna_context_filter_enable(manager->cf, enabled); prop_val = g_variant_new_boolean(enabled); - prv_wl_notify_prop(manager, + prv_cf_notify_prop(manager, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED, prop_val); } @@ -231,7 +232,7 @@ exit: return; } -static void prv_set_prop_wl_entries(dls_manager_t *manager, +static void prv_set_prop_cf_entries(dls_manager_t *manager, dleyna_settings_t *settings, GVariant *entries, GError **error) @@ -250,13 +251,13 @@ static void prv_set_prop_wl_entries(dls_manager_t *manager, /* If no error, the white list will be updated in the reload callack * callack */ - dleyna_settings_set_white_list_entries(settings, entries, error); + dleyna_settings_set_context_filter_entries(settings, entries, error); if (*error == NULL) { - dleyna_white_list_clear(manager->wl); - dleyna_white_list_add_entries(manager->wl, entries); + dleyna_context_filter_clear(manager->cf); + dleyna_context_filter_add_entries(manager->cf, entries); - prv_wl_notify_prop(manager, + prv_cf_notify_prop(manager, DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES, entries); } @@ -299,11 +300,11 @@ void dls_manager_set_prop(dls_manager_t *manager, g_variant_get_boolean(param), &error); else if (!strcmp(name, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED)) - prv_set_prop_wl_enabled(manager, settings, + prv_set_prop_cf_enabled(manager, settings, g_variant_get_boolean(param), &error); else if (!strcmp(name, DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES)) - prv_set_prop_wl_entries(manager, settings, param, &error); + prv_set_prop_cf_entries(manager, settings, param, &error); else cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, DLEYNA_ERROR_UNKNOWN_PROPERTY, diff --git a/libdleyna/server/manager.h b/libdleyna/server/manager.h index 955a80f..646edb2 100644 --- a/libdleyna/server/manager.h +++ b/libdleyna/server/manager.h @@ -26,6 +26,7 @@ #include <libdleyna/core/connector.h> #include <libdleyna/core/settings.h> #include <libgupnp/gupnp-context-manager.h> +#include <libdleyna/core/context-filter.h> #include "task.h" @@ -37,7 +38,7 @@ dls_manager_t *dls_manager_new(dleyna_connector_id_t connection, void dls_manager_delete(dls_manager_t *manager); -dleyna_white_list_t *dls_manager_get_white_list(dls_manager_t *manager); +dleyna_context_filter_t *dls_manager_get_context_filter(dls_manager_t *manager); void dls_manager_get_all_props(dls_manager_t *manager, dleyna_settings_t *settings, diff --git a/libdleyna/server/props.c b/libdleyna/server/props.c index ea18d62..78311ae 100755 --- a/libdleyna/server/props.c +++ b/libdleyna/server/props.c @@ -2105,7 +2105,7 @@ static GVariant *prv_build_wl_entries(dleyna_settings_t *settings) { GVariant *result; - result = dleyna_settings_white_list_entries(settings); + result = dleyna_settings_context_filter_entries(settings); if (result == NULL) result = g_variant_new("as", NULL); @@ -2119,7 +2119,7 @@ void dls_props_add_manager(dleyna_settings_t *settings, GVariantBuilder *vb) dleyna_settings_is_never_quit(settings)); prv_add_bool_prop(vb, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED, - dleyna_settings_is_white_list_enabled(settings)); + dleyna_settings_is_context_filter_enabled(settings)); g_variant_builder_add(vb, "{sv}", DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES, prv_build_wl_entries(settings)); @@ -2138,7 +2138,7 @@ GVariant *dls_props_get_manager_prop(dleyna_settings_t *settings, b_value = dleyna_settings_is_never_quit(settings); retval = g_variant_ref_sink(g_variant_new_boolean(b_value)); } else if (!strcmp(prop, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED)) { - b_value = dleyna_settings_is_white_list_enabled(settings); + b_value = dleyna_settings_is_context_filter_enabled(settings); retval = g_variant_ref_sink(g_variant_new_boolean(b_value)); } else if (!strcmp(prop, DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES)) { retval = g_variant_ref_sink(prv_build_wl_entries(settings)); diff --git a/libdleyna/server/server.c b/libdleyna/server/server.c index e90b446..99aa1c8 100644 --- a/libdleyna/server/server.c +++ b/libdleyna/server/server.c @@ -21,15 +21,17 @@ * */ +#include <config.h> + #include <glib.h> #include <string.h> #include <libdleyna/core/connector.h> +#include <libdleyna/core/context-filter.h> #include <libdleyna/core/control-point.h> #include <libdleyna/core/error.h> #include <libdleyna/core/log.h> #include <libdleyna/core/task-processor.h> -#include <libdleyna/core/white-list.h> #include "async.h" #include "client.h" @@ -1293,21 +1295,21 @@ dls_upnp_t *dls_server_get_upnp(void) return g_context.upnp; } -static void prv_white_list_init(void) +static void prv_context_filter_init(void) { gboolean enabled; GVariant *entries; - dleyna_white_list_t *wl; + dleyna_context_filter_t *wl; DLEYNA_LOG_DEBUG("Enter"); - enabled = dleyna_settings_is_white_list_enabled(g_context.settings); - entries = dleyna_settings_white_list_entries(g_context.settings); + enabled = dleyna_settings_is_context_filter_enabled(g_context.settings); + entries = dleyna_settings_context_filter_entries(g_context.settings); - wl = dls_manager_get_white_list(g_context.manager); + wl = dls_manager_get_context_filter(g_context.manager); - dleyna_white_list_enable(wl, enabled); - dleyna_white_list_add_entries(wl, entries); + dleyna_context_filter_enable(wl, enabled); + dleyna_context_filter_add_entries(wl, entries); DLEYNA_LOG_DEBUG("Exit"); } @@ -1340,7 +1342,7 @@ static gboolean prv_control_point_start_service( dls_upnp_get_context_manager( g_context.upnp)); - prv_white_list_init(); + prv_context_filter_init(); } else { retval = FALSE; } diff --git a/libdleyna/server/upnp.c b/libdleyna/server/upnp.c index d04efb8..b5d0c08 100644 --- a/libdleyna/server/upnp.c +++ b/libdleyna/server/upnp.c @@ -20,6 +20,8 @@ * */ +#include <config.h> + #include <string.h> #include <libgssdp/gssdp-resource-browser.h> @@ -28,7 +30,7 @@ #include <libdleyna/core/error.h> #include <libdleyna/core/log.h> -#include <libdleyna/core/service-task.h> +#include <libdleyna/core/gasync-task.h> #include "async.h" #include "device.h" @@ -123,12 +125,12 @@ static const dleyna_task_queue_key_t *prv_create_device_queue( queue_id = dleyna_task_processor_add_queue( dls_server_get_task_processor(), - dleyna_service_task_create_source(), + dleyna_gasync_task_create_source(), DLS_SERVER_SINK, DLEYNA_TASK_QUEUE_FLAG_AUTO_REMOVE, - dleyna_service_task_process_cb, - dleyna_service_task_cancel_cb, - dleyna_service_task_delete_cb); + dleyna_gasync_task_process_cb, + dleyna_gasync_task_cancel_cb, + dleyna_gasync_task_delete_cb); dleyna_task_queue_set_finally(queue_id, prv_device_chain_end); dleyna_task_queue_set_user_data(queue_id, *priv_t); @@ -212,7 +214,7 @@ static void prv_device_available_cb(GUPnPControlPoint *cp, udn = gupnp_device_info_get_udn(device_proxy); ip_address = gssdp_client_get_host_ip( - GSSDP_CLIENT(gupnp_control_point_get_context(cp))); + gssdp_resource_browser_get_client(GSSDP_RESOURCE_BROWSER(cp))); if (!udn || !ip_address) goto on_error; @@ -352,7 +354,7 @@ static void prv_device_unavailable_cb(GUPnPControlPoint *cp, udn = gupnp_device_info_get_udn((GUPnPDeviceInfo *)proxy); ip_address = gssdp_client_get_host_ip( - GSSDP_CLIENT(gupnp_control_point_get_context(cp))); + gssdp_resource_browser_get_client(GSSDP_RESOURCE_BROWSER(cp))); if (!udn || !ip_address) goto on_error; -- 2.37.3