Sending the first messages over

This commit is contained in:
Pierre Pronchery 2013-01-09 18:56:11 +01:00
parent f227eb3ce1
commit b5e585ab00
4 changed files with 87 additions and 19 deletions

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2012 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2012-2013 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS System libApp */ /* This file is part of DeforaOS System libApp */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -20,20 +20,41 @@
# include <System/buffer.h> # include <System/buffer.h>
# include <System/string.h> # include <System/string.h>
# include <System/variable.h>
# include "app.h" # include "app.h"
/* AppMessage */ /* AppMessage */
/* type */ /* types */
typedef enum _AppMessageType typedef enum _AppMessageType
{ {
AMT_CALL = 0 AMT_CALL = 0
} AppMessageType; } 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 */ /* functions */
AppMessage * appmessage_new_call(char const * method, ...); AppMessage * appmessage_new_call(String const * method,
AppMessage * appmessage_new_call_variables(char 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); AppMessage * appmessage_new_deserialize(Buffer * buffer);
void appmessage_delete(AppMessage * appmessage); void appmessage_delete(AppMessage * appmessage);

View File

@ -37,7 +37,7 @@ struct _AppMessage
struct struct
{ {
char * method; char * method;
Variable ** args; AppMessageCallArgument * args;
size_t args_cnt; size_t args_cnt;
} call; } call;
} t; } t;
@ -47,14 +47,45 @@ struct _AppMessage
/* public */ /* public */
/* functions */ /* functions */
/* appmessage_new_call */ /* 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; AppMessage * message;
va_list ap; va_list ap;
size_t i; size_t i;
int type; int type;
Variable * v; Variable * v;
Variable ** p; AppMessageCallArgument * p;
if((message = object_new(sizeof(*message))) == NULL) if((message = object_new(sizeof(*message))) == NULL)
return NULL; return NULL;
@ -86,7 +117,8 @@ AppMessage * appmessage_new_call(char const * method, ...)
message = NULL; message = NULL;
break; 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; message->t.call.args_cnt = i + 1;
} }
va_end(ap); va_end(ap);
@ -94,14 +126,14 @@ AppMessage * appmessage_new_call(char const * method, ...)
} }
/* appmessage_new_call_variables */ /* appmessage_new_callv_variables */
AppMessage * appmessage_new_call_variables(char const * method, ...) AppMessage * appmessage_new_callv_variables(char const * method, ...)
{ {
AppMessage * message; AppMessage * message;
va_list ap; va_list ap;
size_t i; size_t i;
Variable * v; Variable * v;
Variable ** p; AppMessageCallArgument * p;
if((message = object_new(sizeof(*message))) == NULL) if((message = object_new(sizeof(*message))) == NULL)
return NULL; return NULL;
@ -129,7 +161,8 @@ AppMessage * appmessage_new_call_variables(char const * method, ...)
message = NULL; message = NULL;
break; 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; message->t.call.args_cnt = i + 1;
} }
va_end(ap); va_end(ap);
@ -186,7 +219,7 @@ static AppMessage * _new_deserialize_call(AppMessage * message,
size_t s; size_t s;
Variable * v; Variable * v;
size_t i; size_t i;
Variable ** p; AppMessageCallArgument * p;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
@ -232,7 +265,8 @@ static AppMessage * _new_deserialize_call(AppMessage * message,
#endif #endif
pos += s; pos += s;
size -= 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; message->t.call.args_cnt = i + 1;
} }
return message; return message;
@ -329,9 +363,13 @@ static int _serialize_call(AppMessage * message, Buffer * buffer, Buffer * b)
if(ret != 0) if(ret != 0)
return ret; return ret;
for(i = 0; i < message->t.call.args_cnt; i++) 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) || _serialize_append(buffer, b) != 0)
break; break;
}
buffer_delete(b); buffer_delete(b);
return (i == message->t.call.args_cnt) ? 0 : -1; return (i == message->t.call.args_cnt) ? 0 : -1;
} }

View File

@ -46,6 +46,11 @@ struct _AppTransport
AppTransportPluginDefinition * definition; AppTransportPluginDefinition * definition;
}; };
struct _AppTransportClient
{
AppTransport * transport;
};
/* prototypes */ /* prototypes */
/* helpers */ /* helpers */
@ -150,11 +155,15 @@ static int _apptransport_helper_status(AppTransport * transport,
static AppTransportClient * _apptransport_helper_client_new( static AppTransportClient * _apptransport_helper_client_new(
AppTransport * transport) AppTransport * transport)
{ {
AppTransportClient * client;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
/* FIXME really implement */ if((client = object_new(sizeof(*client))) == NULL)
return NULL; return NULL;
client->transport = transport;
return client;
} }
@ -165,7 +174,7 @@ static void _apptransport_helper_client_delete(AppTransport * transport,
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
/* FIXME really implement */ object_delete(client);
} }

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", -1); transport.message = appmessage_new_callv("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 */