8 #include "e_ukit_private.h"
11 unmarshal_property(DBusMessage *msg, DBusError *err)
13 E_Ukit_Get_Property_Return *ret = NULL;
14 DBusMessageIter iter, a_iter;
18 if (!dbus_message_iter_init(msg, &iter)) return NULL; /* no params in message */
20 ret = calloc(1, sizeof(E_Ukit_Get_Property_Return));
23 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
27 dbus_message_iter_recurse(&iter, &a_iter);
28 if (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID)
30 type = dbus_message_iter_get_arg_type(&a_iter);
34 case DBUS_TYPE_STRING:
35 case DBUS_TYPE_OBJECT_PATH:
36 ret->type = E_UKIT_PROPERTY_TYPE_STRING;
37 dbus_message_iter_get_basic(&a_iter, &tmp);
38 ret->val.s = eina_stringshare_add(tmp);
41 ret->type = E_UKIT_PROPERTY_TYPE_INT;
42 dbus_message_iter_get_basic(&a_iter, &(ret->val.i));
44 case DBUS_TYPE_UINT32:
45 ret->type = E_UKIT_PROPERTY_TYPE_UINT32;
46 dbus_message_iter_get_basic(&a_iter, &(ret->val.u));
48 case DBUS_TYPE_UINT64:
49 ret->type = E_UKIT_PROPERTY_TYPE_UINT64;
50 dbus_message_iter_get_basic(&a_iter, &(ret->val.t));
53 ret->type = E_UKIT_PROPERTY_TYPE_INT64;
54 dbus_message_iter_get_basic(&a_iter, &(ret->val.x));
56 case DBUS_TYPE_BOOLEAN:
57 ret->type = E_UKIT_PROPERTY_TYPE_BOOL;
58 dbus_message_iter_get_basic(&a_iter, &(ret->val.b));
60 case DBUS_TYPE_DOUBLE:
61 ret->type = E_UKIT_PROPERTY_TYPE_DOUBLE;
62 dbus_message_iter_get_basic(&a_iter, &(ret->val.d));
65 ret->type = E_UKIT_PROPERTY_TYPE_STRLIST;
67 DBusMessageIter list_iter;
68 ret->val.strlist = NULL;
69 dbus_message_iter_recurse(&a_iter, &list_iter);
70 while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID)
73 dbus_message_iter_get_basic(&list_iter, &str);
74 tmp = (char*)eina_stringshare_add(str);
75 ret->val.strlist = eina_list_append(ret->val.strlist, tmp);
76 dbus_message_iter_next(&list_iter);
89 free_property(void *data)
91 E_Ukit_Get_Property_Return *ret = data;
94 if (ret->type == E_UKIT_PROPERTY_TYPE_STRLIST)
97 EINA_LIST_FREE(ret->val.strlist, s)
98 eina_stringshare_del(s);
100 else if (ret->type == E_UKIT_PROPERTY_TYPE_STRING)
101 eina_stringshare_del(ret->val.s);
106 unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
108 E_Ukit_Get_All_Properties_Return *ret = NULL;
109 DBusMessageIter iter, a_iter, s_iter, v_iter;
113 /* a{sv} = array of string+variants */
114 if (!dbus_message_has_signature(msg, "a{sv}"))
116 dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
120 ret = calloc(1, sizeof(E_Ukit_Get_All_Properties_Return));
123 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
127 ret->properties = eina_hash_string_small_new(EINA_FREE_CB(e_ukit_property_free));
129 dbus_message_iter_init(msg, &iter);
130 dbus_message_iter_recurse(&iter, &a_iter);
131 while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID)
134 E_Ukit_Property *prop = calloc(1, sizeof(E_Ukit_Property));
135 dbus_message_iter_recurse(&a_iter, &s_iter);
136 dbus_message_iter_get_basic(&s_iter, &name);
137 dbus_message_iter_next(&s_iter);
138 dbus_message_iter_recurse(&s_iter, &v_iter);
140 type = dbus_message_iter_get_arg_type(&v_iter);
143 case DBUS_TYPE_STRING:
144 case DBUS_TYPE_OBJECT_PATH:
145 prop->type = E_UKIT_PROPERTY_TYPE_STRING;
146 dbus_message_iter_get_basic(&v_iter, &tmp);
147 prop->val.s = eina_stringshare_add(tmp);
149 case DBUS_TYPE_INT32:
150 prop->type = E_UKIT_PROPERTY_TYPE_INT;
151 dbus_message_iter_get_basic(&v_iter, &(prop->val.i));
153 case DBUS_TYPE_UINT32:
154 prop->type = E_UKIT_PROPERTY_TYPE_UINT32;
155 dbus_message_iter_get_basic(&v_iter, &(prop->val.u));
157 case DBUS_TYPE_UINT64:
158 prop->type = E_UKIT_PROPERTY_TYPE_UINT64;
159 dbus_message_iter_get_basic(&v_iter, &(prop->val.t));
161 case DBUS_TYPE_INT64:
162 prop->type = E_UKIT_PROPERTY_TYPE_INT64;
163 dbus_message_iter_get_basic(&v_iter, &(prop->val.x));
165 case DBUS_TYPE_BOOLEAN:
166 prop->type = E_UKIT_PROPERTY_TYPE_BOOL;
167 dbus_message_iter_get_basic(&v_iter, &(prop->val.b));
169 case DBUS_TYPE_DOUBLE:
170 prop->type = E_UKIT_PROPERTY_TYPE_DOUBLE;
171 dbus_message_iter_get_basic(&v_iter, &(prop->val.d));
173 case DBUS_TYPE_ARRAY:
174 prop->type = E_UKIT_PROPERTY_TYPE_STRLIST;
176 DBusMessageIter list_iter;
177 prop->val.strlist = NULL;
178 dbus_message_iter_recurse(&v_iter, &list_iter);
179 while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID)
182 dbus_message_iter_get_basic(&list_iter, &str);
183 tmp = (char*)eina_stringshare_add(str);
184 prop->val.strlist = eina_list_append(prop->val.strlist, tmp);
185 dbus_message_iter_next(&list_iter);
190 WARN("EUkit Error: unexpected property type (%s): %c", name, dbus_message_iter_get_arg_type(&v_iter));
193 eina_hash_add(ret->properties, name, prop);
195 dbus_message_iter_next(&a_iter);
202 free_device_get_all_properties(void *data)
204 E_Ukit_Get_All_Properties_Return *ret = data;
207 eina_hash_free(ret->properties);
212 unmarshal_string_list(DBusMessage *msg, DBusError *err)
214 E_Ukit_String_List_Return *ret = NULL;
215 DBusMessageIter iter, sub;
218 /* ao = array of object strings */
219 if (!dbus_message_has_signature(msg, "ao"))
221 dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
225 ret = calloc(1, sizeof(E_Ukit_String_List_Return));
228 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
234 dbus_message_iter_init(msg, &iter);
235 dbus_message_iter_recurse(&iter, &sub);
236 while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID)
240 dbus_message_iter_get_basic(&sub, &dev);
241 tmp = (char*)eina_stringshare_add(dev);
242 if (dev) ret->strings = eina_list_append(ret->strings, tmp);
243 dbus_message_iter_next(&sub);
250 free_string_list(void *data)
252 E_Ukit_String_List_Return *ret = data;
256 EINA_LIST_FREE(ret->strings, x)
257 eina_stringshare_del(x);