Beginning to send acknowledgements

This commit is contained in:
Pierre Pronchery 2014-03-23 00:39:09 +09:00
parent c2dcd53cce
commit 1cd74f6859
5 changed files with 108 additions and 17 deletions

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2012-2013 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2012-2014 Pierre Pronchery <khorben@defora.org> */
/* 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
@ -54,8 +54,10 @@ typedef struct _AppTransportPluginHelper
Event * event;
/* callbacks */
int (*receive)(AppTransport * transport, AppMessage * message);
int (*status)(AppTransport * transport, AppTransportStatus status,
unsigned int code, char const * message);
/* clients */
AppTransportClient * (*client_new)(AppTransport * transport);
void (*client_delete)(AppTransport * transport,

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2012-2013 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2012-2014 Pierre Pronchery <khorben@defora.org> */
/* 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,7 +20,7 @@
#endif
#include <string.h>
#include <System.h>
#include "App/appmessage.h"
#include "appmessage.h"
#include "apptransport.h"
#include "../config.h"
@ -37,6 +37,7 @@
/* types */
struct _AppTransport
{
AppTransportMode mode;
AppTransportHelper helper;
/* plug-in */
@ -70,7 +71,8 @@ static int _apptransport_helper_client_receive(AppTransport * transport,
/* protected */
/* functions */
/* apptransport_new */
static void _new_helper(AppTransport * transport, Event * event);
static void _new_helper(AppTransport * transport, AppTransportMode mode,
Event * event);
AppTransport * apptransport_new(AppTransportMode mode,
AppTransportHelper * helper, char const * plugin,
@ -82,9 +84,10 @@ AppTransport * apptransport_new(AppTransportMode mode,
if((transport = object_new(sizeof(*transport))) == NULL)
return NULL;
memset(transport, 0, sizeof(*transport));
transport->mode = mode;
transport->helper = *helper;
/* initialize the plug-in helper */
_new_helper(transport, event);
_new_helper(transport, mode, event);
/* load the transport plug-in */
if((transport->plugin = plugin_new(LIBDIR, "App", "transport", plugin))
== NULL
@ -102,7 +105,8 @@ AppTransport * apptransport_new(AppTransportMode mode,
return transport;
}
static void _new_helper(AppTransport * transport, Event * event)
static void _new_helper(AppTransport * transport, AppTransportMode mode,
Event * event)
{
transport->thelper.transport = transport;
transport->thelper.event = event;
@ -182,12 +186,26 @@ static void _apptransport_helper_client_delete(AppTransport * transport,
static int _apptransport_helper_client_receive(AppTransport * transport,
AppTransportClient * client, AppMessage * message)
{
AppMessageID id;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s() %u \"%s\"\n", __func__,
fprintf(stderr, "DEBUG: %s() %u %u \"%s\"\n", __func__,
appmessage_get_type(message),
appmessage_get_id(message),
appmessage_get_method(message));
#endif
if(transport->mode != ATM_SERVER)
/* XXX improve the error message */
return -error_set_code(1, "Not a server");
transport->helper.message(transport->helper.data, transport, client,
message);
/* check if an acknowledgement is requested */
if((id = appmessage_get_id(message)) != 0)
/* XXX we can ignore errors */
if((message = appmessage_new_acknowledgement(id)) != NULL)
{
apptransport_send(transport, message, 0);
appmessage_delete(message);
}
return 0;
}

View File

@ -73,8 +73,8 @@ typedef struct _TCPSocket
struct _AppTransportPlugin
{
AppTransportPluginHelper * helper;
AppTransportMode mode;
AppTransportPluginHelper * helper;
struct addrinfo * ai;
socklen_t ai_addrlen;
@ -105,8 +105,8 @@ struct _AppTransportPlugin
/* protected */
/* prototypes */
/* plug-in */
static TCP * _tcp_init(AppTransportPluginHelper * helper,
AppTransportMode mode, char const * name);
static TCP * _tcp_init(AppTransportPluginHelper * helper, AppTransportMode mode,
char const * name);
static void _tcp_destroy(TCP * tcp);
static int _tcp_send(TCP * tcp, AppMessage * message, int acknowledge);
@ -156,8 +156,8 @@ static int _init_address(TCP * tcp, char const * name, int domain);
static int _init_client(TCP * tcp, char const * name);
static int _init_server(TCP * tcp, char const * name);
static TCP * _tcp_init(AppTransportPluginHelper * helper,
AppTransportMode mode, char const * name)
static TCP * _tcp_init(AppTransportPluginHelper * helper, AppTransportMode mode,
char const * name)
{
TCP * tcp;
int res;
@ -652,11 +652,14 @@ static int _tcp_callback_connect(int fd, TCP * tcp)
/* tcp_socket_callback_read */
static void _socket_callback_read_client(TCPSocket * tcpsocket,
AppMessage * message);
static void _socket_callback_read_server(TCPSocket * tcpsocket,
AppMessage * message);
static int _tcp_socket_callback_read(int fd, TCPSocket * tcpsocket)
{
const size_t inc = INC;
TCP * tcp = tcpsocket->tcp;
AppTransportPluginHelper * helper = tcp->helper;
ssize_t ssize;
char * p;
size_t size;
@ -713,8 +716,17 @@ static int _tcp_socket_callback_read(int fd, TCPSocket * tcpsocket)
}
if(message != NULL)
{
helper->client_receive(helper->transport, tcpsocket->client,
switch(tcpsocket->tcp->mode)
{
case ATM_CLIENT:
_socket_callback_read_client(tcpsocket,
message);
break;
case ATM_SERVER:
_socket_callback_read_server(tcpsocket,
message);
break;
}
appmessage_delete(message);
}
else
@ -725,6 +737,23 @@ static int _tcp_socket_callback_read(int fd, TCPSocket * tcpsocket)
return 0;
}
static void _socket_callback_read_client(TCPSocket * tcpsocket,
AppMessage * message)
{
AppTransportPluginHelper * helper = tcpsocket->tcp->helper;
helper->receive(helper->transport, message);
}
static void _socket_callback_read_server(TCPSocket * tcpsocket,
AppMessage * message)
{
AppTransportPluginHelper * helper = tcpsocket->tcp->helper;
helper->client_receive(helper->transport, tcpsocket->client,
message);
}
/* tcp_socket_callback_write */
static int _tcp_socket_callback_write(int fd, TCPSocket * tcpsocket)

View File

@ -421,7 +421,17 @@ static int _udp_callback_read(int fd, UDP * udp)
static void _callback_read_client(UDP * udp, struct sockaddr * sa,
socklen_t sa_len, AppMessage * message)
{
/* FIXME implement */
AppTransportPluginHelper * helper = udp->helper;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%u)\n", __func__,
appmessage_get_type(message));
#endif
if(sa_len != udp->aip->ai_addrlen
|| memcmp(udp->aip->ai_addr, sa, sa_len) != 0)
/* the message is not for us */
return;
helper->receive(helper->transport, message);
}
static void _callback_read_server(UDP * udp, struct sockaddr * sa,

View File

@ -41,6 +41,12 @@ typedef struct _AppTransport
static int _transport(char const * protocol, char const * name);
/* helpers */
static int _transport_helper_receive(AppTransport * transport,
AppMessage * message);
static int _transport_helper_status(AppTransport * transport,
AppTransportStatus status, unsigned int code,
char const * message);
static AppTransportClient * _transport_helper_client_new(
AppTransport * transport);
static void _transport_helper_client_delete(AppTransport * transport,
@ -83,6 +89,8 @@ static int _transport(char const * protocol, char const * name)
memset(helper, 0, sizeof(*helper));
helper->transport = &transport;
helper->event = event_new();
helper->receive = _transport_helper_receive;
helper->status = _transport_helper_status;
helper->client_new = _transport_helper_client_new;
helper->client_delete = _transport_helper_client_delete;
helper->client_receive = _transport_helper_client_receive;
@ -166,6 +174,30 @@ static int _transport_helper_client_receive(AppTransport * transport,
}
/* transport_helper_receive */
static int _transport_helper_receive(AppTransport * transport,
AppMessage * message)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
return 0;
}
/* transport_helper_status */
static int _transport_helper_status(AppTransport * transport,
AppTransportStatus status, unsigned int code,
char const * message)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%u, %u, \"%s\")\n", __func__, status, code,
message);
#endif
return 0;
}
/* callbacks */
/* transport_callback_idle */
static int _transport_callback_idle(void * data)