Enlightenment CVS committal
Author : raster
Project : e17
Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_con
Modified Files:
Tag: SPLIT
Ecore_Con.h ecore_con.c ecore_con_private.h
Log Message:
and now thsi subsystem generates events with recieved data in them, events
with new clients connected, events on server disconnects and client
disconnects.... :)
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/Attic/Ecore_Con.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- Ecore_Con.h 12 Mar 2003 23:53:34 -0000 1.1.2.1
+++ Ecore_Con.h 13 Mar 2003 05:32:22 -0000 1.1.2.2
@@ -13,27 +13,64 @@
{
ECORE_CON_LOCAL_USER,
ECORE_CON_LOCAL_SYSTEM,
- ECORE_CON_REMOTE_SYSTEM
+ ECORE_CON_REMOTE_SYSTEM,
} Ecore_Con_Type;
#endif
+
+ typedef struct _Ecore_Con_Event_Client_Add Ecore_Con_Event_Client_Add;
+ typedef struct _Ecore_Con_Event_Client_Del Ecore_Con_Event_Client_Del;
+ typedef struct _Ecore_Con_Event_Server_Del Ecore_Con_Event_Server_Del;
+ typedef struct _Ecore_Con_Event_Client_Data Ecore_Con_Event_Client_Data;
+ typedef struct _Ecore_Con_Event_Server_Data Ecore_Con_Event_Server_Data;
- int
- ecore_con_init(void);
- int
- ecore_con_shutdown(void);
- Ecore_Con_Server *
- ecore_con_server_add(Ecore_Con_Type type,
- char *name,
- int port,
- const void *data);
- Ecore_Con_Server *
- ecore_con_server_connect(Ecore_Con_Type type,
- char *name,
- int port,
- const void *data);
- int
- ecore_con_server_send(Ecore_Con_Server *svr, void *data, int size);
-
+ struct _Ecore_Con_Event_Client_Add
+ {
+ Ecore_Con_Client *client;
+ };
+
+ struct _Ecore_Con_Event_Client_Del
+ {
+ Ecore_Con_Client *client;
+ };
+
+ struct _Ecore_Con_Event_Server_Del
+ {
+ Ecore_Con_Server *server;
+ };
+
+ struct _Ecore_Con_Event_Client_Data
+ {
+ Ecore_Con_Client *client;
+ void *data;
+ int size;
+ };
+
+ struct _Ecore_Con_Event_Server_Data
+ {
+ Ecore_Con_Server *server;
+ void *data;
+ int size;
+ };
+
+ extern int ECORE_CON_EVENT_CLIENT_ADD;
+ extern int ECORE_CON_EVENT_CLIENT_DEL;
+ extern int ECORE_CON_EVENT_SERVER_DEL;
+ extern int ECORE_CON_EVENT_CLIENT_DATA;
+ extern int ECORE_CON_EVENT_SERVER_DATA;
+
+ int ecore_con_init(void);
+ int ecore_con_shutdown(void);
+
+ Ecore_Con_Server *ecore_con_server_add(Ecore_Con_Type type, char *name, int port,
const void *data);
+ Ecore_Con_Server *ecore_con_server_connect(Ecore_Con_Type type, char *name, int
port, const void *data);
+ void *ecore_con_server_del(Ecore_Con_Server *svr);
+ void *ecore_con_server_data_get(Ecore_Con_Server *svr);
+ int ecore_con_server_send(Ecore_Con_Server *svr, void *data, int
size);
+
+ int ecore_con_client_send(Ecore_Con_Client *cl, void *data, int
size);
+ Ecore_Con_Server *ecore_con_client_server_get(Ecore_Con_Client *cl);
+ void ecore_con_client_del(Ecore_Con_Client *cl);
+
#ifdef __cplusplus
}
#endif
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/Attic/ecore_con.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- ecore_con.c 12 Mar 2003 23:53:34 -0000 1.1.2.1
+++ ecore_con.c 13 Mar 2003 05:32:23 -0000 1.1.2.2
@@ -19,32 +19,67 @@
static int _ecore_con_cl_handler(Ecore_Fd_Handler *fd_handler, void *data);
static int _ecore_con_svr_cl_handler(Ecore_Fd_Handler *fd_handler, void *data);
static void _ecore_con_server_flush(Ecore_Con_Server *svr);
-
-static int ecore_event_con_type = 0;
+static void _ecore_con_client_flush(Ecore_Con_Client *cl);
+static void _ecore_con_event_client_add_free(void *ev, void *data);
+static void _ecore_con_event_client_del_free(void *ev, void *data);
+static void _ecore_con_event_server_del_free(void *ev, void *data);
+static void _ecore_con_event_client_data_free(void *ev, void *data);
+static void _ecore_con_event_server_data_free(void *ev, void *data);
+
+int ECORE_CON_EVENT_CLIENT_ADD = 0;
+int ECORE_CON_EVENT_CLIENT_DEL = 0;
+int ECORE_CON_EVENT_SERVER_DEL = 0;
+int ECORE_CON_EVENT_CLIENT_DATA = 0;
+int ECORE_CON_EVENT_SERVER_DATA = 0;
static Ecore_Con_Server *servers = NULL;
+static int init_count = 0;
#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct
sockaddr_un *)NULL)->sun_path))
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
int
ecore_con_init(void)
{
+ init_count++;
+ if (!ECORE_CON_EVENT_CLIENT_ADD)
+ {
+ ECORE_CON_EVENT_CLIENT_ADD = ecore_event_type_new();
+ ECORE_CON_EVENT_CLIENT_DEL = ecore_event_type_new();
+ ECORE_CON_EVENT_SERVER_DEL = ecore_event_type_new();
+ ECORE_CON_EVENT_CLIENT_DATA = ecore_event_type_new();
+ ECORE_CON_EVENT_SERVER_DATA = ecore_event_type_new();
+ }
return 1;
}
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
int
ecore_con_shutdown(void)
{
- while (servers) _ecore_con_server_free(servers);
+ if (init_count > 0)
+ {
+ init_count--;
+ if (init_count > 0) return init_count;
+ while (servers) _ecore_con_server_free(servers);
+ }
return 0;
}
/**
- * Add.
- * @param data The data
- * @return A con handle
- *
- * Blah blah.
+ * To be documented.
+ *
+ * FIXME: To be fixed.
* <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
*/
Ecore_Con_Server *
@@ -127,6 +162,12 @@
return NULL;
}
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
Ecore_Con_Server *
ecore_con_server_connect(Ecore_Con_Type type,
char *name,
@@ -193,9 +234,44 @@
return NULL;
}
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
+void *
+ecore_con_server_del(Ecore_Con_Server *svr)
+{
+ void *data;
+
+ data = svr->data;
+ _ecore_con_server_free(svr);
+ return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
+void *
+ecore_con_server_data_get(Ecore_Con_Server *svr)
+{
+ return svr->data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
int
ecore_con_server_send(Ecore_Con_Server *svr, void *data, int size)
{
+ if (svr->dead) return 1;
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
if (svr->buf)
{
@@ -214,9 +290,66 @@
svr->buf_size = size;
memcpy(svr->buf, data, size);
}
+ _ecore_con_server_flush(svr);
+ return 1;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
+int
+ecore_con_client_send(Ecore_Con_Client *cl, void *data, int size)
+{
+ if (cl->dead) return 0;
+ ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
+ if (cl->buf)
+ {
+ unsigned char *newbuf;
+
+ newbuf = realloc(cl->buf, cl->buf_size + size);
+ if (newbuf) cl->buf = newbuf;
+ else return 0;
+ memcpy(cl->buf + cl->buf_size, data, size);
+ cl->buf_size += size;
+ }
+ else
+ {
+ cl->buf = malloc(size);
+ if (!cl->buf) return 0;
+ cl->buf_size = size;
+ memcpy(cl->buf, data, size);
+ }
+ _ecore_con_client_flush(cl);
return 1;
}
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
+Ecore_Con_Server *
+ecore_con_client_server_get(Ecore_Con_Client *cl)
+{
+ return cl->server;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ * <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+ */
+void
+ecore_con_client_del(Ecore_Con_Client *cl)
+{
+ _ecore_con_client_free(cl);
+}
+
static void
_ecore_con_server_free(Ecore_Con_Server *svr)
{
@@ -248,6 +381,7 @@
size_t size_in;
svr = data;
+ if (svr->dead) return 1;
/* a new client */
size_in = sizeof(struct sockaddr_in);
new_fd = accept(svr->fd, (struct sockaddr *)&incoming, &size_in);
@@ -270,8 +404,17 @@
_ecore_con_svr_cl_handler, cl,
NULL, NULL);
svr->clients = _ecore_list_append(svr->clients, cl);
- /* generate new client event */
- printf("new client fd %i for %s\n", cl->fd, svr->name);
+ {
+ Ecore_Con_Event_Client_Add *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Client_Add));
+ if (e)
+ {
+ e->client = cl;
+ ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, e,
+ _ecore_con_event_client_add_free, NULL);
+ }
+ }
}
return 1;
}
@@ -280,50 +423,131 @@
_ecore_con_cl_handler(Ecore_Fd_Handler *fd_handler, void *data)
{
Ecore_Con_Server *svr;
- char buf[4096];
svr = data;
- printf("_ecore_con_cl_handler ALIVE!\n");
+ if (svr->dead) return 1;
if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
{
- printf("client reading data from server!\n");
- read(svr->fd, buf, 4096);
+ unsigned char *inbuf = NULL;
+ int inbuf_num = 0;
+
+ for (;;)
+ {
+ char buf[65536];
+ int num;
+
+ num = read(svr->fd, buf, 65536);
+ if (num < 1)
+ {
+ if (inbuf)
+ {
+ Ecore_Con_Event_Server_Data *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Server_Data));
+ if (e)
+ {
+ e->server = svr;
+ e->data = inbuf;
+ e->size = inbuf_num;
+ ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
+ _ecore_con_event_server_data_free, NULL);
+ }
+ }
+ if ((errno == EIO) || (errno == EBADF) ||
+ (errno == EPIPE) || (errno == EINVAL) ||
+ (errno == ENOSPC))
+ {
+ /* we lost our server! */
+ Ecore_Con_Event_Server_Del *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
+ if (e)
+ {
+ e->server = svr;
+ ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
+ _ecore_con_event_server_del_free, NULL);
+ }
+ ecore_main_fd_handler_active_set(svr->fd_handler,
ECORE_FD_READ);
+ svr->dead = 1;
+ }
+ break;
+ }
+ else
+ {
+ inbuf = realloc(inbuf, inbuf_num + num);
+ memcpy(inbuf + inbuf_num, buf, num);
+ inbuf_num += num;
+ }
+ }
}
else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
- {
- printf("client fd to server available for write... write data!\n");
- _ecore_con_server_flush(svr);
- }
+ _ecore_con_server_flush(svr);
return 1;
}
static int
_ecore_con_svr_cl_handler(Ecore_Fd_Handler *fd_handler, void *data)
{
- Ecore_Con_Server *svr;
- char buf[65536];
- int num;
+ Ecore_Con_Client *cl;
- svr = data;
- printf("_ecore_con_svr_cl_handler ALIVE!\n");
- for (;;)
+ cl = data;
+ if (cl->dead) return 1;
+ if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
{
- num = read(svr->fd, buf, 65536);
- printf("%i ", num);
- if (num < 1)
+ unsigned char *inbuf = NULL;
+ int inbuf_num = 0;
+
+ for (;;)
{
- if ((errno == EIO) ||
- (errno == EBADF) ||
- (errno == EPIPE) ||
- (errno == EINVAL) ||
- (errno == ENOSPC))
+ char buf[65536];
+ int num;
+
+ num = read(cl->fd, buf, 65536);
+ if (num < 1)
+ {
+ if (inbuf)
+ {
+ Ecore_Con_Event_Client_Data *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Client_Data));
+ if (e)
+ {
+ e->client = cl;
+ e->data = inbuf;
+ e->size = inbuf_num;
+ ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
+ _ecore_con_event_client_data_free, NULL);
+ }
+ }
+ if ((errno == EIO) || (errno == EBADF) ||
+ (errno == EPIPE) || (errno == EINVAL) ||
+ (errno == ENOSPC))
+ {
+ /* we lost our client! */
+ Ecore_Con_Event_Client_Del *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
+ if (e)
+ {
+ e->client = cl;
+ ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
+ _ecore_con_event_client_del_free, NULL);
+ }
+ ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+ cl->dead = 1;
+ }
+ break;
+ }
+ else
{
- /* we lost our client! */
+ inbuf = realloc(inbuf, inbuf_num + num);
+ memcpy(inbuf + inbuf_num, buf, num);
+ inbuf_num += num;
}
- break;
}
}
- printf(" end reading!\n");
+ else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
+ _ecore_con_client_flush(cl);
return 1;
}
@@ -337,27 +561,117 @@
count = write(svr->fd, svr->buf + svr->buf_offset, num);
if (count < 1)
{
- if ((errno == EIO) ||
- (errno == EBADF) ||
- (errno == EPIPE) ||
- (errno == EINVAL) ||
- (errno == ENOSPC))
+ if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) ||
+ (errno == EINVAL) || (errno == ENOSPC))
{
- /* we lost our client! */
- printf("error flushing data!\n");
+ /* we lost our server! */
+ Ecore_Con_Event_Server_Del *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
+ if (e)
+ {
+ e->server = svr;
+ ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
+ _ecore_con_event_server_del_free, NULL);
+ }
+ ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+ svr->dead = 1;
}
- /* should generate error event here */
return;
}
svr->buf_offset += count;
- printf("wrote %i bytes!\n", count);
if (svr->buf_offset >= svr->buf_size)
{
svr->buf_size = 0;
svr->buf_offset = 0;
free(svr->buf);
svr->buf = NULL;
- printf("buffer fully flushed. clear!\n");
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
}
+}
+
+static void
+_ecore_con_client_flush(Ecore_Con_Client *cl)
+{
+ int count, num;
+
+ if (!cl->buf) return;
+ num = cl->buf_size - cl->buf_offset;
+ count = write(cl->fd, cl->buf + cl->buf_offset, num);
+ if (count < 1)
+ {
+ if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) ||
+ (errno == EINVAL) || (errno == ENOSPC))
+ {
+ /* we lost our client! */
+ Ecore_Con_Event_Client_Del *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
+ if (e)
+ {
+ e->client = cl;
+ ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
+ _ecore_con_event_client_del_free, NULL);
+ }
+ ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+ cl->dead = 1;
+ }
+ return;
+ }
+ cl->buf_offset += count;
+ if (cl->buf_offset >= cl->buf_size)
+ {
+ cl->buf_size = 0;
+ cl->buf_offset = 0;
+ free(cl->buf);
+ cl->buf = NULL;
+ ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+ }
+}
+
+static void
+_ecore_con_event_client_add_free(void *ev, void *data)
+{
+ Ecore_Con_Event_Client_Add *e;
+
+ e = ev;
+ free(e);
+}
+
+static void
+_ecore_con_event_client_del_free(void *ev, void *data)
+{
+ Ecore_Con_Event_Client_Del *e;
+
+ e = ev;
+ free(e);
+}
+
+static void
+_ecore_con_event_server_del_free(void *ev, void *data)
+{
+ Ecore_Con_Event_Server_Del *e;
+
+ e = ev;
+ free(e);
+}
+
+static void
+_ecore_con_event_client_data_free(void *ev, void *data)
+{
+ Ecore_Con_Event_Client_Data *e;
+
+ e = ev;
+ if (e->data) free(e->data);
+ free(e);
+}
+
+static void
+_ecore_con_event_server_data_free(void *ev, void *data)
+{
+ Ecore_Con_Event_Server_Data *e;
+
+ e = ev;
+ if (e->data) free(e->data);
+ free(e);
}
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/Attic/ecore_con_private.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- ecore_con_private.h 12 Mar 2003 23:53:34 -0000 1.1.2.1
+++ ecore_con_private.h 13 Mar 2003 05:32:23 -0000 1.1.2.2
@@ -23,6 +23,7 @@
int buf_size;
int buf_offset;
unsigned char *buf;
+ char dead : 1;
};
struct _Ecore_Con_Server
@@ -36,11 +37,12 @@
char *path;
void *data;
Ecore_Fd_Handler *fd_handler;
- char created : 1;
Ecore_Con_Client *clients;
int buf_size;
int buf_offset;
unsigned char *buf;
+ char dead : 1;
+ char created : 1;
};
#endif
-------------------------------------------------------
This SF.net email is sponsored by:Crypto Challenge is now open!
Get cracking and register here for some mind boggling fun and
the chance of winning an Apple iPod:
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0031en
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs