Hello all, 

If anyone has tried to write some IPC code they know that it can be
tedious to pack and unpack data.  Well, a while back I merged some code
from raster's evoak library/test app into ecore_ipc for handling data
packing/unpacking. 

Now I guess some of you guys might not be so clear on how to use it so I
converted most of the e_ipc in e17 to use these macros.  Now everyone
should be able to see what it is useful for.  

Also, There were some problems with the e_font stuff I submitted a while
ago so I have a few fixes for that in the patch. 

Everything should be !ROCK SOLID! now <fingers crossed>

btw, the ecore_ipc patch I just sent is required for one of the IPC
calls in here to work correctly.

Stafford
Index: e_font.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_font.c,v
retrieving revision 1.3
diff -u -r1.3 e_font.c
--- e_font.c	13 Apr 2005 06:03:49 -0000	1.3
+++ e_font.c	20 Apr 2005 15:38:07 -0000
@@ -8,17 +8,12 @@
  * - use e_path to search for available fonts
  */
 
-static Evas_List *_e_font_defaults = NULL;	/* MRU <E_Font_Default> */
-static Evas_List *_e_font_fallbacks = NULL;	/* <E_Font_Fallback> */
-
 static Evas_List *_e_font_font_dir_available_get (Evas_List * available_fonts, const char *font_dir);
 
 int
 e_font_init(void)
 {
-   /* just get the pointers into the config */
-   _e_font_defaults = e_config->font_defaults;
-   _e_font_fallbacks = e_config->font_fallbacks;
+   /* all init stuff is in e_config */
    return 1;
 }
 
@@ -38,7 +33,7 @@
    E_Font_Default *efd;
    
    /* setup edje fallback list */
-   next = _e_font_fallbacks;
+   next = e_config->font_fallbacks;
    if (next)
      {
 	eff = evas_list_data(next);
@@ -62,12 +57,10 @@
      edje_fontset_append_set(buf);
    
    /* setup edje text classes */
-   next = _e_font_defaults;
-   while (next)
+   for(next = e_config->font_defaults; next; next = evas_list_next(next))
      {
 	efd = evas_list_data(next);
 	edje_text_class_set(efd->text_class, efd->font, efd->size);
-	next = evas_list_next(next);
      }
 }
 
@@ -86,32 +79,30 @@
 void
 e_font_available_list_free(Evas_List * available)
 {
-   char *font_name;
-   Evas_List *l;
+   E_Font_Available *efa;
    
-   for (l = available; l; l = l->next)
+   while(available)
      {
-	font_name = evas_list_data(l);
-	available = evas_list_remove(available, l);
-	free(font_name);
+	efa = available->data;
+	available = evas_list_remove_list(available, available);
+	E_FREE(efa->name);
+	E_FREE(efa);	
      }
 }
 
 void
 e_font_fallback_clear(void)
 {
-   Evas_List *next;
+   E_Font_Fallback *eff;
    
-   next = _e_font_fallbacks;
-   while (next)
-     {
-	E_Font_Fallback *eff;
-	
-	eff = evas_list_data(next);
-	_e_font_fallbacks = evas_list_remove_list(_e_font_fallbacks, next);
+   while(e_config->font_fallbacks)
+     {	
+	eff = e_config->font_fallbacks->data;
+	e_config->font_fallbacks = evas_list_remove_list(
+					e_config->font_fallbacks, 
+					e_config->font_fallbacks);
 	E_FREE(eff->name);
 	E_FREE(eff);
-	next = evas_list_next(next);
     }
 }
 
@@ -124,7 +115,7 @@
    
    eff = E_NEW(E_Font_Fallback, 1);
    eff->name = strdup(font);
-   _e_font_fallbacks = evas_list_append(_e_font_fallbacks, eff);
+   e_config->font_fallbacks = evas_list_append(e_config->font_fallbacks, eff);
 }
 
 void
@@ -136,35 +127,34 @@
    
    eff = E_NEW(E_Font_Fallback, 1);
    eff->name = strdup(font);
