X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-svc.c;h=11e6872f2d7d5ecfb693ff454e1b728f58301fec;hb=c9ba2ce49808a19a4ef982280a46256797b830ae;hp=03ff4b84b830ccb7a8853968ec49e1b2653a9b0b;hpb=5b5a2e4412eea806451c016da9fb285bc09c17ab;p=src%2Fapp-framework-binder.git diff --git a/src/afb-svc.c b/src/afb-svc.c index 03ff4b84..11e6872f 100644 --- a/src/afb-svc.c +++ b/src/afb-svc.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 "IoT.bzh" + * Copyright (C) 2016, 2017 "IoT.bzh" * Author: José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,7 @@ #include #include -#include "session.h" +#include "afb-session.h" #include "afb-context.h" #include "afb-evt.h" #include "afb-subcall.h" @@ -36,7 +36,7 @@ struct afb_svc { /* session of the service */ - struct AFB_clientCtx *session; + struct afb_session *session; /* event listener of the service or NULL */ struct afb_evt_listener *listener; @@ -64,13 +64,19 @@ struct svc_req }; /* functions for services */ -static void svc_on_event(struct afb_svc *svc, const char *event, struct json_object *object); -static void svc_call(struct afb_svc *svc, const char *api, const char *verb, struct json_object *args, - void (*callback)(void*, int, struct json_object*), void *closure); +static void svc_on_event(void *closure, const char *event, int eventid, struct json_object *object); +static void svc_call(void *closure, const char *api, const char *verb, struct json_object *args, + void (*callback)(void*, int, struct json_object*), void *cbclosure); /* the interface for services */ static const struct afb_service_itf service_itf = { - .call = (void*)svc_call + .call = svc_call +}; + +/* the interface for events */ +static const struct afb_evt_itf evt_itf = { + .broadcast = svc_on_event, + .push = svc_on_event }; /* functions for requests of services */ @@ -94,15 +100,14 @@ const struct afb_req_itf afb_svc_req_itf = { .subcall = (void*)svcreq_subcall }; -/* the common session for services sahring their session */ -static struct AFB_clientCtx *common_session; +/* the common session for services sharing their session */ +static struct afb_session *common_session; /* - * Creates a new service + * Allocates 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)) +static struct afb_svc *afb_svc_alloc(int share_session, void (*on_event)(const char *event, struct json_object *object)) { - int rc; struct afb_svc *svc; /* allocates the svc handler */ @@ -114,40 +119,95 @@ struct afb_svc *afb_svc_create(int share_session, int (*init)(struct afb_service if (share_session) { /* session shared with other svcs */ if (common_session == NULL) { - common_session = ctxClientCreate (NULL, 0); + common_session = afb_session_create (NULL, 0); if (common_session == NULL) goto error2; } - svc->session = ctxClientAddRef(common_session); + svc->session = afb_session_addref(common_session); } else { /* session dedicated to the svc */ - svc->session = ctxClientCreate (NULL, 0); + svc->session = afb_session_create (NULL, 0); if (svc->session == NULL) goto error2; } /* initialises the listener if needed */ + svc->on_event = on_event; if (on_event == NULL) svc->listener = NULL; else { - svc->listener = afb_evt_listener_create((void*)svc_on_event, svc); + svc->listener = afb_evt_listener_create(&evt_itf, svc); if (svc->listener == NULL) goto error3; } + return svc; + +error3: + afb_session_unref(svc->session); +error2: + free(svc); +error: + return NULL; +} + +/* + * 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)) +{ + int rc; + struct afb_svc *svc; + + /* allocates the svc handler */ + svc = afb_svc_alloc(share_session, on_event); + if (svc == NULL) + goto error; + /* initialises the svc now */ rc = init((struct afb_service){ .itf = &service_itf, .closure = svc }); if (rc < 0) - goto error4; + goto error2; return svc; -error4: +error2: if (svc->listener != NULL) afb_evt_listener_unref(svc->listener); -error3: - ctxClientUnref(svc->session); + afb_session_unref(svc->session); + free(svc); +error: + return NULL; +} + +/* + * Creates a new service + */ +struct afb_svc *afb_svc_create_v2( + 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) +{ + int rc; + struct afb_svc *svc; + + /* allocates the svc handler */ + svc = afb_svc_alloc(share_session, on_event); + if (svc == NULL) + goto error; + + /* initialises the svc now */ + rc = start(interface, (struct afb_service){ .itf = &service_itf, .closure = svc }); + if (rc < 0) + goto error2; + + return svc; + error2: + if (svc->listener != NULL) + afb_evt_listener_unref(svc->listener); + afb_session_unref(svc->session); free(svc); error: return NULL; @@ -156,22 +216,25 @@ error: /* * Propagates the event to the service */ -static void svc_on_event(struct afb_svc *svc, const char *event, struct json_object *object) +static void svc_on_event(void *closure, const char *event, int eventid, struct json_object *object) { + struct afb_svc *svc = closure; svc->on_event(event, object); + json_object_put(object); } /* * Initiates a call for the service */ -static void svc_call(struct afb_svc *svc, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *closure) +static void svc_call(void *closure, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *cbclosure) { + struct afb_svc *svc = closure; struct svc_req *svcreq; /* allocates the request */ svcreq = malloc(sizeof *svcreq); if (svcreq == NULL) - return afb_subcall_internal_error(callback, closure); + return afb_subcall_internal_error(callback, cbclosure); /* initialises the request */ afb_context_init(&svcreq->context, svc->session, NULL); @@ -180,7 +243,7 @@ static void svc_call(struct afb_svc *svc, const char *api, const char *verb, str svcreq->refcount = 1; /* makes the call */ - afb_subcall(&svcreq->context, api, verb, args, callback, closure, (struct afb_req){ .itf = &afb_svc_req_itf, .closure = svcreq }); + 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);