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