Disconnect service on removal if still connected
[connman] / src / service.c
index c194c55..48bb49c 100644 (file)
@@ -292,6 +292,9 @@ static gboolean connect_timeout(gpointer user_data)
 
        service->timeout = 0;
 
+       if (service->network != NULL)
+               __connman_network_disconnect(service->network);
+
        if (service->pending != NULL) {
                DBusMessage *reply;
 
@@ -409,13 +412,11 @@ static DBusMessage *remove_service(DBusConnection *conn,
        if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET)
                return __connman_error_not_supported(msg);
 
-       if (service->network != NULL) {
-               int err;
+       if (service->favorite == FALSE)
+               return __connman_error_not_supported(msg);
 
-               err = __connman_network_disconnect(service->network);
-               if (err < 0 && err != -EINPROGRESS)
-                       return __connman_error_failed(msg, -err);
-       }
+       if (service->network != NULL)
+               __connman_network_disconnect(service->network);
 
        connman_service_set_favorite(service, FALSE);
        __connman_storage_save_service(service);
@@ -592,6 +593,13 @@ static gint service_compare(gconstpointer a, gconstpointer b,
        struct connman_service *service_a = (void *) a;
        struct connman_service *service_b = (void *) b;
 
+       if (service_a->state != service_b->state) {
+               if (service_a->state == CONNMAN_SERVICE_STATE_READY)
+                       return -1;
+               if (service_b->state == CONNMAN_SERVICE_STATE_READY)
+                       return 1;
+       }
+
        if (service_a->order > service_b->order)
                return -1;
 
@@ -669,6 +677,8 @@ int __connman_service_set_carrier(struct connman_service *service,
 int __connman_service_indicate_state(struct connman_service *service,
                                        enum connman_service_state state)
 {
+       GSequenceIter *iter;
+
        DBG("service %p state %d", service, state);
 
        if (service == NULL)
@@ -728,6 +738,12 @@ int __connman_service_indicate_state(struct connman_service *service,
                state_changed(service);
        }
 
+       iter = g_hash_table_lookup(service_hash, service->identifier);
+       if (iter != NULL)
+               g_sequence_sort_changed(iter, service_compare, NULL);
+
+       __connman_profile_changed();
+
        return 0;
 }