service->timeout = 0;
+ if (service->network != NULL)
+ __connman_network_disconnect(service->network);
+
if (service->pending != NULL) {
DBusMessage *reply;
dbus_message_unref(service->pending);
service->pending = NULL;
+
+ __connman_service_indicate_state(service,
+ CONNMAN_SERVICE_STATE_FAILURE);
}
return FALSE;
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);
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;
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)
dbus_message_unref(service->pending);
service->pending = NULL;
}
-
}
if (state == CONNMAN_SERVICE_STATE_FAILURE) {
dbus_message_unref(service->pending);
service->pending = NULL;
}
+
+ service->state = CONNMAN_SERVICE_STATE_IDLE;
+ 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;
}
service->type = convert_network_type(network);
+ service->state = CONNMAN_SERVICE_STATE_IDLE;
+
update_from_network(service, network);
service_register(service);