-   _e_font_fallbacks = evas_list_prepend(_e_font_fallbacks, eff);
+   e_config->font_fallbacks = evas_list_prepend(e_config->font_fallbacks, eff);
 }
 
 void
 e_font_fallback_remove(const char *font)
 {
    Evas_List *next;
-   
-   next = _e_font_fallbacks;
-   while (next)
+
+   for(next = e_config->font_fallbacks; next; next = evas_list_next(next))
      {
 	E_Font_Fallback *eff;
 	
 	eff = evas_list_data(next);
 	if (!strcmp(eff->name, font))
 	  {
-	     _e_font_fallbacks = evas_list_remove_list(_e_font_fallbacks, next);
+	     e_config->font_fallbacks = evas_list_remove_list(
+					e_config->font_fallbacks, next);
 	     E_FREE(eff->name);
 	     E_FREE(eff);
 	     break;
 	  }
-	next = evas_list_next(next);
      }
 }
 
 Evas_List *
 e_font_fallback_list(void)
 {
-   return _e_font_fallbacks;
+   return e_config->font_fallbacks;
 }
 
 void
@@ -174,8 +164,7 @@
    Evas_List *next;
 
    /* search for the text class */
-   next = _e_font_defaults;
-   while (next)
+   for(next = e_config->font_defaults; next; next = evas_list_next(next))
      {
 	efd = evas_list_data(next);
 	if (!strcmp(efd->text_class, text_class))
@@ -184,11 +173,12 @@
 	     efd->font = strdup(font);
 	     efd->size = size;
 	     /* move to the front of the list */
-	     _e_font_defaults = evas_list_remove_list(_e_font_defaults, next);
-	     _e_font_defaults = evas_list_prepend(_e_font_defaults, efd);
+	     e_config->font_defaults = evas_list_remove_list(
+					e_config->font_defaults, next);
+	     e_config->font_defaults = evas_list_prepend(
+					e_config->font_defaults, efd);
 	     return;
 	  }
-	next = evas_list_next(next);
      }
 
    /* the text class doesnt exist */
@@ -197,7 +187,7 @@
    efd->font = strdup(font);
    efd->size = size;
    
-   _e_font_defaults = evas_list_prepend(_e_font_defaults, efd);
+   e_config->font_defaults = evas_list_prepend(e_config->font_defaults, efd);
 }
 
 /*
@@ -210,18 +200,18 @@
    Evas_List *next;
 
    /* search for the text class */
-   next = _e_font_defaults;
-   while (next)
+   for(next = e_config->font_defaults; next; next = evas_list_next(next))
      {
 	efd = evas_list_data(next);
 	if (!strcmp(efd->text_class, text_class))
 	  {
 	     /* move to the front of the list */
-	     _e_font_defaults = evas_list_remove_list(_e_font_defaults, next);
-	     _e_font_defaults = evas_list_prepend(_e_font_defaults, efd);
+	     e_config->font_defaults = evas_list_remove_list(
+					e_config->font_defaults, next);
+	     e_config->font_defaults = evas_list_prepend(
+					e_config->font_defaults, efd);
 	     return efd;
 	  }
-	next = evas_list_next(next);
      }
    return NULL;
 }
@@ -233,26 +223,25 @@
    Evas_List *next;
    
    /* search for the text class */
-   next = _e_font_defaults;
-   while (next)
+   for(next = e_config->font_defaults; next; next = evas_list_next(next))
      {
 	efd = evas_list_data(next);
 	if (!strcmp(efd->text_class, text_class))
 	  {
-	     _e_font_defaults = evas_list_remove_list(_e_font_defaults, next);
+	     e_config->font_defaults = evas_list_remove_list(
+					e_config->font_defaults, next);
 	     E_FREE(efd->text_class);
 	     E_FREE(efd->font);
 	     E_FREE(efd);
 	     return;
 	  }
-	next = evas_list_next(next);
     }
 }
 
 Evas_List *
 e_font_default_list(void)
 {
-   return _e_font_defaults;
+   return e_config->font_defaults;
 }
 
 static Evas_List *
@@ -271,19 +260,25 @@
 	/* read font alias lines */
 	while (fscanf(f, "%4090s %[^\n]\n", fname, fdef) == 2)
 	  {
+	     E_Font_Available *efa;
+	     
 	     /* skip comments */
 	     if ((fdef[0] == '!') || (fdef[0] == '#'))
 	       continue;
 	     
 	     /* skip duplicates */
-	     next = available_fonts;
-	     while (next)
+	     
+	     for (next = available_fonts; next; next = evas_list_next(next))
 	       {
-		  if (!strcmp((char *)evas_list_data(next), fname))
-		    continue;
-		  next = evas_list_next(next);
+	       	  efa = (E_Font_Available *)evas_list_data(next);
+	       
+		  if (!strcmp(efa->name, fname))
+		    continue;		  
 	       }
-	     available_fonts = evas_list_append(available_fonts, strdup(fname));
+	        
+	     efa = malloc(sizeof(E_Font_Available));
+	     efa->name = strdup(fname);
+	     available_fonts = evas_list_append(available_fonts, efa);
 	  }
 	fclose (f);
      }
