diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2012-09-26 10:51:08 +0200 |
---|---|---|
committer | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2012-09-27 10:28:28 +0200 |
commit | b98f45ab251c959d65501332abc5889f8f265177 (patch) | |
tree | 7fd33d05e72bedf5cf3a12f703c6746625c367a1 | |
parent | 131bf5b3228de622edc77568c8249141d5adf222 (diff) | |
download | connman-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.c | 47 |
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) |