From: Enlightenment S. <no-...@en...> - 2012-10-26 18:19:59
|
Log: edbus: Parse Eina_Value to edbus_message Patch by: Jos?\195?\169 Roberto de Souza <zeh...@pr...> Author: lucas Date: 2012-10-26 11:19:52 -0700 (Fri, 26 Oct 2012) New Revision: 78548 Trac: http://trac.enlightenment.org/e/changeset/78548 Added: trunk/edbus/src/lib/edbus_message_from_eina_value.c trunk/edbus/src/lib/edbus_message_from_eina_value.h Modified: trunk/edbus/Makefile.am trunk/edbus/src/examples/complex_types.c trunk/edbus/src/examples/complex_types_server.c trunk/edbus/src/lib/EDBus.h trunk/edbus/src/lib/edbus_message_to_eina_value.c trunk/edbus/src/lib/edbus_message_to_eina_value.h trunk/edbus/src/lib/edbus_proxy.c Modified: trunk/edbus/Makefile.am =================================================================== --- trunk/edbus/Makefile.am 2012-10-26 18:19:46 UTC (rev 78547) +++ trunk/edbus/Makefile.am 2012-10-26 18:19:52 UTC (rev 78548) @@ -80,7 +80,8 @@ src/lib/edbus_service.c \ src/lib/edbus_signal_handler.c \ src/lib/edbus_message_helper.c \ - src/lib/edbus_message_to_eina_value.c + src/lib/edbus_message_to_eina_value.c \ + src/lib/edbus_message_from_eina_value.c if EFL_BUILD_EXAMPLES noinst_PROGRAMS = \ Modified: trunk/edbus/src/examples/complex_types.c =================================================================== --- trunk/edbus/src/examples/complex_types.c 2012-10-26 18:19:46 UTC (rev 78547) +++ trunk/edbus/src/examples/complex_types.c 2012-10-26 18:19:52 UTC (rev 78548) @@ -28,6 +28,12 @@ printf("Read cache: %s | %d\n", txt, num); + v = edbus_proxy_property_local_get(proxy, "st"); + eina_value_struct_get(v, "arg0", &txt); + printf("Read cache: [st] %s | ", txt); + eina_value_struct_get(v, "arg1", &txt); + printf("%s\n", txt); + return EINA_FALSE; } @@ -218,6 +224,14 @@ eina_value_get(value, &num); printf("[%s] = %d\n", name, num); } + else if (!strcmp(name, "st")) + { + const char *txt; + eina_value_struct_get(value, "arg0", &txt); + printf("[%s] %s | ", name, txt); + eina_value_struct_get(value, "arg1", &txt); + printf("%s\n", txt); + } } int Modified: trunk/edbus/src/examples/complex_types_server.c =================================================================== --- trunk/edbus/src/examples/complex_types_server.c 2012-10-26 18:19:46 UTC (rev 78547) +++ trunk/edbus/src/examples/complex_types_server.c 2012-10-26 18:19:52 UTC (rev 78548) @@ -348,7 +348,7 @@ { EDBus_Service_Interface *iface = data; EDBus_Message *sig = edbus_service_signal_new(iface, 0); - EDBus_Message_Iter *main_iter, *array, *entry, *var, *invalidate; + EDBus_Message_Iter *main_iter, *array, *entry, *var, *invalidate, *st; main_iter = edbus_message_iter_get(sig); if (!edbus_message_iter_arguments_set(main_iter, "sa{sv}", IFACE, &array)) @@ -371,6 +371,15 @@ edbus_message_iter_container_close(entry, var); edbus_message_iter_container_close(array, entry); + edbus_message_iter_arguments_set(array, "{sv}", &entry); + edbus_message_iter_arguments_set(entry, "s", "st"); + var = edbus_message_iter_container_new(entry, 'v', "(ss)"); + edbus_message_iter_arguments_set(var, "(ss)", &st); + edbus_message_iter_arguments_set(st, "ss", "string1", "string2"); + edbus_message_iter_container_close(var, st); + edbus_message_iter_container_close(entry, var); + edbus_message_iter_container_close(array, entry); + edbus_message_iter_container_close(main_iter, array); edbus_message_iter_arguments_set(main_iter, "as", &invalidate); Modified: trunk/edbus/src/lib/EDBus.h =================================================================== --- trunk/edbus/src/lib/EDBus.h 2012-10-26 18:19:46 UTC (rev 78547) +++ trunk/edbus/src/lib/EDBus.h 2012-10-26 18:19:52 UTC (rev 78548) @@ -135,6 +135,7 @@ #include "edbus_service.h" #include "edbus_message_helper.h" #include "edbus_message_to_eina_value.h" +#include "edbus_message_from_eina_value.h" #ifdef __cplusplus } Modified: trunk/edbus/src/lib/edbus_message_to_eina_value.c =================================================================== --- trunk/edbus/src/lib/edbus_message_to_eina_value.c 2012-10-26 18:19:46 UTC (rev 78547) +++ trunk/edbus/src/lib/edbus_message_to_eina_value.c 2012-10-26 18:19:52 UTC (rev 78548) @@ -2,7 +2,6 @@ #include "edbus_private_types.h" static void _message_iter_basic_array_to_eina_value(char type, Eina_Value *value, EDBus_Message_Iter *iter); -static void _eina_value_struct_free(Eina_Value *value, Eina_Array *array); static const Eina_Value_Type * _dbus_type_to_eina_value_type(char type) @@ -216,6 +215,48 @@ #define ARG "arg%d" +typedef struct _EDBus_Struct_Desc +{ + Eina_Value_Struct_Desc base; + int refcount; +} EDBus_Struct_Desc; + +static void * +_ops_malloc(const Eina_Value_Struct_Operations *ops, const Eina_Value_Struct_Desc *desc) +{ + EDBus_Struct_Desc *edesc = (EDBus_Struct_Desc*)desc; + edesc->refcount++; + DBG("%p refcount=%d", edesc, edesc->refcount); + return malloc(desc->size); +} + +static void +_ops_free(const Eina_Value_Struct_Operations *ops, const Eina_Value_Struct_Desc *desc, void *memory) +{ + EDBus_Struct_Desc *edesc = (EDBus_Struct_Desc*) desc; + edesc->refcount--; + free(memory); + DBG("%p refcount=%d", edesc, edesc->refcount); + if (edesc->refcount <= 0) + { + unsigned i; + for (i = 0; i < edesc->base.member_count; i++) + free((char *)edesc->base.members[i].name); + free((Eina_Value_Struct_Member *)edesc->base.members); + free(edesc); + } +} + +static Eina_Value_Struct_Operations operations = +{ + EINA_VALUE_STRUCT_OPERATIONS_VERSION, + _ops_malloc, + _ops_free, + NULL, + NULL, + NULL +}; + Eina_Value * _message_iter_struct_to_eina_value(EDBus_Message_Iter *iter) { @@ -225,13 +266,13 @@ unsigned int offset = 0, z; static char name[7];//arg000 + \0 Eina_Value_Struct_Member *members; - Eina_Value_Struct_Desc *st_desc; + EDBus_Struct_Desc *st_desc; Eina_Array *st_values = eina_array_new(1); DBG("begin struct"); - st_desc = calloc(1, sizeof(Eina_Value_Struct_Desc)); - st_desc->version = EINA_VALUE_STRUCT_DESC_VERSION; - st_desc->ops = NULL; + st_desc = calloc(1, sizeof(EDBus_Struct_Desc)); + st_desc->base.version = EINA_VALUE_STRUCT_DESC_VERSION; + st_desc->base.ops = &operations; //create member list z = 0; @@ -364,10 +405,10 @@ } //setup - st_desc->members = members; - st_desc->member_count = eina_array_count(st_members); - st_desc->size = offset; - value_st = eina_value_struct_new(st_desc); + st_desc->base.members = members; + st_desc->base.member_count = eina_array_count(st_members); + st_desc->base.size = offset; + value_st = eina_value_struct_new((Eina_Value_Struct_Desc *)st_desc); eina_array_free(st_members); //filling with data @@ -392,92 +433,3 @@ EINA_SAFETY_ON_NULL_RETURN_VAL(iter, NULL); return _message_iter_struct_to_eina_value(iter); } - -static void -_eina_value_array_free(Eina_Value *value, Eina_Array *array) -{ - Eina_Value_Array value_array; - unsigned i; - - eina_value_pget(value, &value_array); - if (value_array.subtype == EINA_VALUE_TYPE_STRUCT) - { - for (i = 0; i < eina_value_array_count(value); i++) - { - Eina_Value st; - eina_value_array_value_get(value, i, &st); - _eina_value_struct_free(&st, array); - eina_value_flush(&st); - } - } - else if (value_array.subtype == EINA_VALUE_TYPE_ARRAY) - { - for (i = 0; i < eina_value_array_count(value); i++) - { - Eina_Value inner_array; - eina_value_array_value_get(value, i, &inner_array); - _eina_value_array_free(&inner_array, array); - eina_value_flush(&inner_array); - } - } -} -static void -_eina_value_struct_free(Eina_Value *value, Eina_Array *array) -{ - Eina_Value_Struct st; - unsigned i; - static char name[7]; - - DBG("value %p", value); - EINA_SAFETY_ON_FALSE_RETURN(eina_value_pget(value, &st)); - - for (i = 0; i < st.desc->member_count; i++) - { - DBG("arg%d of %p", i, value); - if (st.desc->members[i].type == EINA_VALUE_TYPE_STRUCT) - { - Eina_Value sub; - sprintf(name, ARG, i); - eina_value_struct_value_get(value, name, &sub); - _eina_value_struct_free(&sub, array); - eina_value_flush(&sub); - } - else if (st.desc->members[i].type == EINA_VALUE_TYPE_ARRAY) - { - Eina_Value sub; - sprintf(name, ARG, i); - eina_value_struct_value_get(value, name, &sub); - _eina_value_array_free(&sub, array); - eina_value_flush(&sub); - } - } - eina_array_push(array, st.desc); - DBG("end value %p", value); -} - -EAPI void -edbus_message_to_eina_value_free(Eina_Value *value) -{ - Eina_Array *descriptions; - Eina_Value_Struct_Desc *st_desc; - - EINA_SAFETY_ON_NULL_RETURN(value); - EINA_SAFETY_ON_FALSE_RETURN(eina_value_type_get(value) == EINA_VALUE_TYPE_STRUCT); - - descriptions = eina_array_new(1); - _eina_value_struct_free(value, descriptions); - eina_value_free(value); - - while ((st_desc = eina_array_pop(descriptions))) - { - unsigned i; - for (i = 0; i < st_desc->member_count; i++) - { - char *name = (char *)st_desc->members[i].name; - free(name); - } - free((Eina_Value_Struct_Member *)st_desc->members); - free(st_desc); - } - eina_array_free(descriptions); -} Modified: trunk/edbus/src/lib/edbus_message_to_eina_value.h =================================================================== --- trunk/edbus/src/lib/edbus_message_to_eina_value.h 2012-10-26 18:19:46 UTC (rev 78547) +++ trunk/edbus/src/lib/edbus_message_to_eina_value.h 2012-10-26 18:19:52 UTC (rev 78548) @@ -1,3 +1 @@ -EAPI void edbus_message_to_eina_value_free(Eina_Value *value); - EAPI Eina_Value *edbus_message_to_eina_value(const EDBus_Message *msg); Modified: trunk/edbus/src/lib/edbus_proxy.c =================================================================== --- trunk/edbus/src/lib/edbus_proxy.c 2012-10-26 18:19:46 UTC (rev 78547) +++ trunk/edbus/src/lib/edbus_proxy.c 2012-10-26 18:19:52 UTC (rev 78548) @@ -303,9 +303,7 @@ event.value = value; _edbus_proxy_event_callback_call(proxy, EDBUS_PROXY_EVENT_PROPERTY_CHANGED, &event); - - edbus_message_to_eina_value_free(st_value); - //TODO if value have any STRUCT at this point it will not be accessible + eina_value_free(st_value); eina_value_flush(&stack_value); } @@ -707,7 +705,7 @@ eina_hash_add(proxy->props, skey, value); } - edbus_message_to_eina_value_free(st_value); + eina_value_free(st_value); eina_value_flush(&stack_value); } |