X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-ws-json1.c;h=8f558ab676f8e98e5caa8d85e50ebda1b8466efa;hb=677813c6a26eca5629ef8201fd0616511400a99e;hp=5ef751f1243e679c6584d2abbec6b9efe8a977dc;hpb=7e0abe76db7b90369429bf387d7aad0fb5a42328;p=src%2Fapp-framework-binder.git diff --git a/src/afb-ws-json1.c b/src/afb-ws-json1.c index 5ef751f1..8f558ab6 100644 --- a/src/afb-ws-json1.c +++ b/src/afb-ws-json1.c @@ -25,26 +25,42 @@ #include +#include + #include "afb-wsj1.h" #include "afb-ws-json1.h" +#include "afb-common.h" #include "afb-msg-json.h" #include "session.h" -#include #include "afb-apis.h" #include "afb-context.h" #include "afb-evt.h" +#include "afb-subcall.h" #include "verbose.h" +/* predeclaration of structures */ +struct afb_ws_json1; +struct afb_wsreq; + +/* predeclaration of websocket callbacks */ 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); +static void aws_on_event(struct afb_ws_json1 *ws, const char *event, int eventid, struct json_object *object); -static struct afb_wsj1_itf wsj1_itf = { - .on_hangup = (void*)aws_on_hangup, - .on_call = (void*)aws_on_call -}; - -struct afb_wsreq; +/* predeclaration of wsreq callbacks */ +static void wsreq_addref(struct afb_wsreq *wsreq); +static void wsreq_unref(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); +/* declaration of websocket structure */ struct afb_ws_json1 { int refcount; @@ -56,7 +72,58 @@ struct afb_ws_json1 int new_session; }; -static void aws_send_event(struct afb_ws_json1 *ws, const char *event, struct json_object *object); +/* 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_ws_json1 *aws; + struct afb_wsreq *next; + struct afb_wsj1_msg *msgj1; +}; + +/* interface for afb_ws_json1 / afb_wsj1 */ +static struct afb_wsj1_itf wsj1_itf = { + .on_hangup = (void*)aws_on_hangup, + .on_call = (void*)aws_on_call +}; + +/* interface for wsreq / afb_req */ +const struct afb_req_itf afb_ws_json1_req_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 +}; + +/* the interface for events */ +static const struct afb_evt_itf evt_itf = { + .broadcast = (void*)aws_on_event, + .push = (void*)aws_on_event +}; + +/*************************************************************** +**************************************************************** +** +** functions of afb_ws_json1 / afb_wsj1 +** +**************************************************************** +***************************************************************/ struct afb_ws_json1 *afb_ws_json1_create(int fd, struct afb_context *context, void (*cleanup)(void*), void *cleanup_closure) { @@ -77,11 +144,11 @@ struct afb_ws_json1 *afb_ws_json1_create(int fd, struct afb_context *context, vo if (result->session == NULL) goto error2; - result->wsj1 = afb_wsj1_create(fd, &wsj1_itf, result); + result->wsj1 = afb_wsj1_create(afb_common_get_event_loop(), fd, &wsj1_itf, result); if (result->wsj1 == NULL) goto error3; - result->listener = afb_evt_listener_create((void*)aws_send_event, result); + result->listener = afb_evt_listener_create(&evt_itf, result); if (result->listener == NULL) goto error4; @@ -121,47 +188,6 @@ static void aws_on_hangup(struct afb_ws_json1 *ws, struct afb_wsj1 *wsj1) aws_unref(ws); } -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_ws_json1 *aws; - struct afb_wsreq *next; - struct afb_wsj1_msg *msgj1; -}; - -static void wsreq_addref(struct afb_wsreq *wsreq); -static void wsreq_unref(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); - -const struct afb_req_itf afb_ws_json1_req_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 -}; - 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; @@ -198,6 +224,19 @@ static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *ve wsreq_unref(wsreq); } +static void aws_on_event(struct afb_ws_json1 *aws, const char *event, int eventid, struct json_object *object) +{ + afb_wsj1_send_event_j(aws->wsj1, event, afb_msg_json_event(event, object)); +} + +/*************************************************************** +**************************************************************** +** +** functions of wsreq / afb_req +** +**************************************************************** +***************************************************************/ + static void wsreq_addref(struct afb_wsreq *wsreq) { wsreq->refcount++; @@ -220,19 +259,7 @@ static struct json_object *wsreq_json(struct afb_wsreq *wsreq) static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name) { - struct afb_arg arg; - struct json_object *value, *root; - - root = wsreq_json(wsreq); - if (json_object_object_get_ex(root, name, &value)) { - arg.name = name; - arg.value = json_object_get_string(value); - } else { - arg.name = NULL; - arg.value = NULL; - } - arg.path = NULL; - return arg; + return afb_msg_json_get_arg(wsreq_json(wsreq), name); } static void wsreq_fail(struct afb_wsreq *wsreq, const char *status, const char *info) @@ -267,11 +294,6 @@ static void wsreq_send(struct afb_wsreq *wsreq, const char *buffer, size_t size) ERROR("Can't send raw reply: %m"); } -static void aws_send_event(struct afb_ws_json1 *aws, const char *event, struct json_object *object) -{ - afb_wsj1_send_event_j(aws->wsj1, event, afb_msg_json_event(event, object)); -} - static int wsreq_subscribe(struct afb_wsreq *wsreq, struct afb_event event) { return afb_evt_add_watch(wsreq->aws->listener, event); @@ -282,3 +304,8 @@ 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 }); +} +