From 78238bcd30a5bd0e712bf0b6d19250a6628aa93e Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 3 Jul 2008 14:37:38 +0200 Subject: [PATCH] Create element for every network in range --- include/element.h | 4 +++ plugins/wifi.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/element.c | 5 ++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/include/element.h b/include/element.h index c4d97cc..e000a58 100644 --- a/include/element.h +++ b/include/element.h @@ -88,6 +88,10 @@ struct connman_element { } netdev; struct { + gchar *identifier; + } network; + + struct { gchar *address; gchar *netmask; gchar *gateway; diff --git a/plugins/wifi.c b/plugins/wifi.c index 40a5913..5c275a4 100644 --- a/plugins/wifi.c +++ b/plugins/wifi.c @@ -29,12 +29,52 @@ #include "supplicant.h" -static void scan_result(struct connman_element *element, +struct wifi_data { + GStaticMutex mutex; + GSList *list; +}; + +static struct connman_element *find_element(struct wifi_data *data, + const char *identifier) +{ + GSList *list; + + for (list = data->list; list; list = list->next) { + struct connman_element *element = list->data; + + if (g_str_equal(identifier, element->network.identifier) == TRUE) + return element; + } + + return NULL; +} + +static void scan_result(struct connman_element *parent, struct supplicant_network *network) { - DBG("element %p name %s", element, element->name); + struct wifi_data *data = connman_element_get_data(parent); + struct connman_element *element; DBG("network %p identifier %s", network, network->identifier); + + if (data == NULL) + return; + + g_static_mutex_lock(&data->mutex); + + element = find_element(data, network->identifier); + if (element == NULL) { + element = connman_element_create(); + + element->type = CONNMAN_ELEMENT_TYPE_NETWORK; + element->name = g_strdup(network->identifier); + + data->list = g_slist_append(data->list, element); + } + + g_static_mutex_unlock(&data->mutex); + + connman_element_register(element, parent); } static struct supplicant_callback wifi_callback = { @@ -43,10 +83,19 @@ static struct supplicant_callback wifi_callback = { static int wifi_probe(struct connman_element *element) { + struct wifi_data *data; int err; DBG("element %p name %s", element, element->name); + data = g_try_new0(struct wifi_data, 1); + if (data == NULL) + return -ENOMEM; + + g_static_mutex_init(&data->mutex); + + connman_element_set_data(element, data); + err = __supplicant_start(element, &wifi_callback); if (err < 0) return err; @@ -58,9 +107,32 @@ static int wifi_probe(struct connman_element *element) static void wifi_remove(struct connman_element *element) { + struct wifi_data *data = connman_element_get_data(element); + GSList *list; + DBG("element %p name %s", element, element->name); __supplicant_stop(element); + + connman_element_set_data(element, NULL); + + if (data == NULL) + return; + + g_static_mutex_lock(&data->mutex); + + for (list = data->list; list; list = list->next) { + struct connman_element *network = list->data; + + connman_element_unregister(network); + connman_element_unref(network); + } + + g_slist_free(data->list); + + g_static_mutex_unlock(&data->mutex); + + g_free(data); } static struct connman_driver wifi_driver = { diff --git a/src/element.c b/src/element.c index fd8570f..1b49b80 100644 --- a/src/element.c +++ b/src/element.c @@ -174,6 +174,10 @@ static DBusMessage *get_properties(DBusConnection *conn, append_entry(&dict, "Priority", DBUS_TYPE_UINT16, &element->priority); + if (element->network.identifier != NULL) + append_entry(&dict, "Identifier", + DBUS_TYPE_STRING, &element->network.identifier); + if (element->ipv4.address != NULL) append_entry(&dict, "IPv4.Address", DBUS_TYPE_STRING, &element->ipv4.address); @@ -392,6 +396,7 @@ void connman_element_unref(struct connman_element *element) g_free(element->ipv4.network); g_free(element->ipv4.broadcast); g_free(element->ipv4.nameserver); + g_free(element->network.identifier); g_free(element->netdev.name); g_free(element->path); g_free(element->name); -- 2.7.4