From 48d17d5b68f5964fe2ac7b1d64fc293b85fca7a2 Mon Sep 17 00:00:00 2001 From: barbieri Date: Tue, 27 Apr 2010 19:37:40 +0000 Subject: [PATCH] HAL changes to make API cleaner and fix string handling. By: Mike@zentific.com git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@48365 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/hal/E_Hal.h | 16 ++++++++-------- src/lib/hal/e_hal_device.c | 46 +++++++++++++++++++++++++++++---------------- src/lib/hal/e_hal_manager.c | 4 +++- src/lib/hal/e_hal_util.c | 8 ++++---- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/lib/hal/E_Hal.h b/src/lib/hal/E_Hal.h index d41aa48..f18fbba 100644 --- a/src/lib/hal/E_Hal.h +++ b/src/lib/hal/E_Hal.h @@ -42,7 +42,7 @@ struct E_Hal_String_List_Return struct E_Hal_Bool_Return { - char boolean; + Eina_Bool boolean; }; struct E_Hal_UDI_Return @@ -118,13 +118,13 @@ extern "C" { EAPI DBusPendingCall *e_hal_manager_find_device_by_capability(E_DBus_Connection *conn, const char *capability, E_DBus_Callback_Func cb_func, void *data); /* utility functions */ - EAPI void e_hal_property_free(E_Hal_Property *prop); - EAPI char *e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err); - EAPI char e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err); - EAPI int e_hal_property_int_get(E_Hal_Properties *properties, const char *key, int *err); - EAPI dbus_uint64_t e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *err); - EAPI double e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *err); - EAPI Eina_List *e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err); + EAPI void e_hal_property_free(E_Hal_Property *prop); + EAPI const char *e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err); + EAPI Eina_Bool e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err); + EAPI int e_hal_property_int_get(E_Hal_Properties *properties, const char *key, int *err); + EAPI dbus_uint64_t e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *err); + EAPI double e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *err); + EAPI const Eina_List *e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err); /* (un)mount */ EAPI DBusPendingCall *e_hal_device_volume_mount(E_DBus_Connection *conn, const char *udi, const char *mount_point, const char *fstype, Eina_List *options, E_DBus_Callback_Func cb_func, void *data); diff --git a/src/lib/hal/e_hal_device.c b/src/lib/hal/e_hal_device.c index bfb3c4d..427df2d 100644 --- a/src/lib/hal/e_hal_device.c +++ b/src/lib/hal/e_hal_device.c @@ -17,6 +17,7 @@ unmarshal_device_get_property(DBusMessage *msg, DBusError *err) E_Hal_Device_Get_Property_Return *ret = NULL; DBusMessageIter iter; int type; + char *tmp; ret = calloc(1, sizeof(E_Hal_Device_Get_Property_Return)); if (!ret) @@ -29,16 +30,17 @@ unmarshal_device_get_property(DBusMessage *msg, DBusError *err) type = dbus_message_iter_get_arg_type(&iter); switch(type) { - case 's': - dbus_message_iter_get_basic(&iter, &(ret->val.s)); + case DBUS_TYPE_STRING: + dbus_message_iter_get_basic(&iter, &tmp); + ret->val.s = (char*)eina_stringshare_add(tmp); break; - case 'i': + case DBUS_TYPE_INT32: dbus_message_iter_get_basic(&iter, &(ret->val.i)); break; - case 'b': + case DBUS_TYPE_BOOLEAN: dbus_message_iter_get_basic(&iter, &(ret->val.b)); break; - case 'd': + case DBUS_TYPE_DOUBLE: dbus_message_iter_get_basic(&iter, &(ret->val.d)); break; } @@ -52,6 +54,14 @@ free_device_get_property(void *data) E_Hal_Device_Get_Property_Return *ret = data; if (!ret) return; + if (ret->type == E_HAL_PROPERTY_TYPE_STRLIST) + { + const char *s; + EINA_LIST_FREE(ret->val.strlist, s) + eina_stringshare_del(s); + } + else if (ret->type == E_HAL_PROPERTY_TYPE_STRING) + eina_stringshare_del(ret->val.s); free(ret); } @@ -75,7 +85,9 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err) { E_Hal_Device_Get_All_Properties_Return *ret = NULL; DBusMessageIter iter, a_iter, s_iter, v_iter; + char *tmp; + /* a{sv} = array of string+variant */ if (!dbus_message_has_signature(msg, "a{sv}")) { dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, ""); @@ -104,27 +116,28 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err) switch(dbus_message_iter_get_arg_type(&v_iter)) { - case 's': + case DBUS_TYPE_STRING: prop->type = E_HAL_PROPERTY_TYPE_STRING; - dbus_message_iter_get_basic(&v_iter, &(prop->val.s)); + dbus_message_iter_get_basic(&v_iter, &tmp); + prop->val.s = (char*)eina_stringshare_add(tmp); break; - case 'i': + case DBUS_TYPE_INT32: prop->type = E_HAL_PROPERTY_TYPE_INT; dbus_message_iter_get_basic(&v_iter, &(prop->val.i)); break; - case 't': + case DBUS_TYPE_UINT64: prop->type = E_HAL_PROPERTY_TYPE_UINT64; dbus_message_iter_get_basic(&v_iter, &(prop->val.u64)); break; - case 'b': + case DBUS_TYPE_BOOLEAN: prop->type = E_HAL_PROPERTY_TYPE_BOOL; dbus_message_iter_get_basic(&v_iter, &(prop->val.b)); break; - case 'd': + case DBUS_TYPE_DOUBLE: prop->type = E_HAL_PROPERTY_TYPE_DOUBLE; dbus_message_iter_get_basic(&v_iter, &(prop->val.d)); break; - case 'a': + case DBUS_TYPE_ARRAY: prop->type = E_HAL_PROPERTY_TYPE_STRLIST; { DBusMessageIter list_iter; @@ -134,7 +147,8 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err) { char *str; dbus_message_iter_get_basic(&list_iter, &str); - prop->val.strlist = eina_list_append(prop->val.strlist, str); + tmp = (char*)eina_stringshare_add(str); + prop->val.strlist = eina_list_append(prop->val.strlist, tmp); dbus_message_iter_next(&list_iter); } } @@ -253,7 +267,7 @@ e_hal_device_volume_mount(E_DBus_Connection *conn, const char *udi, const char * dbus_message_iter_init_append(msg, &iter); dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &mount_point); dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &fstype); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter); if (options) { @@ -293,7 +307,7 @@ e_hal_device_volume_unmount(E_DBus_Connection *conn, const char *udi, Eina_List msg = e_hal_device_volume_call_new(udi, "Unmount"); dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter); if (options) { const char *opt; @@ -330,7 +344,7 @@ e_hal_device_volume_eject(E_DBus_Connection *conn, const char *udi, Eina_List *o msg = e_hal_device_volume_call_new(udi, "Eject"); dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter); if (options) { const char *opt; diff --git a/src/lib/hal/e_hal_manager.c b/src/lib/hal/e_hal_manager.c index 935bb99..8b48958 100644 --- a/src/lib/hal/e_hal_manager.c +++ b/src/lib/hal/e_hal_manager.c @@ -44,9 +44,11 @@ static void free_string_list(void *data) { E_Hal_String_List_Return *ret = data; + const char *x; if (!ret) return; - eina_list_free(ret->strings); + EINA_LIST_FREE(ret->strings, x) + eina_stringshare_del(x); free(ret); } diff --git a/src/lib/hal/e_hal_util.c b/src/lib/hal/e_hal_util.c index a79003e..f664989 100644 --- a/src/lib/hal/e_hal_util.c +++ b/src/lib/hal/e_hal_util.c @@ -21,20 +21,20 @@ e_hal_property_free(E_Hal_Property *prop) * @param key the key of the property to retrieve * @param err a pointer to an int, which if supplied, will be set to 0 on success and 1 on an error */ -EAPI char * +EAPI const char * e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err) { E_Hal_Property *prop; if (err) *err = 0; if (!properties->properties) return NULL; prop = eina_hash_find(properties->properties, key); - if (prop) return strdup(prop->val.s); + if (prop) return prop->val.s; if (err) *err = 1; return NULL; } -EAPI char +EAPI Eina_Bool e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err) { E_Hal_Property *prop; @@ -86,7 +86,7 @@ e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *er return 0; } -EAPI Eina_List * +EAPI const Eina_List * e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err) { E_Hal_Property *prop; -- 2.7.4