5 * Copyright (C) 2011 BWM CarIT GmbH. 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
28 #include <gdbus/gdbus.h>
30 #include "test-connman.h"
32 static enum connman_session_state string2state(const char *state)
34 if (g_strcmp0(state, "connected") == 0)
35 return CONNMAN_SESSION_STATE_CONNECTED;
36 if (g_strcmp0(state, "online") == 0)
37 return CONNMAN_SESSION_STATE_ONLINE;
39 return CONNMAN_SESSION_STATE_DISCONNECTED;
42 static enum connman_session_state string2type(const char *type)
44 if (g_strcmp0(type, "local") == 0)
45 return CONNMAN_SESSION_TYPE_LOCAL;
46 if (g_strcmp0(type, "internet") == 0)
47 return CONNMAN_SESSION_TYPE_INTERNET;
49 return CONNMAN_SESSION_TYPE_ANY;
52 void bearer_info_cleanup(gpointer data, gpointer user_data)
54 struct test_bearer_info *info = data;
60 static GSList *session_parse_allowed_bearers(DBusMessageIter *iter)
62 struct test_bearer_info *info;
63 DBusMessageIter array;
66 dbus_message_iter_recurse(iter, &array);
68 while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRING) {
71 dbus_message_iter_get_basic(&array, &bearer);
73 info = g_try_new0(struct test_bearer_info, 1);
75 g_slist_foreach(list, bearer_info_cleanup, NULL);
81 info->name = g_strdup(bearer);
83 list = g_slist_append(list, info);
85 dbus_message_iter_next(&array);
91 static DBusMessage *notify_release(DBusConnection *conn,
92 DBusMessage *msg, void *user_data)
94 struct test_session *session = user_data;
96 LOG("session %p", session);
98 if (session->notify != NULL)
99 session->notify(session);
104 static DBusMessage *notify_update(DBusConnection *conn,
105 DBusMessage *msg, void *user_data)
107 struct test_session *session = user_data;
108 struct test_session_info *info = session->info;
109 DBusMessageIter iter, array;
110 GSList *allowed_bearers;
112 LOG("session %p notify %s", session, session->notify_path);
114 dbus_message_iter_init(msg, &iter);
115 dbus_message_iter_recurse(&iter, &array);
117 while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
118 DBusMessageIter entry, value;
121 dbus_message_iter_recurse(&array, &entry);
122 dbus_message_iter_get_basic(&entry, &key);
124 dbus_message_iter_next(&entry);
125 dbus_message_iter_recurse(&entry, &value);
127 switch (dbus_message_iter_get_arg_type(&value)) {
128 case DBUS_TYPE_ARRAY:
129 if (g_str_equal(key, "AllowedBearers") == TRUE) {
130 allowed_bearers = session_parse_allowed_bearers(&value);
132 g_slist_foreach(info->allowed_bearers,
133 bearer_info_cleanup, NULL);
134 g_slist_free(info->allowed_bearers);
136 info->allowed_bearers = allowed_bearers;
138 } else if (g_str_equal(key, "IPv4") == TRUE) {
141 } else if (g_str_equal(key, "IPv6") == TRUE) {
146 return __connman_error_invalid_arguments(msg);
149 case DBUS_TYPE_STRING:
150 if (g_str_equal(key, "State") == TRUE) {
152 dbus_message_iter_get_basic(&value, &val);
154 info->state = string2state(val);
155 } else if (g_str_equal(key, "Bearer") == TRUE) {
157 dbus_message_iter_get_basic(&value, &val);
159 if (info->bearer != NULL)
160 g_free(info->bearer);
162 info->bearer = g_strdup(val);
164 } else if (g_str_equal(key, "Name") == TRUE) {
166 dbus_message_iter_get_basic(&value, &val);
168 if (info->name != NULL)
171 info->name = g_strdup(val);
173 } else if (g_str_equal(key, "Interface") == TRUE) {
175 dbus_message_iter_get_basic(&value, &val);
177 if (info->interface != NULL)
178 g_free(info->interface);
180 info->interface = g_strdup(val);
182 } else if (g_str_equal(key, "ConnectionType")
185 dbus_message_iter_get_basic(&value, &val);
187 info->type = string2type(val);
190 return __connman_error_invalid_arguments(msg);
195 return __connman_error_invalid_arguments(msg);
197 dbus_message_iter_next(&array);
200 if (session->notify != NULL)
201 session->notify(session);
203 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
206 static const GDBusMethodTable notify_methods[] = {
207 { GDBUS_METHOD("Release", NULL, NULL, notify_release) },
208 { GDBUS_METHOD("Update",
209 GDBUS_ARGS({ "settings", "a{sv}" }), NULL,
214 int session_notify_register(struct test_session *session,
215 const char *notify_path)
217 if (g_dbus_register_interface(session->connection, notify_path,
218 CONNMAN_NOTIFICATION_INTERFACE,
219 notify_methods, NULL, NULL,
220 session, NULL) == FALSE) {
227 int session_notify_unregister(struct test_session *session,
228 const char *notify_path)
230 if (g_dbus_unregister_interface(session->connection, notify_path,
231 CONNMAN_NOTIFICATION_INTERFACE) == FALSE) {
238 static void append_allowed_bearers(DBusMessageIter *iter, void *user_data)
240 struct test_session_info *info = user_data;
243 for (list = info->allowed_bearers;
244 list != NULL; list = list->next) {
245 struct test_bearer_info *bearer_info = list->data;
247 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
252 void session_append_settings(DBusMessageIter *dict,
253 struct test_session_info *info)
255 connman_dbus_dict_append_array(dict, "AllowedBearers",
257 append_allowed_bearers,
261 DBusMessage *session_connect(DBusConnection *connection,
262 struct test_session *session)
264 DBusMessage *message, *reply;
267 message = dbus_message_new_method_call(CONNMAN_SERVICE,
268 session->session_path,
269 CONNMAN_SESSION_INTERFACE,
274 dbus_error_init(&error);
276 reply = dbus_connection_send_with_reply_and_block(connection,
277 message, -1, &error);
279 if (dbus_error_is_set(&error) == TRUE) {
280 LOG("%s", error.message);
281 dbus_error_free(&error);
283 LOG("Failed to get properties");
285 dbus_message_unref(message);
289 dbus_message_unref(message);
294 DBusMessage *session_disconnect(DBusConnection *connection,
295 struct test_session *session)
297 DBusMessage *message, *reply;
300 message = dbus_message_new_method_call(CONNMAN_SERVICE,
301 session->session_path,
302 CONNMAN_SESSION_INTERFACE,
307 dbus_error_init(&error);
309 reply = dbus_connection_send_with_reply_and_block(connection,
310 message, -1, &error);
312 if (dbus_error_is_set(&error) == TRUE) {
313 LOG("%s", error.message);
314 dbus_error_free(&error);
316 LOG("Failed to get properties");
318 dbus_message_unref(message);
322 dbus_message_unref(message);