5 * Copyright (C) 2007-2009 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 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
31 #define PROFILE_DEFAULT "/profile/default"
33 struct connman_group {
39 connman_uint8_t strength;
40 struct connman_network *network;
43 static GHashTable *groups = NULL;
45 static DBusConnection *connection = NULL;
47 static DBusMessage *get_properties(DBusConnection *conn,
48 DBusMessage *msg, void *data)
50 struct connman_group *group = data;
52 DBusMessageIter array, dict;
56 reply = dbus_message_new_method_return(msg);
60 dbus_message_iter_init_append(reply, &array);
62 dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY,
63 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
64 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
65 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
67 if (group->type != NULL)
68 connman_dbus_dict_append_variant(&dict, "Type",
69 DBUS_TYPE_STRING, &group->type);
71 if (group->name != NULL)
72 connman_dbus_dict_append_variant(&dict, "Name",
73 DBUS_TYPE_STRING, &group->name);
75 if (group->mode != NULL)
76 connman_dbus_dict_append_variant(&dict, "Mode",
77 DBUS_TYPE_STRING, &group->mode);
79 if (group->security != NULL)
80 connman_dbus_dict_append_variant(&dict, "Security",
81 DBUS_TYPE_STRING, &group->security);
83 if (group->strength > 0)
84 connman_dbus_dict_append_variant(&dict, "Strength",
85 DBUS_TYPE_BYTE, &group->strength);
87 dbus_message_iter_close_container(&array, &dict);
92 static GDBusMethodTable service_methods[] = {
93 { "GetProperties", "", "a{sv}", get_properties },
97 static void free_group(gpointer data)
99 struct connman_group *group = data;
101 DBG("group %p", group);
103 g_dbus_unregister_interface(connection, group->path,
104 CONNMAN_SERVICE_INTERFACE);
106 g_free(group->security);
114 static struct connman_group *lookup_group(const char *name)
116 struct connman_group *group;
118 DBG("name %s", name);
123 group = g_hash_table_lookup(groups, name);
127 group = g_try_new0(struct connman_group, 1);
131 group->type = CONNMAN_ELEMENT_TYPE_UNKNOWN;
132 group->path = g_strdup_printf("%s/%s", PROFILE_DEFAULT, name);
134 g_hash_table_insert(groups, g_strdup(name), group);
136 g_dbus_register_interface(connection, group->path,
137 CONNMAN_SERVICE_INTERFACE,
139 NULL, NULL, group, NULL);
142 DBG("group %p", group);
147 int __connman_profile_add_device(struct connman_device *device)
149 struct connman_group *group;
152 DBG("device %p", device);
154 name = g_strdup_printf("%s_%d", __connman_device_get_type(device),
155 connman_device_get_index(device));
156 group = lookup_group(name);
162 group->type = g_strdup(__connman_device_get_type(device));
163 group->name = g_strdup(connman_device_get_string(device, "Name"));
168 int __connman_profile_remove_device(struct connman_device *device)
170 struct connman_group *group;
173 DBG("device %p", device);
175 name = g_strdup_printf("%s_%d", __connman_device_get_type(device),
176 connman_device_get_index(device));
177 group = lookup_group(name);
186 int __connman_profile_add_network(struct connman_network *network)
188 struct connman_group *group;
190 DBG("network %p", network);
192 group = lookup_group(__connman_network_get_group(network));
199 group->type = g_strdup(__connman_network_get_type(network));
200 group->name = g_strdup(connman_network_get_string(network, "Name"));
202 group->strength = connman_network_get_uint8(network, "Strength");
204 if (group->network == NULL) {
205 group->network = network;
207 group->mode = g_strdup(connman_network_get_string(network,
209 group->security = g_strdup(connman_network_get_string(network,
216 int __connman_profile_remove_network(struct connman_network *network)
218 struct connman_group *group;
220 DBG("network %p", network);
222 group = lookup_group(__connman_network_get_group(network));
226 if (group->network == network) {
227 g_free(group->security);
228 group->security = NULL;
233 group->network = NULL;
239 const char *__connman_profile_active(void)
243 return PROFILE_DEFAULT;
246 void __connman_profile_list(DBusMessageIter *iter)
248 const char *path = __connman_profile_active();
252 dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
255 static void append_path(gpointer key, gpointer value, gpointer user_data)
257 struct connman_group *group = value;
258 DBusMessageIter *iter = user_data;
260 dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH,
264 void __connman_profile_list_services(DBusMessageIter *iter)
268 g_hash_table_foreach(groups, append_path, iter);
271 static void append_services(DBusMessageIter *dict)
273 DBusMessageIter entry, value, iter;
274 const char *key = "Services";
276 dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
279 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
281 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
282 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
285 dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
286 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
287 __connman_profile_list_services(&iter);
288 dbus_message_iter_close_container(&value, &iter);
290 dbus_message_iter_close_container(&entry, &value);
292 dbus_message_iter_close_container(dict, &entry);
295 static DBusMessage *profile_properties(DBusConnection *conn,
296 DBusMessage *msg, void *data)
298 const char *name = "Default";
300 DBusMessageIter array, dict;
302 DBG("conn %p", conn);
304 reply = dbus_message_new_method_return(msg);
308 dbus_message_iter_init_append(reply, &array);
310 dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY,
311 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
312 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
313 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
315 connman_dbus_dict_append_variant(&dict, "Name",
316 DBUS_TYPE_STRING, &name);
318 append_services(&dict);
320 dbus_message_iter_close_container(&array, &dict);
325 static GDBusMethodTable profile_methods[] = {
326 { "GetProperties", "", "a{sv}", profile_properties },
330 int __connman_profile_init(DBusConnection *conn)
332 DBG("conn %p", conn);
334 connection = dbus_connection_ref(conn);
335 if (connection == NULL)
338 groups = g_hash_table_new_full(g_str_hash, g_str_equal,
341 g_dbus_register_interface(connection, PROFILE_DEFAULT,
342 CONNMAN_PROFILE_INTERFACE,
344 NULL, NULL, NULL, NULL);
349 void __connman_profile_cleanup(void)
351 DBG("conn %p", connection);
353 g_dbus_unregister_interface(connection, PROFILE_DEFAULT,
354 CONNMAN_PROFILE_INTERFACE);
356 g_hash_table_destroy(groups);
359 if (connection == NULL)
362 dbus_connection_unref(connection);