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

Reply via email to