summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Bianti <sebastien.bianti@linux.intel.com>2013-04-09 15:15:12 +0200
committerMark Ryan <mark.d.ryan@intel.com>2013-04-18 10:15:32 +0200
commit9f9c3cba09f545aeb19cb43e65dab705981f1460 (patch)
tree32b04e7beace0ffe556412bf473364f1231fe542
parent92d864599f32c64193f31b12bee371172d7d2af0 (diff)
downloaddleyna-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.ac2
-rw-r--r--doc/server/dbus/API.txt7
-rw-r--r--libdleyna/server/interface.h1
-rw-r--r--libdleyna/server/server.c9
-rw-r--r--libdleyna/server/task.c11
-rw-r--r--libdleyna/server/task.h3
-rw-r--r--libdleyna/server/upnp.c7
-rw-r--r--libdleyna/server/upnp.h2
-rw-r--r--test/dbus/mediaconsole.py3
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()