Wait until the acknowledgement for AppClient calls
This commit is contained in:
parent
36ad7752cc
commit
24e0b47aa8
|
@ -24,7 +24,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <System.h>
|
#include <System.h>
|
||||||
#include "App/appclient.h"
|
#include "App/appclient.h"
|
||||||
#include "App/appmessage.h"
|
#include "appmessage.h"
|
||||||
#include "apptransport.h"
|
#include "apptransport.h"
|
||||||
#include "appinterface.h"
|
#include "appinterface.h"
|
||||||
|
|
||||||
|
@ -40,12 +40,14 @@ struct _AppClient
|
||||||
int event_free;
|
int event_free;
|
||||||
AppTransport * transport;
|
AppTransport * transport;
|
||||||
AppTransportHelper helper;
|
AppTransportHelper helper;
|
||||||
|
AppMessageID id;
|
||||||
|
int flag;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* prototypes */
|
/* prototypes */
|
||||||
static int _appclient_call_message(AppClient * appclient,
|
static int _appclient_call_message(AppClient * appclient,
|
||||||
AppMessage * appmessage);
|
AppMessage * appmessage, Variable * result);
|
||||||
|
|
||||||
/* helpers */
|
/* helpers */
|
||||||
static int _appclient_helper_message(void * data, AppTransport * transport,
|
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->event_free = (event != NULL) ? 0 : 1;
|
||||||
appclient->transport = apptransport_new_app(ATM_CLIENT,
|
appclient->transport = apptransport_new_app(ATM_CLIENT,
|
||||||
&appclient->helper, app, name, appclient->event);
|
&appclient->helper, app, name, appclient->event);
|
||||||
|
appclient->id = 0;
|
||||||
|
appclient->flag = 0;
|
||||||
/* check for errors */
|
/* check for errors */
|
||||||
if(appclient->interface == NULL
|
if(appclient->interface == NULL
|
||||||
|| appclient->transport == NULL
|
|| appclient->transport == NULL
|
||||||
|
@ -154,7 +158,8 @@ int appclient_callv(AppClient * appclient,
|
||||||
if((message = appinterface_messagev(appclient->interface, method, ap))
|
if((message = appinterface_messagev(appclient->interface, method, ap))
|
||||||
== NULL)
|
== NULL)
|
||||||
return -1;
|
return -1;
|
||||||
ret = _appclient_call_message(appclient, message);
|
/* FIXME implement the result */
|
||||||
|
ret = _appclient_call_message(appclient, message, NULL);
|
||||||
appmessage_delete(message);
|
appmessage_delete(message);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -184,7 +189,7 @@ int appclient_call_variables(AppClient * appclient,
|
||||||
if((message = appinterface_message_variables(appclient->interface,
|
if((message = appinterface_message_variables(appclient->interface,
|
||||||
method, args)) == NULL)
|
method, args)) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
ret = _appclient_call_message(appclient, message);
|
ret = _appclient_call_message(appclient, message, result);
|
||||||
appmessage_delete(message);
|
appmessage_delete(message);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -200,7 +205,7 @@ int appclient_call_variablev(AppClient * appclient,
|
||||||
if((message = appinterface_message_variablev(appclient->interface,
|
if((message = appinterface_message_variablev(appclient->interface,
|
||||||
method, args)) == NULL)
|
method, args)) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
ret = _appclient_call_message(appclient, message);
|
ret = _appclient_call_message(appclient, message, result);
|
||||||
appmessage_delete(message);
|
appmessage_delete(message);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -209,16 +214,25 @@ int appclient_call_variablev(AppClient * appclient,
|
||||||
/* private */
|
/* private */
|
||||||
/* appclient_call_message */
|
/* appclient_call_message */
|
||||||
static int _appclient_call_message(AppClient * appclient,
|
static int _appclient_call_message(AppClient * appclient,
|
||||||
AppMessage * appmessage)
|
AppMessage * appmessage, Variable * result)
|
||||||
{
|
{
|
||||||
/* FIXME obtain the answer (AICD_{,IN}OUT) */
|
int ret;
|
||||||
return apptransport_client_send(appclient->transport, appmessage,
|
|
||||||
ATF_ACKNOWLEDGE);
|
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 */
|
/* helpers */
|
||||||
/* appclient_helper_message */
|
/* appclient_helper_message */
|
||||||
|
static int _helper_message_acknowledgement(AppClient * appclient,
|
||||||
|
AppMessage * message);
|
||||||
static int _helper_message_call(AppClient * appclient, AppTransport * transport,
|
static int _helper_message_call(AppClient * appclient, AppTransport * transport,
|
||||||
AppMessage * message);
|
AppMessage * message);
|
||||||
|
|
||||||
|
@ -232,6 +246,9 @@ static int _appclient_helper_message(void * data, AppTransport * transport,
|
||||||
return -1;
|
return -1;
|
||||||
switch(appmessage_get_type(message))
|
switch(appmessage_get_type(message))
|
||||||
{
|
{
|
||||||
|
case AMT_ACKNOWLEDGEMENT:
|
||||||
|
return _helper_message_acknowledgement(appclient,
|
||||||
|
message);
|
||||||
case AMT_CALL:
|
case AMT_CALL:
|
||||||
return _helper_message_call(appclient, transport,
|
return _helper_message_call(appclient, transport,
|
||||||
message);
|
message);
|
||||||
|
@ -240,6 +257,15 @@ static int _appclient_helper_message(void * data, AppTransport * transport,
|
||||||
return -1;
|
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,
|
static int _helper_message_call(AppClient * appclient, AppTransport * transport,
|
||||||
AppMessage * message)
|
AppMessage * message)
|
||||||
{
|
{
|
||||||
|
|
|
@ -471,6 +471,10 @@ static int _apptransport_helper_client_receive(AppTransport * transport,
|
||||||
static int _apptransport_helper_receive(AppTransport * transport,
|
static int _apptransport_helper_receive(AppTransport * transport,
|
||||||
AppMessage * message)
|
AppMessage * message)
|
||||||
{
|
{
|
||||||
/* FIXME implement */
|
if(transport->mode != ATM_CLIENT)
|
||||||
return -1;
|
/* XXX improve the error message */
|
||||||
|
return -error_set_code(1, "Not a client");
|
||||||
|
transport->helper.message(transport->helper.data, transport, NULL,
|
||||||
|
message);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user