diff --git a/include/App/appmessage.h b/include/App/appmessage.h index 8302a53..f7c643f 100644 --- a/include/App/appmessage.h +++ b/include/App/appmessage.h @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2012 Pierre Pronchery */ +/* Copyright (c) 2012-2013 Pierre Pronchery */ /* This file is part of DeforaOS System libApp */ /* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,20 +20,41 @@ # include # include +# include # include "app.h" /* AppMessage */ -/* type */ +/* types */ typedef enum _AppMessageType { AMT_CALL = 0 } AppMessageType; +typedef enum _AppMessageCallDirection +{ + AMCD_IN = 0, + AMCD_OUT, + AMCD_IN_OUT +} AppMessageCallDirection; + +typedef struct _AppMessageCallArgument +{ + AppMessageCallDirection direction; + Variable * arg; +} AppMessageCallArgument; + + +/* macros */ +# define AMCA(type, direction, variable) \ + (type | (direction) << 8), (variable) + /* functions */ -AppMessage * appmessage_new_call(char const * method, ...); -AppMessage * appmessage_new_call_variables(char const * method, ...); +AppMessage * appmessage_new_call(String const * method, + AppMessageCallArgument * args, size_t args_cnt); +AppMessage * appmessage_new_callv(String const * method, ...); +AppMessage * appmessage_new_callv_variables(String const * method, ...); AppMessage * appmessage_new_deserialize(Buffer * buffer); void appmessage_delete(AppMessage * appmessage); diff --git a/src/appmessage.c b/src/appmessage.c index 93f88c5..eaf4284 100644 --- a/src/appmessage.c +++ b/src/appmessage.c @@ -37,7 +37,7 @@ struct _AppMessage struct { char * method; - Variable ** args; + AppMessageCallArgument * args; size_t args_cnt; } call; } t; @@ -47,14 +47,45 @@ struct _AppMessage /* public */ /* functions */ /* appmessage_new_call */ -AppMessage * appmessage_new_call(char const * method, ...) +AppMessage * appmessage_new_call(char const * method, + AppMessageCallArgument * args, size_t args_cnt) +{ + AppMessage * message; + size_t i; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, method); +#endif + if((message = object_new(sizeof(*message))) == NULL) + return NULL; + message->type = AMT_CALL; + message->t.call.method = string_new(method); + message->t.call.args = malloc(sizeof(*args) * args_cnt); + message->t.call.args_cnt = args_cnt; + if(message->t.call.args == NULL) + { + appmessage_delete(message); + return NULL; + } + for(i = 0; i < args_cnt; i++) + { + /* FIXME check for errors */ + message->t.call.args[i].direction = args[i].direction; + message->t.call.args[i].arg = variable_new_copy(args[i].arg); + } + return message; +} + + +/* appmessage_new_callv */ +AppMessage * appmessage_new_callv(char const * method, ...) { AppMessage * message; va_list ap; size_t i; int type; Variable * v; - Variable ** p; + AppMessageCallArgument * p; if((message = object_new(sizeof(*message))) == NULL) return NULL; @@ -86,7 +117,8 @@ AppMessage * appmessage_new_call(char const * method, ...) message = NULL; break; } - message->t.call.args[i] = v; + message->t.call.args[i].direction = AMCD_IN; /* XXX */ + message->t.call.args[i].arg = v; message->t.call.args_cnt = i + 1; } va_end(ap); @@ -94,14 +126,14 @@ AppMessage * appmessage_new_call(char const * method, ...) } -/* appmessage_new_call_variables */ -AppMessage * appmessage_new_call_variables(char const * method, ...) +/* appmessage_new_callv_variables */ +AppMessage * appmessage_new_callv_variables(char const * method, ...) { AppMessage * message; va_list ap; size_t i; Variable * v; - Variable ** p; + AppMessageCallArgument * p; if((message = object_new(sizeof(*message))) == NULL) return NULL; @@ -129,7 +161,8 @@ AppMessage * appmessage_new_call_variables(char const * method, ...) message = NULL; break; } - message->t.call.args[i] = v; + message->t.call.args[i].direction = AMCD_IN; /* XXX */ + message->t.call.args[i].arg = v; message->t.call.args_cnt = i + 1; } va_end(ap); @@ -186,7 +219,7 @@ static AppMessage * _new_deserialize_call(AppMessage * message, size_t s; Variable * v; size_t i; - Variable ** p; + AppMessageCallArgument * p; #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); @@ -232,7 +265,8 @@ static AppMessage * _new_deserialize_call(AppMessage * message, #endif pos += s; size -= s; - message->t.call.args[i] = v; + message->t.call.args[i].direction = AMCD_IN; /* XXX */ + message->t.call.args[i].arg = v; message->t.call.args_cnt = i + 1; } return message; @@ -329,9 +363,13 @@ static int _serialize_call(AppMessage * message, Buffer * buffer, Buffer * b) if(ret != 0) return ret; for(i = 0; i < message->t.call.args_cnt; i++) - if(variable_serialize(message->t.call.args[i], b, 1) != 0 + { + if(message->t.call.args[i].direction == AMCD_OUT) + continue; + if(variable_serialize(message->t.call.args[i].arg, b, 1) != 0 || _serialize_append(buffer, b) != 0) break; + } buffer_delete(b); return (i == message->t.call.args_cnt) ? 0 : -1; } diff --git a/src/apptransport.c b/src/apptransport.c index de8fd24..45c5d55 100644 --- a/src/apptransport.c +++ b/src/apptransport.c @@ -46,6 +46,11 @@ struct _AppTransport AppTransportPluginDefinition * definition; }; +struct _AppTransportClient +{ + AppTransport * transport; +}; + /* prototypes */ /* helpers */ @@ -150,11 +155,15 @@ static int _apptransport_helper_status(AppTransport * transport, static AppTransportClient * _apptransport_helper_client_new( AppTransport * transport) { + AppTransportClient * client; + #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif - /* FIXME really implement */ - return NULL; + if((client = object_new(sizeof(*client))) == NULL) + return NULL; + client->transport = transport; + return client; } @@ -165,7 +174,7 @@ static void _apptransport_helper_client_delete(AppTransport * transport, #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif - /* FIXME really implement */ + object_delete(client); } diff --git a/tests/transport.c b/tests/transport.c index d8850c6..0d76ebe 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", -1); + transport.message = appmessage_new_callv("hello", -1); tv.tv_sec = 1; tv.tv_usec = 0; /* enter the main loop */