service: Update network pointer in service
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Mon, 25 Jul 2011 14:24:28 +0000 (16:24 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 25 Jul 2011 23:20:25 +0000 (01:20 +0200)
src/connman.h
src/device.c
src/service.c

index 408b809..681b29f 100644 (file)
@@ -470,6 +470,7 @@ struct connman_service *__connman_service_create_from_network(struct connman_net
 struct connman_service *__connman_service_create_from_provider(struct connman_provider *provider);
 void __connman_service_update_from_network(struct connman_network *network);
 void __connman_service_remove_from_network(struct connman_network *network);
+void __connman_service_reset_from_networks(struct connman_service *service, GHashTable *networks);
 
 void __connman_service_create_ip4config(struct connman_service *service,
                                                                int index);
index 1465fce..601f727 100644 (file)
@@ -1108,6 +1108,7 @@ int connman_device_remove_network(struct connman_device *device,
                                                        const char *identifier)
 {
        struct connman_network *network;
+       struct connman_service *service;
 
        DBG("device %p identifier %s", device, identifier);
 
@@ -1115,10 +1116,15 @@ int connman_device_remove_network(struct connman_device *device,
        if (network == NULL)
                return 0;
 
+       service = __connman_service_lookup_from_network(network);
+
        __connman_network_set_device(network, NULL);
 
        g_hash_table_remove(device->networks, identifier);
 
+       if (service != NULL)
+               __connman_service_reset_from_networks(service, device->networks);
+
        return 0;
 }
 
index e793d75..7919454 100644 (file)
@@ -4944,6 +4944,43 @@ void __connman_service_remove_from_network(struct connman_network *network)
        __connman_service_put(service);
 }
 
+void __connman_service_reset_from_networks(struct connman_service *service,
+                                               GHashTable *networks)
+{
+       struct connman_network *network;
+       GHashTableIter iter;
+       gpointer key, value;
+
+       DBG("service %p", service);
+
+       network = NULL;
+
+       g_hash_table_iter_init(&iter, networks);
+
+       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+               struct connman_network *iter_network = value;
+               uint8_t strength, iter_strength;
+
+               if (network == NULL) {
+                       network = iter_network;
+                       continue;
+               }
+
+               strength = connman_network_get_strength(network);
+               iter_strength = connman_network_get_strength(iter_network);
+
+               if (iter_strength > strength)
+                       network = iter_network;
+       }
+
+       if (network == NULL) {
+               service->network = NULL;
+               return;
+       }
+
+       __connman_service_create_from_network(network);
+}
+
 /**
  * __connman_service_create_from_provider:
  * @provider: provider structure