From a9c1d0a135e77025b9810eeb5653283b0b5278c3 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sun, 8 Mar 2009 16:53:54 +0100 Subject: [PATCH] Move network connection state handling to idle callback --- src/network.c | 86 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/src/network.c b/src/network.c index e0f0fa8..332bbec 100644 --- a/src/network.c +++ b/src/network.c @@ -636,6 +636,51 @@ connman_bool_t connman_network_get_available(struct connman_network *network) return network->available; } +static gboolean set_connected(gpointer user_data) +{ + struct connman_network *network = user_data; + + if (network->connected == TRUE) { + struct connman_element *element; + enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN; + + switch (network->protocol) { + case CONNMAN_NETWORK_PROTOCOL_UNKNOWN: + return 0; + case CONNMAN_NETWORK_PROTOCOL_IP: + type = CONNMAN_ELEMENT_TYPE_DHCP; + break; + case CONNMAN_NETWORK_PROTOCOL_PPP: + type = CONNMAN_ELEMENT_TYPE_PPP; + break; + } + + __connman_device_increase_connections(network->device); + + __connman_device_set_network(network->device, network); + + connman_device_set_disconnected(network->device, FALSE); + + element = connman_element_create(NULL); + if (element != NULL) { + element->type = type; + element->index = network->element.index; + + if (connman_element_register(element, + &network->element) < 0) + connman_element_unref(element); + } + } else { + connman_element_unregister_children(&network->element); + + __connman_device_set_network(network->device, NULL); + + __connman_device_decrease_connections(network->device); + } + + return FALSE; +} + /** * connman_network_set_connected: * @network: network structure @@ -658,7 +703,7 @@ int connman_network_set_connected(struct connman_network *network, network->connected = connected; if (network->registered == FALSE) - goto connected; + g_idle_add(set_connected, network); signal = dbus_message_new_signal(network->element.path, CONNMAN_NETWORK_INTERFACE, "PropertyChanged"); @@ -676,44 +721,7 @@ int connman_network_set_connected(struct connman_network *network, g_dbus_send_message(connection, signal); -connected: - if (connected == TRUE) { - struct connman_element *element; - enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN; - - switch (network->protocol) { - case CONNMAN_NETWORK_PROTOCOL_UNKNOWN: - return 0; - case CONNMAN_NETWORK_PROTOCOL_IP: - type = CONNMAN_ELEMENT_TYPE_DHCP; - break; - case CONNMAN_NETWORK_PROTOCOL_PPP: - type = CONNMAN_ELEMENT_TYPE_PPP; - break; - } - - __connman_device_increase_connections(network->device); - - __connman_device_set_network(network->device, network); - - connman_device_set_disconnected(network->device, FALSE); - - element = connman_element_create(NULL); - if (element != NULL) { - element->type = type; - element->index = network->element.index; - - if (connman_element_register(element, - &network->element) < 0) - connman_element_unref(element); - } - } else { - connman_element_unregister_children(&network->element); - - __connman_device_set_network(network->device, NULL); - - __connman_device_decrease_connections(network->device); - } + set_connected(network); return 0; } -- 2.7.4