107 lines
2.1 KiB
C++
107 lines
2.1 KiB
C++
|
#include "examples/hub/pubsub.h"
|
||
|
#include "examples/hub/codec.h"
|
||
|
|
||
|
using namespace muduo;
|
||
|
using namespace muduo::net;
|
||
|
using namespace pubsub;
|
||
|
|
||
|
PubSubClient::PubSubClient(EventLoop* loop,
|
||
|
const InetAddress& hubAddr,
|
||
|
const string& name)
|
||
|
: client_(loop, hubAddr, name)
|
||
|
{
|
||
|
// FIXME: dtor is not thread safe
|
||
|
client_.setConnectionCallback(
|
||
|
std::bind(&PubSubClient::onConnection, this, _1));
|
||
|
client_.setMessageCallback(
|
||
|
std::bind(&PubSubClient::onMessage, this, _1, _2, _3));
|
||
|
}
|
||
|
|
||
|
void PubSubClient::start()
|
||
|
{
|
||
|
client_.connect();
|
||
|
}
|
||
|
|
||
|
void PubSubClient::stop()
|
||
|
{
|
||
|
client_.disconnect();
|
||
|
}
|
||
|
|
||
|
bool PubSubClient::connected() const
|
||
|
{
|
||
|
return conn_ && conn_->connected();
|
||
|
}
|
||
|
|
||
|
bool PubSubClient::subscribe(const string& topic, const SubscribeCallback& cb)
|
||
|
{
|
||
|
string message = "sub " + topic + "\r\n";
|
||
|
subscribeCallback_ = cb;
|
||
|
return send(message);
|
||
|
}
|
||
|
|
||
|
void PubSubClient::unsubscribe(const string& topic)
|
||
|
{
|
||
|
string message = "unsub " + topic + "\r\n";
|
||
|
send(message);
|
||
|
}
|
||
|
|
||
|
|
||
|
bool PubSubClient::publish(const string& topic, const string& content)
|
||
|
{
|
||
|
string message = "pub " + topic + "\r\n" + content + "\r\n";
|
||
|
return send(message);
|
||
|
}
|
||
|
|
||
|
void PubSubClient::onConnection(const TcpConnectionPtr& conn)
|
||
|
{
|
||
|
if (conn->connected())
|
||
|
{
|
||
|
conn_ = conn;
|
||
|
// FIXME: re-sub
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
conn_.reset();
|
||
|
}
|
||
|
if (connectionCallback_)
|
||
|
{
|
||
|
connectionCallback_(this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void PubSubClient::onMessage(const TcpConnectionPtr& conn,
|
||
|
Buffer* buf,
|
||
|
Timestamp receiveTime)
|
||
|
{
|
||
|
ParseResult result = kSuccess;
|
||
|
while (result == kSuccess)
|
||
|
{
|
||
|
string cmd;
|
||
|
string topic;
|
||
|
string content;
|
||
|
result = parseMessage(buf, &cmd, &topic, &content);
|
||
|
if (result == kSuccess)
|
||
|
{
|
||
|
if (cmd == "pub" && subscribeCallback_)
|
||
|
{
|
||
|
subscribeCallback_(topic, content, receiveTime);
|
||
|
}
|
||
|
}
|
||
|
else if (result == kError)
|
||
|
{
|
||
|
conn->shutdown();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool PubSubClient::send(const string& message)
|
||
|
{
|
||
|
bool succeed = false;
|
||
|
if (conn_ && conn_->connected())
|
||
|
{
|
||
|
conn_->send(message);
|
||
|
succeed = true;
|
||
|
}
|
||
|
return succeed;
|
||
|
}
|