summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wagner <daniel.wagner@bmw-carit.de>2012-09-26 10:51:08 +0200
committerDaniel Wagner <daniel.wagner@bmw-carit.de>2012-09-27 10:28:28 +0200
commitb98f45ab251c959d65501332abc5889f8f265177 (patch)
tree7fd33d05e72bedf5cf3a12f703c6746625c367a1
parent131bf5b3228de622edc77568c8249141d5adf222 (diff)
downloadconnman-b98f45ab251c959d65501332abc5889f8f265177.tar.gz
connman-b98f45ab251c959d65501332abc5889f8f265177.tar.bz2
connman-b98f45ab251c959d65501332abc5889f8f265177.zip
session: Update session when policy plugin is added or removed
-rw-r--r--src/session.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/session.c b/src/session.c
index 134bf7a6..cc9d5491 100644
--- a/src/session.c
+++ b/src/session.c
@@ -294,6 +294,48 @@ static int assign_policy_plugin(struct connman_session *session)
return 0;
}
+static void probe_policy(struct connman_session_policy *policy)
+{
+
+ GHashTableIter iter;
+ gpointer key, value;
+ struct connman_session *session;
+
+ DBG("policy %p name %s", policy, policy->name);
+
+ g_hash_table_iter_init(&iter, session_hash);
+
+ while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+ session = value;
+
+ if (session->policy != NULL)
+ continue;
+
+ assign_policy_plugin(session);
+ }
+}
+
+static void remove_policy(struct connman_session_policy *policy)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+ struct connman_session *session;
+
+ DBG("policy %p name %s", policy, policy->name);
+
+ g_hash_table_iter_init(&iter, session_hash);
+
+ while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+ session = value;
+
+ if (session->policy != policy)
+ continue;
+
+ session->policy = NULL;
+ assign_policy_plugin(session);
+ }
+}
+
static gint compare_priority(gconstpointer a, gconstpointer b)
{
const struct connman_session_policy *policy1 = a;
@@ -370,6 +412,9 @@ int connman_session_policy_register(struct connman_session_policy *policy)
policy_list = g_slist_insert_sorted(policy_list, policy,
compare_priority);
+
+ probe_policy(policy);
+
return 0;
}
@@ -378,6 +423,8 @@ void connman_session_policy_unregister(struct connman_session_policy *policy)
DBG("name %s", policy->name);
policy_list = g_slist_remove(policy_list, policy);
+
+ remove_policy(policy);
}
static void cleanup_bearer_info(gpointer data, gpointer user_data)