refactored websockets
[src/app-framework-binder.git] / src / afb-websock.c
index 878df04..d92c7b0 100644 (file)
@@ -2,8 +2,6 @@
  * Copyright 2016 IoT.bzh
  * Author: José Bollo <jose.bollo@iot.bzh>
  *
- * Inspired by the work of 
- *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -30,6 +28,8 @@
 
 #include "websock.h"
 
+#include "afb-ws-json.h"
+
 #include "afb-req-itf.h"
 #include "afb-method.h"
 #include "afb-hreq.h"
@@ -170,7 +170,8 @@ static struct websock_itf aws_itf = {
        .on_close = (void*)aws_on_close,
        .on_text = (void*)aws_on_content,
        .on_binary = (void*)aws_on_content,
-       .on_continue = (void*)aws_on_content
+       .on_continue = (void*)aws_on_content,
+       .on_extension = NULL
 };
 
 struct afb_wsreq
@@ -186,12 +187,12 @@ struct afb_wsreq
 struct afb_websock
 {
        int fd;
+       struct afb_wsreq *requests;
        struct MHD_Connection *connection;
+       struct AFB_clientCtx *context;
        struct websock *ws;
        struct upoll *up;
-       struct AFB_clientCtx *context;
        struct json_tokener *tokener;
-       struct afb_wsreq *requests;
 };
 
 static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name);
@@ -213,6 +214,15 @@ static const struct afb_req_itf wsreq_itf = {
 };
 
 struct afb_websock *afb_websock_create(struct afb_hreq *hreq)
+{
+       return (void*)afb_ws_json_create(
+                       dup(MHD_get_connection_info(hreq->connection,MHD_CONNECTION_INFO_CONNECTION_FD)->connect_fd),
+                       afb_hreq_context(hreq),
+                       (void*)MHD_resume_connection,
+                       hreq->connection);
+}
+
+struct afb_websock *_afb_websock_create(struct afb_hreq *hreq)
 {
        int fd;
        struct afb_websock *result;
@@ -227,31 +237,34 @@ struct afb_websock *afb_websock_create(struct afb_hreq *hreq)
        if (result == NULL)
                goto error;
 
-       result->connection = hreq->connection;
        result->fd = fd;
+       result->requests = NULL;
+       result->connection = hreq->connection;
        result->context = ctxClientGet(afb_hreq_context(hreq));
        if (result->context == NULL)
                goto error2;
 
        result->tokener = json_tokener_new();
        if (result->tokener == NULL)
-               goto error2;
+               goto error3;
 
-       result->ws = websock_create(&aws_itf, result);
+       result->ws = websock_create_v13(&aws_itf, result);
        if (result->ws == NULL)
-               goto error3;
+               goto error4;
 
        result->up = upoll_open(result->fd, result);
        if (result->up == NULL)
-               goto error4;
+               goto error5;
 
        upoll_on_readable(result->up, (void*)aws_on_readable);
        upoll_on_hangup(result->up, (void*)aws_disconnect);
        return result;
-error4:
+error5:
        websock_destroy(result->ws);
-error3:
+error4:
        json_tokener_free(result->tokener);
+error3:
+       ctxClientPut(result->context);
 error2:
        free(result);
 error:
@@ -301,7 +314,7 @@ static void aws_on_readable(struct afb_websock *ws)
 static int aws_handle_json(struct afb_websock *aws, struct json_object *obj)
 {
        struct afb_req r;
-       int count, num, rc;
+       int count, num;
        struct json_object *type, *id, *name, *req, *token;
        struct afb_wsreq *wsreq;
        const char *api, *verb;
@@ -403,7 +416,6 @@ static void aws_on_content(struct afb_websock *ws, int last, size_t size)
        }
 }
 
-
 static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name)
 {
        struct afb_arg arg;