X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-svc.c;h=57173412e62adc3850a673e0fbc3b8d73407206f;hb=157c652b4bb8eba5692bed2a4bc75650f7ae7622;hp=0ae56b81ebcf50bd78e23bdddfb8be2c4653a64c;hpb=a8e971702f23ee67e02b4716ad4159f12cefdca6;p=src%2Fapp-framework-binder.git diff --git a/src/afb-svc.c b/src/afb-svc.c index 0ae56b81..57173412 100644 --- a/src/afb-svc.c +++ b/src/afb-svc.c @@ -18,6 +18,7 @@ #define _GNU_SOURCE #include +#include #include @@ -32,6 +33,7 @@ #include "afb-xreq.h" #include "afb-cred.h" #include "afb-apiset.h" +#include "afb-ditf.h" #include "verbose.h" /* @@ -49,7 +51,13 @@ struct afb_svc struct afb_evt_listener *listener; /* on event callback for the service */ - void (*on_event)(const char *event, struct json_object *object); + union { + void (*on_event_v1)(const char *event, struct json_object *object); + void (*on_event_v2)(struct afb_service service, const char *event, struct json_object *object); + }; + + /* the daemon interface */ + struct afb_ditf *ditf; }; /* @@ -65,7 +73,8 @@ struct svc_req }; /* functions for services */ -static void svc_on_event(void *closure, const char *event, int eventid, struct json_object *object); +static void svc_on_event_v1(void *closure, const char *event, int eventid, struct json_object *object); +static void svc_on_event_v2(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); @@ -75,9 +84,13 @@ static const struct afb_service_itf service_itf = { }; /* the interface for events */ -static const struct afb_evt_itf evt_itf = { - .broadcast = svc_on_event, - .push = svc_on_event +static const struct afb_evt_itf evt_itf_v1 = { + .broadcast = svc_on_event_v1, + .push = svc_on_event_v1 +}; +static const struct afb_evt_itf evt_itf_v2 = { + .broadcast = svc_on_event_v2, + .push = svc_on_event_v2 }; /* functions for requests of services */ @@ -93,21 +106,45 @@ const struct afb_xreq_query_itf afb_svc_xreq_itf = { /* the common session for services sharing their session */ static struct afb_session *common_session; +static inline struct afb_service to_afb_service_v1(struct afb_svc *svc) +{ + return (struct afb_service){ .itf = &service_itf, .closure = svc }; +} + +static inline struct afb_service to_afb_service_v2(struct afb_svc *svc) +{ + return (struct afb_service){ .itf = &service_itf, .closure = svc }; +} + +/* + * Frees a service + */ +static void svc_free(struct afb_svc *svc) +{ + if (svc->listener != NULL) + afb_evt_listener_unref(svc->listener); + if (svc->session) + afb_session_unref(svc->session); + afb_apiset_unref(svc->apiset); + free(svc); +} + /* * Allocates a new service */ static struct afb_svc *afb_svc_alloc( struct afb_apiset *apiset, - int share_session, - void (*on_event)(const char *event, struct json_object *object) + int share_session ) { struct afb_svc *svc; /* allocates the svc handler */ - svc = malloc(sizeof * svc); - if (svc == NULL) - goto error; + svc = calloc(1, sizeof * svc); + if (svc == NULL) { + errno = ENOMEM; + return NULL; + } /* instanciate the apiset */ svc->apiset = afb_apiset_addref(apiset); @@ -118,44 +155,30 @@ static struct afb_svc *afb_svc_alloc( if (common_session == NULL) { common_session = afb_session_create (NULL, 0); if (common_session == NULL) - goto error2; + goto error; } svc->session = afb_session_addref(common_session); } else { /* session dedicated to the svc */ 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(&evt_itf, svc); - if (svc->listener == NULL) - goto error3; + goto error; } return svc; -error3: - afb_session_unref(svc->session); -error2: - afb_apiset_unref(svc->apiset); - free(svc); error: + svc_free(svc); return NULL; } /* * Creates a new service */ -struct afb_svc *afb_svc_create( +struct afb_svc *afb_svc_create_v1( struct afb_apiset *apiset, int share_session, - int (*init)(struct afb_service service), + int (*start)(struct afb_service service), void (*on_event)(const char *event, struct json_object *object) ) { @@ -163,24 +186,27 @@ struct afb_svc *afb_svc_create( struct afb_svc *svc; /* allocates the svc handler */ - svc = afb_svc_alloc(apiset, share_session, on_event); + svc = afb_svc_alloc(apiset, share_session); if (svc == NULL) goto error; + /* initialises the listener if needed */ + if (on_event) { + svc->on_event_v1 = on_event; + svc->listener = afb_evt_listener_create(&evt_itf_v1, svc); + if (svc->listener == NULL) + goto error; + } + /* initialises the svc now */ - rc = init((struct afb_service){ .itf = &service_itf, .closure = svc }); + rc = start(to_afb_service_v1(svc)); if (rc < 0) - goto error2; + goto error; return svc; -error2: - if (svc->listener != NULL) - afb_evt_listener_unref(svc->listener); - afb_session_unref(svc->session); - afb_apiset_unref(svc->apiset); - free(svc); error: + svc_free(svc); return NULL; } @@ -190,43 +216,57 @@ error: 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 + int (*start)(struct afb_service service), + void (*on_event)(struct afb_service service, const char *event, struct json_object *object), + struct afb_ditf *ditf ) { int rc; struct afb_svc *svc; /* allocates the svc handler */ - svc = afb_svc_alloc(apiset, share_session, on_event); + svc = afb_svc_alloc(apiset, share_session); if (svc == NULL) goto error; + svc->ditf = ditf; + + /* initialises the listener if needed */ + if (on_event) { + svc->on_event_v2 = on_event; + svc->listener = afb_evt_listener_create(&evt_itf_v2, svc); + if (svc->listener == NULL) + goto error; + } /* initialises the svc now */ - rc = start(interface, (struct afb_service){ .itf = &service_itf, .closure = svc }); + rc = start(to_afb_service_v2(svc)); if (rc < 0) - goto error2; + goto error; return svc; -error2: - if (svc->listener != NULL) - afb_evt_listener_unref(svc->listener); - afb_session_unref(svc->session); - afb_apiset_unref(svc->apiset); - free(svc); error: + svc_free(svc); return NULL; } /* * Propagates the event to the service */ -static void svc_on_event(void *closure, const char *event, int eventid, struct json_object *object) +static void svc_on_event_v1(void *closure, const char *event, int eventid, struct json_object *object) +{ + struct afb_svc *svc = closure; + svc->on_event_v1(event, object); + json_object_put(object); +} + +/* + * Propagates the event to the service + */ +static void svc_on_event_v2(void *closure, const char *event, int eventid, struct json_object *object) { struct afb_svc *svc = closure; - svc->on_event(event, object); + svc->on_event_v2(to_afb_service_v2(svc), event, object); json_object_put(object); }