Also implemented creating messages with arguments

This commit is contained in:
Pierre Pronchery 2013-01-08 20:14:02 +01:00
parent 647a3ad8b8
commit 4291bae1f9
3 changed files with 20 additions and 4 deletions

View File

@ -33,6 +33,7 @@ typedef enum _AppMessageType
/* functions */ /* functions */
AppMessage * appmessage_new_call(char const * method, ...); AppMessage * appmessage_new_call(char const * method, ...);
AppMessage * appmessage_new_call_variables(char const * method, ...);
AppMessage * appmessage_new_deserialize(Buffer * buffer); AppMessage * appmessage_new_deserialize(Buffer * buffer);
void appmessage_delete(AppMessage * appmessage); void appmessage_delete(AppMessage * appmessage);

View File

@ -51,19 +51,34 @@ AppMessage * appmessage_new_call(char const * method, ...)
{ {
AppMessage * message; AppMessage * message;
va_list ap; va_list ap;
size_t i;
int type;
Variable * v; Variable * v;
Variable ** p;
if((message = object_new(sizeof(*message))) == NULL) if((message = object_new(sizeof(*message))) == NULL)
return NULL; return NULL;
message->type = AMT_CALL; message->type = AMT_CALL;
message->t.call.method = string_new(method); message->t.call.method = string_new(method);
message->t.call.args = NULL;
message->t.call.args_cnt = 0;
/* copy the arguments */ /* copy the arguments */
va_start(ap, method); va_start(ap, method);
while((v = va_arg(ap, Variable *)) != NULL) for(i = 0; (type = va_arg(ap, int)) >= 0; i++)
; {
if((p = realloc(message->t.call.args, sizeof(*p) * (i + 1)))
== NULL)
break;
message->t.call.args = p;
if((v = variable_new(type, va_arg(ap, void *))) == NULL)
break;
message->t.call.args = p;
message->t.call.args[i] = v;
message->t.call.args_cnt = i + 1;
}
va_end(ap); va_end(ap);
/* check for errors */ /* check for errors */
if(message->t.call.method == NULL) if(message->t.call.method == NULL || type >= 0)
{ {
appmessage_delete(message); appmessage_delete(message);
return NULL; return NULL;

View File

@ -100,7 +100,7 @@ static int _transport(char const * protocol, char const * name)
plugin_delete(plugin); plugin_delete(plugin);
return error_print("transport"); return error_print("transport");
} }
transport.message = appmessage_new_call("hello"); transport.message = appmessage_new_call("hello", -1);
tv.tv_sec = 1; tv.tv_sec = 1;
tv.tv_usec = 0; tv.tv_usec = 0;
/* enter the main loop */ /* enter the main loop */