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);
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);
94
padding = (base > size) ? base - size : size - base;
95
return base + padding;
99
_message_iter_array_to_eina_value(Eldbus_Message_Iter *iter)
101
Eina_Value *array_value;
104
sig = eldbus_message_iter_signature_get(iter);
105
DBG("array of %s", sig);
106
array_value = eina_value_array_new(_dbus_type_to_eina_value_type(sig[0]), 0);
107
if (sig[0] == '(' || sig[0] == '{' || sig[0] == 'v')
109
Eldbus_Message_Iter *entry;
113
else if (sig[0] == '(')
116
while (eldbus_message_iter_get_and_next(iter, sig[0], &entry))
118
Eina_Value *data = _message_iter_struct_to_eina_value(entry);
119
Eina_Value_Struct st;
120
eina_value_get(data, &st);
121
eina_value_array_append(array_value, st);
122
eina_value_free(data);
125
else if (sig[0] == 'a')
127
Eldbus_Message_Iter *entry;
128
while (eldbus_message_iter_get_and_next(iter, sig[0], &entry))
130
Eina_Value *data = _message_iter_array_to_eina_value(entry);
131
Eina_Value_Array inner_array;
132
eina_value_get(data, &inner_array);
133
eina_value_array_append(array_value, inner_array);
134
eina_value_free(data);
138
_message_iter_basic_array_to_eina_value(sig[0], array_value, iter);
140
DBG("return array of %s", sig);
146
_message_iter_basic_array_to_eina_value(char type, Eina_Value *value, Eldbus_Message_Iter *iter)
154
while (eldbus_message_iter_get_and_next(iter, type, &i))
155
eina_value_array_append(value, i);
159
case 'o'://object path
163
while (eldbus_message_iter_get_and_next(iter, type, &txt))
164
eina_value_array_append(value, txt);
170
while (eldbus_message_iter_get_and_next(iter, type, &byte))
171
eina_value_array_append(value, byte);
177
while (eldbus_message_iter_get_and_next(iter, type, &boolean))
178
eina_value_array_append(value, (uint8_t)boolean);
184
while (eldbus_message_iter_get_and_next(iter, type, &i))
185
eina_value_array_append(value, i);
191
while (eldbus_message_iter_get_and_next(iter, type, &i))
192
eina_value_array_append(value, i);
198
while (eldbus_message_iter_get_and_next(iter, type, &i))
199
eina_value_array_append(value, i);
205
while (eldbus_message_iter_get_and_next(iter, type, &i))
206
eina_value_array_append(value, i);
212
while (eldbus_message_iter_get_and_next(iter, type, &i))
213
eina_value_array_append(value, i);
219
while (eldbus_message_iter_get_and_next(iter, type, &d))
220
eina_value_array_append(value, d);
228
typedef struct _Eldbus_Struct_Desc
230
Eina_Value_Struct_Desc base;
235
_ops_malloc(const Eina_Value_Struct_Operations *ops EINA_UNUSED, const Eina_Value_Struct_Desc *desc)
237
Eldbus_Struct_Desc *edesc = (Eldbus_Struct_Desc*)desc;
239
DBG("%p refcount=%d", edesc, edesc->refcount);
240
return malloc(desc->size);
244
_ops_free(const Eina_Value_Struct_Operations *ops EINA_UNUSED, const Eina_Value_Struct_Desc *desc, void *memory)
246
Eldbus_Struct_Desc *edesc = (Eldbus_Struct_Desc*) desc;
249
DBG("%p refcount=%d", edesc, edesc->refcount);
250
if (edesc->refcount <= 0)
253
for (i = 0; i < edesc->base.member_count; i++)
254
free((char *)edesc->base.members[i].name);
255
free((Eina_Value_Struct_Member *)edesc->base.members);
260
static Eina_Value_Struct_Operations operations =
262
EINA_VALUE_STRUCT_OPERATIONS_VERSION,
271
_message_iter_struct_to_eina_value(Eldbus_Message_Iter *iter)
274
Eina_Value *value_st = NULL;
275
Eina_Array *st_members = eina_array_new(1);
276
unsigned int offset = 0, z;
277
char name[16];//arg000 + \0
278
Eina_Value_Struct_Member *members;
279
Eldbus_Struct_Desc *st_desc;
280
Eina_Array *st_values = eina_array_new(1);
283
st_desc = calloc(1, sizeof(Eldbus_Struct_Desc));
284
st_desc->base.version = EINA_VALUE_STRUCT_DESC_VERSION;
285
st_desc->base.ops = &operations;
289
while ((type = dbus_message_iter_get_arg_type(&iter->dbus_iterator)) != DBUS_TYPE_INVALID)
291
Eina_Value_Struct_Member *m;
294
m = calloc(1, sizeof(Eina_Value_Struct_Member));
295
snprintf(name, 7, ARG, z);
296
m->name = strdup(name);
297
offset = _type_offset(type, offset);
299
offset += _type_size(type);
300
m->type = _dbus_type_to_eina_value_type(type);
301
eina_array_push(st_members, m);
303
DBG("type = %c", type);
310
v = eina_value_new(EINA_VALUE_TYPE_INT);
311
eldbus_message_iter_basic_get(iter, &i);
312
eina_value_set(v, i);
316
case 'o'://object path
320
v = eina_value_new(EINA_VALUE_TYPE_STRING);
321
eldbus_message_iter_basic_get(iter, &txt);
322
eina_value_set(v, txt);
328
v = eina_value_new(EINA_VALUE_TYPE_UCHAR);
329
eldbus_message_iter_basic_get(iter, &byte);
330
eina_value_set(v, byte);
336
v = eina_value_new(EINA_VALUE_TYPE_UCHAR);
337
eldbus_message_iter_basic_get(iter, &value);
338
eina_value_set(v, (uint8_t)value);
344
v = eina_value_new(EINA_VALUE_TYPE_SHORT);
345
eldbus_message_iter_basic_get(iter, &i);
346
eina_value_set(v, i);
352
v = eina_value_new(EINA_VALUE_TYPE_USHORT);
353
eldbus_message_iter_basic_get(iter, &i);
354
eina_value_set(v, i);
360
v = eina_value_new(EINA_VALUE_TYPE_UINT);
361
eldbus_message_iter_basic_get(iter, &i);
362
eina_value_set(v, i);
368
v = eina_value_new(EINA_VALUE_TYPE_INT64);
369
eldbus_message_iter_basic_get(iter, &i);
370
eina_value_set(v, i);
376
v = eina_value_new(EINA_VALUE_TYPE_UINT64);
377
eldbus_message_iter_basic_get(iter, &i);
378
eina_value_set(v, i);
384
v = eina_value_new(EINA_VALUE_TYPE_DOUBLE);
385
eldbus_message_iter_basic_get(iter, &d);
386
eina_value_set(v, d);
391
Eldbus_Message_Iter *dbus_array;
392
dbus_array = eldbus_message_iter_sub_iter_get(iter);
393
v = _message_iter_array_to_eina_value(dbus_array);
400
Eldbus_Message_Iter *dbus_st;
401
dbus_st = eldbus_message_iter_sub_iter_get(iter);
402
v = _message_iter_struct_to_eina_value(dbus_st);
406
ERR("Unexpected type %c", type);
409
eina_array_push(st_values, v);
410
eldbus_message_iter_next(iter);
420
members = malloc(eina_array_count(st_members) * sizeof(Eina_Value_Struct_Member));
421
for (z = 0; z < eina_array_count(st_members); z++)
423
Eina_Value_Struct_Member *m = eina_array_data_get(st_members, z);
424
members[z].name = m->name;
425
members[z].offset = m->offset;
426
members[z].type = m->type;
431
st_desc->base.members = members;
432
st_desc->base.member_count = eina_array_count(st_members);
433
st_desc->base.size = offset;
434
value_st = eina_value_struct_new((Eina_Value_Struct_Desc *)st_desc);
437
for (z = 0; z < eina_array_count(st_values); z++)
439
Eina_Value *v = eina_array_data_get(st_values, z);
440
sprintf(name, ARG, z);
441
eina_value_struct_value_set(value_st, name, v);
446
eina_array_free(st_members);
447
eina_array_free(st_values);
453
eldbus_message_to_eina_value(const Eldbus_Message *msg)
455
Eldbus_Message_Iter *iter;
456
EINA_SAFETY_ON_FALSE_RETURN_VAL(msg, NULL);
457
iter = eldbus_message_iter_get(msg);
458
EINA_SAFETY_ON_NULL_RETURN_VAL(iter, NULL);
459
return _message_iter_struct_to_eina_value(iter);
463
eldbus_message_iter_struct_like_to_eina_value(const Eldbus_Message_Iter *iter)
465
EINA_SAFETY_ON_NULL_RETURN_VAL(iter, NULL);
466
return _message_iter_struct_to_eina_value((Eldbus_Message_Iter *)iter);