Hi Marcel: According to your feedback, I removed the last_service and last_iter. The patch has been tested several times and it works fine. Please review.
>From 6101a30ccb681f22745170366726e85accd60aee Mon Sep 17 00:00:00 2001 From: Martin Xu <[email protected]> Date: Tue, 7 Jul 2009 01:18:23 -0400 Subject: [PATCH 4/4] add auto connect --- src/service.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 78 insertions(+), 0 deletions(-) diff --git a/src/service.c b/src/service.c index 4e445e0..faa794d 100644 --- a/src/service.c +++ b/src/service.c @@ -27,6 +27,8 @@ #include "connman.h" +#define AUTO_RETRY_PERIOD 5 + static DBusConnection *connection = NULL; static GSequence *service_list = NULL; @@ -1206,6 +1208,76 @@ static enum connman_service_type convert_device_type(struct connman_device *devi return CONNMAN_SERVICE_TYPE_UNKNOWN; } +static guint auto_connect_timeout; + +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 connman_service *service; + GSequenceIter *iter; + DBG(""); + + iter = g_sequence_get_begin_iter(service_list); + + if (g_sequence_iter_is_end(iter)) { + DBG("service sequence is empty"); + 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; + } + + if (service_is_connecting(service)) { + DBG("service: %s is connecting", service->name); + return TRUE; + } + + if (service->state == CONNMAN_SERVICE_STATE_IDLE) { + DBG("connect service %s", service->name); + __connman_service_connect(service); + } + + return TRUE; +} + +static void single_auto_connect(void) +{ + DBG(""); + if (auto_connect_timeout != 0) { + g_source_remove(auto_connect_timeout); + auto_connect_timeout = 0; + } + + auto_connect_timeout = + g_timeout_add_seconds(AUTO_RETRY_PERIOD, try_service, NULL); +} + /** * connman_service_create_from_device: * @device: device structure @@ -1244,6 +1316,9 @@ struct connman_service *__connman_service_create_from_device(struct connman_devi done: g_free(name); + if (service->favorite) + single_auto_connect(); + return service; } @@ -1432,6 +1507,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
