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
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_type string2type(const char *type)
44 if (g_strcmp0(type, "any") == 0)
45 return CONNMAN_SESSION_TYPE_ANY;
46 if (g_strcmp0(type, "local") == 0)
47 return CONNMAN_SESSION_TYPE_LOCAL;
48 if (g_strcmp0(type, "internet") == 0)
49 return CONNMAN_SESSION_TYPE_INTERNET;
51 return CONNMAN_SESSION_TYPE_UNKNOWN;
54 void bearer_info_cleanup(gpointer data, gpointer user_data)
56 struct test_bearer_info *info = data;
62 static GSList *session_parse_allowed_bearers(DBusMessageIter *iter)
64 struct test_bearer_info *info;
65 DBusMessageIter array;
68 dbus_message_iter_recurse(iter, &array);
70 while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRING) {
73 dbus_message_iter_get_basic(&array, &bearer);
75 info = g_try_new0(struct test_bearer_info, 1);
77 g_slist_foreach(list, bearer_info_cleanup, NULL);
83 info->name = g_strdup(bearer);
85 list = g_slist_append(list, info);
87 dbus_message_iter_next(&array);
93 static DBusMessage *notify_release(DBusConnection *conn,
94 DBusMessage *msg, void *user_data)
96 struct test_session *session = user_data;
98 LOG("session %p", session);
100 if (session->notify != NULL)
101 session->notify(session);
106 static DBusMessage *notify_update(DBusConnection *conn,
107 DBusMessage *msg, void *user_data)
109 struct test_session *session = user_data;
110 struct test_session_info *info = session->info;
111 DBusMessageIter iter, array;
112 GSList *allowed_bearers;
114 LOG("session %p notify %s", session, session->notify_path);
116 dbus_message_iter_init(msg, &iter);
117 dbus_message_iter_recurse(&iter, &array);
119 while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
120 DBusMessageIter entry, value;
123 dbus_message_iter_recurse(&array, &entry);
124 dbus_message_iter_get_basic(&entry, &key);
126 dbus_message_iter_next(&entry);
127 dbus_message_iter_recurse(&entry, &value);
129 switch (dbus_message_iter_get_arg_type(&value)) {
130 case DBUS_TYPE_ARRAY:
131 if (g_str_equal(key, "AllowedBearers") == TRUE) {
132 allowed_bearers = session_parse_allowed_bearers(&value);
134 g_slist_foreach(info->allowed_bearers,
135 bearer_info_cleanup, NULL);
136 g_slist_free(info->allowed_bearers);
138 info->allowed_bearers = allowed_bearers;
140 } else if (g_str_equal(key, "IPv4") == TRUE) {
143 } else if (g_str_equal(key, "IPv6") == TRUE) {
148 return __connman_error_invalid_arguments(msg);
151 case DBUS_TYPE_STRING:
152 if (g_str_equal(key, "State") == TRUE) {
154 dbus_message_iter_get_basic(&value, &val);
156 info->state = string2state(val);
157 } else if (g_str_equal(key, "Bearer") == TRUE) {
159 dbus_message_iter_get_basic(&value, &val);
161 if (info->bearer != NULL)
162 g_free(info->bearer);
164 info->bearer = g_strdup(val);
166 } else if (g_str_equal(key, "Name") == TRUE) {
168 dbus_message_iter_get_basic(&value, &val);
170 if (info->name != NULL)
173 info->name = g_strdup(val);
175 } else if (g_str_equal(key, "Interface") == TRUE) {
177 dbus_message_iter_get_basic(&value, &val);
179 if (info->interface != NULL)
180 g_free(info->interface);
182 info->interface = g_strdup(val);
184 } else if (g_str_equal(key, "ConnectionType")
187 dbus_message_iter_get_basic(&value, &val);
189 info->type = string2type(val);
192 return __connman_error_invalid_arguments(msg);
197 return __connman_error_invalid_arguments(msg);
199 dbus_message_iter_next(&array);
202 if (session->notify != NULL)
203 session->notify(session);
205 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
208 static const GDBusMethodTable notify_methods[] = {
209 { GDBUS_METHOD("Release", NULL, NULL, notify_release) },
210 { GDBUS_METHOD("Update",
211 GDBUS_ARGS({ "settings", "a{sv}" }), NULL,
216 int session_notify_register(struct test_session *session,
217 const char *notify_path)
219 if (g_dbus_register_interface(session->connection, notify_path,
220 CONNMAN_NOTIFICATION_INTERFACE,
221 notify_methods, NULL, NULL,
222 session, NULL) == FALSE) {
229 int session_notify_unregister(struct test_session *session,
230 const char *notify_path)
232 if (g_dbus_unregister_interface(session->connection, notify_path,
233 CONNMAN_NOTIFICATION_INTERFACE) == FALSE) {
240 static void append_allowed_bearers(DBusMessageIter *iter, void *user_data)
242 struct test_session_info *info = user_data;
245 for (list = info->allowed_bearers;
246 list != NULL; list = list->next) {
247 struct test_bearer_info *bearer_info = list->data;
249 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
254 void session_append_settings(DBusMessageIter *dict,
255 struct test_session_info *info)
257 if (info->allowed_bearers == NULL)
260 connman_dbus_dict_append_array(dict, "AllowedBearers",
262 append_allowed_bearers,
266 DBusMessage *session_connect(DBusConnection *connection,
267 struct test_session *session)
269 DBusMessage *message, *reply;
272 message = dbus_message_new_method_call(CONNMAN_SERVICE,
273 session->session_path,
274 CONNMAN_SESSION_INTERFACE,
279 dbus_error_init(&error);
281 reply = dbus_connection_send_with_reply_and_block(connection,
282 message, -1, &error);
284 if (dbus_error_is_set(&error) == TRUE) {
285 LOG("%s", error.message);
286 dbus_error_free(&error);
288 LOG("Failed to get properties");
290 dbus_message_unref(message);
294 dbus_message_unref(message);
299 DBusMessage *session_disconnect(DBusConnection *connection,
300 struct test_session *session)
302 DBusMessage *message, *reply;
305 message = dbus_message_new_method_call(CONNMAN_SERVICE,
306 session->session_path,
307 CONNMAN_SESSION_INTERFACE,
312 dbus_error_init(&error);
314 reply = dbus_connection_send_with_reply_and_block(connection,
315 message, -1, &error);
317 if (dbus_error_is_set(&error) == TRUE) {
318 LOG("%s", error.message);
319 dbus_error_free(&error);
321 LOG("Failed to get properties");
323 dbus_message_unref(message);
327 dbus_message_unref(message);