Make LOA local to the binding
authorJosé Bollo <jose.bollo@iot.bzh>
Thu, 4 May 2017 16:01:29 +0000 (18:01 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Thu, 4 May 2017 16:01:29 +0000 (18:01 +0200)
Change-Id: If0494a19a4ce2865af699491c1f6d7b73bce8f11
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afb-context.c
src/afb-context.h
src/afb-session.c
src/afb-session.h

index 87346b5..9f5ddd3 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <assert.h>
 #include <stdlib.h>
+#include <stdint.h>
 
 #include "afb-session.h"
 #include "afb-context.h"
@@ -33,7 +34,6 @@ static void init_context(struct afb_context *context, struct afb_session *sessio
        context->flags = 0;
        context->super = NULL;
        context->api_key = NULL;
-       context->loa_in = afb_session_get_LOA(session) & 7;
 
        /* check the token */
        if (token != NULL) {
@@ -78,10 +78,6 @@ void afb_context_disconnect(struct afb_context *context)
                        afb_session_new_token (context->session);
                        context->refreshed = 1;
                }
-               if (context->loa_changing && !context->loa_changed) {
-                       afb_session_set_LOA (context->session, context->loa_out);
-                       context->loa_changed = 1;
-               }
                if (context->closing && !context->closed) {
                        afb_session_close(context->session);
                        context->closed = 1;
@@ -154,32 +150,36 @@ int afb_context_check(struct afb_context *context)
 
 int afb_context_check_loa(struct afb_context *context, unsigned loa)
 {
-       if (context->super)
-               return afb_context_check_loa(context->super, loa);
-       return context->loa_in >= loa;
+       return afb_context_get_loa(context) >= loa;
 }
 
-int afb_context_change_loa(struct afb_context *context, unsigned loa)
+static inline void *loa_key(struct afb_context *context)
 {
-       if (context->super)
-               return afb_context_change_loa(context, loa);
+       return (void*)(1+(intptr_t)(context->api_key));
+}
+
+static inline void *loa2ptr(unsigned loa)
+{
+       return (void*)(intptr_t)loa;
+}
 
+static inline unsigned ptr2loa(void *ptr)
+{
+       return (unsigned)(intptr_t)ptr;
+}
+
+int afb_context_change_loa(struct afb_context *context, unsigned loa)
+{
        if (!context->validated || loa > 7)
                return 0;
 
-       if (loa == context->loa_in && !context->loa_changed)
-               context->loa_changing = 0;
-       else {
-               context->loa_out = loa & 7;
-               context->loa_changing = 1;
-               context->loa_changed = 0;
-       }
-       return 1;
+       return 0 <= afb_session_set_cookie(context->session, loa_key(context), loa2ptr(loa), NULL);
 }
 
 unsigned afb_context_get_loa(struct afb_context *context)
 {
-       return context->loa_changing || context->loa_changed ? context->loa_out : context->loa_in;
+       assert(context->session != NULL);
+       return ptr2loa(afb_session_get_cookie(context->session, loa_key(context)));
 }
 
 
index f140238..ceda5d2 100644 (file)
@@ -32,10 +32,6 @@ struct afb_context
                        unsigned refreshed: 1;
                        unsigned closing: 1;
                        unsigned closed: 1;
-                       unsigned loa_in: 3;
-                       unsigned loa_out: 3;
-                       unsigned loa_changing: 1;
-                       unsigned loa_changed: 1;
                };
        };
        void *api_key;
index bc1c1c5..17fddd5 100644 (file)
@@ -47,7 +47,6 @@ struct cookie
 struct afb_session
 {
        unsigned refcount;
-       unsigned loa;
        int timeout;
        time_t expiration;    // expiration time of the token
        time_t access;
@@ -383,18 +382,6 @@ const char *afb_session_token (struct afb_session *session)
        return session->token;
 }
 
-unsigned afb_session_get_LOA (struct afb_session *session)
-{
-       assert(session != NULL);
-       return session->loa;
-}
-
-void afb_session_set_LOA (struct afb_session *session, unsigned loa)
-{
-       assert(session != NULL);
-       session->loa = loa;
-}
-
 void *afb_session_get_cookie(struct afb_session *session, const void *key)
 {
        struct cookie *cookie;
index c45a7e2..afff671 100644 (file)
@@ -34,9 +34,6 @@ extern int afb_session_check_token(struct afb_session *session, const char *toke
 extern void afb_session_new_token(struct afb_session *session);
 extern const char *afb_session_token(struct afb_session *session);
 
-extern unsigned afb_session_get_LOA(struct afb_session *session);
-extern void afb_session_set_LOA (struct afb_session *session, unsigned loa);
-
 extern void *afb_session_get_cookie(struct afb_session *session, const void *key);
 extern int afb_session_set_cookie(struct afb_session *session, const void *key, void *value, void (*freecb)(void*));