diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | doc/server/dbus/API.txt | 7 | ||||
-rw-r--r-- | libdleyna/renderer/server.c | 10 | ||||
-rw-r--r-- | libdleyna/renderer/task.c | 11 | ||||
-rw-r--r-- | libdleyna/renderer/task.h | 3 | ||||
-rw-r--r-- | libdleyna/renderer/upnp.c | 7 | ||||
-rw-r--r-- | libdleyna/renderer/upnp.h | 2 | ||||
-rw-r--r-- | test/dbus/rendererconsole.py | 2 |
8 files changed, 43 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 6b89756..623b9a8 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 94092f4..33dc2a9 100644 --- a/doc/server/dbus/API.txt +++ b/doc/server/dbus/API.txt @@ -63,6 +63,13 @@ method if they intend to keep running but they have no immediate plans to invoke any of dleyna-renderer-service's methods. This allows dleyna-renderer-service to quit, freeing up system resources. +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/renderer/server.c b/libdleyna/renderer/server.c index c28952e..514b649 100644 --- a/libdleyna/renderer/server.c +++ b/libdleyna/renderer/server.c @@ -51,6 +51,7 @@ #define DLR_INTERFACE_GET_VERSION "GetVersion" #define DLR_INTERFACE_GET_SERVERS "GetServers" +#define DLR_INTERFACE_RESCAN "Rescan" #define DLR_INTERFACE_RELEASE "Release" #define DLR_INTERFACE_FOUND_SERVER "FoundServer" @@ -123,6 +124,8 @@ static const gchar g_root_introspection[] = " <arg type='as' name='"DLR_INTERFACE_SERVERS"'" " direction='out'/>" " </method>" + " <method name='"DLR_INTERFACE_RESCAN"'>" + " </method>" " <signal name='"DLR_INTERFACE_FOUND_SERVER"'>" " <arg type='s' name='"DLR_INTERFACE_PATH"'/>" " </signal>" @@ -392,6 +395,11 @@ static void prv_process_sync_task(dlr_task_t *task) dlr_task_complete(task); dleyna_task_queue_task_completed(task->atom.queue_id); break; + case DLR_TASK_RESCAN: + dlr_upnp_rescan(g_context.upnp); + dlr_task_complete(task); + dleyna_task_queue_task_completed(task->atom.queue_id); + break; case DLR_TASK_RAISE: case DLR_TASK_QUIT: error = g_error_new(DLEYNA_SERVER_ERROR, @@ -612,6 +620,8 @@ static void prv_dlr_method_call(dleyna_connector_id_t conn, task = dlr_task_get_version_new(invocation); else if (!strcmp(method, DLR_INTERFACE_GET_SERVERS)) task = dlr_task_get_servers_new(invocation); + else if (!strcmp(method, DLR_INTERFACE_RESCAN)) + task = dlr_task_rescan_new(invocation); else goto finished; diff --git a/libdleyna/renderer/task.c b/libdleyna/renderer/task.c index a18014a..575261a 100644 --- a/libdleyna/renderer/task.c +++ b/libdleyna/renderer/task.c @@ -26,6 +26,17 @@ #include "async.h" #include "server.h" +dlr_task_t *dlr_task_rescan_new(dleyna_connector_msg_id_t invocation) +{ + dlr_task_t *task = g_new0(dlr_task_t, 1); + + task->type = DLR_TASK_RESCAN; + task->invocation = invocation; + task->synchronous = TRUE; + + return task; +} + dlr_task_t *dlr_task_get_version_new(dleyna_connector_msg_id_t invocation) { dlr_task_t *task = g_new0(dlr_task_t, 1); diff --git a/libdleyna/renderer/task.h b/libdleyna/renderer/task.h index f78f21a..e1eaf1f 100644 --- a/libdleyna/renderer/task.h +++ b/libdleyna/renderer/task.h @@ -32,6 +32,7 @@ enum dlr_task_type_t_ { DLR_TASK_GET_VERSION, DLR_TASK_GET_SERVERS, + DLR_TASK_RESCAN, DLR_TASK_RAISE, DLR_TASK_QUIT, DLR_TASK_SET_PROP, @@ -109,6 +110,8 @@ struct dlr_task_t_ { } ut; }; +dlr_task_t *dlr_task_rescan_new(dleyna_connector_msg_id_t invocation); + dlr_task_t *dlr_task_get_version_new(dleyna_connector_msg_id_t invocation); dlr_task_t *dlr_task_get_servers_new(dleyna_connector_msg_id_t invocation); diff --git a/libdleyna/renderer/upnp.c b/libdleyna/renderer/upnp.c index 5d691b9..f1c4959 100644 --- a/libdleyna/renderer/upnp.c +++ b/libdleyna/renderer/upnp.c @@ -813,3 +813,10 @@ void dlr_upnp_unsubscribe(dlr_upnp_t *upnp) DLEYNA_LOG_DEBUG("Exit"); } + +void dlr_upnp_rescan(dlr_upnp_t *upnp) +{ + DLEYNA_LOG_DEBUG("re-scanning control points"); + + gupnp_context_manager_rescan_control_points(upnp->context_manager); +} diff --git a/libdleyna/renderer/upnp.h b/libdleyna/renderer/upnp.h index 9e19163..4345040 100644 --- a/libdleyna/renderer/upnp.h +++ b/libdleyna/renderer/upnp.h @@ -100,4 +100,6 @@ void dlr_upnp_lost_client(dlr_upnp_t *upnp, const gchar *client_name); void dlr_upnp_unsubscribe(dlr_upnp_t *upnp); +void dlr_upnp_rescan(dlr_upnp_t *upnp); + #endif /* DLR_UPNP_H__ */ diff --git a/test/dbus/rendererconsole.py b/test/dbus/rendererconsole.py index bd7ada0..0734444 100644 --- a/test/dbus/rendererconsole.py +++ b/test/dbus/rendererconsole.py @@ -185,6 +185,8 @@ class Manager(object): def release(self): self.__manager.Release() + def rescan(self): + self.__manager.Rescan() if __name__ == "__main__": |