1/* 2 * WPA Supplicant / dbus-based control interface 3 * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc. 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9#ifndef DBUS_DICT_HELPERS_H 10#define DBUS_DICT_HELPERS_H 11 12#include "wpabuf.h" 13 14/* 15 * Adding a dict to a DBusMessage 16 */ 17 18dbus_bool_t wpa_dbus_dict_open_write(DBusMessageIter *iter, 19 DBusMessageIter *iter_dict); 20 21dbus_bool_t wpa_dbus_dict_close_write(DBusMessageIter *iter, 22 DBusMessageIter *iter_dict); 23 24const char * wpa_dbus_type_as_string(const int type); 25 26dbus_bool_t wpa_dbus_dict_append_string(DBusMessageIter *iter_dict, 27 const char *key, const char *value); 28 29dbus_bool_t wpa_dbus_dict_append_bool(DBusMessageIter *iter_dict, 30 const char *key, 31 const dbus_bool_t value); 32 33dbus_bool_t wpa_dbus_dict_append_int16(DBusMessageIter *iter_dict, 34 const char *key, 35 const dbus_int16_t value); 36 37dbus_bool_t wpa_dbus_dict_append_uint16(DBusMessageIter *iter_dict, 38 const char *key, 39 const dbus_uint16_t value); 40 41dbus_bool_t wpa_dbus_dict_append_int32(DBusMessageIter *iter_dict, 42 const char *key, 43 const dbus_int32_t value); 44 45dbus_bool_t wpa_dbus_dict_append_uint32(DBusMessageIter *iter_dict, 46 const char *key, 47 const dbus_uint32_t value); 48 49dbus_bool_t wpa_dbus_dict_append_object_path(DBusMessageIter *iter_dict, 50 const char *key, 51 const char *value); 52 53dbus_bool_t wpa_dbus_dict_append_byte_array(DBusMessageIter *iter_dict, 54 const char *key, 55 const char *value, 56 const dbus_uint32_t value_len); 57 58/* Manual construction and addition of array elements */ 59dbus_bool_t wpa_dbus_dict_begin_array(DBusMessageIter *iter_dict, 60 const char *key, const char *type, 61 DBusMessageIter *iter_dict_entry, 62 DBusMessageIter *iter_dict_val, 63 DBusMessageIter *iter_array); 64 65dbus_bool_t wpa_dbus_dict_begin_string_array(DBusMessageIter *iter_dict, 66 const char *key, 67 DBusMessageIter *iter_dict_entry, 68 DBusMessageIter *iter_dict_val, 69 DBusMessageIter *iter_array); 70 71dbus_bool_t wpa_dbus_dict_string_array_add_element(DBusMessageIter *iter_array, 72 const char *elem); 73 74dbus_bool_t wpa_dbus_dict_bin_array_add_element(DBusMessageIter *iter_array, 75 const u8 *value, 76 size_t value_len); 77 78dbus_bool_t wpa_dbus_dict_end_array(DBusMessageIter *iter_dict, 79 DBusMessageIter *iter_dict_entry, 80 DBusMessageIter *iter_dict_val, 81 DBusMessageIter *iter_array); 82 83static inline dbus_bool_t 84wpa_dbus_dict_end_string_array(DBusMessageIter *iter_dict, 85 DBusMessageIter *iter_dict_entry, 86 DBusMessageIter *iter_dict_val, 87 DBusMessageIter *iter_array) 88{ 89 return wpa_dbus_dict_end_array(iter_dict, iter_dict_entry, 90 iter_dict_val, iter_array); 91} 92 93/* Convenience function to add a whole string list */ 94dbus_bool_t wpa_dbus_dict_append_string_array(DBusMessageIter *iter_dict, 95 const char *key, 96 const char **items, 97 const dbus_uint32_t num_items); 98 99dbus_bool_t wpa_dbus_dict_append_wpabuf_array(DBusMessageIter *iter_dict, 100 const char *key, 101 const struct wpabuf **items, 102 const dbus_uint32_t num_items); 103 104/* 105 * Reading a dict from a DBusMessage 106 */ 107 108/* 109 * Used only in struct wpa_dbus_dict_entry::array_type internally to identify 110 * special binary array case. 111 */ 112#define WPAS_DBUS_TYPE_BINARRAY ((int) '@') 113 114struct wpa_dbus_dict_entry { 115 int type; /** the dbus type of the dict entry's value */ 116 int array_type; /** the dbus type of the array elements if the dict 117 entry value contains an array, or the special 118 WPAS_DBUS_TYPE_BINARRAY */ 119 const char *key; /** key of the dict entry */ 120 121 /** Possible values of the property */ 122 union { 123 char *str_value; 124 char byte_value; 125 dbus_bool_t bool_value; 126 dbus_int16_t int16_value; 127 dbus_uint16_t uint16_value; 128 dbus_int32_t int32_value; 129 dbus_uint32_t uint32_value; 130 dbus_int64_t int64_value; 131 dbus_uint64_t uint64_value; 132 double double_value; 133 char *bytearray_value; 134 char **strarray_value; 135 struct wpabuf **binarray_value; 136 }; 137 dbus_uint32_t array_len; /** length of the array if the dict entry's 138 value contains an array */ 139}; 140 141dbus_bool_t wpa_dbus_dict_open_read(DBusMessageIter *iter, 142 DBusMessageIter *iter_dict, 143 DBusError *error); 144 145dbus_bool_t wpa_dbus_dict_get_entry(DBusMessageIter *iter_dict, 146 struct wpa_dbus_dict_entry *entry); 147 148dbus_bool_t wpa_dbus_dict_has_dict_entry(DBusMessageIter *iter_dict); 149 150void wpa_dbus_dict_entry_clear(struct wpa_dbus_dict_entry *entry); 151 152#endif /* DBUS_DICT_HELPERS_H */ 153