#include "abstractnode.h" #include "abstractnodeinfo.h" #include "websocketcontroller.h" #include namespace NP { WebSocketController::WebSocketController(AbstractNode *node) { _node = node; assert(_node); } bool WebSocketController::subscribe(SP subscriber, const DbAddress &item) { _subscribs[item].insert(subscriber); _items[subscriber].insert(item); return true; } void WebSocketController::unsubscribe(SP subscriber, const DbAddress& item) { _subscribs[item].remove(subscriber); _items[subscriber].remove(item); } const QSet &WebSocketController::list( SP node) { return _items[node]; } void WebSocketController::handleItemChanged(const WP &item) { auto obj = item.toStrongRef().dynamicCast(); if (obj.isNull() || !obj->isValid()) return; foreachSubscribers(item, _subscribs.value(obj->dbAddress())); } void WebSocketController::foreachSubscribers(const WP &item, const QSet> &subscribersList) { auto ref = item.toStrongRef().dynamicCast(); if (ref.isNull()) return; for (auto &&subscriber : subscribersList) { if (!subscriber.isNull() && subscriber->isValid()) { if (!_node->sendData(item, subscriber->id())) { QuasarAppUtils::Params::log("Send update failed for " + subscriber->id().toString(), QuasarAppUtils::Warning); } } else { unsubscribe(subscriber, ref->dbAddress()); } } } }