Use xreq for websockets
authorJosé Bollo <jose.bollo@iot.bzh>
Fri, 31 Mar 2017 14:58:14 +0000 (16:58 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Fri, 31 Mar 2017 15:13:18 +0000 (17:13 +0200)
Change-Id: Ia489f863e8be3384fbe8a240f6010f7d5916b72a
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afb-hreq.c
src/afb-ws-json1.c
src/afb-xreq.c
src/afb-xreq.h

index 8e3230d..69403f6 100644 (file)
@@ -317,8 +317,8 @@ static void afb_hreq_destroy(struct afb_hreq *hreq)
        }
        afb_context_disconnect(&hreq->xreq.context);
        json_object_put(hreq->json);
-       free(hreq->xreq.api);
-       free(hreq->xreq.verb);
+       free((char*)hreq->xreq.api);
+       free((char*)hreq->xreq.verb);
        free(hreq);
 }
 
@@ -908,8 +908,6 @@ static void req_success(struct afb_hreq *hreq, json_object *obj, const char *inf
 
 int afb_hreq_init_req_call(struct afb_hreq *hreq, const char *api, size_t lenapi, const char *verb, size_t lenverb)
 {
-       free(hreq->xreq.api);
-       free(hreq->xreq.verb);
        hreq->xreq.api = strndup(api, lenapi);
        hreq->xreq.verb = strndup(verb, lenverb);
        if (hreq->xreq.api == NULL || hreq->xreq.verb == NULL) {
index 8309065..fdd3bae 100644 (file)
@@ -33,6 +33,7 @@
 #include "afb-msg-json.h"
 #include "afb-session.h"
 #include "afb-apis.h"
+#include "afb-xreq.h"
 #include "afb-context.h"
 #include "afb-evt.h"
 #include "afb-subcall.h"
@@ -48,17 +49,9 @@ static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *ve
 static void aws_on_event(struct afb_ws_json1 *ws, const char *event, int eventid, struct json_object *object);
 
 /* predeclaration of wsreq callbacks */
-static void wsreq_addref(struct afb_wsreq *wsreq);
-static void wsreq_unref(struct afb_wsreq *wsreq);
+static void wsreq_destroy(struct afb_wsreq *wsreq);
 static struct json_object *wsreq_json(struct afb_wsreq *wsreq);
-static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name);
-static void wsreq_fail(struct afb_wsreq *wsreq, const char *status, const char *info);
-static void wsreq_success(struct afb_wsreq *wsreq, struct json_object *obj, const char *info);
-static const char *wsreq_raw(struct afb_wsreq *wsreq, size_t *size);
-static void wsreq_send(struct afb_wsreq *wsreq, const char *buffer, size_t size);
-static int wsreq_subscribe(struct afb_wsreq *wsreq, struct afb_event event);
-static int wsreq_unsubscribe(struct afb_wsreq *wsreq, struct afb_event event);
-static void wsreq_subcall(struct afb_wsreq *wsreq, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *closure);
+static void wsreq_reply(struct afb_wsreq *wsreq, int iserror, json_object *obj);
 
 /* declaration of websocket structure */
 struct afb_ws_json1
@@ -75,12 +68,7 @@ struct afb_ws_json1
 /* declaration of wsreq structure */
 struct afb_wsreq
 {
-       /*
-        * CAUTION: 'context' field should be the first because there
-        * is an implicit convertion to struct afb_context
-        */
-       struct afb_context context;
-       int refcount;
+       struct afb_xreq xreq;
        struct afb_ws_json1 *aws;
        struct afb_wsreq *next;
        struct afb_wsj1_msg *msgj1;
@@ -92,23 +80,11 @@ static struct afb_wsj1_itf wsj1_itf = {
        .on_call = (void*)aws_on_call
 };
 
-/* interface for wsreq / afb_req */
-const struct afb_req_itf afb_ws_json1_req_itf = {
+/* interface for xreq */
+const struct afb_xreq_query_itf afb_ws_json1_xreq_itf = {
        .json = (void*)wsreq_json,
-       .get = (void*)wsreq_get,
-       .success = (void*)wsreq_success,
-       .fail = (void*)wsreq_fail,
-       .raw = (void*)wsreq_raw,
-       .send = (void*)wsreq_send,
-       .context_get = (void*)afb_context_get,
-       .context_set = (void*)afb_context_set,
-       .addref = (void*)wsreq_addref,
-       .unref = (void*)wsreq_unref,
-       .session_close = (void*)afb_context_close,
-       .session_set_LOA = (void*)afb_context_change_loa,
-       .subscribe = (void*)wsreq_subscribe,
-       .unsubscribe = (void*)wsreq_unsubscribe,
-       .subcall = (void*)wsreq_subcall
+       .reply = (void*)wsreq_reply,
+       .unref = (void*)wsreq_destroy
 };
 
 /* the interface for events */
@@ -190,7 +166,6 @@ static void aws_on_hangup(struct afb_ws_json1 *ws, struct afb_wsj1 *wsj1)
 
 static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *verb, struct afb_wsj1_msg *msg)
 {
-       struct afb_req r;
        struct afb_wsreq *wsreq;
 
        DEBUG("received websocket request for %s/%s: %s", api, verb, afb_wsj1_msg_object_s(msg));
@@ -203,25 +178,28 @@ static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *ve
        }
 
        /* init the context */
-       afb_context_init(&wsreq->context, ws->session, afb_wsj1_msg_token(msg));
-       if (!wsreq->context.invalidated)
-               wsreq->context.validated = 1;
+       afb_context_init(&wsreq->xreq.context, ws->session, afb_wsj1_msg_token(msg));
+       if (!wsreq->xreq.context.invalidated)
+               wsreq->xreq.context.validated = 1;
        if (ws->new_session != 0) {
-               wsreq->context.created = 1;
+               wsreq->xreq.context.created = 1;
                ws->new_session = 0;
        }
 
        /* fill and record the request */
        afb_wsj1_msg_addref(msg);
        wsreq->msgj1 = msg;
-       wsreq->refcount = 1;
+       wsreq->xreq.refcount = 1;
+       wsreq->xreq.query = wsreq;
+       wsreq->xreq.queryitf = &afb_ws_json1_xreq_itf;
+       wsreq->xreq.api = api;
+       wsreq->xreq.verb = verb;
        wsreq->aws = aws_addref(ws);
+       wsreq->xreq.listener = wsreq->aws->listener;
 
        /* emits the call */
-       r.closure = wsreq;
-       r.itf = &afb_ws_json1_req_itf;
-       afb_apis_call(r, &wsreq->context, api, verb);
-       wsreq_unref(wsreq);
+       afb_apis_xcall(&wsreq->xreq);
+       afb_xreq_unref(&wsreq->xreq);
 }
 
 static void aws_on_event(struct afb_ws_json1 *aws, const char *event, int eventid, struct json_object *object)
@@ -237,19 +215,12 @@ static void aws_on_event(struct afb_ws_json1 *aws, const char *event, int eventi
 ****************************************************************
 ***************************************************************/
 
-static void wsreq_addref(struct afb_wsreq *wsreq)
-{
-       wsreq->refcount++;
-}
-
-static void wsreq_unref(struct afb_wsreq *wsreq)
+static void wsreq_destroy(struct afb_wsreq *wsreq)
 {
-       if (--wsreq->refcount == 0) {
-               afb_context_disconnect(&wsreq->context);
-               afb_wsj1_msg_unref(wsreq->msgj1);
-               aws_unref(wsreq->aws);
-               free(wsreq);
-       }
+       afb_context_disconnect(&wsreq->xreq.context);
+       afb_wsj1_msg_unref(wsreq->msgj1);
+       aws_unref(wsreq->aws);
+       free(wsreq);
 }
 
 static struct json_object *wsreq_json(struct afb_wsreq *wsreq)
@@ -257,55 +228,12 @@ static struct json_object *wsreq_json(struct afb_wsreq *wsreq)
        return afb_wsj1_msg_object_j(wsreq->msgj1);
 }
 
-static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name)
-{
-       return afb_msg_json_get_arg(wsreq_json(wsreq), name);
-}
-
-static void wsreq_fail(struct afb_wsreq *wsreq, const char *status, const char *info)
+static void wsreq_reply(struct afb_wsreq *wsreq, int iserror, json_object *obj)
 {
        int rc;
-       rc = afb_wsj1_reply_error_j(wsreq->msgj1, afb_msg_json_reply_error(status, info, &wsreq->context, NULL), afb_context_sent_token(&wsreq->context));
+       rc = (iserror ? afb_wsj1_reply_error_j : afb_wsj1_reply_ok_j)(
+                       wsreq->msgj1, obj, afb_context_sent_token(&wsreq->xreq.context));
        if (rc)
-               ERROR("Can't send fail reply: %m");
-}
-
-static void wsreq_success(struct afb_wsreq *wsreq, json_object *obj, const char *info)
-{
-       int rc;
-       rc = afb_wsj1_reply_ok_j(wsreq->msgj1, afb_msg_json_reply_ok(info, obj, &wsreq->context, NULL), afb_context_sent_token(&wsreq->context));
-       if (rc)
-               ERROR("Can't send success reply: %m");
-}
-
-static const char *wsreq_raw(struct afb_wsreq *wsreq, size_t *size)
-{
-       const char *result = afb_wsj1_msg_object_s(wsreq->msgj1);
-       if (size != NULL)
-               *size = strlen(result);
-       return result;
-}
-
-static void wsreq_send(struct afb_wsreq *wsreq, const char *buffer, size_t size)
-{
-       int rc;
-       rc = afb_wsj1_reply_ok_s(wsreq->msgj1, buffer, afb_context_sent_token(&wsreq->context));
-       if (rc)
-               ERROR("Can't send raw reply: %m");
-}
-
-static int wsreq_subscribe(struct afb_wsreq *wsreq, struct afb_event event)
-{
-       return afb_evt_add_watch(wsreq->aws->listener, event);
-}
-
-static int wsreq_unsubscribe(struct afb_wsreq *wsreq, struct afb_event event)
-{
-       return afb_evt_remove_watch(wsreq->aws->listener, event);
-}
-
-static void wsreq_subcall(struct afb_wsreq *wsreq, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *closure)
-{
-       afb_subcall(&wsreq->context, api, verb, args, callback, closure, (struct afb_req){ .itf = &afb_ws_json1_req_itf, .closure = wsreq });
+               ERROR("Can't send reply: %m (was %s)", json_object_get_string(obj));
 }
 
index 5bd2068..a884991 100644 (file)
@@ -108,7 +108,7 @@ static void xreq_success_cb(void *closure, struct json_object *obj, const char *
                if (xreq->queryitf->success)
                        xreq->queryitf->success(xreq->query, obj, info);
                else
-                       xreq->queryitf->reply(xreq->query, afb_msg_json_reply_ok(info, obj, &xreq->context, NULL));
+                       xreq->queryitf->reply(xreq->query, 0, afb_msg_json_reply_ok(info, obj, &xreq->context, NULL));
        }
 }
 
