summaryrefslogtreecommitdiffstats
path: root/signal-composer-binding/clientApp.cpp
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2017-09-22 18:16:57 +0200
committerRomain Forlot <romain.forlot@iot.bzh>2017-12-14 11:00:25 +0100
commit51ee5299a7db41e52da2cf52dd9cd9c05b76740a (patch)
treeecdc922c7c7573ddb0dc091c9cbc3b111a0cc981 /signal-composer-binding/clientApp.cpp
parenta758f4a632adc7fff4769d97379264de6c68685d (diff)
Finalize subscription to be a simple relay for now
Adding new object holding signals subscribed and afb event that observes Signals using Reactive response observer design pattern Change-Id: I96647d36e0d27c25a399c1b3789621a803a845b6 Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'signal-composer-binding/clientApp.cpp')
-rw-r--r--signal-composer-binding/clientApp.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/signal-composer-binding/clientApp.cpp b/signal-composer-binding/clientApp.cpp
new file mode 100644
index 0000000..ce30163
--- /dev/null
+++ b/signal-composer-binding/clientApp.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015, 2016 "IoT.bzh"
+ * Author "Romain Forlot" <romain.forlot@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.
+*/
+
+#include "clientApp.hpp"
+
+clientAppCtx::clientAppCtx(const char* uuid)
+: uuid_(uuid)
+{}
+
+void clientAppCtx::update(Signal* sig)
+{
+ json_object* sigJ = sig->toJSON();
+ if(afb_event_push(event_, sigJ) == 0)
+ {sig->delObserver(this);}
+ return;
+}
+
+void clientAppCtx::appendSignals(std::vector<Signal*>& sigV)
+{
+ bool set = false;
+ // Clean up already subscribed signals to avoid duplicata
+ for (std::vector<Signal*>::const_iterator it = sigV.begin();
+ it != sigV.end(); ++it)
+ {
+ for (auto& ctxSig: subscribedSignals_)
+ {if(*it == ctxSig) {set = true;}}
+ if (set)
+ {
+ set = false;
+ sigV.erase(it);
+ continue;
+ }
+ Signal* sig = *it;
+ sig->addObserver(this);
+ }
+
+ subscribedSignals_.insert(subscribedSignals_.end(), sigV.begin(), sigV.end());
+}
+
+int clientAppCtx::makeSubscription(struct afb_req request)
+{
+ event_ = afb_event_is_valid(event_) ?
+ event_ : afb_daemon_make_event(uuid_.c_str());
+ return afb_req_subscribe(request, event_);
+}
+
+int clientAppCtx::makeUnsubscription(struct afb_req request)
+{
+ return afb_event_is_valid(event_) ?
+ afb_req_unsubscribe(request, event_) : -1;
+}