Enlightenment CVS committal

Author  : rephorm
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_dbus


Modified Files:
        ecore_dbus_marshal.c ecore_dbus_message.c ecore_dbus_private.h 
        ecore_dbus_unmarshal.c ecore_dbus_utils.c 


Log Message:

support arrays (via a more general marshal function)
add utility function to get length of a "complete type" in the signature
this assumes the signature is valid. we should probably add a validator (and 
enfore the recursion limits in the spec)

===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_marshal.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- ecore_dbus_marshal.c        26 Jul 2006 20:43:28 -0000      1.3
+++ ecore_dbus_marshal.c        29 Sep 2006 02:04:06 -0000      1.4
@@ -93,7 +93,7 @@
    _ecore_dbus_message_padding(msg, 4);
 
    arr = _ecore_dbus_message_field_new(msg, ECORE_DBUS_DATA_TYPE_ARRAY);
-   /* for the array length value */
+   /* leave room for the array length value, gets filled in on array_end() */
    _ecore_dbus_message_append_uint32(msg, 0);
    arr->contained_type = contained_type;
    ecore_list_prepend(msg->recurse, arr);
@@ -113,6 +113,22 @@
    *(unsigned int *)ECORE_DBUS_MESSAGE_FIELD(arr)->buffer = arr->end - 
arr->start;
 }
 
+Ecore_DBus_Message_Field_Array *
+_ecore_dbus_message_marshal_array(Ecore_DBus_Message *msg, char 
*contained_type, Ecore_List *data)
+{
+   Ecore_DBus_Message_Field_Array *arr;
+   void *el;
+
+   printf("[ecore_dbus] marshal array %c\n", *contained_type);
+   arr = _ecore_dbus_message_marshal_array_begin(msg, *contained_type);
+   ecore_list_goto_first(data);
+   while ((el = ecore_list_next(data)))
+       _ecore_dbus_message_marshal(msg, contained_type, el);
+   _ecore_dbus_message_marshal_array_end(msg, arr);
+
+   return arr;
+}
+
 Ecore_DBus_Message_Field_Struct *
 _ecore_dbus_message_marshal_struct_begin(Ecore_DBus_Message *msg)
 {
@@ -146,22 +162,31 @@
    _ecore_dbus_message_append_byte(msg, type);
    _ecore_dbus_message_append_byte(msg, '\0');
 
-   switch (type)
+   f->value = _ecore_dbus_message_marshal(msg, &type, data);
+   ecore_list_remove_first(msg->recurse);
+   return f;
+}
+
+
+
+Ecore_DBus_Message_Field *
+_ecore_dbus_message_marshal(Ecore_DBus_Message *msg, char *type, void *data)
+{
+
+   switch (*type)
      {
      case ECORE_DBUS_DATA_TYPE_UINT32:
-       f->value = _ecore_dbus_message_marshal_uint32(msg, *(unsigned int 
*)data);
-       break;
+       return (Ecore_DBus_Message_Field 
*)_ecore_dbus_message_marshal_uint32(msg, *(unsigned int *)data);
      case ECORE_DBUS_DATA_TYPE_STRING:
-       f->value = _ecore_dbus_message_marshal_string(msg, (char *)data);
-       break;
+       return (Ecore_DBus_Message_Field 
*)_ecore_dbus_message_marshal_string(msg, (char *)data);
      case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
-       f->value = _ecore_dbus_message_marshal_object_path(msg, (char *)data);
-       break;
+       return (Ecore_DBus_Message_Field 
*)_ecore_dbus_message_marshal_object_path(msg, (char *)data);
      case ECORE_DBUS_DATA_TYPE_SIGNATURE:
-       f->value = _ecore_dbus_message_marshal_signature(msg, (char *)data);
-       break;
-     case ECORE_DBUS_DATA_TYPE_INVALID:
+       return (Ecore_DBus_Message_Field 
*)_ecore_dbus_message_marshal_signature(msg, (char *)data);
      case ECORE_DBUS_DATA_TYPE_BYTE:
+       return (Ecore_DBus_Message_Field 
*)_ecore_dbus_message_marshal_byte(msg, *(char *)data);
+     case ECORE_DBUS_DATA_TYPE_ARRAY:
+       return (Ecore_DBus_Message_Field 
*)_ecore_dbus_message_marshal_array(msg, type + 1, (Ecore_List *)data);  // we 
need to let the caller know how many fields were marshalled (e.g. how far to 
skip ahead in the type list)
      case ECORE_DBUS_DATA_TYPE_BOOLEAN:
      case ECORE_DBUS_DATA_TYPE_INT16:
      case ECORE_DBUS_DATA_TYPE_UINT16:
@@ -169,7 +194,6 @@
      case ECORE_DBUS_DATA_TYPE_INT64:
      case ECORE_DBUS_DATA_TYPE_UINT64:
      case ECORE_DBUS_DATA_TYPE_DOUBLE:
-     case ECORE_DBUS_DATA_TYPE_ARRAY:
      case ECORE_DBUS_DATA_TYPE_VARIANT:
      case ECORE_DBUS_DATA_TYPE_STRUCT:
      case ECORE_DBUS_DATA_TYPE_STRUCT_BEGIN:
@@ -177,12 +201,12 @@
      case ECORE_DBUS_DATA_TYPE_DICT_ENTRY:
      case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN:
      case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END:
-#if 0
+     case ECORE_DBUS_DATA_TYPE_INVALID:
+       printf("[ecore_dbus] unhandled data type %c\n", *type);
+       return NULL;
      default:
-#endif
-       printf("[ecore_dbus] unknown/unhandled data type %c\n", type);
-       break;
+       printf("[ecore_dbus] unknown data type %c\n", *type);
+       return NULL;
      }
-   ecore_list_remove_first(msg->recurse);
-   return f;
+
 }
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_message.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- ecore_dbus_message.c        27 Sep 2006 23:37:01 -0000      1.11
+++ ecore_dbus_message.c        29 Sep 2006 02:04:06 -0000      1.12
@@ -205,6 +205,9 @@
                case ECORE_DBUS_DATA_TYPE_SIGNATURE:
                    _ecore_dbus_message_marshal_signature(msg, (char 
*)va_arg(args, char *));
                   break;
