summaryrefslogtreecommitdiff
path: root/libdleyna/server/manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdleyna/server/manager.c')
-rw-r--r--libdleyna/server/manager.c209
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");
+}