From 23a7d749d14e83f4095843edabc7b8a7737e6ad0 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Sat, 26 Jan 2013 20:44:52 +0200 Subject: [PATCH] common: added custom transport mode support (custom encoding/decoding). --- src/common/dbus-transport.c | 3 +- src/common/dgram-transport.c | 9 +++-- src/common/internal-transport.c | 3 +- src/common/stream-transport.c | 9 +++-- src/common/transport.c | 59 +++++++++++++++++++++++++++++++ src/common/transport.h | 77 ++++++++++++++++++++++++++--------------- 6 files changed, 125 insertions(+), 35 deletions(-) diff --git a/src/common/dbus-transport.c b/src/common/dbus-transport.c index 321b1c3..ac693f1 100644 --- a/src/common/dbus-transport.c +++ b/src/common/dbus-transport.c @@ -1712,5 +1712,6 @@ MRP_REGISTER_TRANSPORT(dbus, DBUS, dbus_t, dbus_resolve, dbus_connect, dbus_disconnect, dbus_sendmsg, dbus_sendmsgto, dbus_sendraw, dbus_sendrawto, - dbus_senddata, dbus_senddatato); + dbus_senddata, dbus_senddatato, + NULL, NULL); diff --git a/src/common/dgram-transport.c b/src/common/dgram-transport.c index ccb46da..206e9a8 100644 --- a/src/common/dgram-transport.c +++ b/src/common/dgram-transport.c @@ -702,7 +702,8 @@ MRP_REGISTER_TRANSPORT(udp4, UDP4, dgrm_t, dgrm_resolve, dgrm_connect, dgrm_disconnect, dgrm_send, dgrm_sendto, dgrm_sendraw, dgrm_sendrawto, - dgrm_senddata, dgrm_senddatato); + dgrm_senddata, dgrm_senddatato, + NULL, NULL); MRP_REGISTER_TRANSPORT(udp6, UDP6, dgrm_t, dgrm_resolve, dgrm_open, dgrm_createfrom, dgrm_close, NULL, @@ -710,7 +711,8 @@ MRP_REGISTER_TRANSPORT(udp6, UDP6, dgrm_t, dgrm_resolve, dgrm_connect, dgrm_disconnect, dgrm_send, dgrm_sendto, dgrm_sendraw, dgrm_sendrawto, - dgrm_senddata, dgrm_senddatato); + dgrm_senddata, dgrm_senddatato, + NULL, NULL); MRP_REGISTER_TRANSPORT(unxdgrm, UNXD, dgrm_t, dgrm_resolve, dgrm_open, dgrm_createfrom, dgrm_close, NULL, @@ -718,4 +720,5 @@ MRP_REGISTER_TRANSPORT(unxdgrm, UNXD, dgrm_t, dgrm_resolve, dgrm_connect, dgrm_disconnect, dgrm_send, dgrm_sendto, dgrm_sendraw, dgrm_sendrawto, - dgrm_senddata, dgrm_senddatato); + dgrm_senddata, dgrm_senddatato, + NULL, NULL); diff --git a/src/common/internal-transport.c b/src/common/internal-transport.c index c1acb03..170c608 100644 --- a/src/common/internal-transport.c +++ b/src/common/internal-transport.c @@ -581,4 +581,5 @@ MRP_REGISTER_TRANSPORT(internal, INTERNAL, internal_t, internal_resolve, internal_connect, internal_disconnect, internal_send, internal_sendto, internal_sendraw, internal_sendrawto, - internal_senddata, internal_senddatato); + internal_senddata, internal_senddatato, + NULL, NULL); diff --git a/src/common/stream-transport.c b/src/common/stream-transport.c index f2f4fe2..37102f8 100644 --- a/src/common/stream-transport.c +++ b/src/common/stream-transport.c @@ -667,7 +667,8 @@ MRP_REGISTER_TRANSPORT(tcp4, TCP4, strm_t, strm_resolve, strm_connect, strm_disconnect, strm_send, NULL, strm_sendraw, NULL, - strm_senddata, NULL); + strm_senddata, NULL, + NULL, NULL); MRP_REGISTER_TRANSPORT(tcp6, TCP6, strm_t, strm_resolve, strm_open, strm_createfrom, strm_close, NULL, @@ -675,7 +676,8 @@ MRP_REGISTER_TRANSPORT(tcp6, TCP6, strm_t, strm_resolve, strm_connect, strm_disconnect, strm_send, NULL, strm_sendraw, NULL, - strm_senddata, NULL); + strm_senddata, NULL, + NULL, NULL); MRP_REGISTER_TRANSPORT(unxstrm, UNXS, strm_t, strm_resolve, strm_open, strm_createfrom, strm_close, NULL, @@ -683,4 +685,5 @@ MRP_REGISTER_TRANSPORT(unxstrm, UNXS, strm_t, strm_resolve, strm_connect, strm_disconnect, strm_send, NULL, strm_sendraw, NULL, - strm_senddata, NULL); + strm_senddata, NULL, + NULL, NULL); diff --git a/src/common/transport.c b/src/common/transport.c index a8bd670..0c56914 100644 --- a/src/common/transport.c +++ b/src/common/transport.c @@ -540,6 +540,43 @@ int mrp_transport_senddatato(mrp_transport_t *t, void *data, uint16_t tag, } +int mrp_transport_sendcustom(mrp_transport_t *t, void *data) +{ + int result; + + if (t->mode == MRP_TRANSPORT_MODE_CUSTOM && t->descr->req.sendcustom) { + MRP_TRANSPORT_BUSY(t, { + result = t->descr->req.sendcustom(t, data); + }); + + purge_destroyed(t); + } + else + result = FALSE; + + return result; +} + + +int mrp_transport_sendcustomto(mrp_transport_t *t, void *data, + mrp_sockaddr_t *addr, socklen_t addrlen) +{ + int result; + + if (t->mode == MRP_TRANSPORT_MODE_CUSTOM && t->descr->req.sendcustomto) { + MRP_TRANSPORT_BUSY(t, { + result = t->descr->req.sendcustomto(t, data, addr, addrlen); + }); + + purge_destroyed(t); + } + else + result = FALSE; + + return result; +} + + static int recv_data(mrp_transport_t *t, void *data, size_t size, mrp_sockaddr_t *addr, socklen_t addrlen) { @@ -630,6 +667,28 @@ static int recv_data(mrp_transport_t *t, void *data, size_t size, } break; + case MRP_TRANSPORT_MODE_CUSTOM: + if (t->connected) { + if (t->evt.recvcustom) { + MRP_TRANSPORT_BUSY(t, { + t->evt.recvcustom(t, data, t->user_data); + }); + + return 0; + } + } + else { + if (t->evt.recvcustomfrom) { + MRP_TRANSPORT_BUSY(t, { + t->evt.recvcustomfrom(t, data, addr, addrlen, + t->user_data); + }); + + return 0; + } + } + return -EPROTOTYPE; + default: return -EPROTOTYPE; } diff --git a/src/common/transport.h b/src/common/transport.h index 1503fde..c3d978a 100644 --- a/src/common/transport.h +++ b/src/common/transport.h @@ -72,14 +72,15 @@ static inline mrp_sockaddr_t *mrp_sockaddr_cpy(mrp_sockaddr_t *d, */ typedef enum { - MRP_TRANSPORT_MODE_MSG = 0x00, /* generic message encoding */ - MRP_TRANSPORT_MODE_RAW = 0x01, /* uses bitpipe mode */ - MRP_TRANSPORT_MODE_DATA = 0x02, /* uses registered data types */ + MRP_TRANSPORT_MODE_MSG = 0x00, /* generic message encoding */ + MRP_TRANSPORT_MODE_RAW = 0x01, /* uses bitpipe mode */ + MRP_TRANSPORT_MODE_DATA = 0x02, /* uses registered data types */ + MRP_TRANSPORT_MODE_CUSTOM = 0x03, /* custom message encoding */ } mrp_transport_mode_t; typedef enum { - MRP_TRANSPORT_MODE_MASK = 0x03, /* mask of mode bits */ - MRP_TRANSPORT_INHERIT = 0x03, /* mask of all inherited flags */ + MRP_TRANSPORT_MODE_MASK = 0x0f, /* mask of mode bits */ + MRP_TRANSPORT_INHERIT = 0x0f, /* mask of all inherited flags */ MRP_TRANSPORT_REUSEADDR = 0x10, MRP_TRANSPORT_NONBLOCK = 0x20, @@ -122,8 +123,10 @@ typedef struct { int (*sendmsg)(mrp_transport_t *t, mrp_msg_t *msg); /** Send raw data over a (connected) transport. */ int (*sendraw)(mrp_transport_t *t, void *buf, size_t size); - /** Send custom data over a (connected) transport. */ + /** Send registered data over a (connected) transport. */ int (*senddata)(mrp_transport_t *t, void *data, uint16_t tag); + /** Send data with a custom encoder over a transport. */ + int (*sendcustom)(mrp_transport_t *t, void *data); /** Send a message over a(n unconnected) transport. */ int (*sendmsgto)(mrp_transport_t *t, mrp_msg_t *msg, mrp_sockaddr_t *addr, @@ -131,9 +134,12 @@ typedef struct { /** Send raw data over a(n unconnected) transport. */ int (*sendrawto)(mrp_transport_t *t, void *buf, size_t size, mrp_sockaddr_t *addr, socklen_t addrlen); - /** Send custom data over a(n unconnected) transport. */ + /** Send registered data over a(n unconnected) transport. */ int (*senddatato)(mrp_transport_t *t, void *data, uint16_t tag, mrp_sockaddr_t *addr, socklen_t addrlen); + /** Send data with a custom encoder over a transport. */ + int (*sendcustomto)(mrp_transport_t *t, void *data, + mrp_sockaddr_t *addr, socklen_t addrlen); } mrp_transport_req_t; @@ -155,9 +161,12 @@ typedef struct { /** Raw data callback for connected transports. */ void (*recvraw)(mrp_transport_t *t, void *data, size_t size, void *user_data); - /** Custom data callback for connected transports. */ + /** Registered data callback for connected transports. */ void (*recvdata)(mrp_transport_t *t, void *data, uint16_t tag, void *user_data); + /** Custom encoded data callback for connected transports. */ + void (*recvcustom)(mrp_transport_t *t, void *data, + void *user_data); }; /** Message received on an unconnected transport. */ @@ -170,10 +179,14 @@ typedef struct { void (*recvrawfrom)(mrp_transport_t *t, void *data, size_t size, mrp_sockaddr_t *addr, socklen_t addrlen, void *user_data); - /** Custom data callback for unconnected transports. */ + /** Registered data callback for unconnected transports. */ void (*recvdatafrom)(mrp_transport_t *t, void *data, uint16_t tag, mrp_sockaddr_t *addr, socklen_t addrlen, void *user_data); + /** Custom encoded data callback for unconnected transports. */ + void (*recvcustomfrom)(mrp_transport_t *t, void *data, + mrp_sockaddr_t *addr, socklen_t addrlen, + void *user_data); }; /** Connection closed by peer. */ void (*closed)(mrp_transport_t *t, int error, void *user_data); @@ -349,7 +362,8 @@ struct mrp_transport_s { _connect, _disconnect, \ _sendmsg, _sendmsgto, \ _sendraw, _sendrawto, \ - _senddata, _senddatato) \ + _senddata, _senddatato, \ + _sendcustom, _sendcustomto) \ static void _prfx##_register_transport(void) \ __attribute__((constructor)); \ \ @@ -359,21 +373,23 @@ struct mrp_transport_s { .size = sizeof(_structtype), \ .resolve = _resolve, \ .req = { \ - .open = _open, \ - .createfrom = _createfrom, \ - .bind = _bind, \ - .listen = _listen, \ - .accept = _accept, \ - .close = _close, \ - .setopt = _setopt, \ - .connect = _connect, \ - .disconnect = _disconnect, \ - .sendmsg = _sendmsg, \ - .sendmsgto = _sendmsgto, \ - .sendraw = _sendraw, \ - .sendrawto = _sendrawto, \ - .senddata = _senddata, \ - .senddatato = _senddatato, \ + .open = _open, \ + .createfrom = _createfrom, \ + .bind = _bind, \ + .listen = _listen, \ + .accept = _accept, \ + .close = _close, \ + .setopt = _setopt, \ + .connect = _connect, \ + .disconnect = _disconnect, \ + .sendmsg = _sendmsg, \ + .sendmsgto = _sendmsgto, \ + .sendraw = _sendraw, \ + .sendrawto = _sendrawto, \ + .senddata = _senddata, \ + .senddatato = _senddatato, \ + .sendcustom = _sendcustom, \ + .sendcustomto = _sendcustomto, \ }, \ }; \ \ @@ -447,13 +463,20 @@ int mrp_transport_sendraw(mrp_transport_t *t, void *data, size_t size); int mrp_transport_sendrawto(mrp_transport_t *t, void *data, size_t size, mrp_sockaddr_t *addr, socklen_t addrlen); -/** Send custom data through the given (connected) transport. */ +/** Send registered data through the given (connected) transport. */ int mrp_transport_senddata(mrp_transport_t *t, void *data, uint16_t tag); -/** Send custom data through the given transport to the remote address. */ +/** Send registered data through the given transport to the remote address. */ int mrp_transport_senddatato(mrp_transport_t *t, void *data, uint16_t tag, mrp_sockaddr_t *addr, socklen_t addrlen); +/** Send custom data through the given (connected) transport. */ +int mrp_transport_sendcustom(mrp_transport_t *t, void *data); + +/** Send registered data through the given transport to the remote address. */ +int mrp_transport_sendcustomto(mrp_transport_t *t, void *data, + mrp_sockaddr_t *addr, socklen_t addrlen); + MRP_CDECL_END #endif /* __MURPHY_TRANSPORT_H__ */ -- 2.7.4