summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2009-04-21 06:13:25 +0100
committerMarcel Holtmann <marcel@holtmann.org>2009-04-21 06:13:25 +0100
commit08c0c3a49b4b02add54856948629dd57b3927791 (patch)
treeb9368b0509c906af33d728f3c84ec15f6b050081
parent3acabae42ea6db35c5937d5ac21ee61274bf4cdf (diff)
downloadconnman-08c0c3a49b4b02add54856948629dd57b3927791.tar.gz
connman-08c0c3a49b4b02add54856948629dd57b3927791.tar.bz2
connman-08c0c3a49b4b02add54856948629dd57b3927791.zip
Add support for service ready and disconnect state changes
-rw-r--r--src/connection.c8
-rw-r--r--src/connman.h3
-rw-r--r--src/element.c32
-rw-r--r--src/service.c24
4 files changed, 67 insertions, 0 deletions
diff --git a/src/connection.c b/src/connection.c
index 6fb1d764..0d544eb7 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 b7be4e85..e13c3de7 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 <connman/notifier.h>
diff --git a/src/element.c b/src/element.c
index 30e6963d..3dc15045 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 b2d09a8e..8e31511b 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