>From dd21cb6c142d854cad2de978a569bfe6f140b1b4 Mon Sep 17 00:00:00 2001
From: Martin Xu <[email protected]>
Date: Mon, 6 Jul 2009 02:22:13 -0400
Subject: [PATCH 4/4] add auto connection
---
src/service.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 106 insertions(+), 0 deletions(-)
diff --git a/src/service.c b/src/service.c
index 4e445e0..e824191 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1206,6 +1206,106 @@ static enum connman_service_type
convert_device_type(struct connman_device *devi
return CONNMAN_SERVICE_TYPE_UNKNOWN;
}
+static struct try_data {
+ struct connman_service *last_service;
+ GSequenceIter *last_iter;
+ guint timeout;
+};
+
+struct try_data auto_connect_data = {.last_iter = NULL,
+ .last_service = NULL,
+ .timeout = 0};
+
+static gboolean service_is_connecting(struct connman_service *service)
+{
+ if (service->state == CONNMAN_SERVICE_STATE_ASSOCIATION ||
+ service->state == CONNMAN_SERVICE_STATE_CONFIGURATION ||
+ service->state == CONNMAN_SERVICE_STATE_CARRIER)
+ return TRUE;
+ return FALSE;
+}
+
+static gboolean try_service(gpointer user_data)
+{
+ struct try_data *data = user_data;
+ struct connman_service *last_service = data->last_service;
+ struct connman_service *service;
+ GSequenceIter *last_iter = data->last_iter;
+ GSequenceIter *iter;
+ DBG("Last service %p", last_service);
+
+ if (last_service != NULL) {
+ if (last_service->state == CONNMAN_SERVICE_STATE_READY) {
+ DBG("Auto connect to service: %s", last_service->name);
+ return FALSE;
+ }
+ if (service_is_connecting(last_service)) {
+ DBG("service: %s is connecting", last_service->name);
+ return TRUE;
+ }
+ }
+
+ if (last_iter == NULL)
+ iter = g_sequence_get_begin_iter(service_list);
+ else
+ iter = g_sequence_iter_next(last_iter);
+
+ if (g_sequence_iter_is_end(iter)) {
+ DBG("Finish going through service sequence");
+ return FALSE;
+ }
+ service = g_sequence_get(iter);
+ while (service == NULL ||
+ service->state == CONNMAN_SERVICE_STATE_FAILURE) {
+ iter = g_sequence_iter_next(iter);
+ if (g_sequence_iter_is_end(iter)) {
+ DBG("Finish going through service sequence");
+ return FALSE;
+ }
+ service = g_sequence_get(iter);
+ }
+
+ if (!service->favorite) {
+ DBG("Finish going through favorite sequence");
+ return FALSE;
+ }
+
+ if (service->state == CONNMAN_SERVICE_STATE_READY) {
+ DBG("service: %s is connected, ignore others", service->name);
+ return FALSE;
+ }
+
+ data->last_service = service;
+ data->last_iter = iter;
+
+ if (!service_is_connecting(service)) {
+ DBG("connect service %s", service->name);
+ __connman_service_connect(service);
+ }
+
+ return TRUE;
+}
+
+static void clear_auto_connect(void)
+{
+ DBG("");
+ auto_connect_data.last_service = NULL;
+ auto_connect_data.last_iter = NULL;
+ g_source_remove(auto_connect_data.timeout);
+ auto_connect_data.timeout = NULL;
+}
+
+static void single_auto_connect(void)
+{
+ DBG("");
+ if (auto_connect_data.timeout != NULL)
+ clear_auto_connect();
+
+ auto_connect_data.timeout =
+ g_timeout_add_seconds(AUTO_RETRY_PERIOD,
+ try_service,
+ &auto_connect_data);
+}
/**
* connman_service_create_from_device:
* @device: device structure
@@ -1243,6 +1343,9 @@ struct connman_service
*__connman_service_create_from_device(struct connman_devi
done:
g_free(name);
+
+ if (service->favorite)
+ single_auto_connect();
return service;
}
@@ -1431,6 +1534,9 @@ struct connman_service
*__connman_service_create_from_network(struct connman_net
done:
g_free(name);
+
+ if (service->favorite)
+ single_auto_connect();
return service;
}
--
1.6.1.3
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman