dbus_dict_helpers.c
Go to the documentation of this file.
00001 /*
00002  * WPA Supplicant / dbus-based control interface
00003  * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License version 2 as
00007  * published by the Free Software Foundation.
00008  *
00009  * Alternatively, this software may be distributed under the terms of BSD
00010  * license.
00011  *
00012  * See README and COPYING for more details.
00013  */
00014 
00015 #include "includes.h"
00016 #include <dbus/dbus.h>
00017 
00018 #include "common.h"
00019 #include "dbus_dict_helpers.h"
00020 
00021 
00031 dbus_bool_t wpa_dbus_dict_open_write(DBusMessageIter *iter,
00032                                      DBusMessageIter *iter_dict)
00033 {
00034         dbus_bool_t result;
00035 
00036         if (!iter || !iter_dict)
00037                 return FALSE;
00038 
00039         result = dbus_message_iter_open_container(
00040                 iter,
00041                 DBUS_TYPE_ARRAY,
00042                 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
00043                 DBUS_TYPE_STRING_AS_STRING
00044                 DBUS_TYPE_VARIANT_AS_STRING
00045                 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
00046                 iter_dict);
00047         return result;
00048 }
00049 
00050 
00062 dbus_bool_t wpa_dbus_dict_close_write(DBusMessageIter *iter,
00063                                       DBusMessageIter *iter_dict)
00064 {
00065         if (!iter || !iter_dict)
00066                 return FALSE;
00067 
00068         return dbus_message_iter_close_container(iter, iter_dict);
00069 }
00070 
00071 
00072 const char * wpa_dbus_type_as_string(const int type)
00073 {
00074         switch(type) {
00075         case DBUS_TYPE_BYTE:
00076                 return DBUS_TYPE_BYTE_AS_STRING;
00077         case DBUS_TYPE_BOOLEAN:
00078                 return DBUS_TYPE_BOOLEAN_AS_STRING;
00079         case DBUS_TYPE_INT16:
00080                 return DBUS_TYPE_INT16_AS_STRING;
00081         case DBUS_TYPE_UINT16:
00082                 return DBUS_TYPE_UINT16_AS_STRING;
00083         case DBUS_TYPE_INT32:
00084                 return DBUS_TYPE_INT32_AS_STRING;
00085         case DBUS_TYPE_UINT32:
00086                 return DBUS_TYPE_UINT32_AS_STRING;
00087         case DBUS_TYPE_INT64:
00088                 return DBUS_TYPE_INT64_AS_STRING;
00089         case DBUS_TYPE_UINT64:
00090                 return DBUS_TYPE_UINT64_AS_STRING;
00091         case DBUS_TYPE_DOUBLE:
00092                 return DBUS_TYPE_DOUBLE_AS_STRING;
00093         case DBUS_TYPE_STRING:
00094                 return DBUS_TYPE_STRING_AS_STRING;
00095         case DBUS_TYPE_OBJECT_PATH:
00096                 return DBUS_TYPE_OBJECT_PATH_AS_STRING;
00097         case DBUS_TYPE_ARRAY:
00098                 return DBUS_TYPE_ARRAY_AS_STRING;
00099         default:
00100                 return NULL;
00101         }
00102 }
00103 
00104 
00105 static dbus_bool_t _wpa_dbus_add_dict_entry_start(
00106         DBusMessageIter *iter_dict, DBusMessageIter *iter_dict_entry,
00107         const char *key, const int value_type)
00108 {
00109         if (!dbus_message_iter_open_container(iter_dict,
00110                                               DBUS_TYPE_DICT_ENTRY, NULL,
00111                                               iter_dict_entry))
00112                 return FALSE;
00113 
00114         if (!dbus_message_iter_append_basic(iter_dict_entry, DBUS_TYPE_STRING,
00115                                             &key))
00116                 return FALSE;
00117 
00118         return TRUE;
00119 }
00120 
00121 
00122 static dbus_bool_t _wpa_dbus_add_dict_entry_end(
00123         DBusMessageIter *iter_dict, DBusMessageIter *iter_dict_entry,
00124         DBusMessageIter *iter_dict_val)
00125 {
00126         if (!dbus_message_iter_close_container(iter_dict_entry, iter_dict_val))
00127                 return FALSE;
00128         if (!dbus_message_iter_close_container(iter_dict, iter_dict_entry))
00129                 return FALSE;
00130 
00131         return TRUE;
00132 }
00133 
00134 
00135 static dbus_bool_t _wpa_dbus_add_dict_entry_basic(DBusMessageIter *iter_dict,
00136                                                   const char *key,
00137                                                   const int value_type,
00138                                                   const void *value)
00139 {
00140         DBusMessageIter iter_dict_entry, iter_dict_val;
00141         const char *type_as_string = NULL;
00142 
00143         if (key == NULL)
00144                 return FALSE;
00145 
00146         type_as_string = wpa_dbus_type_as_string(value_type);
00147         if (!type_as_string)
00148                 return FALSE;
00149 
00150         if (!_wpa_dbus_add_dict_entry_start(iter_dict, &iter_dict_entry,
00151                                             key, value_type))
00152                 return FALSE;
00153 
00154         if (!dbus_message_iter_open_container(&iter_dict_entry,
00155                                               DBUS_TYPE_VARIANT,
00156                                               type_as_string, &iter_dict_val))
00157                 return FALSE;
00158 
00159         if (!dbus_message_iter_append_basic(&iter_dict_val, value_type, value))
00160                 return FALSE;
00161 
00162         if (!_wpa_dbus_add_dict_entry_end(iter_dict, &iter_dict_entry,
00163                                           &iter_dict_val))
00164                 return FALSE;
00165 
00166         return TRUE;
00167 }
00168 
00169 
00170 static dbus_bool_t _wpa_dbus_add_dict_entry_byte_array(
00171         DBusMessageIter *iter_dict, const char *key,
00172         const char *value, const dbus_uint32_t value_len)
00173 {
00174         DBusMessageIter iter_dict_entry, iter_dict_val, iter_array;
00175         dbus_uint32_t i;
00176 
00177         if (!_wpa_dbus_add_dict_entry_start(iter_dict, &iter_dict_entry,
00178                                             key, DBUS_TYPE_ARRAY))
00179                 return FALSE;
00180 
00181         if (!dbus_message_iter_open_container(&iter_dict_entry,
00182                                               DBUS_TYPE_VARIANT,
00183                                               DBUS_TYPE_ARRAY_AS_STRING
00184                                               DBUS_TYPE_BYTE_AS_STRING,
00185                                               &iter_dict_val))
00186                 return FALSE;
00187 
00188         if (!dbus_message_iter_open_container(&iter_dict_val, DBUS_TYPE_ARRAY,
00189                                               DBUS_TYPE_BYTE_AS_STRING,
00190                                               &iter_array))
00191                 return FALSE;
00192 
00193         for (i = 0; i < value_len; i++) {
00194                 if (!dbus_message_iter_append_basic(&iter_array,
00195                                                     DBUS_TYPE_BYTE,
00196                                                     &(value[i])))
00197                         return FALSE;
00198         }
00199 
00200         if (!dbus_message_iter_close_container(&iter_dict_val, &iter_array))
00201                 return FALSE;
00202 
00203         if (!_wpa_dbus_add_dict_entry_end(iter_dict, &iter_dict_entry,
00204                                           &iter_dict_val))
00205                 return FALSE;
00206 
00207         return TRUE;
00208 }
00209 
00210 
00221 dbus_bool_t wpa_dbus_dict_append_string(DBusMessageIter *iter_dict,
00222                                         const char *key, const char *value)
00223 {
00224         if (!value)
00225                 return FALSE;
00226         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_STRING,
00227                                               &value);
00228 }
00229 
00230 
00241 dbus_bool_t wpa_dbus_dict_append_byte(DBusMessageIter *iter_dict,
00242                                       const char *key, const char value)
00243 {
00244         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_BYTE,
00245                                               &value);
00246 }
00247 
00248 
00259 dbus_bool_t wpa_dbus_dict_append_bool(DBusMessageIter *iter_dict,
00260                                       const char *key, const dbus_bool_t value)
00261 {
00262         return _wpa_dbus_add_dict_entry_basic(iter_dict, key,
00263                                               DBUS_TYPE_BOOLEAN, &value);
00264 }
00265 
00266 
00277 dbus_bool_t wpa_dbus_dict_append_int16(DBusMessageIter *iter_dict,
00278                                        const char *key,
00279                                        const dbus_int16_t value)
00280 {
00281         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_INT16,
00282                                               &value);
00283 }
00284 
00285 
00296 dbus_bool_t wpa_dbus_dict_append_uint16(DBusMessageIter *iter_dict,
00297                                         const char *key,
00298                                         const dbus_uint16_t value)
00299 {
00300         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_UINT16,
00301                                               &value);
00302 }
00303 
00304 
00315 dbus_bool_t wpa_dbus_dict_append_int32(DBusMessageIter *iter_dict,
00316                                        const char *key,
00317                                        const dbus_int32_t value)
00318 {
00319         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_INT32,
00320                                               &value);
00321 }
00322 
00323 
00334 dbus_bool_t wpa_dbus_dict_append_uint32(DBusMessageIter *iter_dict,
00335                                         const char *key,
00336                                         const dbus_uint32_t value)
00337 {
00338         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_UINT32,
00339                                               &value);
00340 }
00341 
00342 
00353 dbus_bool_t wpa_dbus_dict_append_int64(DBusMessageIter *iter_dict,
00354                                        const char *key,
00355                                        const dbus_int64_t value)
00356 {
00357         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_INT64,
00358                                               &value);
00359 }
00360 
00361 
00372 dbus_bool_t wpa_dbus_dict_append_uint64(DBusMessageIter *iter_dict,
00373                                         const char *key,
00374                                         const dbus_uint64_t value)
00375 {
00376         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_UINT64,
00377                                               &value);
00378 }
00379 
00380 
00391 dbus_bool_t wpa_dbus_dict_append_double(DBusMessageIter *iter_dict,
00392                                         const char *key, const double value)
00393 {
00394         return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_DOUBLE,
00395                                               &value);
00396 }
00397 
00398 
00409 dbus_bool_t wpa_dbus_dict_append_object_path(DBusMessageIter *iter_dict,
00410                                              const char *key,
00411                                              const char *value)
00412 {
00413         if (!value)
00414                 return FALSE;
00415         return _wpa_dbus_add_dict_entry_basic(iter_dict, key,
00416                                               DBUS_TYPE_OBJECT_PATH, &value);
00417 }
00418 
00419 
00431 dbus_bool_t wpa_dbus_dict_append_byte_array(DBusMessageIter *iter_dict,
00432                                             const char *key,
00433                                             const char *value,
00434                                             const dbus_uint32_t value_len)
00435 {
00436         if (!key)
00437                 return FALSE;
00438         if (!value && (value_len != 0))
00439                 return FALSE;
00440         return _wpa_dbus_add_dict_entry_byte_array(iter_dict, key, value,
00441                                                    value_len);
00442 }
00443 
00444 
00460 dbus_bool_t wpa_dbus_dict_begin_string_array(DBusMessageIter *iter_dict,
00461                                              const char *key,
00462                                              DBusMessageIter *iter_dict_entry,
00463                                              DBusMessageIter *iter_dict_val,
00464                                              DBusMessageIter *iter_array)
00465 {
00466         if (!iter_dict || !iter_dict_entry || !iter_dict_val || !iter_array)
00467                 return FALSE;
00468 
00469         if (!_wpa_dbus_add_dict_entry_start(iter_dict, iter_dict_entry,
00470                                             key, DBUS_TYPE_ARRAY))
00471                 return FALSE;
00472 
00473         if (!dbus_message_iter_open_container(iter_dict_entry,
00474                                               DBUS_TYPE_VARIANT,
00475                                               DBUS_TYPE_ARRAY_AS_STRING
00476                                               DBUS_TYPE_STRING_AS_STRING,
00477                                               iter_dict_val))
00478                 return FALSE;
00479 
00480         if (!dbus_message_iter_open_container(iter_dict_val, DBUS_TYPE_ARRAY,
00481                                               DBUS_TYPE_BYTE_AS_STRING,
00482                                               iter_array))
00483                 return FALSE;
00484 
00485         return TRUE;
00486 }
00487 
00488 
00499 dbus_bool_t wpa_dbus_dict_string_array_add_element(DBusMessageIter *iter_array,
00500                                                    const char *elem)
00501 {
00502         if (!iter_array || !elem)
00503                 return FALSE;
00504 
00505         return dbus_message_iter_append_basic(iter_array, DBUS_TYPE_STRING,
00506                                               &elem);
00507 }
00508 
00509 
00524 dbus_bool_t wpa_dbus_dict_end_string_array(DBusMessageIter *iter_dict,
00525                                            DBusMessageIter *iter_dict_entry,
00526                                            DBusMessageIter *iter_dict_val,
00527                                            DBusMessageIter *iter_array)
00528 {
00529         if (!iter_dict || !iter_dict_entry || !iter_dict_val || !iter_array)
00530                 return FALSE;
00531 
00532         if (!dbus_message_iter_close_container(iter_dict_val, iter_array))
00533                 return FALSE;
00534 
00535         if (!_wpa_dbus_add_dict_entry_end(iter_dict, iter_dict_entry,
00536                                           iter_dict_val))
00537                 return FALSE;
00538 
00539         return TRUE;
00540 }
00541 
00542 
00554 dbus_bool_t wpa_dbus_dict_append_string_array(DBusMessageIter *iter_dict,
00555                                               const char *key,
00556                                               const char **items,
00557                                               const dbus_uint32_t num_items)
00558 {
00559         DBusMessageIter iter_dict_entry, iter_dict_val, iter_array;
00560         dbus_uint32_t i;
00561 
00562         if (!key)
00563                 return FALSE;
00564         if (!items && (num_items != 0))
00565                 return FALSE;
00566 
00567         if (!wpa_dbus_dict_begin_string_array(iter_dict, key,
00568                                               &iter_dict_entry, &iter_dict_val,
00569                                               &iter_array))
00570                 return FALSE;
00571 
00572         for (i = 0; i < num_items; i++) {
00573                 if (!wpa_dbus_dict_string_array_add_element(&iter_array,
00574                                                             items[i]))
00575                         return FALSE;
00576         }
00577 
00578         if (!wpa_dbus_dict_end_string_array(iter_dict, &iter_dict_entry,
00579                                             &iter_dict_val, &iter_array))
00580                 return FALSE;
00581 
00582         return TRUE;
00583 }
00584 
00585 
00586 /*****************************************************/
00587 /* Stuff for reading dicts                           */
00588 /*****************************************************/
00589 
00599 dbus_bool_t wpa_dbus_dict_open_read(DBusMessageIter *iter,
00600                                     DBusMessageIter *iter_dict)
00601 {
00602         if (!iter || !iter_dict)
00603                 return FALSE;
00604 
00605         if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY ||
00606             dbus_message_iter_get_element_type(iter) != DBUS_TYPE_DICT_ENTRY)
00607                 return FALSE;
00608 
00609         dbus_message_iter_recurse(iter, iter_dict);
00610         return TRUE;
00611 }
00612 
00613 
00614 #define BYTE_ARRAY_CHUNK_SIZE 34
00615 #define BYTE_ARRAY_ITEM_SIZE (sizeof(char))
00616 
00617 static dbus_bool_t _wpa_dbus_dict_entry_get_byte_array(
00618         DBusMessageIter *iter, int array_type,
00619         struct wpa_dbus_dict_entry *entry)
00620 {
00621         dbus_uint32_t count = 0;
00622         dbus_bool_t success = FALSE;
00623         char *buffer, *nbuffer;;
00624 
00625         entry->bytearray_value = NULL;
00626         entry->array_type = DBUS_TYPE_BYTE;
00627 
00628         buffer = os_zalloc(BYTE_ARRAY_ITEM_SIZE * BYTE_ARRAY_CHUNK_SIZE);
00629         if (!buffer)
00630                 return FALSE;
00631 
00632         entry->bytearray_value = buffer;
00633         entry->array_len = 0;
00634         while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_BYTE) {
00635                 char byte;
00636 
00637                 if ((count % BYTE_ARRAY_CHUNK_SIZE) == 0 && count != 0) {
00638                         nbuffer = os_realloc(buffer, BYTE_ARRAY_ITEM_SIZE *
00639                                              (count + BYTE_ARRAY_CHUNK_SIZE));
00640                         if (nbuffer == NULL) {
00641                                 os_free(buffer);
00642                                 wpa_printf(MSG_ERROR, "dbus: _wpa_dbus_dict_"
00643                                            "entry_get_byte_array out of "
00644                                            "memory trying to retrieve the "
00645                                            "string array");
00646                                 goto done;
00647                         }
00648                         buffer = nbuffer;
00649                 }
00650                 entry->bytearray_value = buffer;
00651 
00652                 dbus_message_iter_get_basic(iter, &byte);
00653                 entry->bytearray_value[count] = byte;
00654                 entry->array_len = ++count;
00655                 dbus_message_iter_next(iter);
00656         }
00657 
00658         /* Zero-length arrays are valid. */
00659         if (entry->array_len == 0) {
00660                 os_free(entry->bytearray_value);
00661                 entry->bytearray_value = NULL;
00662         }
00663 
00664         success = TRUE;
00665 
00666 done:
00667         return success;
00668 }
00669 
00670 
00671 #define STR_ARRAY_CHUNK_SIZE 8
00672 #define STR_ARRAY_ITEM_SIZE (sizeof(char *))
00673 
00674 static dbus_bool_t _wpa_dbus_dict_entry_get_string_array(
00675         DBusMessageIter *iter, int array_type,
00676         struct wpa_dbus_dict_entry *entry)
00677 {
00678         dbus_uint32_t count = 0;
00679         dbus_bool_t success = FALSE;
00680         char **buffer, **nbuffer;
00681 
00682         entry->strarray_value = NULL;
00683         entry->array_type = DBUS_TYPE_STRING;
00684 
00685         buffer = os_zalloc(STR_ARRAY_ITEM_SIZE * STR_ARRAY_CHUNK_SIZE);
00686         if (buffer == NULL)
00687                 return FALSE;
00688 
00689         entry->strarray_value = buffer;
00690         entry->array_len = 0;
00691         while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRING) {
00692                 const char *value;
00693                 char *str;
00694 
00695                 if ((count % STR_ARRAY_CHUNK_SIZE) == 0 && count != 0) {
00696                         nbuffer = os_realloc(buffer, STR_ARRAY_ITEM_SIZE *
00697                                              (count + STR_ARRAY_CHUNK_SIZE));
00698                         if (nbuffer == NULL) {
00699                                 os_free(buffer);
00700                                 wpa_printf(MSG_ERROR, "dbus: _wpa_dbus_dict_"
00701                                            "entry_get_string_array out of "
00702                                            "memory trying to retrieve the "
00703                                            "string array");
00704                                 goto done;
00705                         }
00706                         buffer = nbuffer;
00707                 }
00708                 entry->strarray_value = buffer;
00709 
00710                 dbus_message_iter_get_basic(iter, &value);
00711                 str = os_strdup(value);
00712                 if (str == NULL) {
00713                         wpa_printf(MSG_ERROR, "dbus: _wpa_dbus_dict_entry_get_"
00714                                    "string_array out of memory trying to "
00715                                    "duplicate the string array");
00716                         goto done;
00717                 }
00718                 entry->strarray_value[count] = str;
00719                 entry->array_len = ++count;
00720                 dbus_message_iter_next(iter);
00721         }
00722 
00723         /* Zero-length arrays are valid. */
00724         if (entry->array_len == 0) {
00725                 os_free(entry->strarray_value);
00726                 entry->strarray_value = NULL;
00727         }
00728 
00729         success = TRUE;
00730 
00731 done:
00732         return success;
00733 }
00734 
00735 
00736 static dbus_bool_t _wpa_dbus_dict_entry_get_array(
00737         DBusMessageIter *iter_dict_val, struct wpa_dbus_dict_entry *entry)
00738 {
00739         int array_type = dbus_message_iter_get_element_type(iter_dict_val);
00740         dbus_bool_t success = FALSE;
00741         DBusMessageIter iter_array;
00742 
00743         if (!entry)
00744                 return FALSE;
00745 
00746         dbus_message_iter_recurse(iter_dict_val, &iter_array);
00747 
00748         switch (array_type) {
00749         case DBUS_TYPE_BYTE:
00750                 success = _wpa_dbus_dict_entry_get_byte_array(&iter_array,
00751                                                               array_type,
00752                                                               entry);
00753                 break;
00754         case DBUS_TYPE_STRING:
00755                 success = _wpa_dbus_dict_entry_get_string_array(&iter_array,
00756                                                                 array_type,
00757                                                                 entry);
00758                 break;
00759         default:
00760                 break;
00761         }
00762 
00763         return success;
00764 }
00765 
00766 
00767 static dbus_bool_t _wpa_dbus_dict_fill_value_from_variant(
00768         struct wpa_dbus_dict_entry *entry, DBusMessageIter *iter)
00769 {
00770         const char *v;
00771 
00772         switch (entry->type) {
00773         case DBUS_TYPE_OBJECT_PATH:
00774         case DBUS_TYPE_STRING:
00775                 dbus_message_iter_get_basic(iter, &v);
00776                 entry->str_value = os_strdup(v);
00777                 if (entry->str_value == NULL)
00778                         return FALSE;
00779                 break;
00780         case DBUS_TYPE_BOOLEAN:
00781                 dbus_message_iter_get_basic(iter, &entry->bool_value);
00782                 break;
00783         case DBUS_TYPE_BYTE:
00784                 dbus_message_iter_get_basic(iter, &entry->byte_value);
00785                 break;
00786         case DBUS_TYPE_INT16:
00787                 dbus_message_iter_get_basic(iter, &entry->int16_value);
00788                 break;
00789         case DBUS_TYPE_UINT16:
00790                 dbus_message_iter_get_basic(iter, &entry->uint16_value);
00791                 break;
00792         case DBUS_TYPE_INT32:
00793                 dbus_message_iter_get_basic(iter, &entry->int32_value);
00794                 break;
00795         case DBUS_TYPE_UINT32:
00796                 dbus_message_iter_get_basic(iter, &entry->uint32_value);
00797                 break;
00798         case DBUS_TYPE_INT64:
00799                 dbus_message_iter_get_basic(iter, &entry->int64_value);
00800                 break;
00801         case DBUS_TYPE_UINT64:
00802                 dbus_message_iter_get_basic(iter, &entry->uint64_value);
00803                 break;
00804         case DBUS_TYPE_DOUBLE:
00805                 dbus_message_iter_get_basic(iter, &entry->double_value);
00806                 break;
00807         case DBUS_TYPE_ARRAY:
00808                 return _wpa_dbus_dict_entry_get_array(iter, entry);
00809         default:
00810                 return FALSE;
00811         }
00812 
00813         return TRUE;
00814 }
00815 
00816 
00833 dbus_bool_t wpa_dbus_dict_get_entry(DBusMessageIter *iter_dict,
00834                                     struct wpa_dbus_dict_entry * entry)
00835 {
00836         DBusMessageIter iter_dict_entry, iter_dict_val;
00837         int type;
00838         const char *key;
00839 
00840         if (!iter_dict || !entry)
00841                 goto error;
00842 
00843         if (dbus_message_iter_get_arg_type(iter_dict) != DBUS_TYPE_DICT_ENTRY)
00844                 goto error;
00845 
00846         dbus_message_iter_recurse(iter_dict, &iter_dict_entry);
00847         dbus_message_iter_get_basic(&iter_dict_entry, &key);
00848         entry->key = key;
00849 
00850         if (!dbus_message_iter_next(&iter_dict_entry))
00851                 goto error;
00852         type = dbus_message_iter_get_arg_type(&iter_dict_entry);
00853         if (type != DBUS_TYPE_VARIANT)
00854                 goto error;
00855 
00856         dbus_message_iter_recurse(&iter_dict_entry, &iter_dict_val);
00857         entry->type = dbus_message_iter_get_arg_type(&iter_dict_val);
00858         if (!_wpa_dbus_dict_fill_value_from_variant(entry, &iter_dict_val))
00859                 goto error;
00860 
00861         dbus_message_iter_next(iter_dict);
00862         return TRUE;
00863 
00864 error:
00865         if (entry) {
00866                 wpa_dbus_dict_entry_clear(entry);
00867                 entry->type = DBUS_TYPE_INVALID;
00868                 entry->array_type = DBUS_TYPE_INVALID;
00869         }
00870 
00871         return FALSE;
00872 }
00873 
00874 
00883 dbus_bool_t wpa_dbus_dict_has_dict_entry(DBusMessageIter *iter_dict)
00884 {
00885         if (!iter_dict)
00886                 return FALSE;
00887         return dbus_message_iter_get_arg_type(iter_dict) ==
00888                 DBUS_TYPE_DICT_ENTRY;
00889 }
00890 
00891 
00897 void wpa_dbus_dict_entry_clear(struct wpa_dbus_dict_entry *entry)
00898 {
00899         unsigned int i;
00900 
00901         if (!entry)
00902                 return;
00903         switch (entry->type) {
00904         case DBUS_TYPE_OBJECT_PATH:
00905         case DBUS_TYPE_STRING:
00906                 os_free(entry->str_value);
00907                 break;
00908         case DBUS_TYPE_ARRAY:
00909                 switch (entry->array_type) {
00910                 case DBUS_TYPE_BYTE:
00911                         os_free(entry->bytearray_value);
00912                         break;
00913                 case DBUS_TYPE_STRING:
00914                         for (i = 0; i < entry->array_len; i++)
00915                                 os_free(entry->strarray_value[i]);
00916                         os_free(entry->strarray_value);
00917                         break;
00918                 }
00919                 break;
00920         }
00921 
00922         memset(entry, 0, sizeof(struct wpa_dbus_dict_entry));
00923 }


wpa_supplicant
Author(s): Package maintained by Blaise Gassend
autogenerated on Thu Jan 2 2014 11:26:36