X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-ws-json1.c;h=9d295e7806bf1613a276d983f6ed4b44fb4444fd;hb=bca90021828565bddb8624e8f6370bf4959cbfbf;hp=31e9e42e9d207f24f3eafa198f068c6b46e16b21;hpb=6518887513840471ea9c5af7e534787717e6bd82;p=src%2Fapp-framework-binder.git diff --git a/src/afb-ws-json1.c b/src/afb-ws-json1.c index 31e9e42e..9d295e78 100644 --- a/src/afb-ws-json1.c +++ b/src/afb-ws-json1.c @@ -37,16 +37,29 @@ #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; @@ -58,7 +71,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) { @@ -83,7 +147,7 @@ struct afb_ws_json1 *afb_ws_json1_create(int fd, struct afb_context *context, vo 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; @@ -123,49 +187,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); -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); - -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 -}; - 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; @@ -202,6 +223,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++; @@ -224,19 +258,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) @@ -271,11 +293,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);