allows to filter events before to receive it
authorJosé Bollo <jose.bollo@iot.bzh>
Wed, 11 May 2016 12:36:14 +0000 (14:36 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Wed, 11 May 2016 12:36:14 +0000 (14:36 +0200)
Change-Id: Ia25d6a6269d7dd1af900b63d54cf615a69dfc4d7
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afb-ws-json.c
src/session.c
src/session.h

index 2e68d27..7475b26 100644 (file)
@@ -56,9 +56,15 @@ struct afb_ws_json
 static void aws_send_event(struct afb_ws_json *ws, const char *event, struct json_object *object);
 
 static const struct afb_event_listener_itf event_listener_itf = {
-       .send = (void*)aws_send_event
+       .send = (void*)aws_send_event,
+       .expects = NULL
 };
 
+static inline struct afb_event_listener listener_for(struct afb_ws_json *aws)
+{
+       return (struct afb_event_listener){ .itf = &event_listener_itf, .closure = aws };
+}
+
 struct afb_ws_json *afb_ws_json_create(int fd, struct AFB_clientCtx *session, void (*cleanup)(void*), void *cleanup_closure)
 {
        struct afb_ws_json *result;
@@ -85,7 +91,7 @@ struct afb_ws_json *afb_ws_json_create(int fd, struct AFB_clientCtx *session, vo
        if (result->ws == NULL)
                goto error4;
 
-       if (0 > ctxClientEventListenerAdd(result->session, (struct afb_event_listener){ .itf = &event_listener_itf, .closure = result }))
+       if (0 > ctxClientEventListenerAdd(result->session, listener_for(result)))
                goto error5;
 
        return result;
@@ -105,7 +111,7 @@ error:
 
 static void aws_on_hangup(struct afb_ws_json *ws)
 {
-       ctxClientEventListenerRemove(ws->session, (struct afb_event_listener){ .itf = &event_listener_itf, .closure = ws });
+       ctxClientEventListenerRemove(ws->session, listener_for(ws));
        afb_ws_destroy(ws->ws);
        json_tokener_free(ws->tokener);
        if (ws->cleanup != NULL)
index 336dfd7..87e9237 100644 (file)
@@ -378,8 +378,10 @@ static int send(struct afb_event_listener_list *head, const char *event, struct
        result = 0;
        iter = head;
        while (iter != NULL) {
-               iter->listener.itf->send(iter->listener.closure, event, json_object_get(object));
-               result++;
+               if (iter->listener.itf->expects == NULL || iter->listener.itf->expects(iter->listener.closure, event)) {
+                       iter->listener.itf->send(iter->listener.closure, event, json_object_get(object));
+                       result++;
+               }
                iter = iter->next;
        }
 
index c272245..a4c0522 100644 (file)
@@ -23,6 +23,7 @@ struct AFB_clientCtx;
 struct afb_event_listener_itf
 {
        void (*send)(void *closure, const char *event, struct json_object *object);
+       int (*expects)(void *closure, const char *event);
 };
 
 struct afb_event_listener