diff options
author | Sébastien Bianti <sebastien.bianti@linux.intel.com> | 2013-04-09 15:15:12 +0200 |
---|---|---|
committer | Mark Ryan <mark.d.ryan@intel.com> | 2013-04-18 10:15:32 +0200 |
commit | 9f9c3cba09f545aeb19cb43e65dab705981f1460 (patch) | |
tree | 32b04e7beace0ffe556412bf473364f1231fe542 | |
parent | 92d864599f32c64193f31b12bee371172d7d2af0 (diff) | |
download | dleyna-server-9f9c3cba09f545aeb19cb43e65dab705981f1460.tar.gz |
[Bug] Add a Rescan method to Manager interface
- Resolves bug #4
- Make use of new API gupnp_context_manager_rescan_control_points()
- Documentation updated.
Signed-off-by: Sébastien Bianti <sebastien.bianti@linux.intel.com>
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | doc/server/dbus/API.txt | 7 | ||||
-rw-r--r-- | libdleyna/server/interface.h | 1 | ||||
-rw-r--r-- | libdleyna/server/server.c | 9 | ||||
-rw-r--r-- | libdleyna/server/task.c | 11 | ||||
-rw-r--r-- | libdleyna/server/task.h | 3 | ||||
-rw-r--r-- | libdleyna/server/upnp.c | 7 | ||||
-rw-r--r-- | libdleyna/server/upnp.h | 2 | ||||
-rw-r--r-- | test/dbus/mediaconsole.py | 3 |
9 files changed, 44 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 1eb19aa..3a4e35d 100644 --- a/configure.ac +++ b/configure.ac @@ -39,7 +39,7 @@ PKG_PROG_PKG_CONFIG(0.16) PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.28]) PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.28]) PKG_CHECK_MODULES([GSSDP], [gssdp-1.0 >= 0.13.2]) -PKG_CHECK_MODULES([GUPNP], [gupnp-1.0 >= 0.19.1]) +PKG_CHECK_MODULES([GUPNP], [gupnp-1.0 >= 0.20.3]) PKG_CHECK_MODULES([GUPNPAV], [gupnp-av-1.0 >= 0.11.5]) PKG_CHECK_MODULES([GUPNPDLNA], [gupnp-dlna-2.0 >= 0.9.4]) PKG_CHECK_MODULES([SOUP], [libsoup-2.4 >= 2.28.2]) diff --git a/doc/server/dbus/API.txt b/doc/server/dbus/API.txt index d040396..920e2dc 100644 --- a/doc/server/dbus/API.txt +++ b/doc/server/dbus/API.txt @@ -119,6 +119,13 @@ need non-local addresses to pass to renderers running on other devices. DMCs should therefore call this function with the value FALSE before requesting any URLs from any servers. +Rescan() + +Calls a rescan to be performed by gupnp library to make sure every server is +still alive. Every server that hasn't responded after a certain amount of +time (see gupnp_context_manager_rescan_control_points() and +gssdp_resource_browser_rescan() code) is considered as unavailable. + Signals: --------- diff --git a/libdleyna/server/interface.h b/libdleyna/server/interface.h index 371a6b6..d845ee8 100644 --- a/libdleyna/server/interface.h +++ b/libdleyna/server/interface.h @@ -109,6 +109,7 @@ enum dls_interface_type_ { #define DLS_INTERFACE_GET_VERSION "GetVersion" #define DLS_INTERFACE_GET_SERVERS "GetServers" +#define DLS_INTERFACE_RESCAN "Rescan" #define DLS_INTERFACE_RELEASE "Release" #define DLS_INTERFACE_SET_PROTOCOL_INFO "SetProtocolInfo" #define DLS_INTERFACE_PREFER_LOCAL_ADDRESSES "PreferLocalAddresses" diff --git a/libdleyna/server/server.c b/libdleyna/server/server.c index 3f290e6..9dd45f5 100644 --- a/libdleyna/server/server.c +++ b/libdleyna/server/server.c @@ -72,6 +72,8 @@ static const gchar g_root_introspection[] = " <arg type='ao' name='"DLS_INTERFACE_SERVERS"'" " direction='out'/>" " </method>" + " <method name='"DLS_INTERFACE_RESCAN"'>" + " </method>" " <method name='"DLS_INTERFACE_SET_PROTOCOL_INFO"'>" " <arg type='s' name='"DLS_INTERFACE_PROTOCOL_INFO"'" " direction='in'/>" @@ -517,6 +519,10 @@ static void prv_process_sync_task(dls_task_t *task) task->result = dls_upnp_get_server_ids(g_context.upnp); prv_sync_task_complete(task); break; + case DLS_TASK_RESCAN: + dls_upnp_rescan(g_context.upnp); + prv_sync_task_complete(task); + break; case DLS_TASK_SET_PROTOCOL_INFO: client_name = dleyna_task_queue_get_source(task->atom.queue_id); client = g_hash_table_lookup(g_context.watchers, client_name); @@ -791,6 +797,9 @@ static void prv_method_call(dleyna_connector_id_t conn, if (!strcmp(method, DLS_INTERFACE_RELEASE)) { prv_remove_client(sender); g_context.connector->return_response(invocation, NULL); + } else if (!strcmp(method, DLS_INTERFACE_RESCAN)) { + task = dls_task_rescan_new(invocation); + prv_add_task(task, sender, DLS_SERVER_SINK); } else if (!strcmp(method, DLS_INTERFACE_GET_VERSION)) { task = dls_task_get_version_new(invocation); prv_add_task(task, sender, DLS_SERVER_SINK); diff --git a/libdleyna/server/task.c b/libdleyna/server/task.c index bed8003..5455f37 100644 --- a/libdleyna/server/task.c +++ b/libdleyna/server/task.c @@ -24,6 +24,17 @@ #include "async.h" +dls_task_t *dls_task_rescan_new(dleyna_connector_msg_id_t invocation) +{ + dls_task_t *task = g_new0(dls_task_t, 1); + + task->type = DLS_TASK_RESCAN; + task->invocation = invocation; + task->synchronous = TRUE; + + return task; +} + dls_task_t *dls_task_get_version_new(dleyna_connector_msg_id_t invocation) { dls_task_t *task = g_new0(dls_task_t, 1); diff --git a/libdleyna/server/task.h b/libdleyna/server/task.h index 061c84e..f38d21b 100644 --- a/libdleyna/server/task.h +++ b/libdleyna/server/task.h @@ -34,6 +34,7 @@ enum dls_task_type_t_ { DLS_TASK_GET_VERSION, DLS_TASK_GET_SERVERS, + DLS_TASK_RESCAN, DLS_TASK_GET_CHILDREN, DLS_TASK_GET_ALL_PROPS, DLS_TASK_GET_PROP, @@ -172,6 +173,8 @@ struct dls_task_t_ { } ut; }; +dls_task_t *dls_task_rescan_new(dleyna_connector_msg_id_t invocation); + dls_task_t *dls_task_get_version_new(dleyna_connector_msg_id_t invocation); dls_task_t *dls_task_get_servers_new(dleyna_connector_msg_id_t invocation); diff --git a/libdleyna/server/upnp.c b/libdleyna/server/upnp.c index b66be43..1a34d78 100644 --- a/libdleyna/server/upnp.c +++ b/libdleyna/server/upnp.c @@ -1196,3 +1196,10 @@ gboolean dls_upnp_device_context_exist(dls_device_t *device, on_exit: return found; } + +void dls_upnp_rescan(dls_upnp_t *upnp) +{ + DLEYNA_LOG_DEBUG("re-scanning control points"); + + gupnp_context_manager_rescan_control_points(upnp->context_manager); +} diff --git a/libdleyna/server/upnp.h b/libdleyna/server/upnp.h index ed3e6f9..2fa0812 100644 --- a/libdleyna/server/upnp.h +++ b/libdleyna/server/upnp.h @@ -110,4 +110,6 @@ void dls_upnp_unsubscribe(dls_upnp_t *upnp); gboolean dls_upnp_device_context_exist(dls_device_t *device, dls_device_context_t *context); +void dls_upnp_rescan(dls_upnp_t *upnp); + #endif /* DLS_UPNP_H__ */ diff --git a/test/dbus/mediaconsole.py b/test/dbus/mediaconsole.py index b438d23..1a05dc1 100644 --- a/test/dbus/mediaconsole.py +++ b/test/dbus/mediaconsole.py @@ -243,3 +243,6 @@ class UPNP(object): def prefer_local_addresses(self, prefer): self._manager.PreferLocalAddresses(prefer) + + def rescan(self): + self._manager.Rescan() |