@@ -122,7 +122,7 @@ static void xreq_fail_cb(void *closure, const char *status, const char *info)
                if (xreq->queryitf->fail)
                        xreq->queryitf->fail(xreq->query, status, info);
                else
-                       xreq->queryitf->reply(xreq->query, afb_msg_json_reply_error(status, info, &xreq->context, NULL));
+                       xreq->queryitf->reply(xreq->query, 1, afb_msg_json_reply_error(status, info, &xreq->context, NULL));
        }
 }
 
index 42824d7..d2eae99 100644 (file)
@@ -31,7 +31,7 @@ struct afb_xreq_query_itf {
        struct afb_arg (*get)(void *closure, const char *name);
        void (*success)(void *closure, struct json_object *obj, const char *info);
        void (*fail)(void *closure, const char *status, const char *info);
-       void (*reply)(void *closure, struct json_object *obj);
+       void (*reply)(void *closure, int iserror, struct json_object *obj);
        void (*unref)(void *closure);
        int (*subscribe)(void *closure, struct afb_event event);
        int (*unsubscribe)(void *closure, struct afb_event event);
@@ -45,8 +45,8 @@ struct afb_xreq_query_itf {
 struct afb_xreq
 {
        struct afb_context context; /**< context of the request */
-       char *api;      /**< the requested API */
-       char *verb;     /**< the requested VERB */
+       const char *api;        /**< the requested API */
+       const char *verb;       /**< the requested VERB */
        void *query;    /**< closure for the query */
        const struct afb_xreq_query_itf *queryitf;
        int refcount;   /**< current ref count */