diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2012-09-26 11:08:41 +0200 |
---|---|---|
committer | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2012-09-27 10:28:28 +0200 |
commit | 3b2d8bb429d1339e7edf9d20331e9b9a3514d279 (patch) | |
tree | bfc962b95af0c4d01585b183fd33419df6bfd0de /plugins | |
parent | 580921d2458dd24174d4cd4392e572112d24501f (diff) | |
download | connman-3b2d8bb429d1339e7edf9d20331e9b9a3514d279.tar.gz connman-3b2d8bb429d1339e7edf9d20331e9b9a3514d279.tar.bz2 connman-3b2d8bb429d1339e7edf9d20331e9b9a3514d279.zip |
session_policy: Implement create() and destroy()
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/session_policy.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/plugins/session_policy.c b/plugins/session_policy.c index 906cc229..31ded238 100644 --- a/plugins/session_policy.c +++ b/plugins/session_policy.c @@ -33,6 +33,8 @@ #include <connman/log.h> #include <connman/session.h> +static GHashTable *config_hash; + static int policy_get_bool(struct connman_session *session, const char *key, connman_bool_t *val) { @@ -61,13 +63,65 @@ static int policy_get_string(struct connman_session *session, return 0; } +static struct connman_session_config *policy_create( + struct connman_session *session) +{ + struct connman_session_config *config; + + DBG("session %p", session); + + config = g_try_new0(struct connman_session_config, 1); + if (config == NULL) + return NULL; + + config->priority = FALSE; + config->roaming_policy = CONNMAN_SESSION_ROAMING_POLICY_DEFAULT; + config->type = CONNMAN_SESSION_TYPE_ANY; + config->ecall = FALSE; + config->allowed_bearers = connman_session_allowed_bearers_any(); + if (config->allowed_bearers == NULL) { + g_free(config); + return NULL; + } + + g_hash_table_replace(config_hash, session, config); + + return config; +} + +static void policy_destroy(struct connman_session *session) +{ + DBG("session %p", session); + + g_hash_table_remove(config_hash, session); +} + static struct connman_session_policy session_policy = { .name = "session policy configuration", .priority = CONNMAN_SESSION_POLICY_PRIORITY_LOW, .get_bool = policy_get_bool, .get_string = policy_get_string, + .create = policy_create, + .destroy = policy_destroy, }; +static void cleanup_bearer(gpointer data, gpointer user_data) +{ + struct connman_session_bearer *info = data; + + g_free(info->name); + g_free(info); +} + +static void cleanup_config(gpointer user_data) +{ + struct connman_session_config *config = user_data; + + g_slist_foreach(config->allowed_bearers, cleanup_bearer, NULL); + g_slist_free(config->allowed_bearers); + g_free(config); +} + static int session_policy_init(void) { int err; @@ -76,11 +130,20 @@ static int session_policy_init(void) if (err < 0) return err; + config_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, + cleanup_config); + if (config_hash == NULL) { + connman_session_policy_unregister(&session_policy); + return -ENOMEM; + } + return 0; } static void session_policy_exit(void) { + g_hash_table_destroy(config_hash); + connman_session_policy_unregister(&session_policy); } |