From 08c0c3a49b4b02add54856948629dd57b3927791 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 21 Apr 2009 06:13:25 +0100 Subject: [PATCH] Add support for service ready and disconnect state changes --- src/connection.c | 8 ++++++++ src/connman.h | 3 +++ src/element.c | 32 ++++++++++++++++++++++++++++++++ src/service.c | 24 ++++++++++++++++++++++++ 4 files changed, 67 insertions(+) diff --git a/src/connection.c b/src/connection.c index 6fb1d76..0d544eb 100644 --- a/src/connection.c +++ b/src/connection.c @@ -467,6 +467,7 @@ static void unregister_interface(struct connman_element *element) static int connection_probe(struct connman_element *element) { + struct connman_service *service; const char *gateway = NULL; DBG("element %p name %s", element, element->name); @@ -485,6 +486,9 @@ static int connection_probe(struct connman_element *element) if (register_interface(element) < 0) return -ENODEV; + service = __connman_element_get_service(element); + __connman_service_ready(service); + if (gateway == NULL) return 0; @@ -509,10 +513,14 @@ done: static void connection_remove(struct connman_element *element) { + struct connman_service *service; const char *gateway = NULL; DBG("element %p name %s", element, element->name); + service = __connman_element_get_service(element); + __connman_service_disconnect(service); + unregister_interface(element); connman_element_get_value(element, diff --git a/src/connman.h b/src/connman.h index b7be4e8..e13c3de 100644 --- a/src/connman.h +++ b/src/connman.h @@ -127,6 +127,7 @@ void __connman_element_list(struct connman_element *element, int __connman_element_count(struct connman_element *element, enum connman_element_type type); +struct connman_service *__connman_element_get_service(struct connman_element *element); struct connman_device *__connman_element_get_device(struct connman_element *element); const char *__connman_element_get_device_path(struct connman_element *element); const char *__connman_element_get_network_path(struct connman_element *element); @@ -226,6 +227,8 @@ struct connman_service *__connman_service_create_from_network(struct connman_net int __connman_service_set_carrier(struct connman_service *service, connman_bool_t carrier); int __connman_service_indicate_configuration(struct connman_service *service); +int __connman_service_ready(struct connman_service *service); +int __connman_service_disconnect(struct connman_service *service); #include diff --git a/src/element.c b/src/element.c index 30e6963..3dc1504 100644 --- a/src/element.c +++ b/src/element.c @@ -272,6 +272,38 @@ int __connman_element_count(struct connman_element *element, return data.count; } +struct connman_service *__connman_element_get_service(struct connman_element *element) +{ + struct connman_service *service; + struct connman_device *device; + enum connman_device_type type; + + device = __connman_element_get_device(element); + if (device == NULL) + return NULL; + + type = connman_device_get_type(device); + + switch (type) { + case CONNMAN_DEVICE_TYPE_UNKNOWN: + case CONNMAN_DEVICE_TYPE_VENDOR: + case CONNMAN_DEVICE_TYPE_WIFI: + case CONNMAN_DEVICE_TYPE_WIMAX: + case CONNMAN_DEVICE_TYPE_BLUETOOTH: + case CONNMAN_DEVICE_TYPE_GPS: + case CONNMAN_DEVICE_TYPE_HSO: + case CONNMAN_DEVICE_TYPE_NOZOMI: + case CONNMAN_DEVICE_TYPE_HUAWEI: + case CONNMAN_DEVICE_TYPE_NOVATEL: + return NULL; + case CONNMAN_DEVICE_TYPE_ETHERNET: + service = __connman_service_lookup_from_device(device); + break; + } + + return service; +} + struct connman_device *__connman_element_get_device(struct connman_element *element) { if (element->type == CONNMAN_ELEMENT_TYPE_DEVICE && diff --git a/src/service.c b/src/service.c index b2d09a8..8e31511 100644 --- a/src/service.c +++ b/src/service.c @@ -496,6 +496,30 @@ int __connman_service_indicate_configuration(struct connman_service *service) return 0; } +int __connman_service_ready(struct connman_service *service) +{ + if (service == NULL) + return -EINVAL; + + service->state = CONNMAN_SERVICE_STATE_READY; + + state_changed(service); + + return 0; +} + +int __connman_service_disconnect(struct connman_service *service) +{ + if (service == NULL) + return -EINVAL; + + service->state = CONNMAN_SERVICE_STATE_DISCONNECT; + + state_changed(service); + + return 0; +} + /** * connman_service_lookup: * @identifier: service identifier -- 2.7.4