summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Ferrandis <ludovic.ferrandis@intel.com>2013-09-11 15:49:51 +0200
committerLudovic Ferrandis <ludovic.ferrandis@intel.com>2013-10-02 19:11:52 +0200
commit21c4ff0e1d94454915eceaef3461cb2bdf3010f7 (patch)
tree3782d0d057c77d54bb900d51e95477febf1dfcab
parent64ad1c620dec35539c97b14f3560cc8372cbe6ca (diff)
downloaddleyna-server-21c4ff0e1d94454915eceaef3461cb2bdf3010f7.tar.gz
[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 <ludovic.ferrandis@intel.com>
-rw-r--r--doc/server/dbus/API.txt26
-rw-r--r--libdleyna/server/interface.h3
-rw-r--r--libdleyna/server/manager.c209
-rw-r--r--libdleyna/server/manager.h16
-rw-r--r--libdleyna/server/props.c43
-rw-r--r--libdleyna/server/props.h7
-rw-r--r--libdleyna/server/server.c92
-rw-r--r--libdleyna/server/task.c84
-rw-r--r--libdleyna/server/task.h39
-rw-r--r--test/dbus/mediaconsole.py19
10 files changed, 278 insertions, 260 deletions
diff --git a/doc/server/dbus/API.txt b/doc/server/dbus/API.txt
index 378daf9..c9c5232 100644
--- a/doc/server/dbus/API.txt
+++ b/doc/server/dbus/API.txt
@@ -46,7 +46,7 @@ com.intel.dLeynaServer.Manager
Methods:
----------
-The interface com.intel.dLeynaServer.Manager contains 10 methods.
+The interface com.intel.dLeynaServer.Manager contains 6 methods.
Descriptions of each of these methods along with their d-Bus
signatures are given below.
@@ -127,24 +127,6 @@ discover new DMSs which for some reason were not detected when either
they, or the device on which dLeyna-server runs, was started or joined
the network. New in version 0.0.2.
-WhiteListEnable(b enabled) -> void
-
-Enable or disable the Network Filtering feature.
-When enabled, only devices that are on allowed networks will be available.
-
-WhiteListAddEntries(as EntryList) -> void
-
-Add new entries to the list of allowed networks. An Entry could be an interface
-name (eth0), an ip address (127.0.0.1) or a SSID (MyWiFi)
-
-WhiteListRemoveEntries(as EntryList) -> void
-
-Remove entries from the list of allowed networks.
-
-WhiteListClear() -> void
-
-Remove all entries from the list, but it doesn't change the 'enabled' flag.
-
Properties:
---------
@@ -157,13 +139,17 @@ of d-Bus properties. These properties are described below:
|------------------------------------------------------------------------------|
| WhiteListEntries | as | m | The list of entries that compose the |
| | | | white list used to filter the networks. |
+| | | | An Entry could be an interface name |
+| | | | (eth0), an ip address (127.0.0.1) or |
+| | | | a SSID (MyWiFi) |
|------------------------------------------------------------------------------|
| WhiteListEnabled | b | m | True if the Network Filtering is active.|
|------------------------------------------------------------------------------|
A org.freedesktop.DBus.Properties.PropertiesChanged signal is emitted when
these properties change.
-
+These properties can be changed using the Set() method of
+org.freedesktop.DBus.Properties interface.
Signals:
---------
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 <libdleyna/core/connector.h>
+#include <libdleyna/core/settings.h>
#include <libgupnp/gupnp-context-manager.h>
#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 <libgupnp/gupnp.h>
#include <libgupnp-av/gupnp-av.h>
+
+#include <libdleyna/core/settings.h>
+
#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 <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"
@@ -84,20 +85,6 @@ static const gchar g_root_introspection[] =
" <arg type='b' name='"DLS_INTERFACE_PREFER"'"
" direction='in'/>"
" </method>"
- " <method name='"DLS_INTERFACE_WHITE_LIST_ENABLE"'>"
- " <arg type='b' name='"DLS_INTERFACE_IS_ENABLED"'"
- " direction='in'/>"
- " </method>"
- " <method name='"DLS_INTERFACE_WHITE_LIST_ADD_ENTRIES"'>"
- " <arg type='as' name='"DLS_INTERFACE_ENTRY_LIST"'"
- " direction='in'/>"
- " </method>"
- " <method name='"DLS_INTERFACE_WHITE_LIST_REMOVE_ENTRIES"'>"
- " <arg type='as' name='"DLS_INTERFACE_ENTRY_LIST"'"
- " direction='in'/>"
- " </method>"
- " <method name='"DLS_INTERFACE_WHITE_LIST_CLEAR"'>"
- " </method>"
" <signal name='"DLS_INTERFACE_FOUND_SERVER"'>"
" <arg type='o' name='"DLS_INTERFACE_PATH"'/>"
" </signal>"
@@ -105,9 +92,9 @@ static const gchar g_root_introspection[] =
" <arg type='o' name='"DLS_INTERFACE_PATH"'/>"
" </signal>"
" <property type='as' name='"DLS_INTERFACE_PROP_WHITE_LIST_ENTRIES"'"
- " access='read'/>"
+ " access='readwrite'/>"
" <property type='b' name='"DLS_INTERFACE_PROP_WHITE_LIST_ENABLED"'"
- " access='read'/>"
+ " access='readwrite'/>"
" </interface>"
" <interface name='"DLS_INTERFACE_PROPERTIES"'>"
" <method name='"DLS_INTERFACE_GET"'>"
@@ -124,6 +111,14 @@ static const gchar g_root_introspection[] =
" <arg type='a{sv}' name='"DLS_INTERFACE_PROPERTIES_VALUE"'"
" direction='out'/>"
" </method>"
+ " <method name='"DLS_INTERFACE_SET"'>"
+ " <arg type='s' name='"DLS_INTERFACE_INTERFACE_NAME"'"
+ " direction='in'/>"
+ " <arg type='s' name='"DLS_INTERFACE_PROPERTY_NAME"'"
+ " direction='in'/>"
+ " <arg type='v' name='"DLS_INTERFACE_VALUE"'"
+ " direction='in'/>"
+ " </method>"
" <signal name='"DLS_INTERFACE_PROPERTIES_CHANGED"'>"
" <arg type='s' name='"DLS_INTERFACE_INTERFACE_NAME"'/>"
" <arg type='a{sv}' name='"DLS_INTERFACE_CHANGED_PROPERTIES"'/>"
@@ -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);
diff --git a/test/dbus/mediaconsole.py b/test/dbus/mediaconsole.py
index 45863a7..d54bb84 100644
--- a/test/dbus/mediaconsole.py
+++ b/test/dbus/mediaconsole.py
@@ -198,11 +198,11 @@ class UPNP(object):
self._manager = dbus.Interface(bus.get_object(
'com.intel.dleyna-server',
'/com/intel/dLeynaServer'),
- 'com.intel.dLeynaServer.Manager')
+ 'com.intel.dLeynaServer.Manager')
self._propsIF = dbus.Interface(bus.get_object(
'com.intel.dleyna-server',
'/com/intel/dLeynaServer'),
- 'org.freedesktop.DBus.Properties')
+ 'org.freedesktop.DBus.Properties')
def get_props(self, iface = ""):
return self._propsIF.GetAll(iface)
@@ -210,6 +210,9 @@ class UPNP(object):
def get_prop(self, prop_name, iface = ""):
return self._propsIF.Get(iface, prop_name)
+ def set_prop(self, prop_name, val, iface = ""):
+ return self._propsIF.Set(iface, prop_name, val)
+
def print_prop(self, prop_name, iface = ""):
print_properties(self._propsIF.Get(iface, prop_name))
@@ -261,13 +264,17 @@ class UPNP(object):
self._manager.Rescan()
def white_list_enable(self, enable):
- self._manager.WhiteListEnable(enable)
+ self.set_prop("WhiteListEnabled", enable)
def white_list_add(self, entries):
- self._manager.WhiteListAddEntries(entries)
+ white_list = set(self.get_prop('WhiteListEntries'))
+ white_list = white_list | set(entries)
+ self.set_prop("WhiteListEntries", list(white_list))
def white_list_remove(self, entries):
- self._manager.WhiteListRemoveEntries(entries)
+ white_list = set(self.get_prop('WhiteListEntries'))
+ white_list = white_list - set(entries)
+ self.set_prop("WhiteListEntries", list(white_list))
def white_list_clear(self):
- self._manager.WhiteListClear()
+ self.set_prop("WhiteListEntries", [''])