From: Daniel Wagner <[email protected]>

This is a very simple version which only activates
a timeout callback. There is no scheduling
between several sessions with PeriodicConnect.
---
 src/session.c |   49 ++++++++++++++++++++++++++++++++++---------------
 1 files changed, 34 insertions(+), 15 deletions(-)

diff --git a/src/session.c b/src/session.c
index 990caea..3c163dc 100644
--- a/src/session.c
+++ b/src/session.c
@@ -50,7 +50,6 @@ enum connman_session_reason {
        CONNMAN_SESSION_REASON_CONNECT          = 1,
        CONNMAN_SESSION_REASON_DISCONNECT       = 2,
        CONNMAN_SESSION_REASON_FREE_RIDE        = 3,
-       CONNMAN_SESSION_REASON_PERIODIC         = 4,
 };
 
 enum connman_session_roaming_policy {
@@ -99,6 +98,8 @@ struct connman_session {
        struct session_info *info;
        struct session_info *info_last;
 
+       unsigned int periodic_watch;
+
        GSequence *service_list;
        GHashTable *service_hash;
 };
@@ -142,8 +143,6 @@ static const char *reason2string(enum 
connman_session_reason reason)
                return "disconnect";
        case CONNMAN_SESSION_REASON_FREE_RIDE:
                return "free-ride";
-       case CONNMAN_SESSION_REASON_PERIODIC:
-               return "periodic";
        }
 
        return NULL;
@@ -668,6 +667,9 @@ static void cleanup_session(gpointer user_data)
        g_slist_foreach(info->allowed_bearers, cleanup_bearer_info, NULL);
        g_slist_free(info->allowed_bearers);
 
+       if (session->periodic_watch != 0)
+               g_source_remove(session->periodic_watch);
+
        g_free(session->owner);
        g_free(session->session_path);
        g_free(session->notify_path);
@@ -722,7 +724,6 @@ static connman_bool_t explicit_connect(enum 
connman_session_reason reason)
        case CONNMAN_SESSION_REASON_DISCONNECT:
                break;
        case CONNMAN_SESSION_REASON_CONNECT:
-       case CONNMAN_SESSION_REASON_PERIODIC:
                return TRUE;
        }
 
@@ -967,6 +968,8 @@ static void populate_service_list(struct connman_session 
*session)
        }
 }
 
+static gboolean trigger_periodic_connect(gpointer data);
+
 static void session_changed(struct connman_session *session,
                                enum connman_session_trigger trigger)
 {
@@ -995,6 +998,21 @@ static void session_changed(struct connman_session 
*session,
                DBG("ignore session changed event");
                return;
        case CONNMAN_SESSION_TRIGGER_SETTING:
+               if (info->periodic_connect != info_last->periodic_connect) {
+                       if (session->periodic_watch != 0) {
+                               g_source_remove(session->periodic_watch);
+                               session->periodic_watch = 0;
+                       }
+
+                       if (info->periodic_connect > 0) {
+                               session->periodic_watch =
+                                       g_timeout_add_seconds(
+                                               info->periodic_connect,
+                                               trigger_periodic_connect,
+                                               session);
+                       }
+               }
+
                if (info->allowed_bearers != info_last->allowed_bearers) {
 
                        service_hash_last = session->service_hash;
@@ -1029,6 +1047,9 @@ static void session_changed(struct connman_session 
*session,
                }
 
                break;
+       case CONNMAN_SESSION_TRIGGER_PERIODIC:
+               if (info->online == TRUE)
+                       break;
        case CONNMAN_SESSION_TRIGGER_CONNECT:
                if (info->online == TRUE) {
                        if (info->entry->reason == 
CONNMAN_SESSION_REASON_CONNECT)
@@ -1047,17 +1068,6 @@ static void session_changed(struct connman_session 
*session,
                                        CONNMAN_SESSION_REASON_DISCONNECT);
 
                break;
-       case CONNMAN_SESSION_TRIGGER_PERIODIC:
-               if (info->online == TRUE) {
-                       info->entry->reason = CONNMAN_SESSION_REASON_PERIODIC;
-                       __connman_service_session_inc(info->entry->service);
-                       break;
-               }
-
-               select_and_connect(session,
-                               CONNMAN_SESSION_REASON_PERIODIC);
-
-               break;
        case CONNMAN_SESSION_TRIGGER_SERVICE:
                if (info->entry != NULL &&
                                (is_connecting(info->entry->state) == TRUE ||
@@ -1085,6 +1095,15 @@ static void session_changed(struct connman_session 
*session,
        session_notify(session);
 }
 
+static gboolean trigger_periodic_connect(gpointer data)
+{
+       struct connman_session *session = data;
+
+       session_changed(session, CONNMAN_SESSION_TRIGGER_PERIODIC);
+
+       return TRUE;
+}
+
 static DBusMessage *connect_session(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
-- 
1.7.6.4

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to