X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-subcall.c;h=ef114077e5d5dcb0783a1287655722e714284f55;hb=a86967decc0ff9b139f412fffccc7914e27a80a9;hp=7026f20e956f3b35cc253eda66c339e9a67c5a61;hpb=4846cec0be7f41f992b9f89b7adb97033e15b1a0;p=src%2Fapp-framework-binder.git diff --git a/src/afb-subcall.c b/src/afb-subcall.c index 7026f20e..ef114077 100644 --- a/src/afb-subcall.c +++ b/src/afb-subcall.c @@ -25,25 +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); - -const struct afb_xreq_query_itf afb_subcall_xreq_itf = { - .reply = subcall_reply, - .unref = subcall_destroy, - .subscribe = subcall_subscribe, - .unsubscribe = subcall_unsubscribe -}; struct subcall { @@ -53,60 +39,44 @@ struct subcall void *closure; }; -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); 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, @@ -118,87 +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); } -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 = sync->jobloop; - sync->jobloop = NULL; - if (jobloop) - jobs_leave(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_sync *sync = closure; - - if (!signum) { - sync->jobloop = jobloop; - afb_xreq_unhooked_subcall(sync->caller, sync->api, sync->verb, sync->args, subcall_sync_reply, sync); - } else { - sync->result = json_object_get(afb_msg_json_internal_error()); - sync->iserror = 1; - subcall_sync_leave(sync); - } -} - -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_sync sync; - - 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_enter, &sync); - if (rc < 0) { - sync.result = json_object_get(afb_msg_json_internal_error()); - sync.iserror = 1; - } - rc = !sync.iserror; - *result = sync.result; - return rc; -} - -