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);
const char *identifier)
{
struct connman_network *network;
+ struct connman_service *service;
DBG("device %p identifier %s", device, identifier);
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;
}
__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