74 lines
2.2 KiB
C++
74 lines
2.2 KiB
C++
#include "Subscription.h"
|
|
#include "Log.h"
|
|
#include "TCPSession.h"
|
|
#include <algorithm>
|
|
|
|
namespace core {
|
|
|
|
Subscription::Subscription(std::string id, std::string mode)
|
|
: id(id), mode(mode), owner(NULL), handler(NULL) {}
|
|
|
|
Subscription::Subscription(std::string id, TCPSession &session, std::string mode)
|
|
: id(id), mode(mode), owner(&session), handler(NULL) {}
|
|
|
|
Subscription::Subscription(std::string id, TCPSession &session, std::string mode, SubscriptionHandler *handler)
|
|
: id(id), mode(mode), owner(&session), handler(handler) {
|
|
// coreutils::Log(coreutils::LOG_DEBUG_3) << "Subscription '" << id << "' with handler '" << handler->name << "'";
|
|
}
|
|
|
|
Subscription::~Subscription() {
|
|
std::stringstream out;
|
|
out << "cancel:" << id << std::endl;
|
|
for (auto subscriber : subscribers) {
|
|
subscriber->write(out.str());
|
|
}
|
|
}
|
|
|
|
int Subscription::subscribe(TCPSession &session) {
|
|
if (handler)
|
|
handler->onSubscribe(session, this);
|
|
else
|
|
onSubscribe(session, this);
|
|
|
|
subscribers.push_back(&session);
|
|
return 1;
|
|
}
|
|
|
|
int Subscription::unsubscribe(TCPSession &session) {
|
|
for (auto subscriber = subscribers.begin(); subscriber < subscribers.end(); ++subscriber) {
|
|
if (*subscriber == &session) {
|
|
subscribers.erase(subscriber++);
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int Subscription::process(coreutils::ZString &request, std::stringstream &out, TCPSession &session) {
|
|
if (handler)
|
|
handler->process(request, out, session, this);
|
|
else
|
|
out << "event:" << request[1] << ":" << request[2] << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
int Subscription::event(std::stringstream &out) {
|
|
for (auto subscriber = subscribers.begin(); subscriber < subscribers.end(); ++subscriber)
|
|
(*subscriber)->write(out.str());
|
|
return 1;
|
|
}
|
|
|
|
bool Subscription::ifSubscriber(TCPSession &session) {
|
|
return (std::find(subscribers.begin(), subscribers.end(), &session) != subscribers.end());
|
|
}
|
|
|
|
int Subscription::onSubscribe(TCPSession &session, Subscription *subscription) {
|
|
return 0;
|
|
}
|
|
|
|
bool Subscription::subInvite(TCPSession &session) {
|
|
return 0;
|
|
}
|
|
|
|
}
|