diff options
author | David Zeuthen <david@fubar.dk> | 2005-02-14 18:20:05 +0000 |
---|---|---|
committer | David Zeuthen <david@fubar.dk> | 2005-02-14 18:20:05 +0000 |
commit | 0d7fb14b0d555c29cff9384979eca6a5de25db81 (patch) | |
tree | afad7ac1a96d6663d7a6d46f5181556b8d25ea46 /libhal | |
parent | 6e6993b442c4149289b73881fa64495e006c67b2 (diff) |
Require dbus >= 0.30
s/HAL_PROPERTY_TYPE_NIL/HAL_PROPERTY_TYPE_INVALID
ported to new dbus-0.30 API (foreach_property_append): implemented real
string lists and got rid of the \tval\tval\tval\t hack
ported to new dbus-0.30 API
s/HAL_PROPERTY_TYPE_NIL/HAL_PROPERTY_TYPE_INVALID
(libhal_get_string_array_from_iter): new helper function to create
string arrays from dbus arrays
(libhal_property_fill_value_from_variant): new helper function that
fills in properties from variants. Used when getting a hash of
properties from hald
s/HAL_PROPERTY_TYPE_NIL/HAL_PROPERTY_TYPE_INVALID HAL_PROPERTY_TYPE_INVALID
= DBUS_TYPE_INVALID
ported to new dbus-0.30 API Added success messages and more detailed failed
messages
Change all illegal characters to underscores '_'
:__init__, add_device_signal_recv): change add_signal_receiver calls to add
expand_args=False parameter. (DeviceManager::device_changed,
gdl_changed): changed handlers to conform with the new way we call
signal handlers
Diffstat (limited to 'libhal')
-rw-r--r-- | libhal/libhal.c | 765 | ||||
-rw-r--r-- | libhal/libhal.h | 4 |
2 files changed, 372 insertions, 397 deletions
diff --git a/libhal/libhal.c b/libhal/libhal.c index 430afbad..c3b95682 100644 --- a/libhal/libhal.c +++ b/libhal/libhal.c @@ -53,6 +53,13 @@ # define N_(String) (String) #endif +char **libhal_get_string_array_from_iter (DBusMessageIter *iter); + +dbus_bool_t libhal_property_fill_value_from_variant (LibHalProperty *p, + DBusMessageIter *var_iter); + + + /** * @defgroup LibHal HAL convenience library * @brief A convenience library used to communicate with the HAL daemon @@ -78,6 +85,61 @@ libhal_free_string_array (char **str_array) } } + +/** Creates a NULL terminated array of strings from a dbus message iterator. + * + * @param iter The message iterator to extract the strings from + * @return Pointer to the string array + */ +char ** +libhal_get_string_array_from_iter (DBusMessageIter *iter) +{ + int count; + char **buffer; + + count = 0; + buffer = (char **)malloc (sizeof (char *) * 8); + + if (buffer == NULL) + goto oom; + + buffer[0] = NULL; + while (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_STRING) { + const char *value; + char *str; + + if ((count % 8) == 0 && count != 0) { + buffer = realloc (buffer, sizeof (char *) * (count + 8)); + if (buffer == NULL) + goto oom; + } + + dbus_message_iter_get_basic (iter, &value); + str = strdup (value); + if (str == NULL) + goto oom; + + buffer[count] = str; + + dbus_message_iter_next(iter); + count++; + } + + if ((count % 8) == 0) { + buffer = realloc (buffer, sizeof (char *) * (count + 1)); + if (buffer == NULL) + goto oom; + } + + buffer[count] = NULL; + return buffer; + +oom: + fprintf (stderr, "%s %d : error allocating memory\n", __FILE__, __LINE__); + return NULL; + +} + /** Frees a nul-terminated string * * @param str The nul-terminated sting to free @@ -176,6 +238,74 @@ libhal_ctx_get_user_data(LibHalContext *ctx) } +/** Fills in the value for the LibHalProperty given a variant iterator. + * + * @param p The property to fill in + * @param var_iter Varient iterator to extract the value from + */ +dbus_bool_t +libhal_property_fill_value_from_variant (LibHalProperty *p, DBusMessageIter *var_iter) +{ + switch (p->type) { + case DBUS_TYPE_ARRAY: + if (dbus_message_iter_get_element_type (var_iter) != DBUS_TYPE_STRING) + return FALSE; + + p->strlist_value = libhal_get_string_array_from_iter (var_iter); + + p->type = LIBHAL_PROPERTY_TYPE_STRLIST; + + break; + case DBUS_TYPE_STRING: + { + const char *v; + + dbus_message_iter_get_basic (var_iter, &v); + + p->str_value = strdup (v); + if (p->str_value == NULL) + return FALSE; + + break; + } + case DBUS_TYPE_INT32: + { + dbus_int32_t v; + + dbus_message_iter_get_basic (var_iter, &v); + + p->int_value = v; + + break; + } + case DBUS_TYPE_UINT64: + { + dbus_uint64_t v; + + dbus_message_iter_get_basic (var_iter, &v); + + p->uint64_value = v; + + break; + } + case DBUS_TYPE_DOUBLE: + { + double v; + + dbus_message_iter_get_basic (var_iter, &v); + + p->double_value = v; + + break; + } + default: + /** @todo report error */ + break; + } + + return TRUE; +} + /** Retrieve all the properties on a device. * * @param ctx The context for the connection to hald @@ -188,14 +318,15 @@ libhal_device_get_all_properties (LibHalContext *ctx, const char *udi, DBusError { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter reply_iter; DBusMessageIter dict_iter; LibHalPropertySet *result; - LibHalProperty **pn; + LibHalProperty *p_last; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device", "GetAllProperties"); + if (message == NULL) { fprintf (stderr, "%s %d : Couldn't allocate D-BUS message\n", @@ -207,6 +338,10 @@ libhal_device_get_all_properties (LibHalContext *ctx, const char *udi, DBusError message, -1, error); if (dbus_error_is_set (error)) { + fprintf (stderr, + "%s %d : %s\n", + __FILE__, __LINE__, error->message); + dbus_message_unref (message); return NULL; } @@ -216,17 +351,11 @@ libhal_device_get_all_properties (LibHalContext *ctx, const char *udi, DBusError return NULL; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); result = malloc (sizeof (LibHalPropertySet)); - if (result == NULL) { - fprintf (stderr, "%s %d : error allocating memory\n", - __FILE__, __LINE__); - dbus_message_unref (message); - dbus_message_unref (reply); - return NULL; - } - + if (result == NULL) + goto oom; /* result->properties = malloc(sizeof(LibHalProperty)*result->num_properties); if( result->properties==NULL ) @@ -236,123 +365,78 @@ libhal_device_get_all_properties (LibHalContext *ctx, const char *udi, DBusError } */ - pn = &result->properties_head; + result->properties_head = NULL; result->num_properties = 0; - dbus_message_iter_init_dict_iterator (&iter, &dict_iter); + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_ARRAY && + dbus_message_iter_get_element_type (&reply_iter) != DBUS_TYPE_DICT_ENTRY) { + fprintf (stderr, "%s %d : error, expecting an array of dict entries\n", + __FILE__, __LINE__); + dbus_message_unref (message); + dbus_message_unref (reply); + return NULL; + } + + dbus_message_iter_recurse (&reply_iter, &dict_iter); + + p_last = NULL; - do { - char *dbus_str; + while (dbus_message_iter_get_arg_type (&dict_iter) + == DBUS_TYPE_DICT_ENTRY) + { + DBusMessageIter dict_entry_iter, var_iter; + const char *key; LibHalProperty *p; + dbus_message_iter_recurse (&dict_iter, &dict_entry_iter); + + dbus_message_iter_get_basic (&dict_entry_iter, &key); + p = malloc (sizeof (LibHalProperty)); - if (p == NULL) { - fprintf (stderr, - "%s %d : error allocating memory\n", - __FILE__, __LINE__); - /** @todo FIXME cleanup */ - return NULL; - } + if (p == NULL) + goto oom; - *pn = p; - pn = &p->next; p->next = NULL; + + if (result->num_properties == 0) + result->properties_head = p; + + if (p_last != NULL) + p_last->next = p; + + p_last = p; + + p->key = strdup (key); + if (p->key == NULL) + goto oom; + + dbus_message_iter_next (&dict_entry_iter); + + dbus_message_iter_recurse (&dict_entry_iter, &var_iter); + + p->type = dbus_message_iter_get_arg_type (&var_iter); + result->num_properties++; - dbus_str = dbus_message_iter_get_dict_key (&dict_iter); - p->key = - (char *) ((dbus_str != NULL) ? strdup (dbus_str) : - NULL); - if (p->key == NULL) { - fprintf (stderr, - "%s %d : error allocating memory\n", - __FILE__, __LINE__); - /** @todo FIXME cleanup */ - return NULL; - } - dbus_free (dbus_str); - - p->type = dbus_message_iter_get_arg_type (&dict_iter); - - switch (p->type) { - case DBUS_TYPE_STRING: - dbus_str = dbus_message_iter_get_string (&dict_iter); - if (dbus_str != NULL && dbus_str[0]=='\t') { - unsigned int i; - unsigned int num_elems; - char *r; - char **str_array; - - /* TODO FIXME HACK XXX: hack for string lists */ - - for (r = dbus_str + 1, num_elems = 0; r != NULL; r = strchr (r + 1, '\t')) - num_elems++; - - p->type = LIBHAL_PROPERTY_TYPE_STRLIST; - - --num_elems; - str_array = calloc (num_elems + 1, sizeof (char *)); - - r = dbus_str; - for (i = 0; i < num_elems; i++) { - char *q; - char *res; - - q = strchr (r + 1, '\t'); - if (q == NULL) - break; - res = calloc (q - r - 1 + 1, sizeof (char)); - strncpy (res, r + 1, (size_t) (q - r)); - res[q - r - 1] = '\0'; - str_array [i] = res; - - r = q; - } - str_array[i] = NULL; - p->strlist_value = str_array; - - } else { - p->str_value = (char *) ((dbus_str != NULL) ? strdup (dbus_str) : NULL); - if (p->str_value == NULL) { - fprintf (stderr, - "%s %d : error allocating memory\n", - __FILE__, __LINE__); - /** @todo FIXME cleanup */ - return NULL; - } - } - dbus_free (dbus_str); - break; - case DBUS_TYPE_INT32: - p->int_value = - dbus_message_iter_get_int32 (&dict_iter); - break; - case DBUS_TYPE_UINT64: - p->uint64_value = - dbus_message_iter_get_uint64 (&dict_iter); - break; - case DBUS_TYPE_DOUBLE: - p->double_value = - dbus_message_iter_get_double (&dict_iter); - break; - case DBUS_TYPE_BOOLEAN: - p->bool_value = - dbus_message_iter_get_boolean (&dict_iter); - break; + if(!libhal_property_fill_value_from_variant (p, &var_iter)) + goto oom; - default: - /** @todo report error */ - break; - } + + dbus_message_iter_next (&dict_iter); } - while (dbus_message_iter_has_next (&dict_iter) && - dbus_message_iter_next (&dict_iter)); dbus_message_unref (message); dbus_message_unref (reply); return result; + +oom: + fprintf (stderr, + "%s %d : error allocating memory\n", + __FILE__, __LINE__); + /** @todo FIXME cleanup */ + return NULL; } /** Free a property set earlier obtained with libhal_device_get_all_properties(). @@ -393,6 +477,7 @@ libhal_psi_init (LibHalPropertySetIterator * iter, LibHalPropertySet * set) iter->cur_prop = set->properties_head; } + /** Determine whether there are more properties to iterate over * * @param iter Iterator object @@ -581,8 +666,7 @@ filter_func (DBusConnection * connection, char *condition_name; dbus_message_iter_init (message, &iter); - condition_name = - dbus_message_iter_get_string (&iter); + dbus_message_iter_get_basic (&iter, &condition_name); ctx->device_condition (ctx, object_path, @@ -599,25 +683,23 @@ filter_func (DBusConnection * connection, if (ctx->device_property_modified != NULL) { int i; char *key; - dbus_bool_t removed, added; + dbus_bool_t removed; + dbus_bool_t added; int num_modifications; DBusMessageIter iter; dbus_message_iter_init (message, &iter); - num_modifications = - dbus_message_iter_get_int32 (&iter); + dbus_message_iter_get_basic (&iter, &num_modifications); dbus_message_iter_next (&iter); for (i = 0; i < num_modifications; i++) { - key = dbus_message_iter_get_string (&iter); + dbus_message_iter_get_basic (&iter, &key); dbus_message_iter_next (&iter); - removed = - dbus_message_iter_get_boolean (&iter); + dbus_message_iter_get_basic (&iter, &removed); dbus_message_iter_next (&iter); - added = - dbus_message_iter_get_boolean (&iter); + dbus_message_iter_get_basic (&iter, &added); dbus_message_iter_next (&iter); ctx-> @@ -794,11 +876,9 @@ libhal_shutdown (LibHalContext *ctx) char ** libhal_get_all_devices (LibHalContext *ctx, int *num_devices, DBusError *error) { - int i; DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; - char **device_names; + DBusMessageIter iter_array, reply_iter; char **hal_device_names; *num_devices = 0; @@ -823,38 +903,20 @@ libhal_get_all_devices (LibHalContext *ctx, int *num_devices, DBusError *error) } /* now analyze reply */ - dbus_message_iter_init (reply, &iter); - if (!dbus_message_iter_get_string_array (&iter, - &device_names, - num_devices)) { - fprintf (stderr, "%s %d : wrong reply from hald\n", __FILE__, __LINE__); + dbus_message_iter_init (reply, &reply_iter); + + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_ARRAY) { + fprintf (stderr, "%s %d : wrong reply from hald. Expecting an array.\n", __FILE__, __LINE__); return NULL; } + + dbus_message_iter_recurse (&reply_iter, &iter_array); + hal_device_names = libhal_get_string_array_from_iter (&iter_array); + dbus_message_unref (reply); dbus_message_unref (message); - /* Have to convert from dbus string array to hal string array - * since we can't poke at the dbus string array for the reason - * that d-bus use their own memory allocation scheme - */ - hal_device_names = malloc (sizeof (char *) * ((*num_devices) + 1)); - if (hal_device_names == NULL) - return NULL; - /** @todo Handle OOM better */ - - for (i = 0; i < (*num_devices); i++) { - hal_device_names[i] = strdup (device_names[i]); - if (hal_device_names[i] == NULL) { - fprintf (stderr, "%s %d : error allocating memory\n", __FILE__, __LINE__); - /** @todo FIXME cleanup */ - return NULL; - } - } - hal_device_names[i] = NULL; - - dbus_free_string_array (device_names); - return hal_device_names; } @@ -865,14 +927,14 @@ libhal_get_all_devices (LibHalContext *ctx, int *num_devices, DBusError *error) * @param key Name of the property * @return One of DBUS_TYPE_STRING, DBUS_TYPE_INT32, * DBUS_TYPE_UINT64, DBUS_TYPE_BOOL, DBUS_TYPE_DOUBLE or - * DBUS_TYPE_NIL if the property didn't exist. + * DBUS_TYPE_INVALID if the property didn't exist. */ LibHalPropertyType libhal_device_get_property_type (LibHalContext *ctx, const char *udi, const char *key, DBusError *error) { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; int type; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, @@ -880,25 +942,25 @@ libhal_device_get_property_type (LibHalContext *ctx, const char *udi, const char "GetPropertyType"); if (message == NULL) { fprintf (stderr, "%s %d : Couldn't allocate D-BUS message\n", __FILE__, __LINE__); - return LIBHAL_PROPERTY_TYPE_NIL; + return LIBHAL_PROPERTY_TYPE_INVALID; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, error); if (dbus_error_is_set (error)) { dbus_message_unref (message); - return LIBHAL_PROPERTY_TYPE_NIL; + return LIBHAL_PROPERTY_TYPE_INVALID; } if (reply == NULL) { dbus_message_unref (message); - return LIBHAL_PROPERTY_TYPE_NIL; + return LIBHAL_PROPERTY_TYPE_INVALID; } - dbus_message_iter_init (reply, &iter); - type = dbus_message_iter_get_int32 (&iter); + dbus_message_iter_init (reply, &reply_iter); + dbus_message_iter_get_basic (&reply_iter, &type); dbus_message_unref (message); dbus_message_unref (reply); @@ -922,12 +984,9 @@ libhal_device_get_property_type (LibHalContext *ctx, const char *udi, const char char ** libhal_device_get_property_strlist (LibHalContext *ctx, const char *udi, const char *key, DBusError *error) { - int i; DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; - char **string_values; - int num_strings; + DBusMessageIter iter, iter_array, reply_iter; char **our_strings; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, @@ -940,8 +999,8 @@ libhal_device_get_property_strlist (LibHalContext *ctx, const char *udi, const c return NULL; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, error); @@ -954,36 +1013,19 @@ libhal_device_get_property_strlist (LibHalContext *ctx, const char *udi, const c return NULL; } /* now analyse reply */ - dbus_message_iter_init (reply, &iter); - if (!dbus_message_iter_get_string_array (&iter, - &string_values, - &num_strings)) { - fprintf (stderr, "%s %d : wrong reply from hald\n", - __FILE__, __LINE__); - return NULL; - } - - dbus_message_unref (message); - dbus_message_unref (reply); + dbus_message_iter_init (reply, &reply_iter); - /* Have to convert from dbus string array to hal string array - * since we can't poke at the dbus string array for the reason - * that d-bus use their own memory allocation scheme - */ - our_strings = malloc (sizeof (char *) * ((num_strings) + 1)); - if (our_strings == NULL) + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_ARRAY) { + fprintf (stderr, "%s %d : wrong reply from hald. Expecting an array.\n", __FILE__, __LINE__); return NULL; - /** @todo Handle OOM better */ - - for (i = 0; i < num_strings; i++) { - our_strings[i] = strdup (string_values[i]); - if (our_strings[i] == NULL) - return NULL; - /** @todo Handle OOM better */ } - our_strings[i] = NULL; + + dbus_message_iter_recurse (&reply_iter, &iter_array); - dbus_free_string_array (string_values); + our_strings = libhal_get_string_array_from_iter (&iter_array); + + dbus_message_unref (reply); + dbus_message_unref (message); return our_strings; } @@ -1005,13 +1047,14 @@ libhal_device_get_property_string (LibHalContext *ctx, { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; char *value; char *dbus_str; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device", "GetPropertyString"); + if (message == NULL) { fprintf (stderr, "%s %d : Couldn't allocate D-BUS message\n", @@ -1019,9 +1062,9 @@ libhal_device_get_property_string (LibHalContext *ctx, return NULL; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); - + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); + reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, error); @@ -1034,21 +1077,17 @@ libhal_device_get_property_string (LibHalContext *ctx, return NULL; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); /* now analyze reply */ - if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_NIL) { - dbus_message_unref (message); - dbus_message_unref (reply); - return NULL; - } else if (dbus_message_iter_get_arg_type (&iter) != + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_STRING) { dbus_message_unref (message); dbus_message_unref (reply); return NULL; } - dbus_str = dbus_message_iter_get_string (&iter); + dbus_message_iter_get_basic (&reply_iter, &dbus_str); value = (char *) ((dbus_str != NULL) ? strdup (dbus_str) : NULL); if (value == NULL) { fprintf (stderr, "%s %d : error allocating memory\n", @@ -1056,7 +1095,6 @@ libhal_device_get_property_string (LibHalContext *ctx, /** @todo FIXME cleanup */ return NULL; } - dbus_free (dbus_str); dbus_message_unref (message); dbus_message_unref (reply); @@ -1076,7 +1114,7 @@ libhal_device_get_property_int (LibHalContext *ctx, { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; dbus_int32_t value; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, @@ -1089,8 +1127,8 @@ libhal_device_get_property_int (LibHalContext *ctx, return -1; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1104,18 +1142,10 @@ libhal_device_get_property_int (LibHalContext *ctx, return -1; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); /* now analyze reply */ - if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_NIL) { - /* property didn't exist */ - fprintf (stderr, - "%s %d : property '%s' for device '%s' does not " - "exist\n", __FILE__, __LINE__, key, udi); - dbus_message_unref (message); - dbus_message_unref (reply); - return -1; - } else if (dbus_message_iter_get_arg_type (&iter) != + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_INT32) { fprintf (stderr, "%s %d : property '%s' for device '%s' is not " @@ -1125,7 +1155,7 @@ libhal_device_get_property_int (LibHalContext *ctx, dbus_message_unref (reply); return -1; } - value = dbus_message_iter_get_int32 (&iter); + dbus_message_iter_get_basic (&reply_iter, &value); dbus_message_unref (message); dbus_message_unref (reply); @@ -1145,7 +1175,7 @@ libhal_device_get_property_uint64 (LibHalContext *ctx, { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; dbus_uint64_t value; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, @@ -1158,8 +1188,8 @@ libhal_device_get_property_uint64 (LibHalContext *ctx, return -1; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1173,18 +1203,9 @@ libhal_device_get_property_uint64 (LibHalContext *ctx, return -1; } - dbus_message_iter_init (reply, &iter); - + dbus_message_iter_init (reply, &reply_iter); /* now analyze reply */ - if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_NIL) { - /* property didn't exist */ - fprintf (stderr, - "%s %d : property '%s' for device '%s' does not " - "exist\n", __FILE__, __LINE__, key, udi); - dbus_message_unref (message); - dbus_message_unref (reply); - return -1; - } else if (dbus_message_iter_get_arg_type (&iter) != + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_UINT64) { fprintf (stderr, "%s %d : property '%s' for device '%s' is not " @@ -1194,7 +1215,7 @@ libhal_device_get_property_uint64 (LibHalContext *ctx, dbus_message_unref (reply); return -1; } - value = dbus_message_iter_get_uint64 (&iter); + dbus_message_iter_get_basic (&reply_iter, &value); dbus_message_unref (message); dbus_message_unref (reply); @@ -1214,7 +1235,7 @@ libhal_device_get_property_double (LibHalContext *ctx, { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; double value; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, @@ -1227,8 +1248,8 @@ libhal_device_get_property_double (LibHalContext *ctx, return -1.0f; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1242,18 +1263,10 @@ libhal_device_get_property_double (LibHalContext *ctx, return -1.0f; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); /* now analyze reply */ - if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_NIL) { - /* property didn't exist */ - fprintf (stderr, - "%s %d : property '%s' for device '%s' does not " - "exist\n", __FILE__, __LINE__, key, udi); - dbus_message_unref (message); - dbus_message_unref (reply); - return -1.0f; - } else if (dbus_message_iter_get_arg_type (&iter) != + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_DOUBLE) { fprintf (stderr, "%s %d : property '%s' for device '%s' is not " @@ -1262,7 +1275,7 @@ libhal_device_get_property_double (LibHalContext *ctx, dbus_message_unref (reply); return -1.0f; } - value = dbus_message_iter_get_double (&iter); + dbus_message_iter_get_basic (&reply_iter, &value); dbus_message_unref (message); dbus_message_unref (reply); @@ -1282,8 +1295,8 @@ libhal_device_get_property_bool (LibHalContext *ctx, { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; - double value; + DBusMessageIter iter, reply_iter; + dbus_bool_t value; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device", @@ -1295,8 +1308,8 @@ libhal_device_get_property_bool (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1310,18 +1323,10 @@ libhal_device_get_property_bool (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); /* now analyze reply */ - if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_NIL) { - /* property didn't exist */ - fprintf (stderr, - "%s %d : property '%s' for device '%s' does not " - "exist\n", __FILE__, __LINE__, key, udi); - dbus_message_unref (message); - dbus_message_unref (reply); - return FALSE; - } else if (dbus_message_iter_get_arg_type (&iter) != + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_BOOLEAN) { fprintf (stderr, "%s %d : property '%s' for device '%s' is not " @@ -1330,7 +1335,7 @@ libhal_device_get_property_bool (LibHalContext *ctx, dbus_message_unref (reply); return FALSE; } - value = dbus_message_iter_get_boolean (&iter); + dbus_message_iter_get_basic (&reply_iter, &value); dbus_message_unref (message); dbus_message_unref (reply); @@ -1357,9 +1362,8 @@ libhal_device_set_property_helper (LibHalContext *ctx, char *method_name = NULL; /** @todo sanity check incoming params */ - switch (type) { - case DBUS_TYPE_NIL: + case DBUS_TYPE_INVALID: method_name = "RemoveProperty"; break; case DBUS_TYPE_STRING: @@ -1391,26 +1395,23 @@ libhal_device_set_property_helper (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); switch (type) { - case DBUS_TYPE_NIL: - dbus_message_iter_append_nil (&iter); - break; case DBUS_TYPE_STRING: - dbus_message_iter_append_string (&iter, str_value); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &str_value); break; case DBUS_TYPE_INT32: - dbus_message_iter_append_int32 (&iter, int_value); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &int_value); break; case DBUS_TYPE_UINT64: - dbus_message_iter_append_uint64 (&iter, uint64_value); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT64, &uint64_value); break; case DBUS_TYPE_DOUBLE: - dbus_message_iter_append_double (&iter, double_value); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_DOUBLE, &double_value); break; case DBUS_TYPE_BOOLEAN: - dbus_message_iter_append_boolean (&iter, bool_value); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &bool_value); break; } @@ -1542,8 +1543,8 @@ dbus_bool_t libhal_device_remove_property (LibHalContext *ctx, const char *udi, const char *key, DBusError *error) { - return libhal_device_set_property_helper (ctx, udi, key, DBUS_TYPE_NIL, - /* DBUS_TYPE_NIL means remove */ + return libhal_device_set_property_helper (ctx, udi, key, DBUS_TYPE_INVALID, + /* DBUS_TYPE_INVALID means remove */ NULL, 0, 0, 0.0f, FALSE, error); } @@ -1567,9 +1568,9 @@ libhal_device_property_strlist_append (LibHalContext *ctx, __FILE__, __LINE__); return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); - dbus_message_iter_append_string (&iter, value); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &value); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1605,9 +1606,9 @@ libhal_device_property_strlist_prepend (LibHalContext *ctx, __FILE__, __LINE__); return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); - dbus_message_iter_append_string (&iter, value); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &value); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1643,9 +1644,9 @@ libhal_device_property_strlist_remove_index (LibHalContext *ctx, __FILE__, __LINE__); return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); - dbus_message_iter_append_uint32 (&iter, index); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &index); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1680,9 +1681,9 @@ libhal_device_property_strlist_remove (LibHalContext *ctx, __FILE__, __LINE__); return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); - dbus_message_iter_append_string (&iter, value); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &value); reply = dbus_connection_send_with_reply_and_block (ctx->connection, message, -1, @@ -1737,8 +1738,8 @@ libhal_device_lock (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, reason_to_lock); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &reason_to_lock); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -1833,7 +1834,7 @@ libhal_agent_new_device (LibHalContext *ctx, DBusError *error) { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter reply_iter; char *value; char *dbus_str; @@ -1861,10 +1862,10 @@ libhal_agent_new_device (LibHalContext *ctx, DBusError *error) return NULL; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); /* now analyze reply */ - if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING) { + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_STRING) { fprintf (stderr, "%s %d : expected a string in reply to NewDevice\n", __FILE__, __LINE__); @@ -1873,7 +1874,7 @@ libhal_agent_new_device (LibHalContext *ctx, DBusError *error) return NULL; } - dbus_str = dbus_message_iter_get_string (&iter); + dbus_message_iter_get_basic (&reply_iter, &dbus_str); value = (char *) ((dbus_str != NULL) ? strdup (dbus_str) : NULL); if (value == NULL) { fprintf (stderr, "%s %d : error allocating memory\n", @@ -1881,7 +1882,6 @@ libhal_agent_new_device (LibHalContext *ctx, DBusError *error) /** @todo FIXME cleanup */ return NULL; } - dbus_free (dbus_str); dbus_message_unref (message); dbus_message_unref (reply); @@ -1926,9 +1926,9 @@ libhal_agent_commit_to_gdl (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, temp_udi); - dbus_message_iter_append_string (&iter, udi); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &temp_udi); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &udi); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -1977,8 +1977,8 @@ libhal_agent_remove_device (LibHalContext *ctx, const char *udi, DBusError *erro return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, udi); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &udi); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2009,7 +2009,7 @@ libhal_device_exists (LibHalContext *ctx, const char *udi, DBusError *error) { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; dbus_bool_t value; message = dbus_message_new_method_call ("org.freedesktop.Hal", @@ -2023,8 +2023,8 @@ libhal_device_exists (LibHalContext *ctx, const char *udi, DBusError *error) return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, udi); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &udi); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2039,10 +2039,10 @@ libhal_device_exists (LibHalContext *ctx, const char *udi, DBusError *error) return FALSE; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); /* now analyze reply */ - if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN) { + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_BOOLEAN) { fprintf (stderr, "%s %d : expected a bool in reply to DeviceExists\n", __FILE__, __LINE__); @@ -2051,7 +2051,7 @@ libhal_device_exists (LibHalContext *ctx, const char *udi, DBusError *error) return FALSE; } - value = dbus_message_iter_get_boolean (&iter); + dbus_message_iter_get_basic (&reply_iter, &value); dbus_message_unref (message); dbus_message_unref (reply); @@ -2071,7 +2071,7 @@ libhal_device_property_exists (LibHalContext *ctx, { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; dbus_bool_t value; message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, @@ -2084,8 +2084,8 @@ libhal_device_property_exists (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2100,10 +2100,10 @@ libhal_device_property_exists (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (reply, &iter); + dbus_message_iter_init (reply, &reply_iter); /* now analyse reply */ - if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN) { + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_BOOLEAN) { fprintf (stderr, "%s %d : expected a bool in reply to " "PropertyExists\n", __FILE__, __LINE__); dbus_message_unref (message); @@ -2111,7 +2111,7 @@ libhal_device_property_exists (LibHalContext *ctx, return FALSE; } - value = dbus_message_iter_get_boolean (&iter); + dbus_message_iter_get_basic (&reply_iter, &value); dbus_message_unref (message); dbus_message_unref (reply); @@ -2144,9 +2144,9 @@ libhal_agent_merge_properties (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, target_udi); - dbus_message_iter_append_string (&iter, source_udi); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &target_udi); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &source_udi); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2192,7 +2192,7 @@ libhal_agent_device_matches (LibHalContext *ctx, { DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; + DBusMessageIter iter, reply_iter; dbus_bool_t value; message = dbus_message_new_method_call ("org.freedesktop.Hal", @@ -2206,10 +2206,10 @@ libhal_agent_device_matches (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, udi1); - dbus_message_iter_append_string (&iter, udi2); - dbus_message_iter_append_string (&iter, property_namespace); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, udi1); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, udi2); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, property_namespace); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2224,8 +2224,9 @@ libhal_agent_device_matches (LibHalContext *ctx, return FALSE; } /* now analyse reply */ - dbus_message_iter_init (reply, &iter); - if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN) { + dbus_message_iter_init (reply, &reply_iter); + + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_BOOLEAN) { fprintf (stderr, "%s %d : expected a bool in reply to DeviceMatches\n", __FILE__, __LINE__); @@ -2234,7 +2235,7 @@ libhal_agent_device_matches (LibHalContext *ctx, return FALSE; } - value = dbus_message_iter_get_boolean (&iter); + dbus_message_iter_get_basic (&reply_iter, &value); dbus_message_unref (message); dbus_message_unref (reply); @@ -2263,6 +2264,7 @@ libhal_device_print (LibHalContext *ctx, const char *udi, DBusError *error) libhal_psi_next (&i)) { type = libhal_psi_get_type (&i); key = libhal_psi_get_key (&i); + switch (type) { case LIBHAL_PROPERTY_TYPE_STRING: printf (" %s = '%s' (string)\n", key, @@ -2300,6 +2302,7 @@ libhal_device_print (LibHalContext *ctx, const char *udi, DBusError *error) printf (", "); } printf ("] (string list)\n"); + break; } default: @@ -2307,6 +2310,7 @@ libhal_device_print (LibHalContext *ctx, const char *udi, DBusError *error) break; } } + libhal_free_property_set (pset); return TRUE; @@ -2327,11 +2331,9 @@ libhal_manager_find_device_string_match (LibHalContext *ctx, const char *key, const char *value, int *num_devices, DBusError *error) { - int i; DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; - char **device_names; + DBusMessageIter iter, iter_array, reply_iter; char **hal_device_names; message = dbus_message_new_method_call ("org.freedesktop.Hal", @@ -2345,9 +2347,9 @@ libhal_manager_find_device_string_match (LibHalContext *ctx, return NULL; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, key); - dbus_message_iter_append_string (&iter, value); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &value); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2362,36 +2364,19 @@ libhal_manager_find_device_string_match (LibHalContext *ctx, return NULL; } /* now analyse reply */ - dbus_message_iter_init (reply, &iter); - if (!dbus_message_iter_get_string_array (&iter, - &device_names, - num_devices)) { - fprintf (stderr, "%s %d : wrong reply from hald\n", - __FILE__, __LINE__); - return NULL; - } - - dbus_message_unref (message); - dbus_message_unref (reply); + dbus_message_iter_init (reply, &reply_iter); - /* Have to convert from dbus string array to hal string array - * since we can't poke at the dbus string array for the reason - * that d-bus use their own memory allocation scheme - */ - hal_device_names = malloc (sizeof (char *) * ((*num_devices) + 1)); - if (hal_device_names == NULL) + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_ARRAY) { + fprintf (stderr, "%s %d : wrong reply from hald. Expecting an array.\n", __FILE__, __LINE__); return NULL; - /** @todo Handle OOM better */ - - for (i = 0; i < (*num_devices); i++) { - hal_device_names[i] = strdup (device_names[i]); - if (hal_device_names[i] == NULL) - return NULL; - /** @todo Handle OOM better */ } - hal_device_names[i] = NULL; + + dbus_message_iter_recurse (&reply_iter, &iter_array); - dbus_free_string_array (device_names); + hal_device_names = libhal_get_string_array_from_iter (&iter_array); + + dbus_message_unref (reply); + dbus_message_unref (message); return hal_device_names; } @@ -2423,8 +2408,8 @@ libhal_device_add_capability (LibHalContext *ctx, return FALSE; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, capability); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &capability); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2479,11 +2464,9 @@ char ** libhal_find_device_by_capability (LibHalContext *ctx, const char *capability, int *num_devices, DBusError *error) { - int i; DBusMessage *message; DBusMessage *reply; - DBusMessageIter iter; - char **device_names; + DBusMessageIter iter, iter_array, reply_iter; char **hal_device_names; message = dbus_message_new_method_call ("org.freedesktop.Hal", @@ -2497,8 +2480,8 @@ libhal_find_device_by_capability (LibHalContext *ctx, return NULL; } - dbus_message_iter_init (message, &iter); - dbus_message_iter_append_string (&iter, capability); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &capability); reply = dbus_connection_send_with_reply_and_block (ctx->connection, @@ -2513,36 +2496,19 @@ libhal_find_device_by_capability (LibHalContext *ctx, return NULL; } /* now analyse reply */ - dbus_message_iter_init (reply, &iter); - if (!dbus_message_iter_get_string_array (&iter, - &device_names, - num_devices)) { - fprintf (stderr, "%s %d : wrong reply from hald\n", - __FILE__, __LINE__); - return NULL; - } + dbus_message_iter_init (reply, &reply_iter); - dbus_message_unref (message); - dbus_message_unref (reply); - - /* Have to convert from dbus string array to hal string array - * since we can't poke at the dbus string array for the reason - * that d-bus use their own memory allocation scheme - */ - hal_device_names = malloc (sizeof (char *) * ((*num_devices) + 1)); - if (hal_device_names == NULL) + if (dbus_message_iter_get_arg_type (&reply_iter) != DBUS_TYPE_ARRAY) { + fprintf (stderr, "%s %d : wrong reply from hald. Expecting an array.\n", __FILE__, __LINE__); return NULL; - /** @todo Handle OOM better */ - - for (i = 0; i < (*num_devices); i++) { - hal_device_names[i] = strdup (device_names[i]); - if (hal_device_names[i] == NULL) - return NULL; - /** @todo Handle OOM better */ } - hal_device_names[i] = NULL; + + dbus_message_iter_recurse (&reply_iter, &iter_array); - dbus_free_string_array (device_names); + hal_device_names = libhal_get_string_array_from_iter (&iter_array); + + dbus_message_unref (reply); + dbus_message_unref (message); return hal_device_names; } @@ -2787,12 +2753,11 @@ dbus_bool_t libhal_device_rescan (LibHalContext *ctx, const char *udi, DBusError *error) { DBusMessage *message; - DBusMessageIter iter; + DBusMessageIter reply_iter; DBusMessage *reply; dbus_bool_t result; - message = dbus_message_new_method_call ("org.freedesktop.Hal", - udi, + message = dbus_message_new_method_call ("org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device", "Rescan"); @@ -2817,8 +2782,14 @@ libhal_device_rescan (LibHalContext *ctx, const char *udi, DBusError *error) if (reply == NULL) return FALSE; - dbus_message_iter_init (reply, &iter); - result = dbus_message_iter_get_boolean (&iter); + dbus_message_iter_init (reply, &reply_iter); + if (dbus_message_iter_get_arg_type (&reply_iter) != + DBUS_TYPE_BOOLEAN) { + dbus_message_unref (message); + dbus_message_unref (reply); + return FALSE; + } + dbus_message_iter_get_basic (&reply_iter, &result); dbus_message_unref (reply); @@ -2829,7 +2800,7 @@ dbus_bool_t libhal_device_reprobe (LibHalContext *ctx, const char *udi, DBusError *error) { DBusMessage *message; - DBusMessageIter iter; + DBusMessageIter reply_iter; DBusMessage *reply; dbus_bool_t result; @@ -2859,8 +2830,14 @@ libhal_device_reprobe (LibHalContext *ctx, const char *udi, DBusError *error) if (reply == NULL) return FALSE; - dbus_message_iter_init (reply, &iter); - result = dbus_message_iter_get_boolean (&iter); + dbus_message_iter_init (reply, &reply_iter); + if (dbus_message_iter_get_arg_type (&reply_iter) != + DBUS_TYPE_BOOLEAN) { + dbus_message_unref (message); + dbus_message_unref (reply); + return FALSE; + } + dbus_message_iter_get_basic (&reply_iter, &result); dbus_message_unref (reply); diff --git a/libhal/libhal.h b/libhal/libhal.h index 311b4a09..9fe29dbf 100644 --- a/libhal/libhal.h +++ b/libhal/libhal.h @@ -44,7 +44,7 @@ extern "C" { /** Possible types for properties on hal device objects */ typedef enum { /** Used to report error condition */ - LIBHAL_PROPERTY_TYPE_NIL = DBUS_TYPE_NIL, + LIBHAL_PROPERTY_TYPE_INVALID = DBUS_TYPE_INVALID, /** Type for 32-bit signed integer property */ LIBHAL_PROPERTY_TYPE_INT32 = DBUS_TYPE_INT32, @@ -157,8 +157,6 @@ char **libhal_get_all_devices (LibHalContext *ctx, int *num_devices, DBus dbus_bool_t libhal_device_exists (LibHalContext *ctx, const char *udi, DBusError *error); dbus_bool_t libhal_device_print (LibHalContext *ctx, const char *udi, DBusError *error); - - dbus_bool_t libhal_device_property_exists (LibHalContext *ctx, const char *udi, const char *key, |