X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fafb-xreq.c;h=87e01559c982fe6d4c394b42e2527f094a1996dc;hb=f05bc513bc0e0a977e6393e859cecbec77b420c6;hp=c8fd94e9e2ad55e7b7915f196cf4f0dc0730156f;hpb=41618d081d650f9cc105034bfa37d3b861663db7;p=src%2Fapp-framework-binder.git diff --git a/src/afb-xreq.c b/src/afb-xreq.c index c8fd94e9..87e01559 100644 --- a/src/afb-xreq.c +++ b/src/afb-xreq.c @@ -62,6 +62,13 @@ static void xreq_subcall_cb( void (*callback)(void*, int, struct json_object*), void *cb_closure); +static int xreq_subcallsync_cb( + void *closure, + const char *api, + const char *verb, + struct json_object *args, + struct json_object **result); + const struct afb_req_itf xreq_itf = { .json = xreq_json_cb, .get = xreq_get_cb, @@ -77,7 +84,8 @@ const struct afb_req_itf xreq_itf = { .session_set_LOA = xreq_session_set_LOA_cb, .subscribe = xreq_subscribe_cb, .unsubscribe = xreq_unsubscribe_cb, - .subcall = xreq_subcall_cb + .subcall = xreq_subcall_cb, + .subcallsync = xreq_subcallsync_cb }; static struct json_object *xreq_json_cb(void *closure) @@ -242,12 +250,24 @@ int afb_xreq_unsubscribe(struct afb_xreq *xreq, struct afb_event event) static void xreq_subcall_cb(void *closure, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *cb_closure) { struct afb_xreq *xreq = closure; + + afb_xreq_subcall(xreq, api, verb, args, callback, cb_closure); +} + +void afb_xreq_subcall(struct afb_xreq *xreq, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *cb_closure) +{ if (xreq->queryitf->subcall) xreq->queryitf->subcall(xreq->query, api, verb, args, callback, cb_closure); else afb_subcall(xreq, api, verb, args, callback, cb_closure); } +static int xreq_subcallsync_cb(void *closure, const char *api, const char *verb, struct json_object *args, struct json_object **result) +{ + struct afb_xreq *xreq = closure; + return afb_subcall_sync(xreq, api, verb, args, result); +} + void afb_xreq_success_f(struct afb_xreq *xreq, struct json_object *obj, const char *info, ...) { char *message; @@ -272,11 +292,9 @@ void afb_xreq_fail_f(struct afb_xreq *xreq, const char *status, const char *info free(message); } -static int xcheck(struct afb_xreq *xreq) +static int xcheck(struct afb_xreq *xreq, int sessionflags) { - int stag = xreq->sessionflags; - - if ((stag & (AFB_SESSION_CREATE|AFB_SESSION_CLOSE|AFB_SESSION_RENEW|AFB_SESSION_CHECK|AFB_SESSION_LOA_EQ)) != 0) { + if ((sessionflags & (AFB_SESSION_CREATE|AFB_SESSION_CLOSE|AFB_SESSION_RENEW|AFB_SESSION_CHECK|AFB_SESSION_LOA_EQ)) != 0) { if (!afb_context_check(&xreq->context)) { afb_context_close(&xreq->context); afb_xreq_fail_f(xreq, "failed", "invalid token's identity"); @@ -284,7 +302,7 @@ static int xcheck(struct afb_xreq *xreq) } } - if ((stag & AFB_SESSION_CREATE) != 0) { + if ((sessionflags & AFB_SESSION_CREATE) != 0) { if (afb_context_check_loa(&xreq->context, 1)) { afb_xreq_fail_f(xreq, "failed", "invalid creation state"); return 0; @@ -293,24 +311,24 @@ static int xcheck(struct afb_xreq *xreq) afb_context_refresh(&xreq->context); } - if ((stag & (AFB_SESSION_CREATE | AFB_SESSION_RENEW)) != 0) + if ((sessionflags & (AFB_SESSION_CREATE | AFB_SESSION_RENEW)) != 0) afb_context_refresh(&xreq->context); - if ((stag & AFB_SESSION_CLOSE) != 0) { + if ((sessionflags & AFB_SESSION_CLOSE) != 0) { afb_context_change_loa(&xreq->context, 0); afb_context_close(&xreq->context); } - if ((stag & AFB_SESSION_LOA_GE) != 0) { - int loa = (stag >> AFB_SESSION_LOA_SHIFT) & AFB_SESSION_LOA_MASK; + if ((sessionflags & AFB_SESSION_LOA_GE) != 0) { + int loa = (sessionflags >> AFB_SESSION_LOA_SHIFT) & AFB_SESSION_LOA_MASK; if (!afb_context_check_loa(&xreq->context, loa)) { afb_xreq_fail_f(xreq, "failed", "invalid LOA"); return 0; } } - if ((stag & AFB_SESSION_LOA_LE) != 0) { - int loa = (stag >> AFB_SESSION_LOA_SHIFT) & AFB_SESSION_LOA_MASK; + if ((sessionflags & AFB_SESSION_LOA_LE) != 0) { + int loa = (sessionflags >> AFB_SESSION_LOA_SHIFT) & AFB_SESSION_LOA_MASK; if (afb_context_check_loa(&xreq->context, loa + 1)) { afb_xreq_fail_f(xreq, "failed", "invalid LOA"); return 0; @@ -319,9 +337,9 @@ static int xcheck(struct afb_xreq *xreq) return 1; } -void afb_xreq_call(struct afb_xreq *xreq) +void afb_xreq_call(struct afb_xreq *xreq, int sessionflags, void (*method)(struct afb_req req)) { - if (xcheck(xreq)) - xreq->callback((struct afb_req){ .itf = &xreq_itf, .closure = xreq }); + if (xcheck(xreq, sessionflags)) + method((struct afb_req){ .itf = &xreq_itf, .closure = xreq }); }