diff options
-rw-r--r-- | signal-composer-binding/clientApp.cpp | 36 | ||||
-rw-r--r-- | signal-composer-binding/clientApp.hpp | 1 | ||||
-rw-r--r-- | signal-composer-binding/signal-composer-binding.cpp | 25 |
3 files changed, 47 insertions, 15 deletions
diff --git a/signal-composer-binding/clientApp.cpp b/signal-composer-binding/clientApp.cpp index c325fcb..da4bb72 100644 --- a/signal-composer-binding/clientApp.cpp +++ b/signal-composer-binding/clientApp.cpp @@ -18,7 +18,8 @@ #include "clientApp.hpp" clientAppCtx::clientAppCtx(const char* uuid) -: uuid_(uuid) +: uuid_{uuid}, + event_{nullptr,nullptr} {} void clientAppCtx::update(Signal* sig) @@ -33,8 +34,8 @@ void clientAppCtx::appendSignals(std::vector<std::shared_ptr<Signal>>& sigV) { bool set = false; // Clean up already subscribed signals to avoid duplicata - for (std::vector<std::shared_ptr<Signal>>::const_iterator it = sigV.begin(); - it != sigV.end(); ++it) + for (std::vector<std::shared_ptr<Signal>>::const_iterator it = sigV.cbegin(); + it != sigV.cend(); ++it) { for (auto& ctxSig: subscribedSignals_) {if(*it == ctxSig) {set = true;}} @@ -51,6 +52,26 @@ void clientAppCtx::appendSignals(std::vector<std::shared_ptr<Signal>>& sigV) subscribedSignals_.insert(subscribedSignals_.end(), sigV.begin(), sigV.end()); } +void clientAppCtx::subtractSignals(std::vector<std::shared_ptr<Signal>>& sigV) +{ + // Clean up already subscribed signals to avoid duplicata + for (std::vector<std::shared_ptr<Signal>>::const_iterator it = sigV.cbegin(); + it != sigV.cend(); ++it) + { + for (auto ctxSig = subscribedSignals_.cbegin(); ctxSig != subscribedSignals_.cend();ctxSig++) + { + if(*it == *ctxSig) + { + subscribedSignals_.erase(ctxSig); + break; + } + } + std::shared_ptr<Signal> sig = *it; + sig->delObserver(this); + AFB_NOTICE("Signal %s delete from subscription", sig->id().c_str()); + } +} + int clientAppCtx::makeSubscription(struct afb_req request) { event_ = afb_event_is_valid(event_) ? @@ -60,6 +81,11 @@ int clientAppCtx::makeSubscription(struct afb_req request) int clientAppCtx::makeUnsubscription(struct afb_req request) { - return afb_event_is_valid(event_) ? - afb_req_unsubscribe(request, event_) : -1; + if(subscribedSignals_.empty()) + { + AFB_NOTICE("No more signals subscribed, releasing."); + return afb_event_is_valid(event_) ? + afb_req_unsubscribe(request, event_) : -1; + } + return 0; } diff --git a/signal-composer-binding/clientApp.hpp b/signal-composer-binding/clientApp.hpp index f5c913b..f91b299 100644 --- a/signal-composer-binding/clientApp.hpp +++ b/signal-composer-binding/clientApp.hpp @@ -29,6 +29,7 @@ public: void update(Signal* sig); void appendSignals(std::vector<std::shared_ptr<Signal>>& sigV); + void subtractSignals(std::vector<std::shared_ptr<Signal>>& sigV); int makeSubscription(struct afb_req request); int makeUnsubscription(struct afb_req request); }; diff --git a/signal-composer-binding/signal-composer-binding.cpp b/signal-composer-binding/signal-composer-binding.cpp index a155062..d9f1f01 100644 --- a/signal-composer-binding/signal-composer-binding.cpp +++ b/signal-composer-binding/signal-composer-binding.cpp @@ -85,11 +85,16 @@ static int one_subscribe_unsubscribe(struct afb_req request, int err = 0; std::vector<std::shared_ptr<Signal>> signals = Composer::instance().searchSignals(event); - cContext->appendSignals(signals); if(subscribe) - {err = cContext->makeSubscription(request);} + { + cContext->appendSignals(signals); + err = cContext->makeSubscription(request); + } else - {err = cContext->makeUnsubscription(request);} + { + cContext->subtractSignals(signals); + err = cContext->makeUnsubscription(request); + } return err; } @@ -100,20 +105,20 @@ static int subscribe_unsubscribe(struct afb_req request, clientAppCtx* cContext) { int rc = 0; - json_object *event = nullptr; - if (args == NULL || !json_object_object_get_ex(args, "event", &event)) + json_object *eventJ = nullptr; + if (args == NULL || !json_object_object_get_ex(args, "signal", &eventJ)) { rc = one_subscribe_unsubscribe(request, subscribe, "*", args, cContext); } - else if (json_object_get_type(event) == json_type_string) + else if (json_object_get_type(eventJ) == json_type_string) { - rc = one_subscribe_unsubscribe(request, subscribe, json_object_get_string(event), args, cContext); + rc = one_subscribe_unsubscribe(request, subscribe, json_object_get_string(eventJ), args, cContext); } - else if (json_object_get_type(event) == json_type_array) + else if (json_object_get_type(eventJ) == json_type_array) { - for (int i = 0 ; i < json_object_array_length(event) ; i++) + for (int i = 0 ; i < json_object_array_length(eventJ) ; i++) { - json_object *x = json_object_array_get_idx(event, i); + json_object *x = json_object_array_get_idx(eventJ, i); rc += one_subscribe_unsubscribe(request, subscribe, json_object_get_string(x), args, cContext); } } |