afb-export: prepare to eventid
[src/app-framework-binder.git] / src / afb-export.c
index 2f16b37..bd5b61e 100644 (file)
@@ -39,7 +39,6 @@
 #include "jobs.h"
 #include "verbose.h"
 
-extern struct afb_apiset *main_apiset;
 
 /*************************************************************************
  * internal types and structures
@@ -133,7 +132,7 @@ static void old_vverbose_cb(void *closure, int level, const char *file, int line
        vverbose_cb(closure, level, file, line, NULL, fmt, args);
 }
 
-static struct afb_event event_make_cb(void *closure, const char *name)
+static struct afb_eventid *eventid_make_cb(void *closure, const char *name)
 {
        size_t plen, nlen;
        char *event;
@@ -143,7 +142,7 @@ static struct afb_event event_make_cb(void *closure, const char *name)
        if (export->state == Api_State_Pre_Init) {
                ERROR("[API %s] Bad call to 'afb_daemon_event_make(%s)', must not be in PreInit", export->apiname, name);
                errno = EINVAL;
-               return (struct afb_event){ .itf = NULL, .closure = NULL };
+               return NULL;
        }
 
        /* makes the event name */
@@ -158,6 +157,12 @@ static struct afb_event event_make_cb(void *closure, const char *name)
        return afb_evt_create_event(event);
 }
 
+static struct afb_event event_make_cb(void *closure, const char *name)
+{
+       struct afb_eventid *eventid = eventid_make_cb(closure, name);
+       return (struct afb_event){ .itf = eventid ? eventid->itf : NULL, .closure = eventid };
+}
+
 static int event_broadcast_cb(void *closure, const char *name, struct json_object *object)
 {
        size_t plen, nlen;
@@ -206,7 +211,7 @@ static int require_api_cb(void *closure, const char *name, int initialized)
                errno = EINVAL;
                return -1;
        }
-       return -!(initialized ? afb_apiset_lookup_started : afb_apiset_lookup)(main_apiset, name, 1);
+       return -!(initialized ? afb_apiset_lookup_started : afb_apiset_lookup)(export->apiset, name, 1);
 }
 
 static int rename_api_cb(void *closure, const char *name)
@@ -245,11 +250,18 @@ static void hooked_old_vverbose_cb(void *closure, int level, const char *file, i
        hooked_vverbose_cb(closure, level, file, line, NULL, fmt, args);
 }
 
-static struct afb_event hooked_event_make_cb(void *closure, const char *name)
+static struct afb_eventid *hooked_eventid_make_cb(void *closure, const char *name)
 {
        struct afb_export *export = closure;
-       struct afb_event r = event_make_cb(closure, name);
-       return afb_hook_ditf_event_make(export, name, r);
+       struct afb_eventid *r = eventid_make_cb(closure, name);
+       afb_hook_ditf_event_make(export, name, r);
+       return r;
+}
+
+static struct afb_event hooked_event_make_cb(void *closure, const char *name)
+{
+       struct afb_eventid *eventid = hooked_eventid_make_cb(closure, name);
+       return (struct afb_event){ .itf = eventid ? eventid->itf : NULL, .closure = eventid };
 }
 
 static int hooked_event_broadcast_cb(void *closure, const char *name, struct json_object *object)
@@ -406,7 +418,6 @@ struct call_req
        struct jobloop *jobloop;
        struct json_object *result;
        int status;
-       int async;
 };
 
 /*
@@ -530,7 +541,6 @@ static void svc_call(void *closure, const char *api, const char *verb, struct js
        callreq->jobloop = NULL;
        callreq->callback = callback;
        callreq->closure = cbclosure;
-       callreq->async = 1;
 
        /* terminates and frees ressources if needed */
        afb_xreq_process(&callreq->xreq, export->apiset);
@@ -558,7 +568,6 @@ static int svc_call_sync(void *closure, const char *api, const char *verb, struc
                callreq->callback = NULL;
                callreq->result = NULL;
                callreq->status = 0;
-               callreq->async = 0;
                afb_xreq_unhooked_addref(&callreq->xreq); /* avoid early callreq destruction */
                rc = jobs_enter(NULL, 0, callreq_sync_enter, callreq);
                if (rc >= 0)
@@ -687,7 +696,7 @@ static const struct afb_evt_itf evt_v12_itf = {
  *************************************************************************************************************
  *************************************************************************************************************/
 
-static struct afb_export *create(const char *apiname, enum afb_api_version version)
+static struct afb_export *create(struct afb_apiset *apiset, const char *apiname, enum afb_api_version version)
 {
        struct afb_export *export;
 
@@ -706,7 +715,7 @@ static struct afb_export *create(const char *apiname, enum afb_api_version versi
                export->version = version;
                export->state = Api_State_Pre_Init;
                export->session = afb_session_addref(common_session);
-               export->apiset = afb_apiset_addref(main_apiset);
+               export->apiset = afb_apiset_addref(apiset);
        }
        return export;
 }
@@ -723,9 +732,9 @@ void afb_export_destroy(struct afb_export *export)
        }
 }
 
-struct afb_export *afb_export_create_v1(const char *apiname, int (*init)(struct afb_service), void (*onevent)(const char*, struct json_object*))
+struct afb_export *afb_export_create_v1(struct afb_apiset *apiset, const char *apiname, int (*init)(struct afb_service), void (*onevent)(const char*, struct json_object*))
 {
-       struct afb_export *export = create(apiname, Api_Version_1);
+       struct afb_export *export = create(apiset, apiname, Api_Version_1);
        if (export) {
                export->init.v1 = init;
                export->on_event.v12 = onevent;
@@ -737,13 +746,14 @@ struct afb_export *afb_export_create_v1(const char *apiname, int (*init)(struct
        return export;
 }
 
-struct afb_export *afb_export_create_v2(const char *apiname, struct afb_binding_data_v2 *data, int (*init)(), void (*onevent)(const char*, struct json_object*))
+struct afb_export *afb_export_create_v2(struct afb_apiset *apiset, const char *apiname, struct afb_binding_data_v2 *data, int (*init)(), void (*onevent)(const char*, struct json_object*))
 {
-       struct afb_export *export = create(apiname, Api_Version_2);
+       struct afb_export *export = create(apiset, apiname, Api_Version_2);
        if (export) {
                export->init.v2 = init;
                export->on_event.v12 = onevent;
                export->export.v2 = data;
+               data->verbosity = verbosity;
                data->daemon.closure = export;
                data->service.closure = export;
                afb_export_update_hook(export);