From 584b5963f81d89f142092ec015b3ece88fc71504 Mon Sep 17 00:00:00 2001 From: Luc Yriarte Date: Tue, 30 Jul 2013 15:17:23 +0200 Subject: [PATCH] make get_servers dbus call asynchronous --- src/MediaServer/JSMediaServerManager.cpp | 2 +- src/MediaServer/MediaServerManager.cpp | 76 +++++++++++++++++++++----------- src/MediaServer/MediaServerManager.h | 2 + 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/src/MediaServer/JSMediaServerManager.cpp b/src/MediaServer/JSMediaServerManager.cpp index 9b8f19c..80f7818 100644 --- a/src/MediaServer/JSMediaServerManager.cpp +++ b/src/MediaServer/JSMediaServerManager.cpp @@ -116,7 +116,7 @@ JSValueRef JSMediaServerManager::scanNetwork(JSContextRef context, privateObject = new MediaServerManagerPrivObject( context, mediaservermanager); } - // FIXME use event handlers instead of callbacks + // TODO use event handlers instead of callbacks LoggerD("Validating arguments: " << argumentCount); ArgumentValidator validator(context, argumentCount, arguments); diff --git a/src/MediaServer/MediaServerManager.cpp b/src/MediaServer/MediaServerManager.cpp index 8316a57..35ea830 100644 --- a/src/MediaServer/MediaServerManager.cpp +++ b/src/MediaServer/MediaServerManager.cpp @@ -16,6 +16,50 @@ namespace MediaServer using namespace WrtDeviceApis::Commons; +/* + * Callback for get servers on UPnPManager proxy + */ +static void getServersCallback(GObject *source_object, GAsyncResult *res, gpointer user_data) { + + GError* gerror = NULL; + ScanNetworkCB * callback = (ScanNetworkCB *) user_data; + LoggerD("Entered getServersCallback"); + + /* finish get servers on UPnPManager proxy */ + gchar ** strTab; + if (upn_pmanager__call_get_servers_finish ( + callback->mgrProxy, /* proxy */ + &strTab, + res, + &gerror /* error */ + )) { + LoggerD("getServersCallback success"); + } else { + LoggerD(gerror->message); + g_error_free(gerror); + return; + } + + while (*strTab) { + LoggerD("mediaserver dbus path " << *strTab); + // Create MediaServer object with proxy path + std::string path = *strTab; + JSValueRef value = JSMediaServer::createJSObject(callback->context, path); + const JSValueRef arguments[1] = { value }; + // Trigger callback + LoggerD("Triggering callback "); + JSObjectCallAsFunction(callback->context, + callback->successCB, + callback->thisObject, + 1, + arguments, + NULL); + LoggerD("done with mediaserver " << *strTab); + strTab++; + } +} + + /** * MediaServerManager implementation */ @@ -55,34 +99,14 @@ void MediaServerManager::scanNetwork(ScanNetworkCB *callback) return; } - char ** strTab; - if (upn_pmanager__call_get_servers_sync( + callback->mgrProxy = proxy; + LoggerD("calling get servers"); + upn_pmanager__call_get_servers( proxy, /* proxy */ - &strTab, /* out_Servers */ NULL, /* cancellable */ - &gerror /* error */ - )) { - LoggerD("get servers success"); - while (*strTab) { - LoggerD("mediaserver dbus path " << *strTab); - // Create MediaServer object with proxy path - std::string path = *strTab; - JSValueRef value = JSMediaServer::createJSObject(callback->context, path); - const JSValueRef arguments[1] = { value }; - // Trigger callback - LoggerD("Triggering callback "); - JSObjectCallAsFunction(callback->context, - callback->successCB, - callback->thisObject, - 1, - arguments, - NULL); - LoggerD("done with mediaserver " << *strTab); - strTab++; - } - } else { - LoggerD("get servers error"); - } + getServersCallback, /* callback */ + callback /* user_data */ + ); } diff --git a/src/MediaServer/MediaServerManager.h b/src/MediaServer/MediaServerManager.h index 6b69de9..7f6742a 100644 --- a/src/MediaServer/MediaServerManager.h +++ b/src/MediaServer/MediaServerManager.h @@ -19,6 +19,7 @@ namespace MediaServer { class ScanNetworkCB { public: + UPnPManager *mgrProxy; JSContextRef context; JSObjectRef object; JSObjectRef thisObject; @@ -27,6 +28,7 @@ public: }; + class MediaServerManager: public WrtDeviceApis::Commons::EventRequestReceiver { public: -- 2.7.4