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 ret->type = E_UKIT_PROPERTY_TYPE_STRING;
36 dbus_message_iter_get_basic(&a_iter, &tmp);
37 ret->val.s = eina_stringshare_add(tmp);
40 ret->type = E_UKIT_PROPERTY_TYPE_INT;
41 dbus_message_iter_get_basic(&a_iter, &(ret->val.i));
43 case DBUS_TYPE_UINT32:
44 ret->type = E_UKIT_PROPERTY_TYPE_UINT32;
45 dbus_message_iter_get_basic(&a_iter, &(ret->val.u));
47 case DBUS_TYPE_UINT64:
48 ret->type = E_UKIT_PROPERTY_TYPE_UINT64;
49 dbus_message_iter_get_basic(&a_iter, &(ret->val.t));
52 ret->type = E_UKIT_PROPERTY_TYPE_INT64;
53 dbus_message_iter_get_basic(&a_iter, &(ret->val.x));
55 case DBUS_TYPE_BOOLEAN:
56 ret->type = E_UKIT_PROPERTY_TYPE_BOOL;
57 dbus_message_iter_get_basic(&a_iter, &(ret->val.b));
59 case DBUS_TYPE_DOUBLE:
60 ret->type = E_UKIT_PROPERTY_TYPE_DOUBLE;
61 dbus_message_iter_get_basic(&a_iter, &(ret->val.d));
64 ret->type = E_UKIT_PROPERTY_TYPE_STRLIST;
66 DBusMessageIter list_iter;
67 ret->val.strlist = NULL;
68 dbus_message_iter_recurse(&a_iter, &list_iter);
69 while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID)
72 dbus_message_iter_get_basic(&list_iter, &str);
73 tmp = (char*)eina_stringshare_add(str);
74 ret->val.strlist = eina_list_append(ret->val.strlist, tmp);
75 dbus_message_iter_next(&list_iter);
88 free_property(void *data)
90 E_Ukit_Get_Property_Return *ret = data;
93 if (ret->type == E_UKIT_PROPERTY_TYPE_STRLIST)
96 EINA_LIST_FREE(ret->val.strlist, s)
97 eina_stringshare_del(s);
99 else if (ret->type == E_UKIT_PROPERTY_TYPE_STRING)
100 eina_stringshare_del(ret->val.s);
105 unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
107 E_Ukit_Get_All_Properties_Return *ret = NULL;
108 DBusMessageIter iter, a_iter, s_iter, v_iter;
112 /* a{sv} = array of string+variants */
113 if (!dbus_message_has_signature(msg, "a{sv}"))
115 dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
119 ret = calloc(1, sizeof(E_Ukit_Get_All_Properties_Return));
122 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
126 ret->properties = eina_hash_string_small_new(EINA_FREE_CB(e_ukit_property_free));
128 dbus_message_iter_init(msg, &iter);
129 dbus_message_iter_recurse(&iter, &a_iter);
130 while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID)
133 E_Ukit_Property *prop = calloc(1, sizeof(E_Ukit_Property));
134 dbus_message_iter_recurse(&a_iter, &s_iter);
135 dbus_message_iter_get_basic(&s_iter, &name);
136 dbus_message_iter_next(&s_iter);
137 dbus_message_iter_recurse(&s_iter, &v_iter);
139 type = dbus_message_iter_get_arg_type(&v_iter);
142 case DBUS_TYPE_STRING:
143 prop->type = E_UKIT_PROPERTY_TYPE_STRING;
144 dbus_message_iter_get_basic(&v_iter, &tmp);
145 prop->val.s = eina_stringshare_add(tmp);
147 case DBUS_TYPE_INT32:
148 prop->type = E_UKIT_PROPERTY_TYPE_INT;
149 dbus_message_iter_get_basic(&v_iter, &(prop->val.i));
151 case DBUS_TYPE_UINT32:
152 prop->type = E_UKIT_PROPERTY_TYPE_UINT32;
153 dbus_message_iter_get_basic(&v_iter, &(prop->val.u));
155 case DBUS_TYPE_UINT64:
156 prop->type = E_UKIT_PROPERTY_TYPE_UINT64;
157 dbus_message_iter_get_basic(&v_iter, &(prop->val.t));
159 case DBUS_TYPE_INT64:
160 prop->type = E_UKIT_PROPERTY_TYPE_INT64;
161 dbus_message_iter_get_basic(&v_iter, &(prop->val.x));
163 case DBUS_TYPE_BOOLEAN:
164 prop->type = E_UKIT_PROPERTY_TYPE_BOOL;
165 dbus_message_iter_get_basic(&v_iter, &(prop->val.b));
167 case DBUS_TYPE_DOUBLE:
168 prop->type = E_UKIT_PROPERTY_TYPE_DOUBLE;
169 dbus_message_iter_get_basic(&v_iter, &(prop->val.d));
171 case DBUS_TYPE_ARRAY:
172 prop->type = E_UKIT_PROPERTY_TYPE_STRLIST;
174 DBusMessageIter list_iter;
175 prop->val.strlist = NULL;
176 dbus_message_iter_recurse(&v_iter, &list_iter);
177 while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID)
180 dbus_message_iter_get_basic(&list_iter, &str);
181 tmp = (char*)eina_stringshare_add(str);
182 prop->val.strlist = eina_list_append(prop->val.strlist, tmp);
183 dbus_message_iter_next(&list_iter);
188 WARN("EUkit Error: unexpected property type (%s): %c", name, dbus_message_iter_get_arg_type(&v_iter));
191 eina_hash_add(ret->properties, name, prop);
193 dbus_message_iter_next(&a_iter);
200 free_device_get_all_properties(void *data)
202 E_Ukit_Get_All_Properties_Return *ret = data;
205 eina_hash_free(ret->properties);
210 unmarshal_string_list(DBusMessage *msg, DBusError *err)
212 E_Ukit_String_List_Return *ret = NULL;
213 DBusMessageIter iter, sub;
216 /* ao = array of object strings */
217 if (!dbus_message_has_signature(msg, "ao"))
219 dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
223 ret = calloc(1, sizeof(E_Ukit_String_List_Return));
226 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
232 dbus_message_iter_init(msg, &iter);
233 dbus_message_iter_recurse(&iter, &sub);
234 while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID)
238 dbus_message_iter_get_basic(&sub, &dev);
239 tmp = (char*)eina_stringshare_add(dev);
240 if (dev) ret->strings = eina_list_append(ret->strings, tmp);
241 dbus_message_iter_next(&sub);
248 free_string_list(void *data)
250 E_Ukit_String_List_Return *ret = data;
254 EINA_LIST_FREE(ret->strings, x)
255 eina_stringshare_del(x);