+               case ECORE_DBUS_DATA_TYPE_ARRAY:
+                  _ecore_dbus_message_marshal_array(msg, signature + 1, 
(Ecore_List *)va_arg(args, Ecore_List *));
+                  break;
                case ECORE_DBUS_DATA_TYPE_INVALID:
                case ECORE_DBUS_DATA_TYPE_BOOLEAN:
                case ECORE_DBUS_DATA_TYPE_INT16:
@@ -213,7 +216,6 @@
                case ECORE_DBUS_DATA_TYPE_INT64:
                case ECORE_DBUS_DATA_TYPE_UINT64:
                case ECORE_DBUS_DATA_TYPE_DOUBLE:
-               case ECORE_DBUS_DATA_TYPE_ARRAY:
                case ECORE_DBUS_DATA_TYPE_VARIANT:
                case ECORE_DBUS_DATA_TYPE_STRUCT:
                case ECORE_DBUS_DATA_TYPE_STRUCT_BEGIN:
@@ -227,7 +229,7 @@
                   printf("[ecore_dbus] unknown/unhandled data type %c\n", 
*signature);
                   break;
               }
-            signature++;
+            signature += _ecore_dbus_complete_type_length_get(signature);
          }
      }
    /* set body length */
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_private.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- ecore_dbus_private.h        27 Sep 2006 23:37:01 -0000      1.15
+++ ecore_dbus_private.h        29 Sep 2006 02:04:06 -0000      1.16
@@ -237,8 +237,11 @@
 unsigned int  _ecore_dbus_message_read_uint32(Ecore_DBus_Message *msg);
 int           _ecore_dbus_alignment_get(Ecore_DBus_Data_Type type);
 void         *_ecore_dbus_message_field_value_get(Ecore_DBus_Message_Field *f);
+int           _ecore_dbus_complete_type_length_get(const char *signature);
 
 /* ecore_dbus_marshal.c */
+Ecore_DBus_Message_Field *
+_ecore_dbus_message_marshal(Ecore_DBus_Message *msg, char *type, void *data);
 Ecore_DBus_Message_Field_Byte   
*_ecore_dbus_message_marshal_byte(Ecore_DBus_Message *msg, unsigned char c);
 #if 0
 Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_boolean(unsigned char 
**buf, unsigned int *old_length, uint32_t i);
@@ -257,6 +260,7 @@
 Ecore_DBus_Message_Field_Signature   
*_ecore_dbus_message_marshal_signature(Ecore_DBus_Message *msg, char *str);
 Ecore_DBus_Message_Field_Array       
*_ecore_dbus_message_marshal_array_begin(Ecore_DBus_Message *msg, 
Ecore_DBus_Data_Type contained_type);
 void                                  
