From: Thadeu Lima de Souza Cascardo Date: Thu, 2 Jul 2009 16:55:29 +0000 (-0300) Subject: Added connection structure to replace GNet. X-Git-Tag: v0.1.3~72 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Frnetproxy.git;a=commitdiff_plain;h=f7413bcb265268909564c327ac43a46adfd44161 Added connection structure to replace GNet. --- diff --git a/iochannel.c b/iochannel.c index a380a7c..18336a1 100644 --- a/iochannel.c +++ b/iochannel.c @@ -18,6 +18,7 @@ #include "iochannel.h" +#include struct hc_server_cb { @@ -58,3 +59,84 @@ hc_server_add_watch (int fd, g_io_add_watch_full (cb->channel, G_PRIORITY_DEFAULT, G_IO_IN, hc_server_watch, cb, hc_server_cb_destroy); } + +struct _hc_conn_t +{ + GIOChannel *channel; + HCClientFunc func; + gpointer data; + ssize_t (*read) (gpointer, char *, size_t); + ssize_t (*write) (gpointer, char *, size_t); + void (*close) (gpointer); + gpointer layer; + guint watch; +}; + +ssize_t +hc_conn_channel_read (gpointer data, char *buffer, size_t len) +{ + int fd = g_io_channel_unix_get_fd ((GIOChannel *) data); + return read (fd, buffer, len); +} + +ssize_t +hc_conn_channel_write (gpointer data, char *buffer, size_t len) +{ + int fd = g_io_channel_unix_get_fd ((GIOChannel *) data); + return write (fd, buffer, len); +} + +void +hc_conn_channel_close (gpointer data) +{ + int fd = g_io_channel_unix_get_fd ((GIOChannel *) data); + shutdown (fd, SHUT_RDWR); +} + +gboolean +hc_conn_watch (GIOChannel *channel, GIOCondition cond, gpointer data) +{ + HCConn *conn = data; + HCEvent event = HC_EVENT_READ; + if (conn->func) + conn->func (conn, event, conn->data); + return TRUE; +} + +HCConn * +hc_conn_new (int fd, HCClientFunc func, gpointer data) +{ + HCConn *conn; + conn = g_slice_new (HCConn); + conn->channel = g_io_channel_unix_new (fd); + conn->func = func; + conn->data = data; + conn->layer = conn->channel; + conn->read = hc_conn_channel_read; + conn->write = hc_conn_channel_write; + conn->close = hc_conn_channel_close; + conn->watch = g_io_add_watch (conn->channel, G_IO_IN, hc_conn_watch, conn); + return conn; +} + +ssize_t +hc_conn_read (HCConn *conn, char *buffer, size_t len) +{ + return conn->read (conn->layer, buffer, len); +} + +void +hc_conn_write (HCConn *conn, char *buffer, size_t len) +{ + /* TODO: Do buffering or something like that */ + conn->write (conn->layer, buffer, len); +} + +void +hc_conn_close (HCConn *conn) +{ + conn->close (conn->layer); + g_source_remove (conn->watch); + g_io_channel_unref (conn->channel); + g_slice_free (HCConn, conn); +} diff --git a/iochannel.h b/iochannel.h index daf0bc1..cac301d 100644 --- a/iochannel.h +++ b/iochannel.h @@ -27,4 +27,21 @@ typedef void (*HCServerFunc) (int, struct sockaddr*, socklen_t, gpointer); void hc_server_add_watch (int, HCServerFunc, gpointer); +typedef struct _hc_conn_t HCConn; + +typedef enum +{ + HC_EVENT_NULL = 0, + HC_EVENT_CONNECT, + HC_EVENT_READ, + HC_EVENT_CLOSE +} HCEvent; + +typedef void (*HCClientFunc) (HCConn *, HCEvent, gpointer); + +HCConn * hc_conn_new (int, HCClientFunc, gpointer); +ssize_t hc_conn_read (HCConn *, char *, size_t); +void hc_conn_write (HCConn *, char *, size_t); +void hc_conn_close (HCConn *); + #endif