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

Reply via email to