1 #include "eldbus_private.h"
2 #include "eldbus_private_types.h"
4 static void _message_iter_basic_array_to_eina_value(char type, Eina_Value *value, Eldbus_Message_Iter *iter);
6 static const Eina_Value_Type *
7 _dbus_type_to_eina_value_type(char type)
13 return EINA_VALUE_TYPE_INT;
17 return EINA_VALUE_TYPE_STRING;
20 return EINA_VALUE_TYPE_UCHAR;
22 return EINA_VALUE_TYPE_SHORT;
24 return EINA_VALUE_TYPE_USHORT;
26 return EINA_VALUE_TYPE_UINT;
28 return EINA_VALUE_TYPE_INT64;
30 return EINA_VALUE_TYPE_UINT64;
32 return EINA_VALUE_TYPE_DOUBLE;
34 return EINA_VALUE_TYPE_ARRAY;
40 return EINA_VALUE_TYPE_STRUCT;
42 ERR("Unknown type %c", type);
55 return(sizeof(int32_t));
59 return(sizeof(char *));
62 return(sizeof(unsigned char));
65 return(sizeof(int16_t));
68 return(sizeof(int64_t));
70 return(sizeof(double));
72 return(sizeof(Eina_Value_Array));
78 return(sizeof(Eina_Value_Struct));
80 ERR("Unknown type %c", type);
86 _type_offset(char type, unsigned base)
88 unsigned size, padding;
89 size = _type_size(type);
92 padding = abs(base - size);
93 return base + padding;
97 _message_iter_array_to_eina_value(Eldbus_Message_Iter *iter)
99 Eina_Value *array_value;
102 sig = eldbus_message_iter_signature_get(iter);
103 DBG("array of %s", sig);
104 array_value = eina_value_array_new(_dbus_type_to_eina_value_type(sig[0]), 0);
105 if (sig[0] == '(' || sig[0] == '{' || sig[0] == 'v')
107 Eldbus_Message_Iter *entry;
111 else if (sig[0] == '(')
114 while (eldbus_message_iter_get_and_next(iter, sig[0], &entry))
116 Eina_Value *data = _message_iter_struct_to_eina_value(entry);
117 Eina_Value_Struct st;
118 eina_value_get(data, &st);
119 eina_value_array_append(array_value, st);
122 else if (sig[0] == 'a')
124 Eldbus_Message_Iter *entry;
125 while (eldbus_message_iter_get_and_next(iter, sig[0], &entry))
127 Eina_Value *data = _message_iter_array_to_eina_value(entry);
128 Eina_Value_Array inner_array;
129 eina_value_get(data, &inner_array);
130 eina_value_array_append(array_value, inner_array);
134 _message_iter_basic_array_to_eina_value(sig[0], array_value, iter);
136 DBG("return array of %s", sig);
142 _message_iter_basic_array_to_eina_value(char type, Eina_Value *value, Eldbus_Message_Iter *iter)
150 while (eldbus_message_iter_get_and_next(iter, type, &i))
151 eina_value_array_append(value, i);
155 case 'o'://object path
159 while (eldbus_message_iter_get_and_next(iter, type, &txt))
160 eina_value_array_append(value, txt);
167 while (eldbus_message_iter_get_and_next(iter, type, &byte))
168 eina_value_array_append(value, byte);
174 while (eldbus_message_iter_get_and_next(iter, type, &i))
175 eina_value_array_append(value, i);
181 while (eldbus_message_iter_get_and_next(iter, type, &i))
182 eina_value_array_append(value, i);
188 while (eldbus_message_iter_get_and_next(iter, type, &i))
189 eina_value_array_append(value, i);
195 while (eldbus_message_iter_get_and_next(iter, type, &i))
196 eina_value_array_append(value, i);
202 while (eldbus_message_iter_get_and_next(iter, type, &i))
203 eina_value_array_append(value, i);
209 while (eldbus_message_iter_get_and_next(iter, type, &d))
210 eina_value_array_append(value, d);
218 typedef struct _Eldbus_Struct_Desc
220 Eina_Value_Struct_Desc base;
222 } Eldbus_Struct_Desc;
225 _ops_malloc(const Eina_Value_Struct_Operations *ops EINA_UNUSED, const Eina_Value_Struct_Desc *desc)
227 Eldbus_Struct_Desc *edesc = (Eldbus_Struct_Desc*)desc;
229 DBG("%p refcount=%d", edesc, edesc->refcount);
230 return malloc(desc->size);
234 _ops_free(const Eina_Value_Struct_Operations *ops EINA_UNUSED, const Eina_Value_Struct_Desc *desc, void *memory)
236 Eldbus_Struct_Desc *edesc = (Eldbus_Struct_Desc*) desc;
239 DBG("%p refcount=%d", edesc, edesc->refcount);
240 if (edesc->refcount <= 0)
243 for (i = 0; i < edesc->base.member_count; i++)
244 free((char *)edesc->base.members[i].name);
245 free((Eina_Value_Struct_Member *)edesc->base.members);
250 static Eina_Value_Struct_Operations operations =
252 EINA_VALUE_STRUCT_OPERATIONS_VERSION,
261 _message_iter_struct_to_eina_value(Eldbus_Message_Iter *iter)
264 Eina_Value *value_st = NULL;
265 Eina_Array *st_members = eina_array_new(1);
266 unsigned int offset = 0, z;
267 char name[7];//arg000 + \0
268 Eina_Value_Struct_Member *members;
269 Eldbus_Struct_Desc *st_desc;
270 Eina_Array *st_values = eina_array_new(1);
273 st_desc = calloc(1, sizeof(Eldbus_Struct_Desc));
274 st_desc->base.version = EINA_VALUE_STRUCT_DESC_VERSION;
275 st_desc->base.ops = &operations;
279 while ((type = dbus_message_iter_get_arg_type(&iter->dbus_iterator)) != DBUS_TYPE_INVALID)
281 Eina_Value_Struct_Member *m;
284 m = calloc(1, sizeof(Eina_Value_Struct_Member));
285 snprintf(name, 7, ARG, z);
286 m->name = strdup(name);
287 offset = _type_offset(type, offset);
289 offset += _type_size(type);
290 m->type = _dbus_type_to_eina_value_type(type);
291 eina_array_push(st_members, m);
293 DBG("type = %c", type);
300 v = eina_value_new(EINA_VALUE_TYPE_INT);
301 eldbus_message_iter_basic_get(iter, &i);
302 eina_value_set(v, i);
306 case 'o'://object path
310 v = eina_value_new(EINA_VALUE_TYPE_STRING);
311 eldbus_message_iter_basic_get(iter, &txt);
312 eina_value_set(v, txt);
319 v = eina_value_new(EINA_VALUE_TYPE_UCHAR);
320 eldbus_message_iter_basic_get(iter, &byte);
321 eina_value_set(v, byte);
327 v = eina_value_new(EINA_VALUE_TYPE_SHORT);
328 eldbus_message_iter_basic_get(iter, &i);
329 eina_value_set(v, i);
335 v = eina_value_new(EINA_VALUE_TYPE_USHORT);
336 eldbus_message_iter_basic_get(iter, &i);
337 eina_value_set(v, i);
343 v = eina_value_new(EINA_VALUE_TYPE_UINT);
344 eldbus_message_iter_basic_get(iter, &i);
345 eina_value_set(v, i);
351 v = eina_value_new(EINA_VALUE_TYPE_INT64);
352 eldbus_message_iter_basic_get(iter, &i);
353 eina_value_set(v, i);
359 v = eina_value_new(EINA_VALUE_TYPE_UINT64);
360 eldbus_message_iter_basic_get(iter, &i);
361 eina_value_set(v, i);
367 v = eina_value_new(EINA_VALUE_TYPE_DOUBLE);
368 eldbus_message_iter_basic_get(iter, &d);
369 eina_value_set(v, d);
374 Eldbus_Message_Iter *dbus_array;
375 dbus_array = eldbus_message_iter_sub_iter_get(iter);
376 v = _message_iter_array_to_eina_value(dbus_array);
383 Eldbus_Message_Iter *dbus_st;
384 dbus_st = eldbus_message_iter_sub_iter_get(iter);
385 v = _message_iter_struct_to_eina_value(dbus_st);
389 ERR("Unexpected type %c", type);
392 eina_array_push(st_values, v);
393 eldbus_message_iter_next(iter);
403 members = malloc(eina_array_count(st_members) * sizeof(Eina_Value_Struct_Member));
404 for (z = 0; z < eina_array_count(st_members); z++)
406 Eina_Value_Struct_Member *m = eina_array_data_get(st_members, z);
407 members[z].name = m->name;
408 members[z].offset = m->offset;
409 members[z].type = m->type;
414 st_desc->base.members = members;
415 st_desc->base.member_count = eina_array_count(st_members);
416 st_desc->base.size = offset;
417 value_st = eina_value_struct_new((Eina_Value_Struct_Desc *)st_desc);
420 for (z = 0; z < eina_array_count(st_values); z++)
422 Eina_Value *v = eina_array_data_get(st_values, z);
423 sprintf(name, ARG, z);
424 eina_value_struct_value_set(value_st, name, v);
429 eina_array_free(st_members);
430 eina_array_free(st_values);
436 eldbus_message_to_eina_value(const Eldbus_Message *msg)
438 Eldbus_Message_Iter *iter;
439 EINA_SAFETY_ON_FALSE_RETURN_VAL(msg, NULL);
440 iter = eldbus_message_iter_get(msg);
441 EINA_SAFETY_ON_NULL_RETURN_VAL(iter, NULL);
442 return _message_iter_struct_to_eina_value(iter);
446 eldbus_message_iter_struct_like_to_eina_value(const Eldbus_Message_Iter *iter)
448 EINA_SAFETY_ON_NULL_RETURN_VAL(iter, NULL);
449 return _message_iter_struct_to_eina_value((Eldbus_Message_Iter *)iter);