diff options
author | José Bollo <jose.bollo@iot.bzh> | 2019-04-11 13:09:56 +0200 |
---|---|---|
committer | Jose Bollo <jose.bollo@iot.bzh> | 2019-04-12 10:55:54 +0200 |
commit | 6b2b09db8ee3cf88b09b59696d50b4fa2de79a72 (patch) | |
tree | 081c5ce2ad13790500dd14078d355796380539cf /bindings/tutorials/tuto-5.cpp | |
parent | 9cf1fcea338281f76eaac000930479b18dacef01 (diff) |
Reordering of sample and tutorial bindings
The main idea here is to install the sample and
tutorial bindings in specific directory.
This will at the end help to package parts
of the binder.
It also includes a simplification of CMakeLists
files.
Also fix an error in packaging rpm.
Bug-AGL: SPEC-2165
Change-Id: I494cc753796848cde849de1c3596893c78fa228f
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'bindings/tutorials/tuto-5.cpp')
-rw-r--r-- | bindings/tutorials/tuto-5.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
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; +} |