Beginning to send acknowledgements
This commit is contained in:
parent
c2dcd53cce
commit
1cd74f6859
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user