From 4291bae1f95c7a442829655d56cdd38ca20891e8 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 8 Jan 2013 20:14:02 +0100 Subject: [PATCH] Also implemented creating messages with arguments --- include/App/appmessage.h | 1 + src/appmessage.c | 21 ++++++++++++++++++--- tests/transport.c | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/App/appmessage.h b/include/App/appmessage.h index 1717604..8302a53 100644 --- a/include/App/appmessage.h +++ b/include/App/appmessage.h @@ -33,6 +33,7 @@ typedef enum _AppMessageType /* functions */ AppMessage * appmessage_new_call(char const * method, ...); +AppMessage * appmessage_new_call_variables(char const * method, ...); AppMessage * appmessage_new_deserialize(Buffer * buffer); void appmessage_delete(AppMessage * appmessage); diff --git a/src/appmessage.c b/src/appmessage.c index f3f67cb..17ee5b3 100644 --- a/src/appmessage.c +++ b/src/appmessage.c @@ -51,19 +51,34 @@ AppMessage * appmessage_new_call(char const * method, ...) { AppMessage * message; va_list ap; + size_t i; + int type; Variable * v; + Variable ** p; if((message = object_new(sizeof(*message))) == NULL) return NULL; message->type = AMT_CALL; message->t.call.method = string_new(method); + message->t.call.args = NULL; + message->t.call.args_cnt = 0; /* copy the arguments */ 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); /* check for errors */ - if(message->t.call.method == NULL) + if(message->t.call.method == NULL || type >= 0) { appmessage_delete(message); return NULL; diff --git a/tests/transport.c b/tests/transport.c index b58be50..d8850c6 100644 --- a/tests/transport.c +++ b/tests/transport.c @@ -100,7 +100,7 @@ static int _transport(char const * protocol, char const * name) plugin_delete(plugin); return error_print("transport"); } - transport.message = appmessage_new_call("hello"); + transport.message = appmessage_new_call("hello", -1); tv.tv_sec = 1; tv.tv_usec = 0; /* enter the main loop */