3 #define e_hal_device_call_new(udi, member) dbus_message_new_method_call(E_HAL_SENDER, udi, E_HAL_DEVICE_INTERFACE, member)
4 #define e_hal_device_volume_call_new(udi, member) dbus_message_new_method_call(E_HAL_SENDER, udi, E_HAL_DEVICE_VOLUME_INTERFACE, member)
7 static void cb_device_get_property(void *data, DBusMessage *msg, DBusError *err);
8 static void cb_device_get_all_properties(void *data, DBusMessage *msg, DBusError *err);
9 static void cb_device_query_capability(void *data, DBusMessage *msg, DBusError *err);
12 /* Device.GetProperty */
14 unmarshal_device_get_property(DBusMessage *msg, DBusError *err)
16 E_Hal_Device_Get_Property_Return *ret = NULL;
20 ret = calloc(1, sizeof(E_Hal_Device_Get_Property_Return));
23 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
27 dbus_message_iter_init(msg, &iter);
28 type = dbus_message_iter_get_arg_type(&iter);
32 dbus_message_iter_get_basic(&iter, &(ret->val.s));
35 dbus_message_iter_get_basic(&iter, &(ret->val.i));
38 dbus_message_iter_get_basic(&iter, &(ret->val.b));
41 dbus_message_iter_get_basic(&iter, &(ret->val.d));
49 free_device_get_property(void *data)
51 E_Hal_Device_Get_Property_Return *ret = data;
58 e_hal_device_get_property(E_DBus_Connection *conn, const char *udi, const char *property, E_DBus_Callback_Func cb_func, void *data)
63 msg = e_hal_device_call_new(udi, "GetProperty");
64 dbus_message_append_args(msg, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID);
65 ret = e_dbus_method_call_send(conn, msg, unmarshal_device_get_property, cb_func, free_device_get_property, -1, data) ? 1 : 0;
66 dbus_message_unref(msg);
70 /* Device.GetAllProperties */
73 unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
75 E_Hal_Device_Get_All_Properties_Return *ret = NULL;
76 DBusMessageIter iter, a_iter, s_iter, v_iter;
78 if (!dbus_message_has_signature(msg, "a{sv}"))
80 dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
84 ret = calloc(1, sizeof(E_Hal_Device_Get_All_Properties_Return));
87 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
91 ret->properties = ecore_hash_new(ecore_str_hash, ecore_str_compare);
92 ecore_hash_free_key_cb_set(ret->properties, ECORE_FREE_CB(eina_stringshare_del));
93 ecore_hash_free_value_cb_set(ret->properties, ECORE_FREE_CB(e_hal_property_free));
96 dbus_message_iter_init(msg, &iter);
97 dbus_message_iter_recurse(&iter, &a_iter);
98 while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID)
101 E_Hal_Property *prop = calloc(1, sizeof(E_Hal_Property));
102 dbus_message_iter_recurse(&a_iter, &s_iter);
103 dbus_message_iter_get_basic(&s_iter, &name);
104 dbus_message_iter_next(&s_iter);
105 dbus_message_iter_recurse(&s_iter, &v_iter);
107 switch(dbus_message_iter_get_arg_type(&v_iter))
110 prop->type = E_HAL_PROPERTY_TYPE_STRING;
111 dbus_message_iter_get_basic(&v_iter, &(prop->val.s));
114 prop->type = E_HAL_PROPERTY_TYPE_INT;
115 dbus_message_iter_get_basic(&v_iter, &(prop->val.i));
118 prop->type = E_HAL_PROPERTY_TYPE_UINT64;
119 dbus_message_iter_get_basic(&v_iter, &(prop->val.u64));
122 prop->type = E_HAL_PROPERTY_TYPE_BOOL;
123 dbus_message_iter_get_basic(&v_iter, &(prop->val.b));
126 prop->type = E_HAL_PROPERTY_TYPE_DOUBLE;
127 dbus_message_iter_get_basic(&v_iter, &(prop->val.d));
130 prop->type = E_HAL_PROPERTY_TYPE_STRLIST;
132 DBusMessageIter list_iter;
133 prop->val.strlist = ecore_list_new();
134 dbus_message_iter_recurse(&v_iter, &list_iter);
135 while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID)
138 dbus_message_iter_get_basic(&list_iter, &str);
139 ecore_list_append(prop->val.strlist, str);
140 dbus_message_iter_next(&list_iter);
145 printf("Error: unexpected property type (%s): %c\n", name, dbus_message_iter_get_arg_type(&v_iter));
148 ecore_hash_set(ret->properties, (void *)eina_stringshare_add(name), prop);
150 dbus_message_iter_next(&a_iter);
157 free_device_get_all_properties(void *data)
159 E_Hal_Device_Get_All_Properties_Return *ret = data;
162 ecore_hash_destroy(ret->properties);
167 e_hal_device_get_all_properties(E_DBus_Connection *conn, const char *udi, E_DBus_Callback_Func cb_func, void *data)
172 msg = e_hal_device_call_new(udi, "GetAllProperties");
173 ret = e_dbus_method_call_send(conn, msg, unmarshal_device_get_all_properties, cb_func, free_device_get_all_properties, -1, data) ? 1 : 0;
174 dbus_message_unref(msg);
180 /* bool Device.QueryCapability(string udi) */
182 // XXX this is same as Device_Exists in manager.
184 unmarshal_device_query_capability(DBusMessage *msg, DBusError *err)
186 E_Hal_Device_Query_Capability_Return *ret = NULL;
189 ret = calloc(1, sizeof(E_Hal_Manager_Device_Exists_Return));
192 dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
196 dbus_message_get_args(msg, err, DBUS_TYPE_BOOLEAN, &val, DBUS_TYPE_INVALID);
198 if (dbus_error_is_set(err))
209 free_device_query_capability(void *data)
211 E_Hal_Device_Query_Capability_Return *ret = data;
218 e_hal_device_query_capability(E_DBus_Connection *conn, const char *udi, const char *capability, E_DBus_Callback_Func cb_func, void *data)
223 msg = e_hal_device_call_new(udi, "QueryCapability");
224 dbus_message_append_args(msg, DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID);
225 ret = e_dbus_method_call_send(conn, msg, unmarshal_device_query_capability, cb_func, free_device_query_capability, -1, data) ? 1 : 0;
226 dbus_message_unref(msg);
232 /* void Device.Mount(string mount_point, string fstype, array{string}options) */
235 * @brief Mount a Volume
237 * @param conn the E_DBus_Connection
238 * @param udi the udi of the device object
239 * @param mount_point the path to mount to, or null for default
240 * @param fstype the fstype of the device (e.g. volume.fstype property)
241 * @param options a list of additional options (not sure... fstype dependant?)
244 e_hal_device_volume_mount(E_DBus_Connection *conn, const char *udi, const char *mount_point, const char *fstype, Ecore_List *options, E_DBus_Callback_Func cb_func, void *data)
247 DBusMessageIter iter, subiter;
250 msg = e_hal_device_volume_call_new(udi, "Mount");
252 dbus_message_iter_init_append(msg, &iter);
253 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &mount_point);
254 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &fstype);
255 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter);
260 ecore_list_first_goto(options);
261 while ((opt = ecore_list_next(options)))
263 dbus_message_iter_append_basic(&subiter, DBUS_TYPE_STRING, &opt);
266 dbus_message_iter_close_container(&iter, &subiter) ;
268 ret = e_dbus_method_call_send(conn, msg, NULL, cb_func, NULL, -1, data) ? 1 : 0;
269 dbus_message_unref(msg);
273 /* void Unmount(array{string} options) */
276 * @brief Mount a Volume
278 * @param conn the E_DBus_Connection
279 * @param udi the udi of the device object
280 * @param options a list of additional options (not sure... fstype dependant?)
283 e_hal_device_volume_unmount(E_DBus_Connection *conn, const char *udi, Ecore_List *options, E_DBus_Callback_Func cb_func, void *data)
286 DBusMessageIter iter, subiter;
289 msg = e_hal_device_volume_call_new(udi, "Unmount");
291 dbus_message_iter_init_append(msg, &iter);
292 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter);
296 ecore_list_first_goto(options);
297 while ((opt = ecore_list_next(options)))
299 dbus_message_iter_append_basic(&subiter, DBUS_TYPE_STRING, &opt);
302 dbus_message_iter_close_container(&iter, &subiter) ;
304 ret = e_dbus_method_call_send(conn, msg, NULL, cb_func, NULL, -1, data) ? 1 : 0;
305 dbus_message_unref(msg);