Wait until the acknowledgement for AppClient calls

This commit is contained in:
Pierre Pronchery 2020-11-17 07:10:03 +01:00
parent 36ad7752cc
commit 24e0b47aa8
2 changed files with 41 additions and 11 deletions

View File

@ -24,7 +24,7 @@
#include <errno.h>
#include <System.h>
#include "App/appclient.h"
#include "App/appmessage.h"
#include "appmessage.h"
#include "apptransport.h"
#include "appinterface.h"
@ -40,12 +40,14 @@ struct _AppClient
int event_free;
AppTransport * transport;
AppTransportHelper helper;
AppMessageID id;
int flag;
};
/* prototypes */
static int _appclient_call_message(AppClient * appclient,
AppMessage * appmessage);
AppMessage * appmessage, Variable * result);
/* helpers */
static int _appclient_helper_message(void * data, AppTransport * transport,
@ -81,6 +83,8 @@ AppClient * appclient_new_event(App * self, char const * app,
appclient->event_free = (event != NULL) ? 0 : 1;
appclient->transport = apptransport_new_app(ATM_CLIENT,
&appclient->helper, app, name, appclient->event);
appclient->id = 0;
appclient->flag = 0;
/* check for errors */
if(appclient->interface == NULL
|| appclient->transport == NULL
@ -154,7 +158,8 @@ int appclient_callv(AppClient * appclient,
if((message = appinterface_messagev(appclient->interface, method, ap))
== NULL)
return -1;
ret = _appclient_call_message(appclient, message);
/* FIXME implement the result */
ret = _appclient_call_message(appclient, message, NULL);
appmessage_delete(message);
return ret;
}
@ -184,7 +189,7 @@ int appclient_call_variables(AppClient * appclient,
if((message = appinterface_message_variables(appclient->interface,
method, args)) == NULL)
return -1;
ret = _appclient_call_message(appclient, message);
ret = _appclient_call_message(appclient, message, result);
appmessage_delete(message);
return ret;
}
@ -200,7 +205,7 @@ int appclient_call_variablev(AppClient * appclient,
if((message = appinterface_message_variablev(appclient->interface,
method, args)) == NULL)
return -1;
ret = _appclient_call_message(appclient, message);
ret = _appclient_call_message(appclient, message, result);
appmessage_delete(message);
return ret;
}
@ -209,16 +214,25 @@ int appclient_call_variablev(AppClient * appclient,
/* private */
/* appclient_call_message */
static int _appclient_call_message(AppClient * appclient,
AppMessage * appmessage)
AppMessage * appmessage, Variable * result)
{
/* FIXME obtain the answer (AICD_{,IN}OUT) */
return apptransport_client_send(appclient->transport, appmessage,
ATF_ACKNOWLEDGE);
int ret;
if((ret = apptransport_client_send(appclient->transport, appmessage,
ATF_ACKNOWLEDGE)) != 0)
return ret;
appclient->id = appmessage_get_id(appmessage);
appclient->flag = 1;
event_loop_while(appclient->event, &appclient->flag);
/* FIXME obtain the answer (AICD_{,IN}OUT) and set the result */
return ret;
}
/* helpers */
/* appclient_helper_message */
static int _helper_message_acknowledgement(AppClient * appclient,
AppMessage * message);
static int _helper_message_call(AppClient * appclient, AppTransport * transport,
AppMessage * message);
@ -232,6 +246,9 @@ static int _appclient_helper_message(void * data, AppTransport * transport,
return -1;
switch(appmessage_get_type(message))
{
case AMT_ACKNOWLEDGEMENT:
return _helper_message_acknowledgement(appclient,
message);
case AMT_CALL:
return _helper_message_call(appclient, transport,
message);
@ -240,6 +257,15 @@ static int _appclient_helper_message(void * data, AppTransport * transport,
return -1;
}
static int _helper_message_acknowledgement(AppClient * appclient,
AppMessage * message)
{
/* stop looping if we were expecting this acknowledgement */
if(appmessage_get_id(message) == appclient->id)
appclient->flag = 0;
return 0;
}
static int _helper_message_call(AppClient * appclient, AppTransport * transport,
AppMessage * message)
{

View File

@ -471,6 +471,10 @@ static int _apptransport_helper_client_receive(AppTransport * transport,
static int _apptransport_helper_receive(AppTransport * transport,
AppMessage * message)
{
/* FIXME implement */
return -1;
if(transport->mode != ATM_CLIENT)
/* XXX improve the error message */
return -error_set_code(1, "Not a client");
transport->helper.message(transport->helper.data, transport, NULL,
message);
return 0;
}