Index: e_font.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_font.h,v
retrieving revision 1.1
diff -u -r1.1 e_font.h
--- e_font.h	2 Apr 2005 17:11:04 -0000	1.1
+++ e_font.h	20 Apr 2005 15:38:07 -0000
@@ -5,6 +5,7 @@
 
 typedef struct _E_Font_Default E_Font_Default;
 typedef struct _E_Font_Fallback E_Font_Fallback;
+typedef struct _E_Font_Fallback E_Font_Available;
 
 #else
 #ifndef E_FONT_H
@@ -14,7 +15,7 @@
 {
    char * text_class;
    char * font;
-   int	size;
+   int    size;
 };
 
 struct _E_Font_Fallback
@@ -22,6 +23,11 @@
    char * name;
 };
 
+struct _E_Font_Available
+{
+   char * name;
+};
+
 EAPI int		e_font_init(void);
 EAPI int		e_font_shutdown(void);
 EAPI void		e_font_apply(void);
Index: e_ipc.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_ipc.c,v
retrieving revision 1.12
diff -u -r1.12 e_ipc.c
--- e_ipc.c	13 Apr 2005 06:03:49 -0000	1.12
+++ e_ipc.c	20 Apr 2005 15:38:07 -0000
@@ -5,6 +5,15 @@
 static int _e_ipc_cb_client_del(void *data, int type, void *event);
 static int _e_ipc_cb_client_data(void *data, int type, void *event);
 static char *_e_ipc_path_str_get(char **paths, int *bytes);
+static char *_e_ipc_simple_str_dec(char *data, int bytes);
+static char **_e_ipc_multi_str_dec(char *data, int bytes, int str_count);
+
+/* encode functions, Should these be global? */
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_module_list_enc);
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_available_list_enc);
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_fallback_list_enc);
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_default_list_enc);
+ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_font_default_enc);
 
 /* local subsystem globals */
 static Ecore_Ipc_Server *_e_ipc_server  = NULL;
