#include "SubscriptionManager.h" #include "Log.h" namespace core { SubscriptionManager::SubscriptionManager() {} int SubscriptionManager::removeSessionSubscriptions(TCPSession &session) { int count = 0; for(auto subscription = subscriptions.begin(); subscription < subscriptions.end(); ++subscription) { count += (*subscription)->unsubscribe(session); } coreutils::Log(coreutils::LOG_DEBUG_2) << "Removed session from " << count << " subscriptions."; return count; } int SubscriptionManager::processCommand(coreutils::ZString &request, TCPSession &session) { if(request[0].equals("publish")) { subscriptions.push_back(new Subscription(request[1].str(), session)); return 1; } else if(request[0].equals("catalog")) { session.out << ":catalog:"; for(auto subscription = subscriptions.begin(); subscription < subscriptions.end(); ++subscription) { session.out << (*subscription)->id << "|"; (*subscription)->processCommand(request, session); session.out << (";"); } session.out << std::endl; return 1; } for(auto subscription = subscriptions.begin(); subscription < subscriptions.end(); ++subscription) { if(request[1].equals((*subscription)->id)) { if(request[0].equals("unpublish")) { subscriptions.erase(subscription); } else if(request[0].equals("subscribe")) { (*subscription)->subscribe(session); } else if(request[0].equals("unsubscribe")) { (*subscription)->unsubscribe(session); } else if(request[0].equals("event")) { if((*subscription)->owner == &session) { std::stringstream out; (*subscription)->process(request, out); (*subscription)->event(out); } else return 0; } return 1; } } return 0; } }