1214501Srpaulo/*
2214501Srpaulo * WPA Supplicant / dbus-based control interface
3214501Srpaulo * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
4214501Srpaulo *
5252190Srpaulo * This software may be distributed under the terms of the BSD license.
6252190Srpaulo * See README for more details.
7214501Srpaulo */
8214501Srpaulo
9214501Srpaulo#ifndef DBUS_DICT_HELPERS_H
10214501Srpaulo#define DBUS_DICT_HELPERS_H
11214501Srpaulo
12252190Srpaulo#include "wpabuf.h"
13252190Srpaulo
14214501Srpaulo/*
15214501Srpaulo * Adding a dict to a DBusMessage
16214501Srpaulo */
17214501Srpaulo
18214501Srpaulodbus_bool_t wpa_dbus_dict_open_write(DBusMessageIter *iter,
19214501Srpaulo				     DBusMessageIter *iter_dict);
20214501Srpaulo
21214501Srpaulodbus_bool_t wpa_dbus_dict_close_write(DBusMessageIter *iter,
22214501Srpaulo				      DBusMessageIter *iter_dict);
23214501Srpaulo
24214501Srpauloconst char * wpa_dbus_type_as_string(const int type);
25214501Srpaulo
26214501Srpaulodbus_bool_t wpa_dbus_dict_append_string(DBusMessageIter *iter_dict,
27214501Srpaulo					const char *key, const char *value);
28214501Srpaulo
29214501Srpaulodbus_bool_t wpa_dbus_dict_append_byte(DBusMessageIter *iter_dict,
30214501Srpaulo				      const char *key, const char value);
31214501Srpaulo
32214501Srpaulodbus_bool_t wpa_dbus_dict_append_bool(DBusMessageIter *iter_dict,
33214501Srpaulo				      const char *key,
34214501Srpaulo				      const dbus_bool_t value);
35214501Srpaulo
36214501Srpaulodbus_bool_t wpa_dbus_dict_append_int16(DBusMessageIter *iter_dict,
37214501Srpaulo				       const char *key,
38214501Srpaulo				       const dbus_int16_t value);
39214501Srpaulo
40214501Srpaulodbus_bool_t wpa_dbus_dict_append_uint16(DBusMessageIter *iter_dict,
41214501Srpaulo					const char *key,
42214501Srpaulo					const dbus_uint16_t value);
43214501Srpaulo
44214501Srpaulodbus_bool_t wpa_dbus_dict_append_int32(DBusMessageIter *iter_dict,
45214501Srpaulo				       const char *key,
46214501Srpaulo				       const dbus_int32_t value);
47214501Srpaulo
48214501Srpaulodbus_bool_t wpa_dbus_dict_append_uint32(DBusMessageIter *iter_dict,
49214501Srpaulo					const char *key,
50214501Srpaulo					const dbus_uint32_t value);
51214501Srpaulo
52214501Srpaulodbus_bool_t wpa_dbus_dict_append_int64(DBusMessageIter *iter_dict,
53214501Srpaulo				       const char *key,
54214501Srpaulo				       const dbus_int64_t value);
55214501Srpaulo
56214501Srpaulodbus_bool_t wpa_dbus_dict_append_uint64(DBusMessageIter *iter_dict,
57214501Srpaulo					const char *key,
58214501Srpaulo					const dbus_uint64_t value);
59214501Srpaulo
60214501Srpaulodbus_bool_t wpa_dbus_dict_append_double(DBusMessageIter *iter_dict,
61214501Srpaulo					const char *key,
62214501Srpaulo					const double value);
63214501Srpaulo
64214501Srpaulodbus_bool_t wpa_dbus_dict_append_object_path(DBusMessageIter *iter_dict,
65214501Srpaulo					     const char *key,
66214501Srpaulo					     const char *value);
67214501Srpaulo
68214501Srpaulodbus_bool_t wpa_dbus_dict_append_byte_array(DBusMessageIter *iter_dict,
69214501Srpaulo					    const char *key,
70214501Srpaulo					    const char *value,
71214501Srpaulo					    const dbus_uint32_t value_len);
72214501Srpaulo
73252190Srpaulo/* Manual construction and addition of array elements */
74252190Srpaulodbus_bool_t wpa_dbus_dict_begin_array(DBusMessageIter *iter_dict,
75281806Srpaulo				      const char *key, const char *type,
76281806Srpaulo				      DBusMessageIter *iter_dict_entry,
77281806Srpaulo				      DBusMessageIter *iter_dict_val,
78281806Srpaulo				      DBusMessageIter *iter_array);
79252190Srpaulo
80214501Srpaulodbus_bool_t wpa_dbus_dict_begin_string_array(DBusMessageIter *iter_dict,
81281806Srpaulo					     const char *key,
82281806Srpaulo					     DBusMessageIter *iter_dict_entry,
83281806Srpaulo					     DBusMessageIter *iter_dict_val,
84281806Srpaulo					     DBusMessageIter *iter_array);
85214501Srpaulo
86214501Srpaulodbus_bool_t wpa_dbus_dict_string_array_add_element(DBusMessageIter *iter_array,
87281806Srpaulo						   const char *elem);
88214501Srpaulo
89252190Srpaulodbus_bool_t wpa_dbus_dict_bin_array_add_element(DBusMessageIter *iter_array,
90252190Srpaulo						const u8 *value,
91252190Srpaulo						size_t value_len);
92214501Srpaulo
93252190Srpaulodbus_bool_t wpa_dbus_dict_end_array(DBusMessageIter *iter_dict,
94281806Srpaulo				    DBusMessageIter *iter_dict_entry,
95281806Srpaulo				    DBusMessageIter *iter_dict_val,
96281806Srpaulo				    DBusMessageIter *iter_array);
97252190Srpaulo
98252190Srpaulostatic inline dbus_bool_t
99252190Srpaulowpa_dbus_dict_end_string_array(DBusMessageIter *iter_dict,
100252190Srpaulo			       DBusMessageIter *iter_dict_entry,
101252190Srpaulo			       DBusMessageIter *iter_dict_val,
102252190Srpaulo			       DBusMessageIter *iter_array)
103252190Srpaulo{
104252190Srpaulo	return wpa_dbus_dict_end_array(iter_dict, iter_dict_entry,
105252190Srpaulo				       iter_dict_val, iter_array);
106252190Srpaulo}
107252190Srpaulo
108214501Srpaulo/* Convenience function to add a whole string list */
109214501Srpaulodbus_bool_t wpa_dbus_dict_append_string_array(DBusMessageIter *iter_dict,
110214501Srpaulo					      const char *key,
111214501Srpaulo					      const char **items,
112214501Srpaulo					      const dbus_uint32_t num_items);
113214501Srpaulo
114252190Srpaulodbus_bool_t wpa_dbus_dict_append_wpabuf_array(DBusMessageIter *iter_dict,
115252190Srpaulo					      const char *key,
116252190Srpaulo					      const struct wpabuf **items,
117252190Srpaulo					      const dbus_uint32_t num_items);
118252190Srpaulo
119214501Srpaulo/*
120214501Srpaulo * Reading a dict from a DBusMessage
121214501Srpaulo */
122214501Srpaulo
123281806Srpaulo/*
124281806Srpaulo * Used only in struct wpa_dbus_dict_entry::array_type internally to identify
125281806Srpaulo * special binary array case.
126281806Srpaulo */
127281806Srpaulo#define WPAS_DBUS_TYPE_BINARRAY ((int) '@')
128252190Srpaulo
129214501Srpaulostruct wpa_dbus_dict_entry {
130214501Srpaulo	int type;         /** the dbus type of the dict entry's value */
131214501Srpaulo	int array_type;   /** the dbus type of the array elements if the dict
132252190Srpaulo			      entry value contains an array, or the special
133252190Srpaulo			      WPAS_DBUS_TYPE_BINARRAY */
134214501Srpaulo	const char *key;  /** key of the dict entry */
135214501Srpaulo
136214501Srpaulo	/** Possible values of the property */
137214501Srpaulo	union {
138214501Srpaulo		char *str_value;
139214501Srpaulo		char byte_value;
140214501Srpaulo		dbus_bool_t bool_value;
141214501Srpaulo		dbus_int16_t int16_value;
142214501Srpaulo		dbus_uint16_t uint16_value;
143214501Srpaulo		dbus_int32_t int32_value;
144214501Srpaulo		dbus_uint32_t uint32_value;
145214501Srpaulo		dbus_int64_t int64_value;
146214501Srpaulo		dbus_uint64_t uint64_value;
147214501Srpaulo		double double_value;
148214501Srpaulo		char *bytearray_value;
149214501Srpaulo		char **strarray_value;
150252190Srpaulo		struct wpabuf **binarray_value;
151214501Srpaulo	};
152214501Srpaulo	dbus_uint32_t array_len; /** length of the array if the dict entry's
153214501Srpaulo				     value contains an array */
154214501Srpaulo};
155214501Srpaulo
156214501Srpaulodbus_bool_t wpa_dbus_dict_open_read(DBusMessageIter *iter,
157252190Srpaulo				    DBusMessageIter *iter_dict,
158252190Srpaulo				    DBusError *error);
159214501Srpaulo
160214501Srpaulodbus_bool_t wpa_dbus_dict_get_entry(DBusMessageIter *iter_dict,
161214501Srpaulo				    struct wpa_dbus_dict_entry *entry);
162214501Srpaulo
163214501Srpaulodbus_bool_t wpa_dbus_dict_has_dict_entry(DBusMessageIter *iter_dict);
164214501Srpaulo
165214501Srpaulovoid wpa_dbus_dict_entry_clear(struct wpa_dbus_dict_entry *entry);
166214501Srpaulo
167214501Srpaulo#endif  /* DBUS_DICT_HELPERS_H */
168