jobs: Fix a lock of call sync
[src/app-framework-binder.git] / bindings / samples / ave.c
index 3ddfda6..ce01c6d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015, 2016, 2017 "IoT.bzh"
+ * Copyright (C) 2015-2018 "IoT.bzh"
  * Author José Bollo <jose.bollo@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +21,7 @@
 
 #include <json-c/json.h>
 
+#define AFB_BINDING_WANT_DYNAPI
 #define AFB_BINDING_VERSION 0
 #include <afb/afb-binding.h>
 
@@ -29,7 +30,7 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 struct event
 {
        struct event *next;
-       struct afb_eventid *eventid;
+       afb_eventid *eventid;
        char tag[1];
 };
 
@@ -147,7 +148,7 @@ static void pingBug (afb_request *request)
 static void pingEvent(afb_request *request)
 {
        json_object *query = afb_request_json(request);
-       afb_dynapi_broadcast_event(request->dynapi, "event", json_object_get(query));
+       afb_dynapi_broadcast_event(request->api, "event", json_object_get(query));
        ping(request, json_object_get(query), "event");
 }
 
@@ -219,7 +220,7 @@ static void eventadd (afb_request *request)
        pthread_mutex_lock(&mutex);
        if (tag == NULL || name == NULL)
                afb_request_fail(request, "failed", "bad arguments");
-       else if (0 != event_add(request->dynapi, tag, name))
+       else if (0 != event_add(request->api, tag, name))
                afb_request_fail(request, "failed", "creation error");
        else
                afb_request_success(request, NULL, NULL);
@@ -305,7 +306,7 @@ static void call (afb_request *request)
        if (object == NULL)
                afb_request_fail(request, "failed", "bad arguments");
        else
-               afb_dynapi_call(request->dynapi, api, verb, object, callcb, afb_request_addref(request));
+               afb_dynapi_call(request->api, api, verb, object, callcb, afb_request_addref(request));
 }
 
 static void callsync (afb_request *request)
@@ -319,7 +320,7 @@ static void callsync (afb_request *request)
        if (object == NULL)
                afb_request_fail(request, "failed", "bad arguments");
        else {
-               rc = afb_dynapi_call_sync(request->dynapi, api, verb, object, &result);
+               rc = afb_dynapi_call_sync(request->api, api, verb, object, &result);
                if (rc >= 0)
                        afb_request_success(request, result, NULL);
                else {
@@ -379,7 +380,7 @@ static void broadcast(afb_request *request)
                        afb_request_success(request, NULL, NULL);
                pthread_mutex_unlock(&mutex);
        } else if (name != NULL) {
-               if (0 > afb_dynapi_broadcast_event(request->dynapi, name, object))
+               if (0 > afb_dynapi_broadcast_event(request->api, name, object))
                        afb_request_fail(request, "failed", "broadcast error");
                else
                        afb_request_success(request, NULL, NULL);
@@ -415,7 +416,7 @@ static void onevent(afb_dynapi *dynapi, const char *event, struct json_object *o
 {
        AFB_DYNAPI_NOTICE(dynapi, "received event %s(%s) by AVE(%s)",
                        event, json_object_to_json_string(object),
-                       (const char*)dynapi->userdata);
+                       (const char*)afb_dynapi_get_userdata(dynapi));
 }
 
 // NOTE: this sample does not use session to keep test a basic as possible
@@ -447,19 +448,32 @@ static const struct {
   { .verb=NULL}
 };
 
+static void pingoo(struct afb_req_x1 req)
+{
+       json_object *args = afb_req_x1_json(req);
+       afb_req_x1_reply_f(req, json_object_get(args), NULL, "You reached pingoo \\o/ nice args: %s", json_object_to_json_string(args));
+}
+
+static const struct afb_verb_v2 verbsv2[]= {
+  { .verb="pingoo",      .callback=pingoo },
+  { .verb="ping",      .callback=pingoo },
+  { .verb=NULL}
+};
+
 static const char *apis[] = { "ave", "hi", "salut", NULL };
 
-static int api_preinit(void *closure, afb_dynapi *dynapi)
+static int build_api(void *closure, afb_dynapi *dynapi)
 {
        int i, rc;
 
-       dynapi->userdata = closure;
-       AFB_DYNAPI_NOTICE(dynapi, "dynamic binding AVE(%s) comes to live", (const char*)dynapi->userdata);
+       afb_dynapi_set_userdata(dynapi, closure);
+       AFB_DYNAPI_NOTICE(dynapi, "dynamic binding AVE(%s) comes to live", (const char*)afb_dynapi_get_userdata(dynapi));
        afb_dynapi_on_init(dynapi, init);
        afb_dynapi_on_event(dynapi, onevent);
 
+       rc = afb_dynapi_set_verbs_v2(dynapi, verbsv2);
        for (i = rc = 0; verbs[i].verb && rc >= 0 ; i++) {
-               rc = afb_dynapi_add_verb(dynapi, verbs[i].verb, NULL, verbs[i].callback, NULL, 0);
+               rc = afb_dynapi_add_verb(dynapi, verbs[i].verb, NULL, verbs[i].callback, (void*)(intptr_t)i, NULL, 0);
        }
        afb_dynapi_seal(dynapi);
        return rc;
@@ -470,7 +484,9 @@ int afbBindingVdyn(afb_dynapi *dynapi)
        int i, rc;
 
        for (i = 0; apis[i] ; i++) {
-               rc = afb_dynapi_new_api(dynapi, apis[i], NULL, api_preinit, (void*)apis[i]);
+               rc = afb_dynapi_new_api(dynapi, apis[i], NULL, 0, build_api, (void*)apis[i]);
+               if (rc < 0)
+                       AFB_DYNAPI_ERROR(dynapi, "can't create API %s", apis[i]);
        }
        return 0;
 }