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
27 #include "dbus_helpers.h"
31 void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
32 const char *dict, const char *sep)
41 DBusMessageIter entry;
46 while ((arg_type = dbus_message_iter_get_arg_type(iter))
47 != DBUS_TYPE_INVALID) {
49 fprintf(stdout, "%s", pre);
52 case DBUS_TYPE_STRUCT:
53 fprintf(stdout, "{ ");
54 dbus_message_iter_recurse(iter, &entry);
55 __connmanctl_dbus_print(&entry, "", "=", " ");
56 fprintf(stdout, " }");
60 fprintf(stdout, "[ ");
62 dbus_message_iter_recurse(iter, &entry);
63 __connmanctl_dbus_print(&entry, "", "=", ", ");
65 fprintf(stdout, " ]");
68 case DBUS_TYPE_DICT_ENTRY:
70 dbus_message_iter_recurse(iter, &entry);
71 __connmanctl_dbus_print(&entry, "", dict, dict);
74 case DBUS_TYPE_STRING:
75 case DBUS_TYPE_OBJECT_PATH:
76 dbus_message_iter_get_basic(iter, &str);
77 fprintf(stdout, "%s", str);
80 case DBUS_TYPE_VARIANT:
81 dbus_message_iter_recurse(iter, &entry);
82 __connmanctl_dbus_print(&entry, pre, dict, sep);
85 case DBUS_TYPE_BOOLEAN:
86 dbus_message_iter_get_basic(iter, &b);
88 fprintf(stdout, "False");
90 fprintf(stdout, "True");
94 dbus_message_iter_get_basic(iter, &c);
95 fprintf(stdout, "%d", c);
98 case DBUS_TYPE_UINT16:
99 case DBUS_TYPE_UINT32:
100 dbus_message_iter_get_basic(iter, &i);
101 fprintf(stdout, "%d", i);
104 case DBUS_TYPE_DOUBLE:
105 dbus_message_iter_get_basic(iter, &d);
106 fprintf(stdout, "%f", d);
110 fprintf(stdout, "<type %c>", arg_type);
114 if (dbus_message_iter_has_next(iter) == TRUE)
115 fprintf(stdout, "%s", sep);
117 dbus_message_iter_next(iter);
121 struct dbus_callback {
122 connmanctl_dbus_method_return_func_t cb;
126 static void dbus_method_reply(DBusPendingCall *call, void *user_data)
128 struct dbus_callback *callback = user_data;
130 DBusMessageIter iter;
132 reply = dbus_pending_call_steal_reply(call);
133 if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
136 dbus_error_init(&err);
137 dbus_set_error_from_message(&err, reply);
139 callback->cb(NULL, err.message, callback->user_data);
141 dbus_error_free(&err);
145 dbus_message_iter_init(reply, &iter);
146 callback->cb(&iter, NULL, callback->user_data);
150 dbus_message_unref(reply);
153 int __connmanctl_dbus_method_call(DBusConnection *connection, const char *path,
154 const char *interface, const char *method,
155 connmanctl_dbus_method_return_func_t cb, void * user_data,
159 DBusMessage *message;
161 DBusPendingCall *call;
162 struct dbus_callback *callback;
164 message = dbus_message_new_method_call("net.connman", path,
170 va_start(args, arg1);
171 dbus_message_append_args_valist(message, arg1, args);
174 if (dbus_connection_send_with_reply(connection, message, &call,
182 callback = g_new0(struct dbus_callback, 1);
184 callback->user_data = user_data;
185 dbus_pending_call_set_notify(call, dbus_method_reply,
191 dbus_message_unref(message);