Subscription system improvements.
This commit is contained in:
parent
3ef82e0fce
commit
16ffd60e75
@ -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());
|
||||
|
1
Sihen.txt
Normal file
1
Sihen.txt
Normal file
@ -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:
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,33 +1,36 @@
|
||||
#ifndef __Subscription_h__
|
||||
#define __Subscription_h__
|
||||
|
||||
#include "TCPSession.h"
|
||||
#include "Command.h"
|
||||
#include "ZString.h"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
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<TCPSession *> subscribers;
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -14,6 +14,8 @@ namespace core {
|
||||
|
||||
public:
|
||||
SubscriptionManager();
|
||||
|
||||
int add(Subscription &subscription);
|
||||
|
||||
int removeSessionSubscriptions(TCPSession &session);
|
||||
|
||||
|
BIN
output/main
BIN
output/main
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user