X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-subcall.c;h=8a8c77a985dc185c8f7628158e1c7ab59d3a981c;hb=863a97b989aecce8b52a09168c0668ad40df8e1c;hp=bc5fc862dde061bfb382f290dc2772cdaf97ca45;hpb=ede362db9ea82b85a531849c21582f1692bf0d4d;p=src%2Fapp-framework-binder.git diff --git a/src/afb-subcall.c b/src/afb-subcall.c index bc5fc862..8a8c77a9 100644 --- a/src/afb-subcall.c +++ b/src/afb-subcall.c @@ -25,19 +25,19 @@ #include "afb-subcall.h" #include "afb-msg-json.h" -#include "afb-apis.h" +#include "afb-apiset.h" #include "afb-context.h" #include "afb-xreq.h" +#include "afb-cred.h" #include "verbose.h" #include "jobs.h" struct subcall; -static void subcall_destroy(void *closure); -static void subcall_reply(void *closure, int iserror, struct json_object *obj); -static int subcall_subscribe(void *closure, struct afb_event event); -static int subcall_unsubscribe(void *closure, struct afb_event event); -static void subcall_sync_leave(struct subcall *subcall); +static void subcall_destroy(struct afb_xreq *xreq); +static void subcall_reply(struct afb_xreq *xreq, int iserror, struct json_object *obj); +static int subcall_subscribe(struct afb_xreq *xreq, struct afb_event event); +static int subcall_unsubscribe(struct afb_xreq *xreq, struct afb_event event); const struct afb_xreq_query_itf afb_subcall_xreq_itf = { .reply = subcall_reply, @@ -52,44 +52,36 @@ struct subcall struct afb_xreq *caller; void (*callback)(void*, int, struct json_object*); void *closure; - struct jobloop *jobloop; - struct json_object *result; - int iserror; }; -static void subcall_destroy(void *closure) +static void subcall_destroy(struct afb_xreq *xreq) { - struct subcall *subcall = closure; + struct subcall *subcall = CONTAINER_OF_XREQ(struct subcall, xreq); json_object_put(subcall->xreq.json); + afb_cred_unref(subcall->xreq.cred); afb_xreq_unref(subcall->caller); free(subcall); } -static void subcall_reply(void *closure, int iserror, struct json_object *obj) +static void subcall_reply(struct afb_xreq *xreq, int iserror, struct json_object *obj) { - struct subcall *subcall = closure; + struct subcall *subcall = CONTAINER_OF_XREQ(struct subcall, xreq); - if (subcall->callback) { - subcall->callback(subcall->closure, iserror, obj); - json_object_put(obj); - } else { - subcall->result = obj; - subcall->iserror = iserror; - subcall_sync_leave(subcall); - } + subcall->callback(subcall->closure, iserror, obj); + json_object_put(obj); } -static int subcall_subscribe(void *closure, struct afb_event event) +static int subcall_subscribe(struct afb_xreq *xreq, struct afb_event event) { - struct subcall *subcall = closure; + struct subcall *subcall = CONTAINER_OF_XREQ(struct subcall, xreq); return afb_xreq_subscribe(subcall->caller, event); } -static int subcall_unsubscribe(void *closure, struct afb_event event) +static int subcall_unsubscribe(struct afb_xreq *xreq, struct afb_event event) { - struct subcall *subcall = closure; + struct subcall *subcall = CONTAINER_OF_XREQ(struct subcall, xreq); return afb_xreq_unsubscribe(subcall->caller, event); } @@ -97,19 +89,25 @@ static int subcall_unsubscribe(void *closure, struct afb_event event) static struct subcall *create_subcall(struct afb_xreq *caller, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *closure) { struct subcall *subcall; + size_t lenapi, lenverb; + char *copy; - subcall = calloc(1, sizeof *subcall); + lenapi = 1 + strlen(api); + lenverb = 1 + strlen(verb); + subcall = malloc(lenapi + lenverb + sizeof *subcall); if (subcall == NULL) { return NULL; } - + afb_xreq_init(&subcall->xreq, &afb_subcall_xreq_itf); afb_context_subinit(&subcall->xreq.context, &caller->context); - subcall->xreq.refcount = 1; + subcall->xreq.cred = afb_cred_addref(caller->cred); subcall->xreq.json = args; - subcall->xreq.api = api; /* TODO: alloc ? */ - subcall->xreq.verb = verb; /* TODO: alloc ? */ - subcall->xreq.query = subcall; - subcall->xreq.queryitf = &afb_subcall_xreq_itf; + copy = (char*)&subcall[1]; + memcpy(copy, api, lenapi); + subcall->xreq.api = copy; + copy = ©[lenapi]; + memcpy(copy, verb, lenverb); + subcall->xreq.verb = copy; subcall->caller = caller; subcall->callback = callback; subcall->closure = closure; @@ -135,29 +133,50 @@ void afb_subcall( return; } - afb_apis_call(&subcall->xreq); - afb_xreq_unref(&subcall->xreq); + afb_xreq_process(&subcall->xreq, caller->apiset); } -static void subcall_sync_leave(struct subcall *subcall) +struct subcall_sync +{ + struct afb_xreq *caller; + const char *api; + const char *verb; + struct json_object *args; + struct jobloop *jobloop; + struct json_object *result; + int iserror; +}; + +static void subcall_sync_leave(struct subcall_sync *sync) { - struct jobloop *jobloop = subcall->jobloop; - subcall->jobloop = NULL; + struct jobloop *jobloop = sync->jobloop; + sync->jobloop = NULL; if (jobloop) jobs_leave(jobloop); } -static void subcall_sync_cb(int signum, void *closure, struct jobloop *jobloop) +static void subcall_sync_reply(void *closure, int iserror, struct json_object *obj) +{ + struct subcall_sync *sync = closure; + + sync->iserror = iserror; + sync->result = obj; + json_object_get(obj); + subcall_sync_leave(sync); +} + +static void subcall_sync_enter(int signum, void *closure, struct jobloop *jobloop) { - struct subcall *subcall = closure; + struct subcall_sync *sync = closure; if (!signum) { - subcall->jobloop = jobloop; - afb_apis_call_direct(&subcall->xreq); + sync->jobloop = jobloop; + afb_xreq_unhooked_subcall(sync->caller, sync->api, sync->verb, sync->args, subcall_sync_reply, sync); } else { - afb_xreq_fail_f(&subcall->xreq, "aborted", "signal %s(%d) caught", strsignal(signum), signum); + sync->result = json_object_get(afb_msg_json_internal_error()); + sync->iserror = 1; + subcall_sync_leave(sync); } - subcall_sync_leave(subcall); } int afb_subcall_sync( @@ -169,22 +188,23 @@ int afb_subcall_sync( ) { int rc; - struct subcall *subcall; + struct subcall_sync sync; - subcall = create_subcall(caller, api, verb, args, NULL, NULL); - if (subcall == NULL) { - *result = json_object_get(afb_msg_json_internal_error()); - return 0; - } + sync.caller = caller; + sync.api = api; + sync.verb = verb; + sync.args = args; + sync.jobloop = NULL; + sync.result = NULL; + sync.iserror = 1; - rc = jobs_enter(NULL, 0, subcall_sync_cb, subcall); + rc = jobs_enter(NULL, 0, subcall_sync_enter, &sync); if (rc < 0) { - subcall->result = json_object_get(afb_msg_json_internal_error()); - subcall->iserror = 1; + sync.result = json_object_get(afb_msg_json_internal_error()); + sync.iserror = 1; } - rc = !subcall->iserror; - *result = subcall->result; - afb_xreq_unref(&subcall->xreq); + rc = !sync.iserror; + *result = sync.result; return rc; }