summaryrefslogtreecommitdiffstats
path: root/bindings/tutorials/tuto-3.cpp
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2019-04-11 13:09:56 +0200
committerJose Bollo <jose.bollo@iot.bzh>2019-04-12 10:55:54 +0200
commit6b2b09db8ee3cf88b09b59696d50b4fa2de79a72 (patch)
tree081c5ce2ad13790500dd14078d355796380539cf /bindings/tutorials/tuto-3.cpp
parent9cf1fcea338281f76eaac000930479b18dacef01 (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-3.cpp')
-rw-r--r--bindings/tutorials/tuto-3.cpp95
1 files changed, 95 insertions, 0 deletions
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);
+
+