2024-03-08 14:03:37 +08:00

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;
}