Added connection structure to replace GNet.
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Thu, 2 Jul 2009 16:55:29 +0000 (13:55 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Thu, 2 Jul 2009 16:55:29 +0000 (13:55 -0300)
iochannel.c
iochannel.h

index a380a7c..18336a1 100644 (file)
@@ -18,6 +18,7 @@
 
 
 #include "iochannel.h"
+#include <unistd.h>
 
 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);
+}
index daf0bc1..cac301d 100644 (file)
@@ -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