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