_ecore_dbus_message_marshal_array_end(Ecore_DBus_Message *msg, 
Ecore_DBus_Message_Field_Array *arr);
+Ecore_DBus_Message_Field_Array       
*_ecore_dbus_message_marshal_array(Ecore_DBus_Message *msg, char 
*contained_type, Ecore_List *data);
 Ecore_DBus_Message_Field_Struct      
*_ecore_dbus_message_marshal_struct_begin(Ecore_DBus_Message *msg);
 void                                  
_ecore_dbus_message_marshal_struct_end(Ecore_DBus_Message *msg, 
Ecore_DBus_Message_Field_Struct *s);
 Ecore_DBus_Message_Field_Variant     
*_ecore_dbus_message_marshal_variant(Ecore_DBus_Message *msg, 
Ecore_DBus_Data_Type type, void *data);
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- ecore_dbus_unmarshal.c      27 Sep 2006 00:00:59 -0000      1.7
+++ ecore_dbus_unmarshal.c      29 Sep 2006 02:04:06 -0000      1.8
@@ -387,7 +387,7 @@
    /* Parse header fields */
    if (!(arr = _ecore_dbus_message_unmarshal_array_begin(msg, 
ECORE_DBUS_DATA_TYPE_STRUCT, &size)))
      {
-       printf("Could not parse custom header.\n");
+       printf("Could not parse header fields.\n");
        goto error;
      }
    while (msg->length < arr->end)
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_utils.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ecore_dbus_utils.c  24 Sep 2006 07:24:52 -0000      1.5
+++ ecore_dbus_utils.c  29 Sep 2006 02:04:06 -0000      1.6
@@ -140,7 +140,7 @@
         case ECORE_DBUS_DATA_TYPE_DICT_ENTRY:
           return 8;
        default:
-          printf("Ecore_DBus: Alignment requested for invalid data type!\n");
+          printf("[ecore_dbus] Alignment requested for invalid data type 
(%c)", type);
           return 0;
      }
 }
@@ -203,3 +203,64 @@
    return NULL;
 }
 
+
+/**
+ * Returns the length of the complete type starting at signature.
+ * signature should be a pointer within a signature string.
+ *
+ * e.g
+ *   uia -> 1 "u"
+ *   aus -> 2 "au"
+ *   (aus)s -> 5 "(aus)"
+ */
+int
+_ecore_dbus_complete_type_length_get(const char *signature)
+{
+   int len = 0;
+   int depth = 0;
+
+   while (*signature)
+     {
+       len++;
+       switch (*signature)
+         {
+          case ECORE_DBUS_DATA_TYPE_BYTE:
+          case ECORE_DBUS_DATA_TYPE_BOOLEAN:
+          case ECORE_DBUS_DATA_TYPE_INT16:
+          case ECORE_DBUS_DATA_TYPE_UINT16:
+          case ECORE_DBUS_DATA_TYPE_INT32:
+          case ECORE_DBUS_DATA_TYPE_UINT32:
+          case ECORE_DBUS_DATA_TYPE_INT64:
+          case ECORE_DBUS_DATA_TYPE_UINT64:
+          case ECORE_DBUS_DATA_TYPE_DOUBLE:
+          case ECORE_DBUS_DATA_TYPE_STRING:
+          case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
+          case ECORE_DBUS_DATA_TYPE_SIGNATURE:
+          case ECORE_DBUS_DATA_TYPE_VARIANT:
+             /* these types are complete on their own */
+             if (!depth) return len;
+             break;
+          case ECORE_DBUS_DATA_TYPE_ARRAY:
+             /* this takes one complete type after it. */
+             break;
+          case ECORE_DBUS_DATA_TYPE_STRUCT_BEGIN:
+          case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN:
+             depth++;
+             break;
+          case ECORE_DBUS_DATA_TYPE_STRUCT_END:
+          case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END:
+             depth--;
+             if (!depth) return len;
+             break;
+          case ECORE_DBUS_DATA_TYPE_STRUCT:
+          case ECORE_DBUS_DATA_TYPE_DICT_ENTRY:
+          case ECORE_DBUS_DATA_TYPE_INVALID:
+             printf("[ecore_dbus] type '%c' not allowed in signature string", 
*signature);
+             break;
+          default:
+             printf("[ecore_dbus] unknown type '%c' not allowed in signature 
string", *signature);
+             break;
+         }
+       signature++;
+     }
+}



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to