diff options
Diffstat (limited to 'libdleyna/server/manager.c')
-rw-r--r-- | libdleyna/server/manager.c | 209 |
1 files changed, 141 insertions, 68 deletions
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"); +} |