#include <chrono>
#include <ctime>
#include <iostream>
#include <boost/asio/steady_timer.hpp>
const std::string realm = "cppwamp.demo.time";
const std::string address = "localhost";
const short port = 54321u;
{
template <typename TConverter>
void convert(TConverter& conv, std::tm& t)
{
conv ("sec", t.tm_sec)
("min", t.tm_min)
("hour", t.tm_hour)
("mday", t.tm_mday)
("mon", t.tm_mon)
("year", t.tm_year)
("wday", t.tm_wday)
("yday", t.tm_yday)
("isdst", t.tm_isdst);
}
}
class TimeService : public std::enable_shared_from_this<TimeService>
{
public:
{
return std::shared_ptr<TimeService>(new TimeService(ioctx, session));
}
void start()
{
auto self = shared_from_this();
{
join();
});
}
private:
: session_(session),
timer_(ioctx)
{}
static std::tm getTime()
{
auto t = std::time(nullptr);
return *std::localtime(&t);
}
void join()
{
auto self = shared_from_this();
session_->join(
{
enroll();
});
}
void enroll()
{
auto self = shared_from_this();
session_->enroll(
wamp::simpleRpc<std::tm>(&getTime),
{
deadline_ = std::chrono::steady_clock::now();
kickTimer();
});
}
void kickTimer()
{
deadline_ += std::chrono::seconds(1);
timer_.expires_at(deadline_);
auto self = shared_from_this();
timer_.async_wait([this, self](boost::system::error_code ec)
{
if (ec)
throw boost::system::system_error(ec);
publish();
kickTimer();
});
}
void publish()
{
auto t = std::time(nullptr);
const std::tm* local = std::localtime(&t);
session_->publish(
wamp::Pub(
"time_tick").withArgs(*local));
std::cout << "Tick: " << std::asctime(local) << "\n";
}
boost::asio::steady_timer timer_;
std::chrono::steady_clock::time_point deadline_;
};
int main()
{
auto tcp = connector<Json>(ioctx,
TcpHost(address, port));
auto service = TimeService::create(ioctx, session);
service->start();
ioctx.run();
return 0;
}