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