diff options
-rw-r--r-- | src/afb-svc.c | 102 | ||||
-rw-r--r-- | src/afb-xreq.c | 5 | ||||
-rw-r--r-- | src/afb-xreq.h | 2 |
3 files changed, 50 insertions, 59 deletions
diff --git a/src/afb-svc.c b/src/afb-svc.c index 11e6872f..58e2b6d3 100644 --- a/src/afb-svc.c +++ b/src/afb-svc.c @@ -29,6 +29,9 @@ #include "afb-evt.h" #include "afb-subcall.h" #include "afb-svc.h" +#include "afb-xreq.h" +#include "afb-apis.h" +#include "verbose.h" /* * Structure for recording service @@ -50,17 +53,15 @@ struct afb_svc */ struct svc_req { - /* - * CAUTION: 'context' field should be the first because there - * is an implicit convertion to struct afb_context - */ - struct afb_context context; + 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; - - /* the count of references to the request */ - int refcount; }; /* functions for services */ @@ -80,24 +81,15 @@ static const struct afb_evt_itf evt_itf = { }; /* functions for requests of services */ -static void svcreq_addref(struct svc_req *svcreq); -static void svcreq_unref(struct svc_req *svcreq); -static int svcreq_subscribe(struct svc_req *svcreq, struct afb_event event); -static int svcreq_unsubscribe(struct svc_req *svcreq, struct afb_event event); -static void svcreq_subcall(struct svc_req *svcreq, const char *api, const char *verb, struct json_object *args, - void (*callback)(void*, int, struct json_object*), void *closure); +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); /* interface for requests of services */ -const struct afb_req_itf afb_svc_req_itf = { - .addref = (void*)svcreq_addref, - .unref = (void*)svcreq_unref, - .context_get = (void*)afb_context_get, - .context_set = (void*)afb_context_set, - .session_close = (void*)afb_context_close, - .session_set_LOA = (void*)afb_context_change_loa, - .subscribe = (void*)svcreq_subscribe, - .unsubscribe = (void*)svcreq_unsubscribe, - .subcall = (void*)svcreq_subcall +const struct afb_xreq_query_itf afb_svc_xreq_itf = { + .unref = svcreq_destroy, + .json = svcreq_json, + .reply = svcreq_reply }; /* the common session for services sharing their session */ @@ -232,52 +224,50 @@ static void svc_call(void *closure, const char *api, const char *verb, struct js struct svc_req *svcreq; /* allocates the request */ - svcreq = malloc(sizeof *svcreq); - if (svcreq == NULL) + svcreq = calloc(1, sizeof *svcreq); + if (svcreq == NULL) { + ERROR("out of memory"); + json_object_put(args); return afb_subcall_internal_error(callback, cbclosure); + } /* initialises the request */ - afb_context_init(&svcreq->context, svc->session, NULL); - svcreq->context.validated = 1; + 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.api = api; + svcreq->xreq.verb = verb; + svcreq->xreq.listener = svc->listener; + svcreq->args = args; + svcreq->callback = callback; + svcreq->closure = cbclosure; svcreq->svc = svc; - svcreq->refcount = 1; - - /* makes the call */ - afb_subcall(&svcreq->context, api, verb, args, callback, cbclosure, (struct afb_req){ .itf = &afb_svc_req_itf, .closure = svcreq }); /* terminates and frees ressources if needed */ - svcreq_unref(svcreq); -} - -static void svcreq_addref(struct svc_req *svcreq) -{ - svcreq->refcount++; -} - -static void svcreq_unref(struct svc_req *svcreq) -{ - if (0 == --svcreq->refcount) { - afb_context_disconnect(&svcreq->context); - free(svcreq); - } + afb_apis_xcall(&svcreq->xreq); + afb_xreq_unref(&svcreq->xreq); } -static int svcreq_subscribe(struct svc_req *svcreq, struct afb_event event) +static void svcreq_destroy(void *closure) { - if (svcreq->svc->listener == NULL) - return -1; - return afb_evt_add_watch(svcreq->svc->listener, event); + struct svc_req *svcreq = closure; + afb_context_disconnect(&svcreq->xreq.context); + json_object_put(svcreq->args); + free(svcreq); } -static int svcreq_unsubscribe(struct svc_req *svcreq, struct afb_event event) +static struct json_object *svcreq_json(void *closure) { - if (svcreq->svc->listener == NULL) - return -1; - return afb_evt_remove_watch(svcreq->svc->listener, event); + struct svc_req *svcreq = closure; + return svcreq->args; } -static void svcreq_subcall(struct svc_req *svcreq, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *closure) +static void svcreq_reply(void *closure, int iserror, json_object *obj) { - afb_subcall(&svcreq->context, api, verb, args, callback, closure, (struct afb_req){ .itf = &afb_svc_req_itf, .closure = svcreq }); + struct svc_req *svcreq = closure; + svcreq->callback(svcreq->closure, iserror, obj); + json_object_put(obj); } diff --git a/src/afb-xreq.c b/src/afb-xreq.c index a8849910..6364018d 100644 --- a/src/afb-xreq.c +++ b/src/afb-xreq.c @@ -215,7 +215,10 @@ static int xreq_unsubscribe_cb(void *closure, 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_subcall(&xreq->context, api, verb, args, callback, cb_closure, (struct afb_req){ .itf = &xreq_itf, .closure = xreq }); + if (xreq->queryitf->subcall) + xreq->queryitf->subcall(xreq->query, api, verb, args, callback, cb_closure); + else + afb_subcall(&xreq->context, api, verb, args, callback, cb_closure, (struct afb_req){ .itf = &xreq_itf, .closure = xreq }); } void afb_xreq_success_f(struct afb_xreq *xreq, struct json_object *obj, const char *info, ...) diff --git a/src/afb-xreq.h b/src/afb-xreq.h index d2eae99c..6a4bfc11 100644 --- a/src/afb-xreq.h +++ b/src/afb-xreq.h @@ -33,8 +33,6 @@ struct afb_xreq_query_itf { void (*fail)(void *closure, const char *status, const char *info); void (*reply)(void *closure, int iserror, struct json_object *obj); void (*unref)(void *closure); - int (*subscribe)(void *closure, struct afb_event event); - int (*unsubscribe)(void *closure, struct afb_event event); void (*subcall)(void *closure, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *cb_closure); }; |