X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-subcall.c;h=ef114077e5d5dcb0783a1287655722e714284f55;hb=a86967decc0ff9b139f412fffccc7914e27a80a9;hp=bc5fc862dde061bfb382f290dc2772cdaf97ca45;hpb=ede362db9ea82b85a531849c21582f1692bf0d4d;p=src%2Fapp-framework-binder.git diff --git a/src/afb-subcall.c b/src/afb-subcall.c index bc5fc862..ef114077 100644 --- a/src/afb-subcall.c +++ b/src/afb-subcall.c @@ -25,26 +25,11 @@ #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); - -const struct afb_xreq_query_itf afb_subcall_xreq_itf = { - .reply = subcall_reply, - .unref = subcall_destroy, - .subscribe = subcall_subscribe, - .unsubscribe = subcall_unsubscribe -}; struct subcall { @@ -52,71 +37,46 @@ 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; - - if (subcall->callback) { - subcall->callback(subcall->closure, iserror, obj); - json_object_put(obj); - } else { - subcall->result = obj; - subcall->iserror = iserror; - subcall_sync_leave(subcall); - } + struct subcall *subcall = CONTAINER_OF_XREQ(struct subcall, xreq); + + 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); } -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; - - subcall = calloc(1, sizeof *subcall); - if (subcall == NULL) { - return NULL; - } - - afb_context_subinit(&subcall->xreq.context, &caller->context); - subcall->xreq.refcount = 1; - 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; - subcall->caller = caller; - subcall->callback = callback; - subcall->closure = closure; - afb_xreq_addref(caller); - json_object_get(args); - return subcall; -} +const struct afb_xreq_query_itf afb_subcall_xreq_itf = { + .reply = subcall_reply, + .unref = subcall_destroy, + .subscribe = subcall_subscribe, + .unsubscribe = subcall_unsubscribe +}; void afb_subcall( struct afb_xreq *caller, @@ -128,64 +88,31 @@ void afb_subcall( ) { struct subcall *subcall; + size_t lenapi, lenverb; + char *copy; - subcall = create_subcall(caller, api, verb, args, callback, closure); - if (subcall == NULL) { + lenapi = 1 + strlen(api); + lenverb = 1 + strlen(verb); + subcall = malloc(lenapi + lenverb + sizeof *subcall); + if (subcall == NULL) callback(closure, 1, afb_msg_json_internal_error()); - return; + else { + afb_xreq_init(&subcall->xreq, &afb_subcall_xreq_itf); + afb_context_subinit(&subcall->xreq.context, &caller->context); + subcall->xreq.cred = afb_cred_addref(caller->cred); + subcall->xreq.json = args; + 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; + afb_xreq_addref(caller); + json_object_get(args); /* keep args existing */ + afb_xreq_process(&subcall->xreq, caller->apiset); } - - afb_apis_call(&subcall->xreq); - afb_xreq_unref(&subcall->xreq); -} - -static void subcall_sync_leave(struct subcall *subcall) -{ - struct jobloop *jobloop = subcall->jobloop; - subcall->jobloop = NULL; - if (jobloop) - jobs_leave(jobloop); -} - -static void subcall_sync_cb(int signum, void *closure, struct jobloop *jobloop) -{ - struct subcall *subcall = closure; - - if (!signum) { - subcall->jobloop = jobloop; - afb_apis_call_direct(&subcall->xreq); - } else { - afb_xreq_fail_f(&subcall->xreq, "aborted", "signal %s(%d) caught", strsignal(signum), signum); - } - subcall_sync_leave(subcall); } -int afb_subcall_sync( - struct afb_xreq *caller, - const char *api, - const char *verb, - struct json_object *args, - struct json_object **result -) -{ - int rc; - struct subcall *subcall; - - subcall = create_subcall(caller, api, verb, args, NULL, NULL); - if (subcall == NULL) { - *result = json_object_get(afb_msg_json_internal_error()); - return 0; - } - - rc = jobs_enter(NULL, 0, subcall_sync_cb, subcall); - if (rc < 0) { - subcall->result = json_object_get(afb_msg_json_internal_error()); - subcall->iserror = 1; - } - rc = !subcall->iserror; - *result = subcall->result; - afb_xreq_unref(&subcall->xreq); - return rc; -} - -