X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fapp-framework-binder.git;a=blobdiff_plain;f=bindings%2Fsamples%2Fhello3.c;h=3a6c9ad92077c3f785b4080bba7bfb974abd0576;hp=7e54e3a98612ee78c25fedd71b595ec957ecabff;hb=65353dce81a629e042800bb7b86fcd869a76727e;hpb=4772c5626204f6ab0e26b938f49a6719fb10f88d diff --git a/bindings/samples/hello3.c b/bindings/samples/hello3.c index 7e54e3a9..3a6c9ad9 100644 --- a/bindings/samples/hello3.c +++ b/bindings/samples/hello3.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2018 "IoT.bzh" + * Copyright (C) 2015-2020 "IoT.bzh" * Author "Fulup Ar Foll" * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #include #include @@ -29,7 +31,7 @@ #include #if !defined(APINAME) -#define APINAME "hello3" +#define APINAME "hello" #endif static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; @@ -422,7 +424,7 @@ static void broadcast(afb_req_t request) afb_req_success(request, NULL, NULL); pthread_mutex_unlock(&mutex); } else if (name != NULL) { - if (0 > afb_daemon_broadcast_event(name, object)) + if (0 > afb_daemon_broadcast_event(name, json_object_get(object))) afb_req_fail(request, "failed", "broadcast error"); else afb_req_success(request, NULL, NULL); @@ -539,6 +541,11 @@ static void mute(afb_req_t request) { } +static void mutebug(afb_req_t request) +{ + afb_req_addref(request); +} + void queue_cb(int signum, void *arg) { afb_req_t request = arg; @@ -552,6 +559,13 @@ static void queue(afb_req_t request) afb_api_queue_job(afb_req_get_api(request), queue_cb, request, NULL, 0); } +static void settings(afb_req_t request) +{ + afb_api_t api = afb_req_get_api(request); + struct json_object *object = afb_api_settings(api); + afb_req_reply(request, json_object_get(object), NULL, NULL); +} + static void rootdir (afb_req_t request) { ssize_t s; @@ -606,6 +620,78 @@ static void locale (afb_req_t request) } } +static void in_after (afb_req_t request) +{ + int rc; + const char *ts, *ty; + char *te; + double td; + struct timespec t; + + /* get the type */ + ty = afb_req_value(request, "type") ?: "call"; + if (strcmp(ty, "call") && strcmp(ty, "callsync") + && strcmp(ty, "subcall") && strcmp(ty, "subcallsync")) + return afb_req_reply(request, NULL, "invalid", "bad type"); + + /* get the delay */ + ts = afb_req_value(request, "delay"); + if (!ts) + return afb_req_reply(request, NULL, "invalid", "no delay"); + td = strtod(ts, &te); + if (*te || td < 0 || td > 3e6) /* a month is the biggest accepted */ + return afb_req_reply(request, NULL, "invalid", "bad delay"); + + /* wait for that time */ + if (td > 0) { + t.tv_nsec = (long)(1e6 * modf(td, &td)); + t.tv_sec = (time_t)td; + do { + rc = nanosleep(&t, &t); + } while (rc != 0 && errno == EINTR); + + if (rc) + return afb_req_reply(request, NULL, "error", "sleep failed"); + } + + /* do the call */ + if (!strcmp(ty, "subcallsync")) + subcall(request); + else if (!strcmp(ty, "subcall")) + subcallsync(request); + else if (!strcmp(ty, "callsync")) + callsync(request); + else + call(request); +} + +static void *thread_after (void *closure) +{ + afb_req_t request = closure; + in_after (request); + afb_req_unref(request); + return NULL; +} + +static void after (afb_req_t request) +{ + int rc; + pthread_t tid; + pthread_attr_t attr; + + afb_req_addref(request); + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + rc =pthread_create(&tid, &attr, thread_after, request); + pthread_attr_destroy(&attr); + + if (rc != 0) { + afb_req_unref(request); + afb_req_reply(request, NULL, "cant-start", NULL); + } +} + static void api (afb_req_t request); /** @@ -723,6 +809,7 @@ static const struct afb_verb_v3 verbs[]= { { .verb="setctx", .callback=setctx, .vcbdata = (void*)(intptr_t)1 }, { .verb="setctxif", .callback=setctx, .vcbdata = (void*)(intptr_t)0 }, { .verb="getctx", .callback=getctx }, + { .verb="checktok", .callback=ok, .session=AFB_SESSION_CHECK }, { .verb="reftok", .callback=ok, .session=AFB_SESSION_CHECK | AFB_SESSION_REFRESH }, { .verb="info", .callback=info }, { .verb="eventloop", .callback=eventloop }, @@ -734,7 +821,10 @@ static const struct afb_verb_v3 verbs[]= { { .verb="locale", .callback=locale}, { .verb="api", .callback=api}, { .verb="mute", .callback=mute}, + { .verb="mutebug", .callback=mutebug}, { .verb="queue", .callback=queue}, + { .verb="settings", .callback=settings}, + { .verb="after", .callback=after}, { .verb=NULL} }; @@ -823,6 +913,7 @@ static void api (afb_req_t request) } sapi->api = afb_api_new_api(api, apiname, NULL, 1, apipreinit, NULL); if (!sapi->api) { + free(sapi); afb_req_reply_f(request, NULL, "cant-create", "%m"); goto end; }