#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 = {
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;
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 = {
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);
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);