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 const char *roamingpolicy2string(enum connman_session_roaming_policy policy)
45 case CONNMAN_SESSION_ROAMING_POLICY_UNKNOWN:
47 case CONNMAN_SESSION_ROAMING_POLICY_DEFAULT:
49 case CONNMAN_SESSION_ROAMING_POLICY_ALWAYS:
51 case CONNMAN_SESSION_ROAMING_POLICY_FORBIDDEN:
53 case CONNMAN_SESSION_ROAMING_POLICY_NATIONAL:
55 case CONNMAN_SESSION_ROAMING_POLICY_INTERNATIONAL:
56 return "international";
62 static enum connman_session_roaming_policy string2roamingpolicy(const char *policy)
64 if (g_strcmp0(policy, "default") == 0)
65 return CONNMAN_SESSION_ROAMING_POLICY_DEFAULT;
66 else if (g_strcmp0(policy, "always") == 0)
67 return CONNMAN_SESSION_ROAMING_POLICY_ALWAYS;
68 else if (g_strcmp0(policy, "forbidden") == 0)
69 return CONNMAN_SESSION_ROAMING_POLICY_FORBIDDEN;
70 else if (g_strcmp0(policy, "national") == 0)
71 return CONNMAN_SESSION_ROAMING_POLICY_NATIONAL;
72 else if (g_strcmp0(policy, "international") == 0)
73 return CONNMAN_SESSION_ROAMING_POLICY_INTERNATIONAL;
75 return CONNMAN_SESSION_ROAMING_POLICY_UNKNOWN;
78 void bearer_info_cleanup(gpointer data, gpointer user_data)
80 struct test_bearer_info *info = data;
86 static GSList *session_parse_allowed_bearers(DBusMessageIter *iter)
88 struct test_bearer_info *info;
89 DBusMessageIter array;
92 dbus_message_iter_recurse(iter, &array);
94 while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRING) {
97 dbus_message_iter_get_basic(&array, &bearer);
99 info = g_try_new0(struct test_bearer_info, 1);
101 g_slist_foreach(list, bearer_info_cleanup, NULL);
107 info->name = g_strdup(bearer);
109 list = g_slist_append(list, info);
111 dbus_message_iter_next(&array);
117 static DBusMessage *notify_release(DBusConnection *conn,
118 DBusMessage *msg, void *user_data)
120 struct test_session *session = user_data;
122 LOG("session %p", session);
124 if (session->notify != NULL)
125 session->notify(session);
130 static DBusMessage *notify_update(DBusConnection *conn,
131 DBusMessage *msg, void *user_data)
133 struct test_session *session = user_data;
134 struct test_session_info *info = session->info;
135 DBusMessageIter iter, array;
136 GSList *allowed_bearers;
138 LOG("session %p notify %s", session, session->notify_path);
140 dbus_message_iter_init(msg, &iter);
141 dbus_message_iter_recurse(&iter, &array);
143 while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
144 DBusMessageIter entry, value;
147 dbus_message_iter_recurse(&array, &entry);
148 dbus_message_iter_get_basic(&entry, &key);
150 dbus_message_iter_next(&entry);
151 dbus_message_iter_recurse(&entry, &value);
153 switch (dbus_message_iter_get_arg_type(&value)) {
154 case DBUS_TYPE_ARRAY:
155 if (g_str_equal(key, "AllowedBearers") == TRUE) {
156 allowed_bearers = session_parse_allowed_bearers(&value);
158 g_slist_foreach(info->allowed_bearers,
159 bearer_info_cleanup, NULL);
160 g_slist_free(info->allowed_bearers);
162 info->allowed_bearers = allowed_bearers;
164 } else if (g_str_equal(key, "IPv4") == TRUE) {
167 } else if (g_str_equal(key, "IPv6") == TRUE) {
172 return __connman_error_invalid_arguments(msg);
175 case DBUS_TYPE_BOOLEAN:
176 if (g_str_equal(key, "Priority") == TRUE) {
177 dbus_message_iter_get_basic(&value,
180 } else if (g_str_equal(key, "AvoidHandover") == TRUE) {
181 dbus_message_iter_get_basic(&value,
182 &info->avoid_handover);
184 } else if (g_str_equal(key, "StayConnected") == TRUE) {
185 dbus_message_iter_get_basic(&value,
186 &info->stay_connected);
188 } else if (g_str_equal(key, "EmergencyCall") == TRUE) {
189 dbus_message_iter_get_basic(&value,
194 return __connman_error_invalid_arguments(msg);
197 case DBUS_TYPE_UINT32:
198 if (g_str_equal(key, "PeriodicConnect") == TRUE) {
199 dbus_message_iter_get_basic(&value,
200 &info->periodic_connect);
202 } else if (g_str_equal(key, "IdleTimeout") == TRUE) {
203 dbus_message_iter_get_basic(&value,
204 &info->idle_timeout);
206 } else if (g_str_equal(key, "SessionMarker") == TRUE) {
207 dbus_message_iter_get_basic(&value,
212 return __connman_error_invalid_arguments(msg);
215 case DBUS_TYPE_STRING:
216 if (g_str_equal(key, "State") == TRUE) {
218 dbus_message_iter_get_basic(&value, &val);
220 info->state = string2state(val);
221 } else if (g_str_equal(key, "Bearer") == TRUE) {
223 dbus_message_iter_get_basic(&value, &val);
225 if (info->bearer != NULL)
226 g_free(info->bearer);
228 info->bearer = g_strdup(val);
230 } else if (g_str_equal(key, "Name") == TRUE) {
232 dbus_message_iter_get_basic(&value, &val);
234 if (info->name != NULL)
237 info->name = g_strdup(val);
239 } else if (g_str_equal(key, "RoamingPolicy") == TRUE) {
241 dbus_message_iter_get_basic(&value, &val);
242 info->roaming_policy =
243 string2roamingpolicy(val);
245 } else if (g_str_equal(key, "Interface") == TRUE) {
247 dbus_message_iter_get_basic(&value, &val);
249 if (info->interface != NULL)
250 g_free(info->interface);
252 info->interface = g_strdup(val);
256 return __connman_error_invalid_arguments(msg);
261 return __connman_error_invalid_arguments(msg);
263 dbus_message_iter_next(&array);
266 if (session->notify != NULL)
267 session->notify(session);
269 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
272 static GDBusMethodTable notify_methods[] = {
273 { "Release", "", "", notify_release },
274 { "Update", "a{sv}", "", notify_update },
278 int session_notify_register(struct test_session *session,
279 const char *notify_path)
281 if (g_dbus_register_interface(session->connection, notify_path,
282 CONNMAN_NOTIFICATION_INTERFACE,
283 notify_methods, NULL, NULL,
284 session, NULL) == FALSE) {
291 int session_notify_unregister(struct test_session *session,
292 const char *notify_path)
294 if (g_dbus_unregister_interface(session->connection, notify_path,
295 CONNMAN_NOTIFICATION_INTERFACE) == FALSE) {
302 static void append_allowed_bearers(DBusMessageIter *iter, void *user_data)
304 struct test_session_info *info = user_data;
307 for (list = info->allowed_bearers;
308 list != NULL; list = list->next) {
309 struct test_bearer_info *info = list->data;
311 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
316 void session_append_settings(DBusMessageIter *dict,
317 struct test_session_info *info)
321 connman_dbus_dict_append_basic(dict, "Priority",
325 connman_dbus_dict_append_array(dict, "AllowedBearers",
327 append_allowed_bearers,
330 connman_dbus_dict_append_basic(dict, "AvoidHandover",
332 &info->avoid_handover);
334 connman_dbus_dict_append_basic(dict, "StayConnected",
336 &info->stay_connected);
338 connman_dbus_dict_append_basic(dict, "PeriodicConnect",
340 &info->periodic_connect);
342 connman_dbus_dict_append_basic(dict, "IdleTimeout",
344 &info->idle_timeout);
346 connman_dbus_dict_append_basic(dict, "EmergencyCall",
350 policy = roamingpolicy2string(info->roaming_policy);
351 connman_dbus_dict_append_basic(dict, "RoamingPolicy",
356 DBusMessage *session_connect(DBusConnection *connection,
357 struct test_session *session)
359 DBusMessage *message, *reply;
362 message = dbus_message_new_method_call(CONNMAN_SERVICE,
363 session->session_path,
364 CONNMAN_SESSION_INTERFACE,
369 dbus_error_init(&error);
371 reply = dbus_connection_send_with_reply_and_block(connection,
372 message, -1, &error);
374 if (dbus_error_is_set(&error) == TRUE) {
375 LOG("%s", error.message);
376 dbus_error_free(&error);
378 LOG("Failed to get properties");
380 dbus_message_unref(message);
384 dbus_message_unref(message);
389 DBusMessage *session_disconnect(DBusConnection *connection,
390 struct test_session *session)
392 DBusMessage *message, *reply;
395 message = dbus_message_new_method_call(CONNMAN_SERVICE,
396 session->session_path,
397 CONNMAN_SESSION_INTERFACE,
402 dbus_error_init(&error);
404 reply = dbus_connection_send_with_reply_and_block(connection,
405 message, -1, &error);
407 if (dbus_error_is_set(&error) == TRUE) {
408 LOG("%s", error.message);
409 dbus_error_free(&error);
411 LOG("Failed to get properties");
413 dbus_message_unref(message);
417 dbus_message_unref(message);