Add support for service ready and disconnect state changes
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 21 Apr 2009 05:13:25 +0000 (06:13 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 21 Apr 2009 05:13:25 +0000 (06:13 +0100)
src/connection.c
src/connman.h
src/element.c
src/service.c

index 6fb1d76..0d544eb 100644 (file)
@@ -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,
index b7be4e8..e13c3de 100644 (file)
@@ -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 <connman/notifier.h>
 
index 30e6963..3dc1504 100644 (file)
@@ -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 &&
index b2d09a8..8e31511 100644 (file)
@@ -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