From 21c4ff0e1d94454915eceaef3461cb2bdf3010f7 Mon Sep 17 00:00:00 2001 From: Ludovic Ferrandis Date: Wed, 11 Sep 2013 15:49:51 +0200 Subject: [Network Filtering] New API and save - Remove all WhiteListxxx API - Add Set() to 'org.freedesktop.DBus.Properties' interface to 'com.intel.dLeynaServer.Manager' root interface Signed-off-by: Ludovic Ferrandis --- libdleyna/server/interface.h | 3 +- libdleyna/server/manager.c | 209 +++++++++++++++++++++++++++++-------------- libdleyna/server/manager.h | 16 ++-- libdleyna/server/props.c | 43 +++------ libdleyna/server/props.h | 7 +- libdleyna/server/server.c | 92 ++++++++++--------- libdleyna/server/task.c | 84 ++++++----------- libdleyna/server/task.h | 39 ++++---- 8 files changed, 259 insertions(+), 234 deletions(-) (limited to 'libdleyna') diff --git a/libdleyna/server/interface.h b/libdleyna/server/interface.h index f8cb6c6..f77f845 100644 --- a/libdleyna/server/interface.h +++ b/libdleyna/server/interface.h @@ -157,10 +157,11 @@ enum dls_interface_type_ { #define DLS_INTERFACE_GET "Get" #define DLS_INTERFACE_GET_ALL "GetAll" +#define DLS_INTERFACE_SET "Set" #define DLS_INTERFACE_INTERFACE_NAME "InterfaceName" #define DLS_INTERFACE_PROPERTY_NAME "PropertyName" #define DLS_INTERFACE_PROPERTIES_VALUE "Properties" -#define DLS_INTERFACE_VALUE "value" +#define DLS_INTERFACE_VALUE "Value" #define DLS_INTERFACE_CHILD_TYPES "ChildTypes" #define DLS_INTERFACE_VERSION "Version" diff --git a/libdleyna/server/manager.c b/libdleyna/server/manager.c index b92ebc5..c1afc96 100644 --- a/libdleyna/server/manager.c +++ b/libdleyna/server/manager.c @@ -35,16 +35,16 @@ struct dls_manager_t_ { dleyna_connector_id_t connection; GUPnPContextManager *cm; + dleyna_white_list_t *wl; }; -static void prv_wl_notify_prop(dls_manager_t *manager, const gchar *prop_name) +static void prv_wl_notify_prop(dls_manager_t *manager, + const gchar *prop_name, + GVariant *prop_val) { - GVariant *prop_val; GVariant *val; GVariantBuilder array; - prop_val = dls_props_get_manager_prop(manager->cm, prop_name); - g_variant_builder_init(&array, G_VARIANT_TYPE("a{sv}")); g_variant_builder_add(&array, "{sv}", prop_name, prop_val); @@ -58,36 +58,19 @@ static void prv_wl_notify_prop(dls_manager_t *manager, const gchar *prop_name) DLS_INTERFACE_PROPERTIES_CHANGED, val, NULL); - g_variant_unref(prop_val); -} - -static void prv_wl_notify_enabled_prop(gpointer user_data) -{ - prv_wl_notify_prop((dls_manager_t *)user_data, - DLS_INTERFACE_PROP_WHITE_LIST_ENABLED); -} - -static void prv_wl_notify_entries_prop(gpointer user_data) -{ - prv_wl_notify_prop((dls_manager_t *)user_data, - DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES); } dls_manager_t *dls_manager_new(dleyna_connector_id_t connection, GUPnPContextManager *connection_manager) { dls_manager_t *manager = g_new0(dls_manager_t, 1); - dleyna_white_list_t wl_info; + GUPnPWhiteList *gupnp_wl; + + gupnp_wl = gupnp_context_manager_get_white_list(connection_manager); manager->connection = connection; manager->cm = connection_manager; - - wl_info.wl = gupnp_context_manager_get_white_list(manager->cm); - wl_info.cb_enabled = prv_wl_notify_enabled_prop; - wl_info.cb_entries = prv_wl_notify_entries_prop; - wl_info.user_data = manager; - - dleyna_white_list_set_info(&wl_info); + manager->wl = dleyna_white_list_new(gupnp_wl); return manager; } @@ -95,57 +78,38 @@ 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_set_info(NULL); + dleyna_white_list_delete(manager->wl); g_free(manager); } } -void dls_manager_wl_enable(dls_task_t *task) -{ - dleyna_white_list_enable(task->ut.white_list.enabled, TRUE); -} - -void dls_manager_wl_add_entries(dls_task_t *task) -{ - dleyna_white_list_add_entries(task->ut.white_list.entries, TRUE); -} - -void dls_manager_wl_remove_entries(dls_task_t *task) -{ - dleyna_white_list_remove_entries(task->ut.white_list.entries, TRUE); -} - -void dls_manager_wl_clear(dls_task_t *task) +dleyna_white_list_t *dls_manager_get_white_list(dls_manager_t *manager) { - dleyna_white_list_clear(TRUE); + return manager->wl; } void dls_manager_get_all_props(dls_manager_t *manager, + dleyna_settings_t *settings, dls_task_t *task, dls_manager_task_complete_t cb) { dls_async_task_t *cb_data = (dls_async_task_t *)task; dls_async_get_all_t *cb_task_data; dls_task_get_props_t *task_data = &task->ut.get_props; + gchar *i_name = task_data->interface_name; DLEYNA_LOG_DEBUG("Enter"); DLEYNA_LOG_DEBUG("Path: %s", task->target.path); - DLEYNA_LOG_DEBUG("Interface %s", task->ut.get_prop.interface_name); + DLEYNA_LOG_DEBUG("Interface %s", i_name); cb_data->cb = cb; cb_task_data = &cb_data->ut.get_all; cb_task_data->vb = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - if (!strcmp(task_data->interface_name, - DLEYNA_SERVER_INTERFACE_MANAGER) || - !strcmp(task_data->interface_name, "")) { - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); - - dls_props_add_manager(manager->cm, cb_task_data->vb); + if (!strcmp(i_name, DLEYNA_SERVER_INTERFACE_MANAGER) || + !strcmp(i_name, "")) { + dls_props_add_manager(settings, cb_task_data->vb); cb_data->task.result = g_variant_ref_sink( g_variant_builder_end( @@ -159,36 +123,31 @@ void dls_manager_get_all_props(dls_manager_t *manager, } (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); DLEYNA_LOG_DEBUG("Exit"); } void dls_manager_get_prop(dls_manager_t *manager, + dleyna_settings_t *settings, dls_task_t *task, dls_manager_task_complete_t cb) { dls_async_task_t *cb_data = (dls_async_task_t *)task; dls_task_get_prop_t *task_data = &task->ut.get_prop; + gchar *i_name = task_data->interface_name; + gchar *name = task_data->prop_name; DLEYNA_LOG_DEBUG("Enter"); DLEYNA_LOG_DEBUG("Path: %s", task->target.path); - DLEYNA_LOG_DEBUG("Interface %s", task->ut.get_prop.interface_name); - DLEYNA_LOG_DEBUG("Prop.%s", task->ut.get_prop.prop_name); + DLEYNA_LOG_DEBUG("Interface %s", i_name); + DLEYNA_LOG_DEBUG("Prop.%s", name); cb_data->cb = cb; - if (!strcmp(task_data->interface_name, - DLEYNA_SERVER_INTERFACE_MANAGER) || - !strcmp(task_data->interface_name, "")) { - cb_data->cancel_id = g_cancellable_connect( - cb_data->cancellable, - G_CALLBACK(dls_async_task_cancelled_cb), - cb_data, NULL); - - cb_data->task.result = dls_props_get_manager_prop( - manager->cm, - task_data->prop_name); + if (!strcmp(i_name, DLEYNA_SERVER_INTERFACE_MANAGER) || + !strcmp(i_name, "")) { + cb_data->task.result = dls_props_get_manager_prop(settings, + name); if (!cb_data->task.result) cb_data->error = g_error_new( @@ -204,7 +163,121 @@ void dls_manager_get_prop(dls_manager_t *manager, } (void) g_idle_add(dls_async_task_complete, cb_data); - g_cancellable_disconnect(cb_data->cancellable, cb_data->cancel_id); DLEYNA_LOG_DEBUG("Exit"); } + +static void prv_set_prop_wl_enabled(dls_manager_t *manager, + dleyna_settings_t *settings, + gboolean enabled, + GError **error) +{ + GVariant *prop_val; + gboolean old_val; + + DLEYNA_LOG_DEBUG("Enter %d", enabled); + + old_val = dleyna_settings_is_white_list_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); + + if (*error == NULL) { + dleyna_white_list_enable(manager->wl, enabled); + + prop_val = g_variant_new_boolean(enabled); + prv_wl_notify_prop(manager, + DLS_INTERFACE_PROP_WHITE_LIST_ENABLED, + prop_val); + } + +exit: + DLEYNA_LOG_DEBUG("Exit"); + return; +} + +static void prv_set_prop_wl_entries(dls_manager_t *manager, + dleyna_settings_t *settings, + GVariant *entries, + GError **error) +{ + DLEYNA_LOG_DEBUG("Enter"); + + if (strcmp(g_variant_get_type_string(entries), "as")) { + DLEYNA_LOG_WARNING("Invalid parameter type. 'as' expected."); + + *error = g_error_new(DLEYNA_SERVER_ERROR, + DLEYNA_ERROR_BAD_QUERY, + "Invalid parameter type. 'as' expected."); + goto exit; + } + + /* If no error, the white list will be updated in the reload callack + * callack + */ + dleyna_settings_set_white_list_entries(settings, entries, error); + + if (*error == NULL) { + dleyna_white_list_clear(manager->wl); + dleyna_white_list_add_entries(manager->wl, entries); + + prv_wl_notify_prop(manager, + DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES, + entries); + } + +exit: + DLEYNA_LOG_DEBUG("Exit"); +} + +void dls_manager_set_prop(dls_manager_t *manager, + dleyna_settings_t *settings, + dls_task_t *task, + dls_manager_task_complete_t cb) +{ + dls_async_task_t *cb_data = (dls_async_task_t *)task; + dls_task_set_prop_t *task_data = &task->ut.set_prop; + GVariant *param = task_data->params; + gchar *name = task_data->prop_name; + gchar *i_name = task_data->interface_name; + GError *error = NULL; + + DLEYNA_LOG_DEBUG("Enter"); + DLEYNA_LOG_DEBUG("Path: %s", task->target.path); + DLEYNA_LOG_DEBUG("Interface %s", i_name); + DLEYNA_LOG_DEBUG("Prop.%s", name); + + cb_data->cb = cb; + + if (strcmp(i_name, DLEYNA_SERVER_INTERFACE_MANAGER) && + strcmp(i_name, "")) { + DLEYNA_LOG_WARNING("Interface is unknown."); + + cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, + DLEYNA_ERROR_UNKNOWN_INTERFACE, + "Interface is unknown."); + goto exit; + } + + if (!strcmp(name, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED)) + prv_set_prop_wl_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); + else + cb_data->error = g_error_new(DLEYNA_SERVER_ERROR, + DLEYNA_ERROR_UNKNOWN_PROPERTY, + "Unknown property"); + + if (error != NULL) + cb_data->error = error; + +exit: + (void) g_idle_add(dls_async_task_complete, cb_data); + DLEYNA_LOG_DEBUG("Exit"); +} diff --git a/libdleyna/server/manager.h b/libdleyna/server/manager.h index c7542f7..3487a3b 100644 --- a/libdleyna/server/manager.h +++ b/libdleyna/server/manager.h @@ -24,6 +24,7 @@ #define DLS_MANAGER_H__ #include +#include #include #include "task.h" @@ -36,19 +37,20 @@ dls_manager_t *dls_manager_new(dleyna_connector_id_t connection, void dls_manager_delete(dls_manager_t *manager); -void dls_manager_wl_enable(dls_task_t *task); - -void dls_manager_wl_add_entries(dls_task_t *task); - -void dls_manager_wl_remove_entries(dls_task_t *task); - -void dls_manager_wl_clear(dls_task_t *task); +dleyna_white_list_t *dls_manager_get_white_list(dls_manager_t *manager); void dls_manager_get_all_props(dls_manager_t *manager, + dleyna_settings_t *settings, dls_task_t *task, dls_manager_task_complete_t cb); void dls_manager_get_prop(dls_manager_t *manager, + dleyna_settings_t *settings, + dls_task_t *task, + dls_manager_task_complete_t cb); + +void dls_manager_set_prop(dls_manager_t *manager, + dleyna_settings_t *settings, dls_task_t *task, dls_manager_task_complete_t cb); diff --git a/libdleyna/server/props.c b/libdleyna/server/props.c index e66e0a2..6ff6cf6 100644 --- a/libdleyna/server/props.c +++ b/libdleyna/server/props.c @@ -2060,57 +2060,42 @@ on_error: return retval; } -static void prv_add_list_wl_entries(gpointer data, gpointer user_data) +static GVariant *prv_build_wl_entries(dleyna_settings_t *settings) { - GVariantBuilder *vb = (GVariantBuilder *)user_data; - gchar *entry = (gchar *)data; + GVariant *result; - g_variant_builder_add(vb, "s", entry); -} + result = dleyna_settings_white_list_entries(settings); -void dls_props_add_manager(GUPnPContextManager *manager, GVariantBuilder *vb) -{ - GUPnPWhiteList *wl; - GList *list; - GVariantBuilder vb2; + if (result == NULL) + result = g_variant_new("as", NULL); - wl = gupnp_context_manager_get_white_list(manager); - list = gupnp_white_list_get_entries(wl); + return result; +} +void dls_props_add_manager(dleyna_settings_t *settings, GVariantBuilder *vb) +{ prv_add_bool_prop(vb, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED, - gupnp_white_list_get_enabled(wl)); - - g_variant_builder_init(&vb2, G_VARIANT_TYPE("as")); - g_list_foreach(list, prv_add_list_wl_entries, &vb2); + dleyna_settings_is_white_list_enabled(settings)); g_variant_builder_add(vb, "{sv}", DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES, - g_variant_builder_end(&vb2)); + prv_build_wl_entries(settings)); } -GVariant *dls_props_get_manager_prop(GUPnPContextManager *manager, +GVariant *dls_props_get_manager_prop(dleyna_settings_t *settings, const gchar *prop) { GVariant *retval = NULL; - GUPnPWhiteList *wl; - GVariantBuilder vb; - GList *list; gboolean b_value; #if DLEYNA_LOG_LEVEL & DLEYNA_LOG_LEVEL_DEBUG gchar *prop_str; #endif - wl = gupnp_context_manager_get_white_list(manager); - if (!strcmp(prop, DLS_INTERFACE_PROP_WHITE_LIST_ENABLED)) { - b_value = gupnp_white_list_get_enabled(wl); + b_value = dleyna_settings_is_white_list_enabled(settings); retval = g_variant_ref_sink(g_variant_new_boolean(b_value)); } else if (!strcmp(prop, DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES)) { - list = gupnp_white_list_get_entries(wl); - - g_variant_builder_init(&vb, G_VARIANT_TYPE("as")); - g_list_foreach(list, prv_add_list_wl_entries, &vb); - retval = g_variant_ref_sink(g_variant_builder_end(&vb)); + retval = g_variant_ref_sink(prv_build_wl_entries(settings)); } #if DLEYNA_LOG_LEVEL & DLEYNA_LOG_LEVEL_DEBUG diff --git a/libdleyna/server/props.h b/libdleyna/server/props.h index 1cb5e93..72cff1b 100644 --- a/libdleyna/server/props.h +++ b/libdleyna/server/props.h @@ -25,6 +25,9 @@ #include #include + +#include + #include "async.h" #define DLS_UPNP_MASK_PROP_PARENT (1LL << 0) @@ -142,9 +145,9 @@ const gchar *dls_props_upnp_class_to_media_spec(const gchar *upnp_class); const gchar *dls_props_upnp_class_to_media_spec_ex(const gchar *upnp_class); -void dls_props_add_manager(GUPnPContextManager *manager, GVariantBuilder *vb); +void dls_props_add_manager(dleyna_settings_t *settings, GVariantBuilder *vb); -GVariant *dls_props_get_manager_prop(GUPnPContextManager *manager, +GVariant *dls_props_get_manager_prop(dleyna_settings_t *settings, const gchar *prop); GVariant *dls_props_get_error_prop(GError *error); diff --git a/libdleyna/server/server.c b/libdleyna/server/server.c index c6e1082..40de9a2 100644 --- a/libdleyna/server/server.c +++ b/libdleyna/server/server.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "async.h" #include "client.h" @@ -84,20 +85,6 @@ static const gchar g_root_introspection[] = " " " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " " " " " " " @@ -105,9 +92,9 @@ static const gchar g_root_introspection[] = " " " " " " + " access='readwrite'/>" " " + " access='readwrite'/>" " " " " " " @@ -124,6 +111,14 @@ static const gchar g_root_introspection[] = " " " " + " " + " " + " " + " " + " " " " " " " " @@ -593,22 +588,6 @@ static void prv_process_sync_task(dls_task_t *task) case DLS_TASK_CANCEL_UPLOAD: dls_upnp_cancel_upload(g_context.upnp, task); break; - case DLS_TASK_WHITE_LIST_ENABLE: - dls_manager_wl_enable(task); - dls_task_complete(task); - break; - case DLS_TASK_WHITE_LIST_ADD_ENTRIES: - dls_manager_wl_add_entries(task); - dls_task_complete(task); - break; - case DLS_TASK_WHITE_LIST_REMOVE_ENTRIES: - dls_manager_wl_remove_entries(task); - dls_task_complete(task); - break; - case DLS_TASK_WHITE_LIST_CLEAR: - dls_manager_wl_clear(task); - dls_task_complete(task); - break; default: goto finished; break; @@ -650,12 +629,16 @@ static void prv_process_async_task(dls_task_t *task) switch (task->type) { case DLS_TASK_MANAGER_GET_PROP: - dls_manager_get_prop(g_context.manager, task, - prv_async_task_complete); + dls_manager_get_prop(g_context.manager, g_context.settings, + task, prv_async_task_complete); break; case DLS_TASK_MANAGER_GET_ALL_PROPS: - dls_manager_get_all_props(g_context.manager, task, - prv_async_task_complete); + dls_manager_get_all_props(g_context.manager, g_context.settings, + task, prv_async_task_complete); + break; + case DLS_TASK_MANAGER_SET_PROP: + dls_manager_set_prop(g_context.manager, g_context.settings, + task, prv_async_task_complete); break; case DLS_TASK_GET_CHILDREN: dls_upnp_get_children(g_context.upnp, client, task, @@ -890,14 +873,6 @@ static void prv_manager_root_method_call( } else if (!strcmp(method, DLS_INTERFACE_PREFER_LOCAL_ADDRESSES)) { task = dls_task_prefer_local_addresses_new(invocation, parameters); - } else if (!strcmp(method, DLS_INTERFACE_WHITE_LIST_ENABLE)) { - task = dls_task_wl_enable_new(invocation, parameters); - } else if (!strcmp(method, DLS_INTERFACE_WHITE_LIST_ADD_ENTRIES)) { - task = dls_task_wl_add_entries_new(invocation, parameters); - } else if (!strcmp(method, DLS_INTERFACE_WHITE_LIST_REMOVE_ENTRIES)) { - task = dls_task_wl_remove_entries_new(invocation, parameters); - } else if (!strcmp(method, DLS_INTERFACE_WHITE_LIST_CLEAR)) { - task = dls_task_wl_clear_new(invocation); } else { goto finished; } @@ -926,6 +901,9 @@ static void prv_manager_props_method_call(dleyna_connector_id_t conn, else if (!strcmp(method, DLS_INTERFACE_GET)) task = dls_task_manager_get_prop_new(invocation, object, parameters, &error); + else if (!strcmp(method, DLS_INTERFACE_SET)) + task = dls_task_manager_set_prop_new(invocation, object, + parameters, &error); else goto finished; @@ -1277,6 +1255,25 @@ dls_upnp_t *dls_server_get_upnp(void) return g_context.upnp; } +static void prv_white_list_init(void) +{ + gboolean enabled; + GVariant *entries; + dleyna_white_list_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); + + wl = dls_manager_get_white_list(g_context.manager); + + dleyna_white_list_enable(wl, enabled); + dleyna_white_list_add_entries(wl, entries); + + DLEYNA_LOG_DEBUG("Exit"); +} + static gboolean prv_control_point_start_service( dleyna_connector_id_t connection) { @@ -1301,13 +1298,14 @@ static gboolean prv_control_point_start_service( NULL); g_context.manager = dls_manager_new(connection, - dls_upnp_get_context_manager(g_context.upnp)); + dls_upnp_get_context_manager( + g_context.upnp)); + + prv_white_list_init(); } else { retval = FALSE; } - dleyna_settings_init_white_list(g_context.settings); - return retval; } diff --git a/libdleyna/server/task.c b/libdleyna/server/task.c index 9f39929..1ad4108 100644 --- a/libdleyna/server/task.c +++ b/libdleyna/server/task.c @@ -46,6 +46,11 @@ static void prv_delete(dls_task_t *task) g_free(task->ut.get_prop.interface_name); g_free(task->ut.get_prop.prop_name); break; + case DLS_TASK_MANAGER_SET_PROP: + g_free(task->ut.set_prop.interface_name); + g_free(task->ut.set_prop.prop_name); + g_variant_unref(task->ut.set_prop.params); + break; case DLS_TASK_SEARCH: g_free(task->ut.search.query); if (task->ut.search.filter) @@ -92,11 +97,6 @@ static void prv_delete(dls_task_t *task) g_free(task->ut.get_icon.resolution); g_free(task->ut.get_icon.mime_type); break; - case DLS_TASK_WHITE_LIST_ADD_ENTRIES: - case DLS_TASK_WHITE_LIST_REMOVE_ENTRIES: - if (task->ut.white_list.entries) - g_variant_unref(task->ut.white_list.entries); - break; default: break; } @@ -146,57 +146,6 @@ dls_task_t *dls_task_get_servers_new(dleyna_connector_msg_id_t invocation) return task; } -dls_task_t *dls_task_wl_enable_new(dleyna_connector_msg_id_t invocation, - GVariant *parameters) -{ - dls_task_t *task = g_new0(dls_task_t, 1); - - task->type = DLS_TASK_WHITE_LIST_ENABLE; - task->invocation = invocation; - task->synchronous = TRUE; - g_variant_get(parameters, "(b)", - &task->ut.white_list.enabled); - - return task; -} - -dls_task_t *dls_task_wl_clear_new(dleyna_connector_msg_id_t invocation) -{ - dls_task_t *task = g_new0(dls_task_t, 1); - - task->type = DLS_TASK_WHITE_LIST_CLEAR; - task->invocation = invocation; - task->synchronous = TRUE; - - return task; -} - -dls_task_t *dls_task_wl_add_entries_new(dleyna_connector_msg_id_t invocation, - GVariant *parameters) -{ - dls_task_t *task = g_new0(dls_task_t, 1); - - task->type = DLS_TASK_WHITE_LIST_ADD_ENTRIES; - task->invocation = invocation; - task->synchronous = TRUE; - g_variant_get(parameters, "(@as)", &task->ut.white_list.entries); - - return task; -} - -dls_task_t *dls_task_wl_remove_entries_new(dleyna_connector_msg_id_t invocation, - GVariant *parameters) -{ - dls_task_t *task = g_new0(dls_task_t, 1); - - task->type = DLS_TASK_WHITE_LIST_REMOVE_ENTRIES; - task->invocation = invocation; - task->synchronous = TRUE; - g_variant_get(parameters, "(@as)", &task->ut.white_list.entries); - - return task; -} - dls_task_t *dls_task_manager_get_prop_new(dleyna_connector_msg_id_t invocation, const gchar *path, GVariant *parameters, @@ -237,6 +186,29 @@ dls_task_t *dls_task_manager_get_props_new(dleyna_connector_msg_id_t invocation, return task; } +dls_task_t *dls_task_manager_set_prop_new(dleyna_connector_msg_id_t invocation, + const gchar *path, + GVariant *parameters, + GError **error) +{ + dls_task_t *task = (dls_task_t *)g_new0(dls_async_task_t, 1); + + g_variant_get(parameters, "(ssv)", + &task->ut.set_prop.interface_name, + &task->ut.set_prop.prop_name, + &task->ut.set_prop.params); + + g_strstrip(task->ut.set_prop.interface_name); + g_strstrip(task->ut.set_prop.prop_name); + + task->target.path = g_strstrip(g_strdup(path)); + + task->type = DLS_TASK_MANAGER_SET_PROP; + task->invocation = invocation; + + return task; +} + static gboolean prv_set_task_target_info(dls_task_t *task, const gchar *path, GError **error) { diff --git a/libdleyna/server/task.h b/libdleyna/server/task.h index c8cf613..a06b3e2 100644 --- a/libdleyna/server/task.h +++ b/libdleyna/server/task.h @@ -55,12 +55,9 @@ enum dls_task_type_t_ { DLS_TASK_GET_OBJECT_METADATA, DLS_TASK_CREATE_REFERENCE, DLS_TASK_GET_ICON, - DLS_TASK_WHITE_LIST_ENABLE, - DLS_TASK_WHITE_LIST_ADD_ENTRIES, - DLS_TASK_WHITE_LIST_REMOVE_ENTRIES, - DLS_TASK_WHITE_LIST_CLEAR, DLS_TASK_MANAGER_GET_ALL_PROPS, - DLS_TASK_MANAGER_GET_PROP + DLS_TASK_MANAGER_GET_PROP, + DLS_TASK_MANAGER_SET_PROP }; typedef enum dls_task_type_t_ dls_task_type_t; @@ -87,6 +84,13 @@ struct dls_task_get_prop_t_ { gchar *interface_name; }; +typedef struct dls_task_set_prop_t_ dls_task_set_prop_t; +struct dls_task_set_prop_t_ { + gchar *prop_name; + gchar *interface_name; + GVariant *params; +}; + typedef struct dls_task_search_t_ dls_task_search_t; struct dls_task_search_t_ { gchar *query; @@ -162,12 +166,6 @@ struct dls_task_get_icon_t_ { gchar *resolution; }; -typedef struct dls_task_white_list_t_ dls_task_white_list_t; -struct dls_task_white_list_t_ { - gboolean enabled; - GVariant *entries; -}; - typedef struct dls_task_t_ dls_task_t; struct dls_task_t_ { dleyna_task_atom_t atom; /* pseudo inheritance - MUST be first field */ @@ -182,6 +180,7 @@ struct dls_task_t_ { dls_task_get_children_t get_children; dls_task_get_props_t get_props; dls_task_get_prop_t get_prop; + dls_task_set_prop_t set_prop; dls_task_search_t search; dls_task_get_resource_t resource; dls_task_set_prefer_local_addresses_t prefer_local_addresses; @@ -192,7 +191,6 @@ struct dls_task_t_ { dls_task_update_t update; dls_task_create_reference_t create_reference; dls_task_get_icon_t get_icon; - dls_task_white_list_t white_list; dls_task_browse_objects_t browse_objects; } ut; }; @@ -296,18 +294,6 @@ dls_task_t *dls_task_get_icon_new(dleyna_connector_msg_id_t invocation, const gchar *path, GVariant *parameters, GError **error); - -dls_task_t *dls_task_wl_enable_new(dleyna_connector_msg_id_t invocation, - GVariant *parameters); - -dls_task_t *dls_task_wl_clear_new(dleyna_connector_msg_id_t invocation); - -dls_task_t *dls_task_wl_add_entries_new(dleyna_connector_msg_id_t invocation, - GVariant *parameters); - -dls_task_t *dls_task_wl_remove_entries_new(dleyna_connector_msg_id_t invocation, - GVariant *parameters); - dls_task_t *dls_task_manager_get_prop_new(dleyna_connector_msg_id_t invocation, const gchar *path, GVariant *parameters, @@ -318,6 +304,11 @@ dls_task_t *dls_task_manager_get_props_new(dleyna_connector_msg_id_t invocation, GVariant *parameters, GError **error); +dls_task_t *dls_task_manager_set_prop_new(dleyna_connector_msg_id_t invocation, + const gchar *path, + GVariant *parameters, + GError **error); + void dls_task_cancel(dls_task_t *task); void dls_task_complete(dls_task_t *task); -- cgit v1.2.1