X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-svc.c;h=0ae56b81ebcf50bd78e23bdddfb8be2c4653a64c;hb=f2995647f0f79e816c7f46033e1ec824185732b5;hp=93e85533856b0a9df4f41c2531242adab31105ff;hpb=0b838a6101edc810098ee0645d3bfd966096ae07;p=src%2Fapp-framework-binder.git diff --git a/src/afb-svc.c b/src/afb-svc.c index 93e85533..0ae56b81 100644 --- a/src/afb-svc.c +++ b/src/afb-svc.c @@ -27,10 +27,11 @@ #include "afb-session.h" #include "afb-context.h" #include "afb-evt.h" -#include "afb-subcall.h" +#include "afb-msg-json.h" #include "afb-svc.h" #include "afb-xreq.h" -#include "afb-apis.h" +#include "afb-cred.h" +#include "afb-apiset.h" #include "verbose.h" /* @@ -41,6 +42,9 @@ struct afb_svc /* session of the service */ struct afb_session *session; + /* the apiset for the service */ + struct afb_apiset *apiset; + /* event listener of the service or NULL */ struct afb_evt_listener *listener; @@ -56,12 +60,8 @@ struct svc_req struct afb_xreq xreq; /* the args */ - struct json_object *args; void (*callback)(void*, int, struct json_object*); void *closure; - - /* the service */ - struct afb_svc *svc; }; /* functions for services */ @@ -81,14 +81,12 @@ static const struct afb_evt_itf evt_itf = { }; /* functions for requests of services */ -static struct json_object *svcreq_json(void *closure); -static void svcreq_destroy(void *closure); -static void svcreq_reply(void *closure, int iserror, json_object *obj); +static void svcreq_destroy(struct afb_xreq *xreq); +static void svcreq_reply(struct afb_xreq *xreq, int iserror, json_object *obj); /* interface for requests of services */ const struct afb_xreq_query_itf afb_svc_xreq_itf = { .unref = svcreq_destroy, - .json = svcreq_json, .reply = svcreq_reply }; @@ -98,7 +96,11 @@ static struct afb_session *common_session; /* * Allocates a new service */ -static struct afb_svc *afb_svc_alloc(int share_session, void (*on_event)(const char *event, struct json_object *object)) +static struct afb_svc *afb_svc_alloc( + struct afb_apiset *apiset, + int share_session, + void (*on_event)(const char *event, struct json_object *object) +) { struct afb_svc *svc; @@ -107,6 +109,9 @@ static struct afb_svc *afb_svc_alloc(int share_session, void (*on_event)(const c if (svc == NULL) goto error; + /* instanciate the apiset */ + svc->apiset = afb_apiset_addref(apiset); + /* instanciate the session */ if (share_session) { /* session shared with other svcs */ @@ -138,6 +143,7 @@ static struct afb_svc *afb_svc_alloc(int share_session, void (*on_event)(const c error3: afb_session_unref(svc->session); error2: + afb_apiset_unref(svc->apiset); free(svc); error: return NULL; @@ -146,13 +152,18 @@ error: /* * Creates a new service */ -struct afb_svc *afb_svc_create(int share_session, int (*init)(struct afb_service service), void (*on_event)(const char *event, struct json_object *object)) +struct afb_svc *afb_svc_create( + struct afb_apiset *apiset, + int share_session, + int (*init)(struct afb_service service), + void (*on_event)(const char *event, struct json_object *object) +) { int rc; struct afb_svc *svc; /* allocates the svc handler */ - svc = afb_svc_alloc(share_session, on_event); + svc = afb_svc_alloc(apiset, share_session, on_event); if (svc == NULL) goto error; @@ -167,6 +178,7 @@ error2: if (svc->listener != NULL) afb_evt_listener_unref(svc->listener); afb_session_unref(svc->session); + afb_apiset_unref(svc->apiset); free(svc); error: return NULL; @@ -176,16 +188,18 @@ error: * Creates a new service */ struct afb_svc *afb_svc_create_v2( + struct afb_apiset *apiset, int share_session, void (*on_event)(const char *event, struct json_object *object), int (*start)(const struct afb_binding_interface *interface, struct afb_service service), - const struct afb_binding_interface *interface) + const struct afb_binding_interface *interface +) { int rc; struct afb_svc *svc; /* allocates the svc handler */ - svc = afb_svc_alloc(share_session, on_event); + svc = afb_svc_alloc(apiset, share_session, on_event); if (svc == NULL) goto error; @@ -200,6 +214,7 @@ error2: if (svc->listener != NULL) afb_evt_listener_unref(svc->listener); afb_session_unref(svc->session); + afb_apiset_unref(svc->apiset); free(svc); error: return NULL; @@ -228,45 +243,38 @@ static void svc_call(void *closure, const char *api, const char *verb, struct js if (svcreq == NULL) { ERROR("out of memory"); json_object_put(args); - return afb_subcall_internal_error(callback, cbclosure); + callback(cbclosure, 1, afb_msg_json_internal_error()); + return; } /* initialises the request */ + afb_xreq_init(&svcreq->xreq, &afb_svc_xreq_itf); afb_context_init(&svcreq->xreq.context, svc->session, NULL); svcreq->xreq.context.validated = 1; - svcreq->xreq.refcount = 1; - svcreq->xreq.query = svcreq; - svcreq->xreq.queryitf = &afb_svc_xreq_itf; + svcreq->xreq.cred = afb_cred_current(); svcreq->xreq.api = api; svcreq->xreq.verb = verb; svcreq->xreq.listener = svc->listener; - svcreq->args = args; + svcreq->xreq.json = args; svcreq->callback = callback; svcreq->closure = cbclosure; - svcreq->svc = svc; /* terminates and frees ressources if needed */ - afb_apis_call(&svcreq->xreq); - afb_xreq_unref(&svcreq->xreq); + afb_xreq_process(&svcreq->xreq, svc->apiset); } -static void svcreq_destroy(void *closure) +static void svcreq_destroy(struct afb_xreq *xreq) { - struct svc_req *svcreq = closure; + struct svc_req *svcreq = CONTAINER_OF_XREQ(struct svc_req, xreq); afb_context_disconnect(&svcreq->xreq.context); - json_object_put(svcreq->args); + json_object_put(svcreq->xreq.json); + afb_cred_unref(svcreq->xreq.cred); free(svcreq); } -static struct json_object *svcreq_json(void *closure) -{ - struct svc_req *svcreq = closure; - return svcreq->args; -} - -static void svcreq_reply(void *closure, int iserror, json_object *obj) +static void svcreq_reply(struct afb_xreq *xreq, int iserror, json_object *obj) { - struct svc_req *svcreq = closure; + struct svc_req *svcreq = CONTAINER_OF_XREQ(struct svc_req, xreq); svcreq->callback(svcreq->closure, iserror, obj); json_object_put(obj); }