5 * Copyright (C) 2013 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 as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "dbus_helpers.h"
32 void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
33 const char *dict, const char *sep)
42 DBusMessageIter entry;
47 while ((arg_type = dbus_message_iter_get_arg_type(iter))
48 != DBUS_TYPE_INVALID) {
50 fprintf(stdout, "%s", pre);
53 case DBUS_TYPE_STRUCT:
54 fprintf(stdout, "{ ");
55 dbus_message_iter_recurse(iter, &entry);
56 __connmanctl_dbus_print(&entry, "", "=", " ");
57 fprintf(stdout, " }");
61 fprintf(stdout, "[ ");
63 dbus_message_iter_recurse(iter, &entry);
64 __connmanctl_dbus_print(&entry, "", "=", ", ");
66 fprintf(stdout, " ]");
69 case DBUS_TYPE_DICT_ENTRY:
71 dbus_message_iter_recurse(iter, &entry);
72 __connmanctl_dbus_print(&entry, "", dict, dict);
75 case DBUS_TYPE_STRING:
76 case DBUS_TYPE_OBJECT_PATH:
77 dbus_message_iter_get_basic(iter, &str);
78 fprintf(stdout, "%s", str);
81 case DBUS_TYPE_VARIANT:
82 dbus_message_iter_recurse(iter, &entry);
83 __connmanctl_dbus_print(&entry, pre, dict, sep);
86 case DBUS_TYPE_BOOLEAN:
87 dbus_message_iter_get_basic(iter, &b);
89 fprintf(stdout, "False");
91 fprintf(stdout, "True");
95 dbus_message_iter_get_basic(iter, &c);
96 fprintf(stdout, "%d", c);
99 case DBUS_TYPE_UINT16:
100 case DBUS_TYPE_UINT32:
101 dbus_message_iter_get_basic(iter, &i);
102 fprintf(stdout, "%d", i);
105 case DBUS_TYPE_DOUBLE:
106 dbus_message_iter_get_basic(iter, &d);
107 fprintf(stdout, "%f", d);
111 fprintf(stdout, "<type %c>", arg_type);
115 if (dbus_message_iter_has_next(iter) == TRUE)
116 fprintf(stdout, "%s", sep);
118 dbus_message_iter_next(iter);
122 struct dbus_callback {
123 connmanctl_dbus_method_return_func_t cb;
127 static void dbus_method_reply(DBusPendingCall *call, void *user_data)
129 struct dbus_callback *callback = user_data;
132 DBusMessageIter iter;
134 __connmanctl_save_rl();
136 reply = dbus_pending_call_steal_reply(call);
137 if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
140 dbus_error_init(&err);
141 dbus_set_error_from_message(&err, reply);
143 callback->cb(NULL, err.message, callback->user_data);
145 dbus_error_free(&err);
149 dbus_message_iter_init(reply, &iter);
150 res = callback->cb(&iter, NULL, callback->user_data);
153 __connmanctl_redraw_rl();
154 if (__connmanctl_is_interactive() == false && res != -EINPROGRESS)
158 dbus_message_unref(reply);
161 static int send_method_call(DBusConnection *connection,
162 DBusMessage *message, connmanctl_dbus_method_return_func_t cb,
166 DBusPendingCall *call;
167 struct dbus_callback *callback;
169 if (dbus_connection_send_with_reply(connection, message, &call,
177 callback = g_new0(struct dbus_callback, 1);
179 callback->user_data = user_data;
180 dbus_pending_call_set_notify(call, dbus_method_reply,
186 dbus_message_unref(message);
190 static int append_variant(DBusMessageIter *iter, const char *property,
191 int type, void *value)
193 DBusMessageIter variant;
197 case DBUS_TYPE_BOOLEAN:
198 type_str = DBUS_TYPE_BOOLEAN_AS_STRING;
201 type_str = DBUS_TYPE_BYTE_AS_STRING;
203 case DBUS_TYPE_STRING:
204 type_str = DBUS_TYPE_STRING_AS_STRING;
210 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &property);
211 dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, type_str,
213 dbus_message_iter_append_basic(&variant, type, value);
214 dbus_message_iter_close_container(iter, &variant);
219 int __connmanctl_dbus_method_call(DBusConnection *connection,
220 const char *service, const char *path, const char *interface,
221 const char *method, connmanctl_dbus_method_return_func_t cb,
222 void *user_data, int arg1, ...)
224 DBusMessage *message;
227 message = dbus_message_new_method_call(service, path, interface,
233 va_start(args, arg1);
234 dbus_message_append_args_valist(message, arg1, args);
237 return send_method_call(connection, message, cb, user_data);
240 int __connmanctl_dbus_set_property(DBusConnection *connection,
241 const char *path, const char *interface,
242 connmanctl_dbus_method_return_func_t cb, void * user_data,
243 const char *property, int type, void *value)
245 DBusMessage *message;
246 DBusMessageIter iter;
248 message = dbus_message_new_method_call("net.connman", path,
249 interface, "SetProperty");
254 dbus_message_iter_init_append(message, &iter);
256 if (append_variant(&iter, property, type, value) < 0) {
257 dbus_message_unref(message);
261 return send_method_call(connection, message, cb, user_data);
264 void __connmanctl_dbus_append_dict_entry(DBusMessageIter *iter,
265 const char *property, int type, void *value)
267 DBusMessageIter dict_entry;
269 dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL,
272 append_variant(&dict_entry, property, type, value);
274 dbus_message_iter_close_container(iter, &dict_entry);
277 int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
278 const char *path, const char *interface,
279 connmanctl_dbus_method_return_func_t cb, void *user_data,
280 const char *property, int type,
281 connmanctl_dbus_append_func_t append_fn,
282 void *append_user_data)
284 DBusMessage *message;
285 DBusMessageIter iter, variant, dict;
287 message = dbus_message_new_method_call("net.connman", path,
288 interface, "SetProperty");
293 dbus_message_iter_init_append(message, &iter);
294 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &property);
295 dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
296 DBUS_TYPE_ARRAY_AS_STRING
297 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
298 DBUS_TYPE_STRING_AS_STRING
299 DBUS_TYPE_VARIANT_AS_STRING
300 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
303 dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
304 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
305 DBUS_TYPE_STRING_AS_STRING
306 DBUS_TYPE_VARIANT_AS_STRING
307 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
310 append_fn(&dict, append_user_data);
312 dbus_message_iter_close_container(&variant, &dict);
313 dbus_message_iter_close_container(&iter, &variant);
315 return send_method_call(connection, message, cb, user_data);
318 static void append_variant_array(DBusMessageIter *iter, const char *property,
319 connmanctl_dbus_append_func_t append_fn,
320 void *append_user_data)
322 DBusMessageIter variant, array;
324 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &property);
325 dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
326 DBUS_TYPE_ARRAY_AS_STRING
327 DBUS_TYPE_STRING_AS_STRING,
330 dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
331 DBUS_TYPE_STRING_AS_STRING, &array);
333 append_fn(&array, append_user_data);
335 dbus_message_iter_close_container(&variant, &array);
336 dbus_message_iter_close_container(iter, &variant);
339 void __connmanctl_dbus_append_dict_string_array(DBusMessageIter *iter,
340 const char *property, connmanctl_dbus_append_func_t append_fn,
341 void *append_user_data)
343 DBusMessageIter dict_entry;
345 dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL,
348 append_variant_array(&dict_entry, property, append_fn,
351 dbus_message_iter_close_container(iter, &dict_entry);
354 int __connmanctl_dbus_set_property_array(DBusConnection *connection,
355 const char *path, const char *interface,
356 connmanctl_dbus_method_return_func_t cb, void *user_data,
357 const char *property, int type,
358 connmanctl_dbus_append_func_t append_fn,
359 void *append_user_data)
361 DBusMessage *message;
362 DBusMessageIter iter;
364 if (type != DBUS_TYPE_STRING)
367 message = dbus_message_new_method_call("net.connman", path,
368 interface, "SetProperty");
373 dbus_message_iter_init_append(message, &iter);
375 append_variant_array(&iter, property, append_fn, append_user_data);
377 return send_method_call(connection, message, cb, user_data);