Provide the AppServerClient in AppInterface calls

This commit is contained in:
Pierre Pronchery 2020-11-05 21:09:45 +01:00
parent b922ec51fb
commit 6968cfd261
4 changed files with 30 additions and 17 deletions

View File

@ -244,7 +244,7 @@ static int _helper_message_call(AppClient * appclient, AppTransport * transport,
/* XXX report errors */ /* XXX report errors */
return -1; return -1;
ret = appinterface_call_variablev(appclient->interface, appclient->app, ret = appinterface_call_variablev(appclient->interface, appclient->app,
result, method, 0, NULL); NULL, result, method, 0, NULL);
if(result != NULL) if(result != NULL)
variable_delete(result); variable_delete(result);
return ret; return ret;

View File

@ -168,8 +168,9 @@ static AppInterfaceCall * _appinterface_get_call(AppInterface * appinterface,
static Variable ** _appinterface_argv_new(AppInterfaceCall * call, static Variable ** _appinterface_argv_new(AppInterfaceCall * call,
va_list ap); va_list ap);
static void _appinterface_argv_free(Variable ** argv, size_t argc); static void _appinterface_argv_free(Variable ** argv, size_t argc);
static int _appinterface_call(App * app, Variable * result, static int _appinterface_call(App * app, AppServerClient * asc,
AppInterfaceCall * call, size_t argc, Variable ** argv); Variable * result, AppInterfaceCall * call,
size_t argc, Variable ** argv);
static AppMessage * _appinterface_message(AppInterfaceCall * call, static AppMessage * _appinterface_message(AppInterfaceCall * call,
size_t argc, Variable ** argv); size_t argc, Variable ** argv);
@ -646,7 +647,8 @@ AppStatus * appinterface_get_status(AppInterface * appinterface)
/* useful */ /* useful */
/* appinterface_callv */ /* 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) String const * method, va_list args)
{ {
int ret = 0; int ret = 0;
@ -667,7 +669,8 @@ int appinterface_callv(AppInterface * appinterface, App * app, void ** result,
return -1; return -1;
} }
if(ret == 0) 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(r != NULL)
{ {
if(ret == 0 && result != NULL) if(ret == 0 && result != NULL)
@ -683,14 +686,14 @@ int appinterface_callv(AppInterface * appinterface, App * app, void ** result,
/* appinterface_call_variablev */ /* appinterface_call_variablev */
int appinterface_call_variablev(AppInterface * appinterface, App * app, 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) size_t argc, Variable ** argv)
{ {
AppInterfaceCall * call; AppInterfaceCall * call;
if((call = _appinterface_get_call(appinterface, method)) == NULL) if((call = _appinterface_get_call(appinterface, method)) == NULL)
return -1; 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 */ /* appinterface_call */
static int _appinterface_call(App * app, Variable * result, static int _appinterface_call(App * app, AppServerClient * asc,
AppInterfaceCall * call, size_t argc, Variable ** argv) Variable * result, AppInterfaceCall * call,
size_t argc, Variable ** argv)
{ {
int ret; int ret;
Variable ** p; Variable ** p;
@ -991,17 +995,23 @@ static int _appinterface_call(App * app, Variable * result,
if(argc != call->args_cnt) if(argc != call->args_cnt)
/* XXX set the error */ /* XXX set the error */
return -1; return -1;
if((p = object_new(sizeof(*p) * (argc + 1))) == NULL) if((p = object_new(sizeof(*p) * (argc + 2))) == NULL)
return -1; return -1;
/* XXX really is a VT_POINTER (void *) */ p[0] = variable_new(VT_POINTER, app);
if((p[0] = variable_new(VT_BUFFER, app)) == NULL) 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); object_delete(p);
return -1; return -1;
} }
for(i = 0; i < argc; i++) for(i = 0; i < argc; i++)
p[i + 1] = argv[i]; p[i + 2] = argv[i];
ret = marshall_callp(result, call->call, argc, argv); ret = marshall_callp(result, call->call, argc + 2, p);
variable_delete(p[1]);
variable_delete(p[0]); variable_delete(p[0]);
object_delete(p); object_delete(p);
return ret; return ret;

View File

@ -20,6 +20,7 @@
# include <stdarg.h> # include <stdarg.h>
# include <System/variable.h> # include <System/variable.h>
# include "App/appserver.h"
# include "App/appstatus.h" # include "App/appstatus.h"
# include "App/apptransport.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); AppStatus * appinterface_get_status(AppInterface * appinterface);
/* useful */ /* 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); char const * method, va_list args);
int appinterface_call_variablev(AppInterface * appinterface, App * app, 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); size_t argc, Variable ** argv);
AppMessage * appinterface_messagev(AppInterface * appinterface, AppMessage * appinterface_messagev(AppInterface * appinterface,

View File

@ -183,8 +183,9 @@ static int _helper_message_call(AppServer * appserver, AppTransport * transport,
if(!appinterface_can_call(appserver->interface, method, name)) if(!appinterface_can_call(appserver->interface, method, name))
/* XXX report errors */ /* XXX report errors */
return -1; return -1;
/* FIXME provide the actual AppServerClient */
ret = appinterface_call_variablev(appserver->interface, appserver->app, ret = appinterface_call_variablev(appserver->interface, appserver->app,
result, method, 0, NULL); NULL, result, method, 0, NULL);
if(result != NULL) if(result != NULL)
variable_delete(result); variable_delete(result);
return ret; return ret;