Create element for every network in range
authorMarcel Holtmann <marcel@holtmann.org>
Thu, 3 Jul 2008 12:37:38 +0000 (14:37 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 3 Jul 2008 12:37:38 +0000 (14:37 +0200)
include/element.h
plugins/wifi.c
src/element.c

index c4d97cc..e000a58 100644 (file)
@@ -88,6 +88,10 @@ struct connman_element {
        } netdev;
 
        struct {
+               gchar *identifier;
+       } network;
+
+       struct {
                gchar *address;
                gchar *netmask;
                gchar *gateway;
index 40a5913..5c275a4 100644 (file)
 
 #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 = {
index fd8570f..1b49b80 100644 (file)
@@ -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);