diff --git a/src/appclient.c b/src/appclient.c index b2d2545..1636666 100644 --- a/src/appclient.c +++ b/src/appclient.c @@ -244,7 +244,7 @@ static int _helper_message_call(AppClient * appclient, AppTransport * transport, /* XXX report errors */ return -1; ret = appinterface_call_variablev(appclient->interface, appclient->app, - result, method, 0, NULL); + NULL, result, method, 0, NULL); if(result != NULL) variable_delete(result); return ret; diff --git a/src/appinterface.c b/src/appinterface.c index 2dfffc9..b2f88e3 100644 --- a/src/appinterface.c +++ b/src/appinterface.c @@ -168,8 +168,9 @@ static AppInterfaceCall * _appinterface_get_call(AppInterface * appinterface, static Variable ** _appinterface_argv_new(AppInterfaceCall * call, va_list ap); static void _appinterface_argv_free(Variable ** argv, size_t argc); -static int _appinterface_call(App * app, Variable * result, - AppInterfaceCall * call, size_t argc, Variable ** argv); +static int _appinterface_call(App * app, AppServerClient * asc, + Variable * result, AppInterfaceCall * call, + size_t argc, Variable ** argv); static AppMessage * _appinterface_message(AppInterfaceCall * call, size_t argc, Variable ** argv); @@ -646,7 +647,8 @@ AppStatus * appinterface_get_status(AppInterface * appinterface) /* useful */ /* appinterface_callv */ -int appinterface_callv(AppInterface * appinterface, App * app, void ** result, +int appinterface_callv(AppInterface * appinterface, App * app, + AppServerClient * asc, void ** result, String const * method, va_list args) { int ret = 0; @@ -667,7 +669,8 @@ int appinterface_callv(AppInterface * appinterface, App * app, void ** result, return -1; } if(ret == 0) - ret = _appinterface_call(app, r, call, call->args_cnt, argv); + ret = _appinterface_call(app, asc, r, call, + call->args_cnt, argv); if(r != NULL) { if(ret == 0 && result != NULL) @@ -683,14 +686,14 @@ int appinterface_callv(AppInterface * appinterface, App * app, void ** result, /* appinterface_call_variablev */ int appinterface_call_variablev(AppInterface * appinterface, App * app, - Variable * result, char const * method, + AppServerClient * asc, Variable * result, char const * method, size_t argc, Variable ** argv) { AppInterfaceCall * call; if((call = _appinterface_get_call(appinterface, method)) == NULL) return -1; - return _appinterface_call(app, result, call, argc, argv); + return _appinterface_call(app, asc, result, call, argc, argv); } @@ -981,8 +984,9 @@ static void _appinterface_argv_free(Variable ** argv, size_t argc) /* appinterface_call */ -static int _appinterface_call(App * app, Variable * result, - AppInterfaceCall * call, size_t argc, Variable ** argv) +static int _appinterface_call(App * app, AppServerClient * asc, + Variable * result, AppInterfaceCall * call, + size_t argc, Variable ** argv) { int ret; Variable ** p; @@ -991,17 +995,23 @@ static int _appinterface_call(App * app, Variable * result, if(argc != call->args_cnt) /* XXX set the error */ return -1; - if((p = object_new(sizeof(*p) * (argc + 1))) == NULL) + if((p = object_new(sizeof(*p) * (argc + 2))) == NULL) return -1; - /* XXX really is a VT_POINTER (void *) */ - if((p[0] = variable_new(VT_BUFFER, app)) == NULL) + p[0] = variable_new(VT_POINTER, app); + p[1] = variable_new(VT_POINTER, asc); + if(p[0] == NULL || p[1] == NULL) { + if(p[0] != NULL) + variable_delete(p[0]); + if(p[1] != NULL) + variable_delete(p[1]); object_delete(p); return -1; } for(i = 0; i < argc; i++) - p[i + 1] = argv[i]; - ret = marshall_callp(result, call->call, argc, argv); + p[i + 2] = argv[i]; + ret = marshall_callp(result, call->call, argc + 2, p); + variable_delete(p[1]); variable_delete(p[0]); object_delete(p); return ret; diff --git a/src/appinterface.h b/src/appinterface.h index 6377fb6..bc3099f 100644 --- a/src/appinterface.h +++ b/src/appinterface.h @@ -20,6 +20,7 @@ # include # include +# include "App/appserver.h" # include "App/appstatus.h" # include "App/apptransport.h" @@ -45,10 +46,11 @@ int appinterface_get_args_count(AppInterface * appinterface, size_t * count, AppStatus * appinterface_get_status(AppInterface * appinterface); /* useful */ -int appinterface_callv(AppInterface * appinterface, App * app, void ** result, +int appinterface_callv(AppInterface * appinterface, App * app, + AppServerClient * asc, void ** result, char const * method, va_list args); int appinterface_call_variablev(AppInterface * appinterface, App * app, - Variable * result, char const * method, + AppServerClient * asc, Variable * result, char const * method, size_t argc, Variable ** argv); AppMessage * appinterface_messagev(AppInterface * appinterface, diff --git a/src/appserver.c b/src/appserver.c index 99911d0..b7359c5 100644 --- a/src/appserver.c +++ b/src/appserver.c @@ -183,8 +183,9 @@ static int _helper_message_call(AppServer * appserver, AppTransport * transport, if(!appinterface_can_call(appserver->interface, method, name)) /* XXX report errors */ return -1; + /* FIXME provide the actual AppServerClient */ ret = appinterface_call_variablev(appserver->interface, appserver->app, - result, method, 0, NULL); + NULL, result, method, 0, NULL); if(result != NULL) variable_delete(result); return ret;