diff --git a/CommandList.cpp b/CommandList.cpp index b3ab300..df97968 100644 --- a/CommandList.cpp +++ b/CommandList.cpp @@ -17,7 +17,7 @@ namespace core { else { if(request.equals("")) return false; - request.split(delimiter, 2); + request.split(delimiter, 10); request.reset(); try { auto command = commands.at(request[0].str()); diff --git a/Sihen.txt b/Sihen.txt new file mode 100644 index 0000000..3eaf00b --- /dev/null +++ b/Sihen.txt @@ -0,0 +1 @@ +0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: \ No newline at end of file diff --git a/Subscription.cpp b/Subscription.cpp index 94231cd..ba16cd3 100644 --- a/Subscription.cpp +++ b/Subscription.cpp @@ -1,8 +1,11 @@ #include "Subscription.h" +#include "TCPSession.h" namespace core { - Subscription::Subscription(std::string id, TCPSession &session) : id(id), owner(session) {} + Subscription::Subscription(std::string id) : id(id), owner(NULL) {} + + Subscription::Subscription(std::string id, TCPSession &session) : id(id), owner(&session) {} Subscription::~Subscription() { std::stringstream out; @@ -13,8 +16,9 @@ namespace core { } int Subscription::subscribe(TCPSession &session) { + onSubscribe(session); subscribers.push_back(&session); - return 1; + return 1; } int Subscription::unsubscribe(TCPSession &session) { @@ -38,9 +42,8 @@ namespace core { return 1; } - int Subscription::processCommand(coreutils::ZString &request, TCPSession &session) { - session.out << "Generic subscription passthrough"; - return 1; + int Subscription::onSubscribe(TCPSession &session) { + return 0; } - + } diff --git a/Subscription.h b/Subscription.h index 93e307f..4b11c76 100644 --- a/Subscription.h +++ b/Subscription.h @@ -1,33 +1,36 @@ #ifndef __Subscription_h__ #define __Subscription_h__ -#include "TCPSession.h" -#include "Command.h" #include "ZString.h" #include #include namespace core { - class Subscription : public Command { + class TCPSession; - public: + class Subscription { + + public: + Subscription(std::string id); Subscription(std::string id, TCPSession &session); - ~Subscription(); + virtual ~Subscription(); int subscribe(TCPSession &session); int unsubscribe(TCPSession &session); + virtual int process(coreutils::ZString &request, std::stringstream &out); + virtual int onSubscribe(TCPSession &session); int event(std::stringstream &out); - int processCommand(coreutils::ZString &request, TCPSession &session) override; + // int processCommand(coreutils::ZString &request, TCPSession &session) override; std::string id; - TCPSession &owner; + TCPSession *owner; std::vector subscribers; - + }; } diff --git a/SubscriptionManager.cpp b/SubscriptionManager.cpp index c93c530..93455b6 100644 --- a/SubscriptionManager.cpp +++ b/SubscriptionManager.cpp @@ -4,13 +4,18 @@ namespace core { SubscriptionManager::SubscriptionManager() {} - + + int SubscriptionManager::add(Subscription &subscription) { + subscriptions.insert(std::make_pair(subscription.id, &subscription)); + return 1; + } + int SubscriptionManager::removeSessionSubscriptions(TCPSession &session) { int countSubscribed = 0; int countPublished = 0; for(auto subscription = subscriptions.begin(); subscription != subscriptions.end();) { countSubscribed += (*subscription).second->unsubscribe(session); - if(&(*subscription).second->owner == &session) { + if((*subscription).second->owner == &session) { subscription = subscriptions.erase(subscription); delete (*subscription).second; ++countPublished; @@ -24,19 +29,15 @@ namespace core { } int SubscriptionManager::processCommand(coreutils::ZString &request, TCPSession &session) { - - coreutils::Log(coreutils::LOG_DEBUG_2) << "Processing subscription request: " << request << "."; - if(request[0].equals("publish")) { Subscription *newSubscription = new Subscription(request[1].str(), session); subscriptions.insert(std::make_pair(request[1].str(), newSubscription)); - return 1; } else if(request[0].equals("catalog")) { session.out << ":catalog:"; for(auto const& [key, subscription] : subscriptions) { session.out << subscription->id << "|"; - subscription->processCommand(request, session); +// subscription->processCommand(request, session); session.out << (";"); } session.out << std::endl; @@ -53,7 +54,7 @@ namespace core { } else if(request[0].equals("unsubscribe")) { subscription->unsubscribe(session); } else if(request[0].equals("event")) { - if(&subscription->owner == &session) { + if(subscription->owner == &session) { std::stringstream out; subscription->process(request, out); subscription->event(out); diff --git a/SubscriptionManager.h b/SubscriptionManager.h index 0f32db9..e0d19a3 100644 --- a/SubscriptionManager.h +++ b/SubscriptionManager.h @@ -14,6 +14,8 @@ namespace core { public: SubscriptionManager(); + + int add(Subscription &subscription); int removeSessionSubscriptions(TCPSession &session); diff --git a/output/main b/output/main index 99f2acb..b3e266c 100755 Binary files a/output/main and b/output/main differ