Sending the first messages over
This commit is contained in:
parent
f227eb3ce1
commit
b5e585ab00
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user