@@ -76,9 +85,8 @@
 	  {
 	     char *name;
 	     
-	     name = malloc(e->size + 1);
-	     name[e->size] = 0;
-	     memcpy(name, e->data, e->size);
+	     name = _e_ipc_simple_str_dec(e->data, e->size);
+	     
 	     if (!e_module_find(name))
 	       {
 		  e_module_new(name);
@@ -92,9 +100,8 @@
 	     char *name;
 	     E_Module *m;
 	     
-	     name = malloc(e->size + 1);
-	     name[e->size] = 0;
-	     memcpy(name, e->data, e->size);
+	     name = _e_ipc_simple_str_dec(e->data, e->size);
+	     
 	     if ((m = e_module_find(name)))
 	       {
 		  if (e_module_enabled_get(m))
@@ -109,9 +116,8 @@
 	     char *name;
 	     E_Module *m;
 	     
-	     name = malloc(e->size + 1);
-	     name[e->size] = 0;
-	     memcpy(name, e->data, e->size);
+	     name = _e_ipc_simple_str_dec(e->data, e->size);
+	     
 	     if ((m = e_module_find(name)))
 	       {
 		  if (!e_module_enabled_get(m))
@@ -121,13 +127,12 @@
 	  }
 	break;
       case E_IPC_OP_MODULE_DISABLE:
-	  {
+	  {      
 	     char *name;
 	     E_Module *m;
 	     
-	     name = malloc(e->size + 1);
-	     name[e->size] = 0;
-	     memcpy(name, e->data, e->size);
+	     name = _e_ipc_simple_str_dec(e->data, e->size);
+	     
 	     if ((m = e_module_find(name)))
 	       {
 		  if (e_module_enabled_get(m))
@@ -138,30 +143,15 @@
 	break;
       case E_IPC_OP_MODULE_LIST:
 	  {
-	     Evas_List *modules, *l;
+	     /* encode module list (str,8-bit) */
+	     Evas_List *modules;
+	     char * data;
 	     int bytes;
-	     E_Module *m;
-	     char *data, *p;
-		  
-	     bytes = 0;
-	     modules = e_module_list();
-	     for (l = modules; l; l = l->next)
-	       {
-		  m = l->data;
-		  bytes += strlen(m->name) + 1 + 1;
-	       }
-	     data = malloc(bytes);
-	     p = data;
-	     for (l = modules; l; l = l->next)
-	       {
-		  m = l->data;
-		  strcpy(p, m->name);
-		  p += strlen(m->name);
-		  *p = 0;
-		  p++;
-		  *p = e_module_enabled_get(m);
-		  p++;
-	       }
+
+             modules = e_module_list();
+	     data = _e_ipc_module_list_enc(modules, &bytes);
+	     
+	     /* send reply data */
 	     ecore_ipc_client_send(e->client,
 				   E_IPC_DOMAIN_REPLY,
 				   E_IPC_OP_MODULE_LIST_REPLY,
@@ -194,10 +184,9 @@
 	  {
 	     char *file;
 	     Evas_List *managers, *l;
+
+	     file = _e_ipc_simple_str_dec(e->data, e->size);
 	     
-	     file = malloc(e->size + 1);
-	     file[e->size] = 0;
-	     memcpy(file, e->data, e->size);
 	     E_FREE(e_config->desktop_default_background);
 	     e_config->desktop_default_background = file;
 	     
@@ -236,29 +225,13 @@
 	break;
       case E_IPC_OP_FONT_AVAILABLE_LIST:
 	  {
-	     Evas_List *fonts_available, *l;
+	     /* encode font available list (str) */
+	     Evas_List *fonts_available;
 	     int bytes;
-	     char *font_name, *data, *p;
+	     char *data;
 		  
-	     bytes = 0;
-	     fonts_available = e_font_available_list();
-	     printf("ipc font av: %d\n", fonts_available);
-	     for (l = fonts_available; l; l = l->next)
-	       {
-		  font_name = evas_list_data(l);
-		  bytes += strlen(font_name) + 1;
-	       }
-
-	     data = malloc(bytes);
-	     p = data;
-	     for (l = fonts_available; l; l = l->next)
-	       {
-		  font_name = evas_list_data(l);
-		  strcpy(p, font_name);
-		  p += strlen(font_name);
-		  *p = 0;
-		  p++;
-	       }
+	     fonts_available = e_font_available_list();	       
+	     data = _e_ipc_font_available_list_enc(fonts_available, &bytes);	       
 	     ecore_ipc_client_send(e->client,
 				   E_IPC_DOMAIN_REPLY,
 				   E_IPC_OP_FONT_AVAILABLE_LIST_REPLY,
@@ -282,9 +255,8 @@
       case E_IPC_OP_FONT_FALLBACK_APPEND:
 	  {
 	     char * font_name;
-	     font_name = malloc(e->size + 1);
-	     font_name[e->size] = 0;
-	     memcpy(font_name, e->data, e->size);
+	     
+	     font_name = _e_ipc_simple_str_dec(e->data, e->size);
 	     e_font_fallback_append(font_name);
 	     free(font_name);
 
@@ -294,9 +266,8 @@
       case E_IPC_OP_FONT_FALLBACK_PREPEND:
 	  {
 	     char * font_name;
-	     font_name = malloc(e->size + 1);
-	     font_name[e->size] = 0;
-	     memcpy(font_name, e->data, e->size);
+
+	     font_name = _e_ipc_simple_str_dec(e->data, e->size);	     
 	     e_font_fallback_prepend(font_name);
 	     free(font_name);	   
 		
@@ -305,28 +276,15 @@
 	break;
       case E_IPC_OP_FONT_FALLBACK_LIST:
 	  {
-	     Evas_List *fallbacks, *l;
+	  	
+	     /* encode font fallback list (str) */
+	     Evas_List *fallbacks;
 	     int bytes;
-	     E_Font_Fallback *eff;
-	     char *data, *p;
-		  
-	     bytes = 0;
+	     char *data;
+		 
 	     fallbacks = e_font_fallback_list();
-	     for (l = fallbacks; l; l = l->next)
-	       {
-		  eff = evas_list_data(l);
-		  bytes += strlen(eff->name) + 1;
-	       }
-	     data = malloc(bytes);
-	     p = data;
-	     for (l = fallbacks; l; l = l->next)
-	       {
-		  eff = evas_list_data(l);
-		  strcpy(p, eff->name);
-		  p += strlen(eff->name);
-		  *p = 0;
-		  p++;
-	       }
+
+	     data = _e_ipc_font_fallback_list_enc(fallbacks, &bytes);
 	     ecore_ipc_client_send(e->client,
 				   E_IPC_DOMAIN_REPLY,
 				   E_IPC_OP_FONT_FALLBACK_LIST_REPLY,
@@ -339,9 +297,8 @@
       case E_IPC_OP_FONT_FALLBACK_REMOVE:
 	  {
 	     char * font_name;
-	     font_name = malloc(e->size + 1);
-	     font_name[e->size] = 0;
-	     memcpy(font_name, e->data, e->size);
+
+	     font_name = _e_ipc_simple_str_dec(e->data, e->size);
 	     e_font_fallback_remove(font_name);
 	     free(font_name);	     
 
@@ -350,75 +307,30 @@
 	break;
       case E_IPC_OP_FONT_DEFAULT_SET:
 	  {
-	     char * p;
-	     char * font_name;
-	     char * text_class;
-	     int font_size;
-
+	     char ** argv;
+	     int i, argc;
 	     
-	     p = e->data;
+	     argc = 3;
+	     
+	     argv = _e_ipc_multi_str_dec(e->data, e->size, argc);
+	     e_font_default_set(argv[0], argv[1], atoi(argv[2]));
+	     free(argv);	     
 	     
-	     /* Make sure our data is packed for us <str>0<str>0 */
-	     if( p[e->size - 1] != 0) {
-		break;
-	     }
-
-	     text_class = strdup(p);
-
-	     p += strlen(text_class) + 1;
-	     font_name = strdup(p);
-	
-	     p += strlen(font_name) + 1;
-	     font_size = atoi(p);
-
-	     e_font_default_set(text_class, font_name, font_size);
-
-	     free(font_name);
-	     free(text_class);
-
 	     e_config_save_queue();
 	  }
 	break;
       case E_IPC_OP_FONT_DEFAULT_GET:
 	  {
-	     int bytes;
+	  
+	     /* encode font default struct (str,str,32-bits)(E_Font_Default) */	     
 	     E_Font_Default *efd;
-	     char *data, *p, *text_class;
-	     
-	     text_class = malloc(e->size + 1);
-	     text_class[e->size] = 0;
-	     memcpy(text_class, e->data, e->size);
-	     
-	     efd = e_font_default_get (text_class);
+	     char *data, *text_class;
+	     int bytes;
 	     
+	     text_class = _e_ipc_simple_str_dec(e->data, e->size);	     
+	     efd = e_font_default_get (text_class);	     
 	     free(text_class);
-		  
-	     bytes = 0;
-	     if (efd) {
-	         bytes += strlen(efd->text_class) + 1;
-	         bytes += strlen(efd->font) + 1;
-	         bytes++; /* efd->size */
-	     }
-	     
-	     data = malloc(bytes);
-	     p = data;
-	     
-	     if (efd) {
-	         strcpy(p, efd->text_class);
-                 p += strlen(efd->text_class);
-                 *p = 0;
-	         p++;
-	     
-	         strcpy(p, efd->font);
-	         p += strlen(efd->font);
-	         *p = 0;
-	         p++;
-		  
-                 /* FIXME: should this be packed like this (int to char) ? */
-	         *p = (char) efd->size;
-	         p++;
-	     }
-
+	     data = _e_ipc_font_default_enc(efd, &bytes);
 	     ecore_ipc_client_send(e->client,
 				   E_IPC_DOMAIN_REPLY,
 				   E_IPC_OP_FONT_DEFAULT_GET_REPLY,
@@ -430,9 +342,8 @@
       case E_IPC_OP_FONT_DEFAULT_REMOVE:
 	  {	  
 	     char * text_class;
-	     text_class = malloc(e->size + 1);
-	     text_class[e->size] = 0;
-	     memcpy(text_class, e->data, e->size);
+	     
+	     text_class = _e_ipc_simple_str_dec(e->data, e->size);
 	     e_font_default_remove(text_class);
 	     free(text_class);	   
 
@@ -441,37 +352,13 @@
 	break;
       case E_IPC_OP_FONT_DEFAULT_LIST:
 	  {
-	     Evas_List *defaults, *l;
+	     /* encode font default struct list (str,str,32-bits)(E_Font_Default) */
+	     Evas_List *defaults;
 	     int bytes;
-	     E_Font_Default *efd;
-	     char *data, *p;
+	     char *data;
 		  
-	     bytes = 0;
 	     defaults = e_font_default_list();
-	     for (l = defaults; l; l = l->next)
-	       {
-		  efd = l->data;
-		  bytes += strlen(efd->text_class) + 1;
-		  bytes += strlen(efd->font) + 1;
-		  bytes++; /* efd->size */
-	       }
-	     data = malloc(bytes);
-	     p = data;
-	     for (l =defaults; l; l = l->next)
-	       {
-		  efd = l->data;
-		  strcpy(p, efd->text_class);
-		  p += strlen(efd->text_class);
-		  *p = 0;
-		  p++;
-		  strcpy(p, efd->font);
-		  p += strlen(efd->font);
-		  *p = 0;
-		  p++;
-		  /* FIXME: should this be packed like this (int to char) ? */
-		  *p = (char) efd->size;
-		  p++;
-	       }
+	     data = _e_ipc_font_default_list_enc(defaults, &bytes);
 	     ecore_ipc_client_send(e->client,
 				   E_IPC_DOMAIN_REPLY,
 				   E_IPC_OP_FONT_DEFAULT_LIST_REPLY,
@@ -557,4 +444,115 @@
    return data;
 }
 
+/**
+ * Decode a simple string that was passed by an IPC client
+ *
+ * The returned string must be freed
+ */
+static char *
+_e_ipc_simple_str_dec(char *data, int bytes)
+{
+    char *str;
+    
+    str = malloc(bytes + 1);
+    str[bytes] = 0;
+    memcpy(str, data, bytes);
+    
+    return str;
+}
+
+/**
+ * Decode a list of strings and return an array, you need to pass
+ * the string count that you are expecting back.
+ *
+ * Strings are encoded <str>0<str>0...
+ *
+ * free up the array that you get back
+ */
+static char **
+_e_ipc_multi_str_dec(char *data, int bytes, int str_count)
+{
+    char ** str_array;
+    int i;
+ 
+    /* Make sure our data is packed for us <str>0<str>0 */
+    if( data[bytes - 1] != 0) {
+	return NULL;
+    }
+
+    str_array = malloc(sizeof(char *)*str_count);
+
+    for(i = 0; i < str_count; i++) 
+    {
+        str_array[i] = data;
+	data += strlen(str_array[i]) + 1;
+    }
+
+    return str_array;
+}
+
+
+/* list/struct encoding functions */
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_module_list_enc)
+{
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_START(E_Module);
+	ECORE_IPC_CNTS(name);
+	ECORE_IPC_CNT8();
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH();
+    	int l1;
+    	ECORE_IPC_SLEN(l1, name);
+    	ECORE_IPC_PUTS(name, l1);
+    	ECORE_IPC_PUT8(enabled);
+    ECORE_IPC_ENC_EVAS_LIST_FOOT();
+}
+
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_available_list_enc)
+{
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_START(E_Font_Available);
+	ECORE_IPC_CNTS(name);
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH();
+    	int l1;
+    	ECORE_IPC_SLEN(l1, name);
+    	ECORE_IPC_PUTS(name, l1);
+    ECORE_IPC_ENC_EVAS_LIST_FOOT();
+}
+
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_fallback_list_enc)
+{
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_START(E_Font_Fallback);
+	ECORE_IPC_CNTS(name);
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH();
+    	int l1;
+    	ECORE_IPC_SLEN(l1, name);
+    	ECORE_IPC_PUTS(name, l1);
+    ECORE_IPC_ENC_EVAS_LIST_FOOT();
+}
 
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_default_list_enc)
+{
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_START(E_Font_Default);
+	ECORE_IPC_CNTS(text_class);
+	ECORE_IPC_CNTS(font);
+	ECORE_IPC_CNT32();
+    ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH();
+    	int l1, l2;
+    	ECORE_IPC_SLEN(l1, text_class);
+    	ECORE_IPC_SLEN(l2, font);
+    	ECORE_IPC_PUTS(text_class, l1);
+    	ECORE_IPC_PUTS(font, l2);
+    	ECORE_IPC_PUT32(size);
+    ECORE_IPC_ENC_EVAS_LIST_FOOT();
+}
+
+ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_font_default_enc)
+{
+   int l1, l2;
+   ECORE_IPC_ENC_STRUCT_HEAD(E_Font_Default, 
+	ECORE_IPC_SLEN(l1, text_class) +
+	ECORE_IPC_SLEN(l2, font) +
+	4);	   	   
+   ECORE_IPC_PUTS(text_class, l1);
+   ECORE_IPC_PUTS(font, l2);
+   ECORE_IPC_PUT32(size);
+   ECORE_IPC_ENC_STRUCT_FOOT();
+}
Index: e_remote_main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_remote_main.c,v
retrieving revision 1.12
diff -u -r1.12 e_remote_main.c
--- e_remote_main.c	14 Apr 2005 09:09:22 -0000	1.12
+++ e_remote_main.c	20 Apr 2005 15:38:07 -0000
@@ -27,6 +27,12 @@
 
 static void _e_help(void);
 
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_module_list_dec);
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_font_available_list_dec);
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_font_fallback_list_dec);
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_font_default_list_dec);
+ECORE_IPC_DEC_STRUCT_PROTO(_e_ipc_font_default_dec);
+
 /* local subsystem globals */
 static Ecore_Ipc_Server *_e_ipc_server  = NULL;
 static const char *display_name = NULL;
@@ -316,33 +322,23 @@
       case E_IPC_OP_MODULE_LIST_REPLY:
 	if (e->data)
 	  {
-	     char *p;
+	     Evas_List *modules;
+	     E_Module *m;
 	     
-	     p = e->data;
-	     while (p < (char *)(e->data + e->size))
+	     modules = _e_ipc_module_list_dec(e->data, e->size);	     
+	     while(modules)
 	       {
-		  char *name;
-		  char  enabled;
-		  
-		  name = p;
-		  p += strlen(name);
-		  if (p < (char *)(e->data + e->size))
-		    {
-		       p++;
-		       if (p < (char *)(e->data + e->size))
-			 {
-			    enabled = *p;
-			    p++;
-			    printf("REPLY: MODULE NAME=\"%s\" ENABLED=%i\n",
-				   name, (int)enabled);
-			 }
-		    }
+	     	   m = modules->data;
+	     	   printf("REPLY: MODULE NAME=\"%s\" ENABLED=%i\n",
+				   	m->name, m->enabled);
+		   modules = evas_list_remove_list(modules, modules);
+		   E_FREE(m);
 	       }
 	  }
 	else
 	  printf("REPLY: MODULE NONE\n");
 	break;
-	case E_IPC_OP_MODULE_DIRS_LIST_REPLY:
+       case E_IPC_OP_MODULE_DIRS_LIST_REPLY:
 	if (e->data)
 	  {
 	     char *p;
@@ -366,7 +362,7 @@
       break;
       case E_IPC_OP_BG_DIRS_LIST_REPLY:
       if (e->data)
-	{
+	{	
 	   char *p;
  
 	   p = e->data;
@@ -383,21 +379,17 @@
       case E_IPC_OP_FONT_FALLBACK_LIST_REPLY:
 	if (e->data)
 	  {
-	     char *p;
+	     Evas_List *fallbacks;
+	     E_Font_Fallback *eff;
 	     
-	     p = e->data;
-	     while (p < (char *)(e->data + e->size))
-	       {
-		  char *name;
-		  
-		  name = p;
-		  p += strlen(name);
-		  if (p < (char *)(e->data + e->size))
-		    {
-			printf("REPLY: FALLBACK NAME=\"%s\"\n", name);
-		    }
-		  p++;
-	       }
+	     fallbacks = _e_ipc_font_fallback_list_dec(e->data, e->size);
+	     while(fallbacks)
+	        {
+	            eff = fallbacks->data;
+	            printf("REPLY: FALLBACK NAME=\"%s\"\n", eff->name);
+		    fallbacks = evas_list_remove_list(fallbacks, fallbacks);
+		    E_FREE(eff);
+	        }
 	  }
 	else
 	  printf("REPLY: FALLBACK NONE\n");
@@ -405,20 +397,17 @@
       case E_IPC_OP_FONT_AVAILABLE_LIST_REPLY:
         if (e->data)
           {
-             char *p;
-          
-             p = e->data;
-             while (p < (char *)(e->data + e->size))
-              	{
-              	  char *name;
-              	  name = p;
- 		  p += strlen(name);
-		  if (p < (char *)(e->data + e->size))
-		    {
-			printf("REPLY: AVAILABLE NAME=\"%s\"\n", name);
-		    }
-		  p++;             	    
-              	}
+             Evas_List *available;
+	     E_Font_Available *fa;
+	
+	     available = _e_ipc_font_available_list_dec(e->data, e->size);
+	     while(available)
+	        {
+	            fa = available->data;
+	            printf("REPLY: AVAILABLE NAME=\"%s\"\n", fa->name);
+	            available = evas_list_remove_list(available, available);
+		    E_FREE(fa);
+		}
           }
         else
           printf("REPLY: AVAILABLE NONE\n"); 
@@ -426,27 +415,10 @@
       case E_IPC_OP_FONT_DEFAULT_GET_REPLY:
         if (e->data)
           {
-             char *text_class, *name;
-             char *p;
-	     char size;
-	     
-	     p = e->data;
-		  
-	     text_class = p;
-	     p += strlen(text_class) + 1;
-	     if (p < (char *)(e->data + e->size))
-	       {
-		       name = p;
-		       p  += strlen(name) + 1;     
-		       if (p < (char *)(e->data + e->size))
-			 {
-			   	 size = *p;
-			    	 printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%i\n",
-				   text_class, name, (int)size);
-				 p++;
-			  
-			 }
-	       }
+             E_Font_Default efd;
+             _e_ipc_font_default_dec(e->data, e->size, &efd);
+             printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n",
+				   efd.text_class, efd.font, efd.size);
           }
         else
           printf("REPLY: DEFAULT NONE\n"); 
@@ -454,29 +426,18 @@
       case E_IPC_OP_FONT_DEFAULT_LIST_REPLY:
         if (e->data)
           {
-             char *text_class, *name;
-             char *p;
-	     char size;
-	     
-	     p = e->data;
-		
-	while (p < (char *)(e->data + e->size))
-	{  
-	     text_class = p;
-	     p += strlen(text_class) + 1;
-	     if (p < (char *)(e->data + e->size))
-	       {
-		       name = p;
-		       p += strlen(name) + 1;
-		       if (p < (char *)(e->data + e->size))
-			 {
-			   	 size = *p;
-			    	 printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%i\n",
-				   text_class, name, (int)size);
-				 p++;
-			 }
+             Evas_List *defaults;
+             E_Font_Default *efd;
+          
+             defaults = _e_ipc_font_default_list_dec(e->data, e->size);
+             while(defaults)
+               {
+             	  efd = defaults->data;
+             	  printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n",
+				   efd->text_class, efd->font, efd->size);  
+                  defaults = evas_list_remove_list(defaults, defaults);
+		  E_FREE(efd);
 	       }
-	  }
           }
         else
           printf("REPLY: DEFAULT NONE\n"); 
@@ -532,3 +493,49 @@
 	printf("  - %s\n", handler->desc);
      }
 }
+
+
+/* list/struct encoding functions */
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_module_list_dec)
+{
+    ECORE_IPC_DEC_EVAS_LIST_HEAD(E_Module);
+    ECORE_IPC_GETS(name);
+    ECORE_IPC_GET8(enabled);
+    ECORE_IPC_DEC_EVAS_LIST_FOOT();
+}
+
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_font_available_list_dec)
+{
+    ECORE_IPC_DEC_EVAS_LIST_HEAD(E_Font_Available);
+    ECORE_IPC_GETS(name);
+    ECORE_IPC_DEC_EVAS_LIST_FOOT();
+}
+
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_font_fallback_list_dec)
+{
+    ECORE_IPC_DEC_EVAS_LIST_HEAD(E_Font_Fallback);
+    ECORE_IPC_GETS(name);
+    ECORE_IPC_DEC_EVAS_LIST_FOOT();
+}
+
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_font_default_list_dec)
+{
+    ECORE_IPC_DEC_EVAS_LIST_HEAD(E_Font_Default);
+    ECORE_IPC_GETS(text_class);
+    ECORE_IPC_GETS(font);
+    ECORE_IPC_GET32(size);
+    ECORE_IPC_DEC_EVAS_LIST_FOOT();
+}
+
+ECORE_IPC_DEC_STRUCT_PROTO(_e_ipc_font_default_dec)
+{  
+   ECORE_IPC_DEC_STRUCT_HEAD_MIN(E_Font_Default,
+	       1 +
+	       1 +
+	       4);
+   ECORE_IPC_CHEKS();
+   ECORE_IPC_GETS(text_class);
+   ECORE_IPC_GETS(font);
+   ECORE_IPC_GET32(size);
+   ECORE_IPC_DEC_STRUCT_FOOT();
+}

Reply via email to