afb-session: add function afb_session_search
[src/app-framework-binder.git] / src / afb-session.c
index 2b649ef..a28a35f 100644 (file)
@@ -59,7 +59,7 @@ struct afb_session
 // Session UUID are store in a simple array [for 10 sessions this should be enough]
 static struct {
        pthread_mutex_t mutex;          // declare a mutex to protect hash table
-       struct afb_session **store;          // sessions store
+       struct afb_session **store;     // sessions store
        int count;                      // current number of sessions
        int max;
        int timeout;
@@ -97,7 +97,7 @@ static inline void unlock(struct afb_session *session)
 }
 
 // Free context [XXXX Should be protected again memory abort XXXX]
-static void free_data (struct afb_session *session)
+static void remove_all_cookies(struct afb_session *session)
 {
        int idx;
        struct cookie *cookie, *next;
@@ -284,6 +284,7 @@ error:
        return NULL;
 }
 
+/* Creates a new session with 'timeout' */
 struct afb_session *afb_session_create (int timeout)
 {
        time_t now;
@@ -295,7 +296,19 @@ struct afb_session *afb_session_create (int timeout)
        return make_session(NULL, timeout, now);
 }
 
-// This function will return exiting session or newly created session
+/* Searchs the session of 'uuid' */
+struct afb_session *afb_session_search (const char *uuid)
+{
+       time_t now;
+
+       /* cleaning */
+       now = NOW;
+       cleanup (now);
+       return search(uuid);
+
+}
+
+/* This function will return exiting session or newly created session */
 struct afb_session *afb_session_get (const char *uuid, int *created)
 {
        struct afb_session *session;
@@ -308,20 +321,21 @@ struct afb_session *afb_session_get (const char *uuid, int *created)
        /* search for an existing one not too old */
        if (uuid != NULL) {
                session = search(uuid);
-               if (!created)
-                       return session;
                if (session != NULL) {
-                       *created = 0;
+                       if (created)
+                               *created = 0;
                        session->access = now;
                        session->refcount++;
                        return session;
                }
        }
 
+       /* no existing session found, create it */
+       session = make_session(uuid, sessions.timeout, now);
        if (created)
-               *created = 1;
+               *created = !!session;
 
-       return make_session(uuid, sessions.timeout, now);
+       return session;
 }
 
 struct afb_session *afb_session_addref(struct afb_session *session)
@@ -351,7 +365,7 @@ void afb_session_close (struct afb_session *session)
        assert(session != NULL);
        if (session->uuid[0] != 0) {
                session->uuid[0] = 0;
-               free_data (session);
+               remove_all_cookies(session);
                if (session->refcount == 0) {
                        destroy (session);
                        free(session);
@@ -388,18 +402,21 @@ void afb_session_new_token (struct afb_session *session)
                session->expiration = NOW + session->timeout;
 }
 
+/* Returns the uuid of 'session' */
 const char *afb_session_uuid (struct afb_session *session)
 {
        assert(session != NULL);
        return session->uuid;
 }
 
+/* Returns the token of 'session' */
 const char *afb_session_token (struct afb_session *session)
 {
        assert(session != NULL);
        return session->token;
 }
 
+/* Set, get, replace, remove a cookie key */
 void *afb_session_cookie(struct afb_session *session, const void *key, void *(*makecb)(void *closure), void (*freecb)(void *item), void *closure, int replace)
 {
        int idx;