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