From 32593c6e25796b78e0518c67fce053a614a94a91 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 22 Mar 2014 23:40:28 +0900 Subject: [PATCH] Preparing support for acknowledgements --- Makefile | 1 + include/App/appmessage.h | 10 ++- src/Makefile | 2 +- src/appmessage.c | 144 +++++++++++++++++++++++++++++++++++---- src/appmessage.h | 31 +++++++++ src/project.conf | 5 +- 6 files changed, 175 insertions(+), 18 deletions(-) create mode 100644 src/appmessage.h diff --git a/Makefile b/Makefile index 9d59e54..e2a7c01 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,7 @@ dist: $(PACKAGE)-$(VERSION)/src/common.c \ $(PACKAGE)-$(VERSION)/src/Makefile \ $(PACKAGE)-$(VERSION)/src/appinterface.h \ + $(PACKAGE)-$(VERSION)/src/appmessage.h \ $(PACKAGE)-$(VERSION)/src/apptransport.h \ $(PACKAGE)-$(VERSION)/src/common.h \ $(PACKAGE)-$(VERSION)/src/project.conf \ diff --git a/include/App/appmessage.h b/include/App/appmessage.h index 3e1c22a..9abc851 100644 --- a/include/App/appmessage.h +++ b/include/App/appmessage.h @@ -28,10 +28,14 @@ /* types */ typedef enum _AppMessageType { - AMT_CALL = 0 + AMT_CALL = 0, + AMT_ACKNOWLEDGEMENT } AppMessageType; # define AMT_CALLBACK AMT_CALL +typedef uint32_t AppMessageID; + +/* calls */ typedef enum _AppMessageCallDirection { AMCD_IN = 0, @@ -52,10 +56,14 @@ typedef struct _AppMessageCallArgument /* functions */ +/* calls */ 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, ...); +/* acknowledgement */ +AppMessage * appmessage_new_acknowledgement(AppMessageID id); +/* generic */ AppMessage * appmessage_new_deserialize(Buffer * buffer); void appmessage_delete(AppMessage * appmessage); diff --git a/src/Makefile b/src/Makefile index 98b616f..2f00afa 100644 --- a/src/Makefile +++ b/src/Makefile @@ -39,7 +39,7 @@ appclient.o: appclient.c appinterface.h ../include/App/appclient.h common.h appinterface.o: appinterface.c ../include/App/appserver.h ../config.h $(CC) $(libApp_CFLAGS) -c appinterface.c -appmessage.o: appmessage.c +appmessage.o: appmessage.c ../include/App/appmessage.h appmessage.h $(CC) $(libApp_CFLAGS) -c appmessage.c appserver.o: appserver.c appinterface.h ../include/App/appserver.h ../config.h diff --git a/src/appmessage.c b/src/appmessage.c index 0bfcb11..4a3478d 100644 --- a/src/appmessage.c +++ b/src/appmessage.c @@ -22,7 +22,7 @@ # include #endif #include -#include "App/appmessage.h" +#include "appmessage.h" /* AppMessage */ @@ -31,6 +31,7 @@ struct _AppMessage { AppMessageType type; + AppMessageID id; union { @@ -46,6 +47,22 @@ struct _AppMessage /* public */ /* functions */ +/* appmessage_new_acknowledgement */ +AppMessage * appmessage_new_acknowledgement(AppMessageID id) +{ + AppMessage * message; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, method); +#endif + if((message = object_new(sizeof(*message))) == NULL) + return NULL; + message->type = AMT_ACKNOWLEDGEMENT; + message->id = id; + return message; +} + + /* appmessage_new_call */ AppMessage * appmessage_new_call(char const * method, AppMessageCallArgument * args, size_t args_cnt) @@ -59,6 +76,7 @@ AppMessage * appmessage_new_call(char const * method, if((message = object_new(sizeof(*message))) == NULL) return NULL; message->type = AMT_CALL; + message->id = 0; message->t.call.method = string_new(method); message->t.call.args = malloc(sizeof(*args) * args_cnt); message->t.call.args_cnt = args_cnt; @@ -90,6 +108,7 @@ AppMessage * appmessage_new_callv(char const * method, ...) if((message = object_new(sizeof(*message))) == NULL) return NULL; message->type = AMT_CALL; + message->id = 0; message->t.call.method = string_new(method); message->t.call.args = NULL; message->t.call.args_cnt = 0; @@ -138,6 +157,7 @@ AppMessage * appmessage_new_callv_variables(char const * method, ...) if((message = object_new(sizeof(*message))) == NULL) return NULL; message->type = AMT_CALL; + message->id = 0; message->t.call.method = string_new(method); message->t.call.args = NULL; message->t.call.args_cnt = 0; @@ -171,8 +191,12 @@ AppMessage * appmessage_new_callv_variables(char const * method, ...) /* appmessage_new_deserialize */ +static AppMessage * _new_deserialize_acknowledgement(AppMessage * message, + char const * data, const size_t size, size_t pos); static AppMessage * _new_deserialize_call(AppMessage * message, - char const * data, size_t size, size_t pos); + char const * data, const size_t size, size_t pos); +static AppMessage * _new_deserialize_id(AppMessage * message, char const * data, + const size_t size, size_t * pos); AppMessage * appmessage_new_deserialize(Buffer * buffer) { @@ -203,6 +227,9 @@ AppMessage * appmessage_new_deserialize(Buffer * buffer) variable_delete(v); switch((message->type = u8)) { + case AMT_ACKNOWLEDGEMENT: + return _new_deserialize_acknowledgement(message, data, + size, pos); case AMT_CALL: return _new_deserialize_call(message, data, size, pos); default: @@ -213,8 +240,17 @@ AppMessage * appmessage_new_deserialize(Buffer * buffer) } } +static AppMessage * _new_deserialize_acknowledgement(AppMessage * message, + char const * data, const size_t size, size_t pos) +{ +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s()\n", __func__); +#endif + return _new_deserialize_id(message, data, size, &pos); +} + static AppMessage * _new_deserialize_call(AppMessage * message, - char const * data, size_t size, size_t pos) + char const * data, const size_t size, size_t pos) { size_t s; Variable * v; @@ -224,6 +260,8 @@ static AppMessage * _new_deserialize_call(AppMessage * message, #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif + if(_new_deserialize_id(message, data, size, &pos) == NULL) + return NULL; message->t.call.method = NULL; message->t.call.args = NULL; message->t.call.args_cnt = 0; @@ -231,12 +269,12 @@ static AppMessage * _new_deserialize_call(AppMessage * message, if((v = variable_new_deserialize_type(VT_STRING, &s, &data[pos])) == NULL) { - error_set_code(1, "%s%u", "Unknown method "); + error_set_code(1, "%s", "Could not obtain the AppMessage call" + " method"); appmessage_delete(message); return NULL; } pos += s; - size -= s; /* XXX may fail */ variable_get_as(v, VT_STRING, &message->t.call.method); variable_delete(v); @@ -257,7 +295,7 @@ static AppMessage * _new_deserialize_call(AppMessage * message, return NULL; } message->t.call.args = p; - s = size; + s = size - pos; if((v = variable_new_deserialize(&s, &data[pos])) == NULL) { appmessage_delete(message); @@ -268,7 +306,6 @@ static AppMessage * _new_deserialize_call(AppMessage * message, variable_get_type(v)); #endif pos += s; - size -= s; message->t.call.args[i].direction = AMCD_IN; /* XXX */ message->t.call.args[i].arg = v; message->t.call.args_cnt = i + 1; @@ -276,6 +313,34 @@ static AppMessage * _new_deserialize_call(AppMessage * message, return message; } +static AppMessage * _new_deserialize_id(AppMessage * message, char const * data, + const size_t size, size_t * pos) +{ + int ret = 0; + size_t s = size; + Variable * v; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s()\n", __func__); +#endif + if((v = variable_new_deserialize_type(VT_UINT32, &s, &data[*pos])) + == NULL) + { + error_set_code(1, "%s", "Could not obtain the AppMessage ID"); + appmessage_delete(message); + return NULL; + } + ret = variable_get_as(v, VT_UINT32, &message->id); + variable_delete(v); + if(ret != 0) + { + appmessage_delete(message); + return NULL; + } + *pos += s; + return message; +} + /* appmessage_delete */ static void _delete_call(AppMessage * message); @@ -284,6 +349,8 @@ void appmessage_delete(AppMessage * message) { switch(message->type) { + case AMT_ACKNOWLEDGEMENT: + break; case AMT_CALL: _delete_call(message); break; @@ -298,6 +365,13 @@ static void _delete_call(AppMessage * message) /* accessors */ +/* appmessage_get_id */ +AppMessageID appmessage_get_id(AppMessage * message) +{ + return message->id; +} + + /* appmessage_get_method */ String const * appmessage_get_method(AppMessage * message) { @@ -314,30 +388,36 @@ AppMessageType appmessage_get_type(AppMessage * message) } +/* appmessage_set_id */ +void appmessage_set_id(AppMessage * message, AppMessageID id) +{ + message->id = id; +} + + /* useful */ /* appmessage_serialize */ +static int _serialize_acknowledgement(AppMessage * message, Buffer * buffer, + Buffer * b); static int _serialize_append(Buffer * buffer, Buffer * b); static int _serialize_call(AppMessage * message, Buffer * buffer, Buffer * b); +static int _serialize_id(AppMessage * message, Buffer * buffer, Buffer * b); +static int _serialize_type(AppMessage * message, Buffer * buffer, Buffer * b); int appmessage_serialize(AppMessage * message, Buffer * buffer) { - int ret; - Variable * v; Buffer * b; if((b = buffer_new(0, NULL)) == NULL) return -1; /* reset the output buffer */ buffer_set_size(buffer, 0); - if((v = variable_new(VT_UINT8, &message->type)) == NULL) + if(_serialize_type(message, buffer, b) != 0) return -1; - ret = (variable_serialize(v, b, 0) == 0 - && _serialize_append(buffer, b) == 0) ? 0 : -1; - variable_delete(v); - if(ret != 0) - return ret; switch(message->type) { + case AMT_ACKNOWLEDGEMENT: + return _serialize_acknowledgement(message, buffer, b); case AMT_CALL: return _serialize_call(message, buffer, b); default: @@ -347,6 +427,12 @@ int appmessage_serialize(AppMessage * message, Buffer * buffer) } } +static int _serialize_acknowledgement(AppMessage * message, Buffer * buffer, + Buffer * b) +{ + return _serialize_id(message, buffer, b); +} + static int _serialize_append(Buffer * buffer, Buffer * b) { return buffer_set_data(buffer, buffer_get_size(buffer), @@ -359,6 +445,8 @@ static int _serialize_call(AppMessage * message, Buffer * buffer, Buffer * b) Variable * v; size_t i; + if(_serialize_id(message, buffer, b) != 0) + return -1; if((v = variable_new(VT_STRING, message->t.call.method)) == NULL) return -1; ret = (variable_serialize(v, b, 0) == 0 @@ -377,3 +465,29 @@ static int _serialize_call(AppMessage * message, Buffer * buffer, Buffer * b) buffer_delete(b); return (i == message->t.call.args_cnt) ? 0 : -1; } + +static int _serialize_id(AppMessage * message, Buffer * buffer, Buffer * b) +{ + int ret; + Variable * v; + + if((v = variable_new(VT_UINT32, &message->id)) == NULL) + return -1; + ret = (variable_serialize(v, b, 0) == 0 + && _serialize_append(buffer, b) == 0) ? 0 : -1; + variable_delete(v); + return ret; +} + +static int _serialize_type(AppMessage * message, Buffer * buffer, Buffer * b) +{ + int ret; + Variable * v; + + if((v = variable_new(VT_UINT8, &message->type)) == NULL) + return -1; + ret = (variable_serialize(v, b, 0) == 0 + && _serialize_append(buffer, b) == 0) ? 0 : -1; + variable_delete(v); + return ret; +} diff --git a/src/appmessage.h b/src/appmessage.h new file mode 100644 index 0000000..2d7f3a0 --- /dev/null +++ b/src/appmessage.h @@ -0,0 +1,31 @@ +/* $Id$ */ +/* Copyright (c) 2014 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 + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + + + +#ifndef LIBAPP_SRC_APPMESSAGE_H +# define LIBAPP_SRC_APPMESSAGE_H + +# include +# include "App/appmessage.h" + + +/* AppMessage */ +/* functions */ +/* accessors */ +AppMessageID appmessage_get_id(AppMessage * message); +void appmessage_set_id(AppMessage * message, AppMessageID id); + +#endif /* !LIBAPP_SRC_APPMESSAGE_H */ diff --git a/src/project.conf b/src/project.conf index 0e757d1..5262bdc 100644 --- a/src/project.conf +++ b/src/project.conf @@ -5,7 +5,7 @@ cflags_force=-W -fPIC `pkg-config --cflags libSystem` cflags=-Wall -g -O2 -pedantic ldflags_force=`pkg-config --libs libSystem` ldflags= -dist=Makefile,appinterface.h,apptransport.h,common.h +dist=Makefile,appinterface.h,appmessage.h,apptransport.h,common.h [libApp] type=library @@ -19,6 +19,9 @@ depends=appinterface.h,../include/App/appclient.h,common.h [appinterface.c] depends=../include/App/appserver.h,../config.h +[appmessage.c] +depends=../include/App/appmessage.h,appmessage.h + [apptransport.c] depends=../include/App/appmessage.h,../config.h