session_policy: Implement create() and destroy()
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Wed, 26 Sep 2012 09:08:41 +0000 (11:08 +0200)
committerDaniel Wagner <daniel.wagner@bmw-carit.de>
Thu, 27 Sep 2012 08:28:28 +0000 (10:28 +0200)
plugins/session_policy.c

index 906cc22..31ded23 100644 (file)
@@ -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);
 }