Changeset e154c89ce313738b3356c116c83148b5b3044ce2

Show
Ignore:
Timestamp:
03/07/10 13:45:10 (5 months ago)
Author:
Nedko Arnaudov <nedko@…>
Children:
1f11f0968ec78d2ee1ae73c6604e2637725adf86
Parents:
47dbbb940a7211caebac367f2a0fc05c278f6f8b
git-committer:
Nedko Arnaudov <nedko@arnaudov.name> / 2010-03-07T13:45:10Z+0200
Message:

Improve the helper for retrieving dbus dict entries

Location:
dbus
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • dbus/helpers.c

    r78f5665 re154c89  
    33 * LADI Session Handler (ladish) 
    44 * 
    5  * Copyright (C) 2008, 2009 Nedko Arnaudov <nedko@arnaudov.name> 
     5 * Copyright (C) 2008, 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name> 
    66 * Copyright (C) 2008 Juuso Alasuutari <juuso.alasuutari@gmail.com> 
    77 * 
     
    6161LIST_HEAD(g_dbus_services); 
    6262 
    63 bool dbus_iter_get_dict_entry(DBusMessageIter * iter, const char ** key_ptr, void * value_ptr, int * type_ptr, int * size_ptr) 
    64 { 
    65   if (!iter || !key_ptr || !value_ptr || !type_ptr) { 
    66     log_error("Invalid arguments"); 
    67     return false; 
    68   } 
    69  
    70   DBusMessageIter dict_iter, variant_iter; 
    71  
    72   if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_DICT_ENTRY) { 
     63bool dbus_iter_get_dict_entry(DBusMessageIter * iter_ptr, const char * key, void * value, int * type, int * size) 
     64{ 
     65  DBusMessageIter dict_iter; 
     66  DBusMessageIter entry_iter; 
     67  DBusMessageIter variant_iter; 
     68  const char * current_key; 
     69  DBusMessageIter array_iter; 
     70  int n; 
     71  int detype; 
     72 
     73  dbus_message_iter_recurse(iter_ptr, &dict_iter); 
     74 
     75loop: 
     76  detype = dbus_message_iter_get_arg_type(&dict_iter); 
     77 
     78  if (detype == DBUS_TYPE_INVALID) 
     79  { 
     80    return false; 
     81  } 
     82 
     83  if (detype != DBUS_TYPE_DICT_ENTRY) 
     84  { 
    7385    log_error("Iterator does not point to a dict entry container"); 
    7486    return false; 
    7587  } 
    7688 
    77   dbus_message_iter_recurse(iter, &dict_iter); 
    78  
    79   if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_STRING) { 
     89  dbus_message_iter_recurse(&dict_iter, &entry_iter); 
     90 
     91  if (dbus_message_iter_get_arg_type(&entry_iter) != DBUS_TYPE_STRING) 
     92  { 
    8093    log_error("Cannot find key in dict entry container"); 
    8194    return false; 
    8295  } 
    8396 
    84   dbus_message_iter_get_basic(&dict_iter, key_ptr); 
    85  
    86   if (!dbus_message_iter_next(&dict_iter) 
    87       || dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_VARIANT) { 
     97  dbus_message_iter_get_basic(&entry_iter, &current_key); 
     98  if (strcmp(current_key, key) != 0) 
     99  { 
     100    dbus_message_iter_next(&dict_iter); 
     101    goto loop; 
     102  } 
     103 
     104  if (!dbus_message_iter_next(&entry_iter) || dbus_message_iter_get_arg_type(&entry_iter) != DBUS_TYPE_VARIANT) 
     105  { 
    88106    log_error("Cannot find variant container in dict entry"); 
    89107    return false; 
    90108  } 
    91109 
    92   dbus_message_iter_recurse(&dict_iter, &variant_iter); 
    93  
    94   *type_ptr = dbus_message_iter_get_arg_type(&variant_iter); 
    95   if (*type_ptr == DBUS_TYPE_INVALID) { 
     110  dbus_message_iter_recurse(&entry_iter, &variant_iter); 
     111 
     112  *type = dbus_message_iter_get_arg_type(&variant_iter); 
     113  if (*type == DBUS_TYPE_INVALID) 
     114  { 
    96115    log_error("Cannot find value in variant container"); 
    97116    return false; 
    98117  } 
    99118 
    100   if (*type_ptr == DBUS_TYPE_ARRAY) { 
    101     DBusMessageIter array_iter; 
    102     int n; 
    103  
    104     if (dbus_message_iter_get_element_type(&variant_iter) 
    105         != DBUS_TYPE_BYTE) { 
     119  if (*type == DBUS_TYPE_ARRAY) 
     120  { 
     121    if (dbus_message_iter_get_element_type(&variant_iter) != DBUS_TYPE_BYTE) 
     122    { 
    106123      log_error("Dict entry value is a non-byte array"); 
    107124      return false; 
    108125    } 
    109     *type_ptr = '-'; 
     126    *type = '-'; 
    110127 
    111128    dbus_message_iter_recurse(&variant_iter, &array_iter); 
    112     dbus_message_iter_get_fixed_array(&array_iter, value_ptr, &n); 
    113  
    114     if (size_ptr) 
    115       *size_ptr = n; 
    116   } else 
    117     dbus_message_iter_get_basic(&variant_iter, value_ptr); 
     129    dbus_message_iter_get_fixed_array(&array_iter, value, &n); 
     130 
     131    if (size != NULL) 
     132    { 
     133      *size = n; 
     134    } 
     135  } 
     136  else 
     137  { 
     138    dbus_message_iter_get_basic(&variant_iter, value); 
     139  } 
     140 
     141  return true; 
     142} 
     143 
     144bool dbus_iter_get_dict_entry_string(DBusMessageIter * iter_ptr, const char * key, const char ** value) 
     145{ 
     146  int type; 
     147 
     148  if (!dbus_iter_get_dict_entry(iter_ptr, key, value, &type, NULL)) 
     149  { 
     150    return false; 
     151  } 
     152 
     153  if (type != DBUS_TYPE_STRING) 
     154  { 
     155    log_error("value of the dict entry '%s' is not a string", key); 
     156    return false; 
     157  } 
    118158 
    119159  return true; 
  • dbus/helpers.h

    r49e18be re154c89  
    33 * LADI Session Handler (ladish) 
    44 * 
    5  * Copyright (C) 2008, 2009 Nedko Arnaudov <nedko@arnaudov.name> 
     5 * Copyright (C) 2008, 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name> 
    66 * Copyright (C) 2008 Juuso Alasuutari <juuso.alasuutari@gmail.com> 
    77 * 
     
    3636extern DBusError g_dbus_error; 
    3737 
    38 bool dbus_iter_get_dict_entry(DBusMessageIter * iter, const char ** key_ptr, void * value_ptr, int * type_ptr, int * size_ptr); 
     38bool dbus_iter_get_dict_entry(DBusMessageIter * iter_ptr, const char * key, void * value, int * type, int * size); 
     39bool dbus_iter_get_dict_entry_string(DBusMessageIter * iter_ptr, const char * key, const char ** value); 
    3940bool dbus_iter_append_variant(DBusMessageIter * iter, int type, const void * arg); 
    4041bool dbus_iter_append_dict_entry(DBusMessageIter *iter, int type, const char * key, const void * value, int length);