5 * Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32 static void append_variant(DBusMessageIter *iter,
33 int type, void *value)
36 DBusMessageIter valueiter;
41 dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
44 dbus_message_iter_append_basic(&valueiter, type, value);
46 dbus_message_iter_close_container(iter, &valueiter);
49 void obex_dbus_dict_append(DBusMessageIter *dict,
50 const char *key, int type, void *value)
52 DBusMessageIter keyiter;
54 if (type == DBUS_TYPE_STRING) {
55 const char *str = *((const char **) value);
60 dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
63 dbus_message_iter_append_basic(&keyiter, DBUS_TYPE_STRING, &key);
65 append_variant(&keyiter, type, value);
67 dbus_message_iter_close_container(dict, &keyiter);
70 static void append_array_variant(DBusMessageIter *iter, int type, void *val)
72 DBusMessageIter variant, array;
75 const char **str_array = *(const char ***) val;
78 arraysig[0] = DBUS_TYPE_ARRAY;
79 arraysig[1] = typesig[0] = type;
80 arraysig[2] = typesig[1] = '\0';
82 dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
85 dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
88 for (i = 0; str_array[i]; i++)
89 dbus_message_iter_append_basic(&array, type,
92 dbus_message_iter_close_container(&variant, &array);
94 dbus_message_iter_close_container(iter, &variant);
97 void obex_dbus_dict_append_array(DBusMessageIter *dict, const char *key,
100 DBusMessageIter entry;
102 dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
105 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
107 append_array_variant(&entry, type, val);
109 dbus_message_iter_close_container(dict, &entry);
112 static void append_dict_variant(DBusMessageIter *iter, int type, void *val)
114 DBusMessageIter variant, array, entry;
117 const void **val_array = *(const void ***) val;
120 arraysig[0] = DBUS_TYPE_ARRAY;
121 arraysig[1] = typesig[0] = DBUS_DICT_ENTRY_BEGIN_CHAR;
122 arraysig[2] = typesig[1] = DBUS_TYPE_STRING;
123 arraysig[3] = typesig[2] = type;
124 arraysig[4] = typesig[3] = DBUS_DICT_ENTRY_END_CHAR;
125 arraysig[5] = typesig[4] = '\0';
127 dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
130 dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
133 for (i = 0; val_array[i]; i += 2) {
134 dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY,
137 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
138 &(val_array[i + 0]));
141 * D-Bus expects a char** or uint8* depending on the type
142 * given. Since we are dealing with an array through a void**
143 * (and thus val_array[i] is a pointer) we need to
144 * differentiate DBUS_TYPE_STRING from the others. The other
145 * option would be the user to pass the exact type to this
146 * function, instead of a pointer to it. However in this case
147 * a cast from type to void* would be needed, which is not
150 if (type == DBUS_TYPE_STRING) {
151 dbus_message_iter_append_basic(&entry, type,
152 &(val_array[i + 1]));
154 dbus_message_iter_append_basic(&entry, type,
158 dbus_message_iter_close_container(&array, &entry);
161 dbus_message_iter_close_container(&variant, &array);
163 dbus_message_iter_close_container(iter, &variant);
166 void obex_dbus_dict_append_dict(DBusMessageIter *dict, const char *key,
169 DBusMessageIter entry;
171 dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
174 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
176 append_dict_variant(&entry, type, val);
178 dbus_message_iter_close_container(dict, &entry);
181 int obex_dbus_signal_property_changed(DBusConnection *conn,
183 const char *interface,
185 int type, void *value)
188 DBusMessageIter iter;
190 signal = dbus_message_new_signal(path, interface, "PropertyChanged");
191 if (signal == NULL) {
192 error("Unable to allocate new %s.PropertyChanged signal",
197 dbus_message_iter_init_append(signal, &iter);
199 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
201 append_variant(&iter, type, value);
203 return g_dbus_send_message(conn, signal);
206 int obex_dbus_signal_array_property_changed(DBusConnection *conn,
208 const char *interface,
210 int type, void *value)
214 DBusMessageIter iter;
216 signal = dbus_message_new_signal(path, interface, "PropertyChanged");
217 if (signal == NULL) {
218 error("Unable to allocate new %s.PropertyChanged signal",
223 dbus_message_iter_init_append(signal, &iter);
225 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
227 append_array_variant(&iter, type, value);
229 return g_dbus_send_message(conn, signal);
232 int obex_dbus_signal_dict_property_changed(DBusConnection *conn,
234 const char *interface,
236 int type, void *value)
240 DBusMessageIter iter;
242 signal = dbus_message_new_signal(path, interface, "PropertyChanged");
243 if (signal == NULL) {
244 error("Unable to allocate new %s.PropertyChanged signal",
249 dbus_message_iter_init_append(signal, &iter);
251 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
253 append_dict_variant(&iter, type, value);
255 return g_dbus_send_message(conn, signal);