diff options
Diffstat (limited to 'bindings/tutorials')
-rw-r--r-- | bindings/tutorials/CMakeLists.txt | 37 | ||||
-rw-r--r-- | bindings/tutorials/export.map | 1 | ||||
-rw-r--r-- | bindings/tutorials/tuto-1.c | 19 | ||||
-rw-r--r-- | bindings/tutorials/tuto-2.c | 100 | ||||
-rw-r--r-- | bindings/tutorials/tuto-3.cpp | 95 | ||||
-rw-r--r-- | bindings/tutorials/tuto-4.c | 29 | ||||
-rw-r--r-- | bindings/tutorials/tuto-5.cpp | 93 | ||||
-rw-r--r-- | bindings/tutorials/tuto-app1.c | 30 |
8 files changed, 404 insertions, 0 deletions
diff --git a/bindings/tutorials/CMakeLists.txt b/bindings/tutorials/CMakeLists.txt new file mode 100644 index 00000000..e071d7a9 --- /dev/null +++ b/bindings/tutorials/CMakeLists.txt @@ -0,0 +1,37 @@ +########################################################################### +# Copyright (C) 2015-2019 "IoT.bzh" +# +# author: José Bollo <jose.bollo@iot.bzh> +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +########################################################################### + + +MACRO(tuto num ext) + ADD_LIBRARY(tuto-${num} MODULE tuto-${num}.${ext}) + SET_TARGET_PROPERTIES(tuto-${num} PROPERTIES + PREFIX "" + LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/export.map" + ) + TARGET_LINK_LIBRARIES(tuto-${num} ${json-c_LDFLAGS}) + install(TARGETS tuto-${num} LIBRARY DESTINATION ${install_datadir}/bindings/tutorials) +ENDMACRO(tuto) + + +tuto(1 c) +tuto(2 c) +tuto(3 cpp) +tuto(4 c) +tuto(5 cpp) + +tuto(app1 c) diff --git a/bindings/tutorials/export.map b/bindings/tutorials/export.map new file mode 100644 index 00000000..ee2f4133 --- /dev/null +++ b/bindings/tutorials/export.map @@ -0,0 +1 @@ +{ global: afbBindingV*; local: *; }; diff --git a/bindings/tutorials/tuto-1.c b/bindings/tutorials/tuto-1.c new file mode 100644 index 00000000..1f58be6c --- /dev/null +++ b/bindings/tutorials/tuto-1.c @@ -0,0 +1,19 @@ +#define AFB_BINDING_VERSION 3 +#include <afb/afb-binding.h> + +void hello(afb_req_t req) +{ + AFB_REQ_DEBUG(req, "hello world"); + afb_req_reply(req, NULL, NULL, "hello world"); +} + +const afb_verb_t verbs[] = { + { .verb="hello", .callback=hello }, + { .verb=NULL } +}; + +const afb_binding_t afbBindingExport = { + .api = "tuto-1", + .verbs = verbs +}; + diff --git a/bindings/tutorials/tuto-2.c b/bindings/tutorials/tuto-2.c new file mode 100644 index 00000000..10797081 --- /dev/null +++ b/bindings/tutorials/tuto-2.c @@ -0,0 +1,100 @@ +#include <string.h> +#include <json-c/json.h> + +#define AFB_BINDING_VERSION 3 +#include <afb/afb-binding.h> + +afb_event_t event_login, event_logout; + +void login(afb_req_t req) +{ + json_object *args, *user, *passwd; + char *usr; + + args = afb_req_json(req); + if (!json_object_object_get_ex(args, "user", &user) + || !json_object_object_get_ex(args, "password", &passwd)) { + AFB_REQ_ERROR(req, "login, bad request: %s", json_object_get_string(args)); + afb_req_reply(req, NULL, "bad-request", NULL); + } else if (afb_req_context_get(req)) { + AFB_REQ_ERROR(req, "login, bad state, logout first"); + afb_req_reply(req, NULL, "bad-state", NULL); + } else if (strcmp(json_object_get_string(passwd), "please")) { + AFB_REQ_ERROR(req, "login, unauthorized: %s", json_object_get_string(args)); + afb_req_reply(req, NULL, "unauthorized", NULL); + } else { + usr = strdup(json_object_get_string(user)); + AFB_REQ_NOTICE(req, "login user: %s", usr); + afb_req_session_set_LOA(req, 1); + afb_req_context_set(req, usr, free); + afb_req_reply(req, NULL, NULL, NULL); + afb_event_push(event_login, json_object_new_string(usr)); + } +} + +void action(afb_req_t req) +{ + json_object *args, *val; + char *usr; + + args = afb_req_json(req); + usr = afb_req_context_get(req); + AFB_REQ_NOTICE(req, "action for user %s: %s", usr, json_object_get_string(args)); + if (json_object_object_get_ex(args, "subscribe", &val)) { + if (json_object_get_boolean(val)) { + AFB_REQ_NOTICE(req, "user %s subscribes to events", usr); + afb_req_subscribe(req, event_login); + afb_req_subscribe(req, event_logout); + } else { + AFB_REQ_NOTICE(req, "user %s unsubscribes to events", usr); + afb_req_unsubscribe(req, event_login); + afb_req_unsubscribe(req, event_logout); + } + } + afb_req_reply(req, json_object_get(args), NULL, NULL); +} + +void logout(afb_req_t req) +{ + char *usr; + + usr = afb_req_context_get(req); + AFB_REQ_NOTICE(req, "login user %s out", usr); + afb_event_push(event_logout, json_object_new_string(usr)); + afb_req_session_set_LOA(req, 0); + afb_req_context_clear(req); + afb_req_reply(req, NULL, NULL, NULL); +} + +int preinit(afb_api_t api) +{ + AFB_API_NOTICE(api, "preinit"); + return 0; +} + +int init(afb_api_t api) +{ + AFB_API_NOTICE(api, "init"); + event_login = afb_api_make_event(api, "login"); + event_logout = afb_api_make_event(api, "logout"); + if (afb_event_is_valid(event_login) && afb_event_is_valid(event_logout)) + return 0; + AFB_API_ERROR(api, "Can't create events"); + return -1; +} + +const afb_verb_t verbs[] = { + { .verb="login", .callback=login }, + { .verb="action", .callback=action, .session=AFB_SESSION_LOA_1 }, + { .verb="logout", .callback=logout, .session=AFB_SESSION_LOA_1 }, + { .verb=NULL } +}; + +const afb_binding_t afbBindingExport = { + .api = "tuto-2", + .specification = NULL, + .verbs = verbs, + .preinit = preinit, + .init = init, + .noconcurrency = 0 +};
\ No newline at end of file diff --git a/bindings/tutorials/tuto-3.cpp b/bindings/tutorials/tuto-3.cpp new file mode 100644 index 00000000..8ad69ef3 --- /dev/null +++ b/bindings/tutorials/tuto-3.cpp @@ -0,0 +1,95 @@ +#include <string.h> +#include <json-c/json.h> + +#define AFB_BINDING_VERSION 3 +#include <afb/afb-binding> + +afb::event event_login, event_logout; + +void login(afb::req req) +{ + json_object *args, *user, *passwd; + char *usr; + + args = req.json(); + if (!json_object_object_get_ex(args, "user", &user) + || !json_object_object_get_ex(args, "password", &passwd)) { + AFB_REQ_ERROR(req, "login, bad request: %s", json_object_get_string(args)); + req.fail("bad-request"); + } else if (afb_req_context_get(req)) { + AFB_REQ_ERROR(req, "login, bad state, logout first"); + req.fail("bad-state"); + } else if (strcmp(json_object_get_string(passwd), "please")) { + AFB_REQ_ERROR(req, "login, unauthorized: %s", json_object_get_string(args)); + req.fail("unauthorized"); + } else { + usr = strdup(json_object_get_string(user)); + AFB_REQ_NOTICE(req, "login user: %s", usr); + req.session_set_LOA(1); +// req.context(1, nullptr, free, usr); + req.success(); + event_login.push(json_object_new_string(usr)); + } +} + +void action(afb::req req) +{ + json_object *args, *val; + char *usr; + + args = req.json(); +// usr = (char*)req.context_get(); +usr = nullptr; + AFB_REQ_NOTICE(req, "action for user %s: %s", usr, json_object_get_string(args)); + if (json_object_object_get_ex(args, "subscribe", &val)) { + if (json_object_get_boolean(val)) { + AFB_REQ_NOTICE(req, "user %s subscribes to events", usr); + req.subscribe(event_login); + req.subscribe(event_logout); + } else { + AFB_REQ_NOTICE(req, "user %s unsubscribes to events", usr); + req.unsubscribe(event_login); + req.unsubscribe(event_logout); + } + } + req.success(json_object_get(args)); +} + +void logout(afb::req req) +{ + char *usr; + +// usr = (char*)req.context_get(); +usr = nullptr; + AFB_REQ_NOTICE(req, "login user %s out", usr); + event_logout.push(json_object_new_string(usr)); + req.session_set_LOA(0); +// req.context_clear(); + req.success(); +} + +int init( +#if AFB_BINDING_VERSION >= 3 + afb_api_t api +#endif +) +{ + AFB_NOTICE("init"); + event_login = afb_daemon_make_event("login"); + event_logout = afb_daemon_make_event("logout"); + if (afb_event_is_valid(event_login) && afb_event_is_valid(event_logout)) + return 0; + AFB_ERROR("Can't create events"); + return -1; +} + +const afb_verb_t verbs[] = { + afb::verb("login", login, "log in the system"), + afb::verb("action", action, "perform an action", AFB_SESSION_LOA_1), + afb::verb("logout", logout, "log out the system", AFB_SESSION_LOA_1), + afb::verbend() +}; + +const afb_binding_t afbBindingExport = afb::binding("tuto-3", verbs, "third tutorial: C++", init); + + diff --git a/bindings/tutorials/tuto-4.c b/bindings/tutorials/tuto-4.c new file mode 100644 index 00000000..cb909fd0 --- /dev/null +++ b/bindings/tutorials/tuto-4.c @@ -0,0 +1,29 @@ +#define AFB_BINDING_VERSION 3 +#include <afb/afb-binding.h> + +void hello(afb_req_t req) +{ + AFB_REQ_DEBUG(req, "hello world"); + afb_req_reply(req, NULL, NULL, "hello world"); +} + +const afb_verb_t verbs[] = { + { .verb="hello", .callback=hello }, + { .verb=NULL } +}; + + +static int init(afb_api_t api) +{ + int rc = afb_api_require_api(api, "hello", 1); + if (!rc) + rc = afb_api_call_sync(api, "hello", "ping", NULL, NULL, NULL, NULL); + return rc; +} + +const afb_binding_t afbBindingExport = { + .api = "tuto-4", + .verbs = verbs, + .init = init +}; + diff --git a/bindings/tutorials/tuto-5.cpp b/bindings/tutorials/tuto-5.cpp new file mode 100644 index 00000000..458ae7b5 --- /dev/null +++ b/bindings/tutorials/tuto-5.cpp @@ -0,0 +1,93 @@ +#include <afb/c++/binding> +#include <json-c/json.h> +#include <string.h> + +class tuto5 + : public afb::base_api_t<tuto5> +{ +private: + afb::event event_login; + afb::event event_logout; + +public: + void login(afb::req req) + { + json_object *user, *passwd; + + json_object* args = req.json(); + if (!json_object_object_get_ex(args, "user", &user) + || !json_object_object_get_ex(args, "password", &passwd)) { + AFB_REQ_ERROR(req, "login, bad request: %s", json_object_get_string(args)); + req.fail("bad-request"); + } else if (afb_req_context_get(req)) { + AFB_REQ_ERROR(req, "login, bad state, logout first"); + req.fail("bad-state"); + } else if (std::string(json_object_get_string(passwd)) != std::string("please")) { + AFB_REQ_ERROR(req, "login, unauthorized: %s", json_object_get_string(args)); + req.fail("unauthorized"); + } else { + char* username = strdup(json_object_get_string(user)); + AFB_REQ_NOTICE(req, "login user: %s", username); + req.session_set_LOA(1); + afb_req_context_set(req, username, free); + req.success(); + event_login.push(json_object_new_string(username)); + } + } + + void action(afb::req req) const + { + json_object* val; + json_object* args = req.json(); + char* username = reinterpret_cast<char*>(afb_req_context_get(req)); + AFB_REQ_NOTICE(req, "action for user %s: %s", username, json_object_get_string(args)); + if (json_object_object_get_ex(args, "subscribe", &val)) { + if (json_object_get_boolean(val)) { + AFB_REQ_NOTICE(req, "user %s subscribes to events", username); + req.subscribe(event_login); + req.subscribe(event_logout); + } else { + AFB_REQ_NOTICE(req, "user %s unsubscribes to events", username); + req.unsubscribe(event_login); + req.unsubscribe(event_logout); + } + } + req.success(json_object_get(args)); + } + + void logout(afb::req req) + { + char* username = reinterpret_cast<char*>(afb_req_context_get(req)); + AFB_REQ_NOTICE(req, "login user %s out", username); + event_logout.push(json_object_new_string(username)); + req.session_set_LOA(0); + afb_req_context_clear(req); + req.success(); + } + + int preinit(afb_api_t h) override + { + return !( + (add_verb<&tuto5::login>("login", "log in the system") == 0) && + (add_verb<&tuto5::action>("action", "perform an action", nullptr, nullptr, AFB_SESSION_LOA_1) == 0) && + (add_verb<&tuto5::logout>("logout", "log out the system", nullptr, nullptr, AFB_SESSION_LOA_1) == 0) + ); + } + + int init() override + { + AFB_API_NOTICE(api_, "init"); + event_login = make_event("login"); + event_logout = make_event("logout"); + if (event_login.is_valid() && event_logout.is_valid()) + return 0; + AFB_API_ERROR(api_, "Can't create events"); + return -1; + } +}; + +int afbBindingEntry(afb_api_t h) +{ + afb::new_api<tuto5>(h, "tuto-5", "fifth tutorial: C++"); + return 0; +} diff --git a/bindings/tutorials/tuto-app1.c b/bindings/tutorials/tuto-app1.c new file mode 100644 index 00000000..93747cdd --- /dev/null +++ b/bindings/tutorials/tuto-app1.c @@ -0,0 +1,30 @@ +#include <stdio.h> + +#define AFB_BINDING_VERSION 3 +#include <afb/afb-binding.h> + +static int appmain(void *arg) +{ + const char *name = arg; + char buffer[50]; + + AFB_API_NOTICE(afbBindingV3root, "Entering Application main"); + printf("Hello, I'm %s!\n", name); + printf("What's your name? "); + scanf("%s", buffer); + printf("Hi %s! Nice to meet you. OOOOPS I'm late bye bye\n", buffer); + return 0; +} + +static void application(int signum, void *arg) +{ + if (signum) + exit(127); + exit(appmain(arg)); +} + +int afbBindingV3entry(struct afb_api_x3 *rootapi) +{ + return afb_api_queue_job(rootapi, application, "BOB", NULL, 0); +} + |