23 #include "openprs_comm.h" 25 #include "openprs_server_proxy.h" 26 #include <core/exception.h> 27 #include <core/exceptions/system.h> 29 #include <opaque-pub.h> 36 void send_message_string_socket(
int socket, Symbol
rec, PString message );
37 void broadcast_message_string_socket(
int socket, PString message );
38 void multicast_message_string_socket(
int socket,
unsigned int nb_recs, Symbol *recs, PString message );
66 : name_(local_name), server_proxy_(server_proxy), logger_(logger),
67 io_service_work_(io_service_), sd_mp_socket_(io_service_)
71 mp_socket_ = external_register_to_the_mp_host_prot(local_name, hostname, port, STRINGS_PT);
72 if (mp_socket_ == -1) {
73 throw Exception(
"Failed to connect to OpenPRS as '%s'", local_name);
75 io_service_thread_ = std::thread([
this]() { this->io_service_.run(); });
76 sd_mp_socket_.assign(dup(mp_socket_));
85 io_service_thread_.join();
86 if (mp_socket_ >= 0) {
99 send_message_string_socket(mp_socket_, recipient, (
char *)message);
109 broadcast_message_string_socket(mp_socket_, (
char *)message);
120 multicast_message_string_socket(mp_socket_, recipients.size(), &(recipients[0]), (
char *)message);
131 send_message_string_socket(mp_socket_, recipient.c_str(), (
char *)message.c_str());
141 broadcast_message_string_socket(mp_socket_, (
char *)message.c_str());
152 std::vector<const char *> recs;
153 recs.resize(recipients.size());
154 for (
size_t i = 0; i < recipients.size(); ++i) {
155 recs[i] = recipients[i].c_str();
157 multicast_message_string_socket(mp_socket_, recs.size(), &(recs[0]), (
char *)message.c_str());
169 va_start(arg, format);
171 if (vasprintf(&msg, format, arg) == -1) {
175 send_message_string_socket(mp_socket_, recipient.c_str(), msg);
187 va_start(arg, format);
189 if (vasprintf(&msg, format, arg) == -1) {
193 broadcast_message_string_socket(mp_socket_, msg);
205 std::vector<const char *> recs;
206 recs.resize(recipients.size());
207 for (
size_t i = 0; i < recipients.size(); ++i) {
208 recs[i] = recipients[i].c_str();
211 va_start(arg, format);
213 if (vasprintf(&msg, format, arg) == -1) {
217 multicast_message_string_socket(mp_socket_, recs.size(), &(recs[0]), msg);
257 va_start(arg, format);
264 OpenPRSComm::start_recv()
266 sd_mp_socket_.async_read_some(boost::asio::null_buffers(),
267 boost::bind(&OpenPRSComm::handle_recv,
this,
268 boost::asio::placeholders::error));
273 OpenPRSComm::handle_recv(
const boost::system::error_code &err)
277 std::string sender = read_string_from_socket(sd_mp_socket_);
278 std::string message = read_string_from_socket(sd_mp_socket_);
280 sig_rcvd_(sender, message);
286 }
else if (logger_) {
287 logger_->
log_warn(name_.c_str(),
"Failed to receive message: %s", err.message().c_str());
294 OpenPRSComm::read_string_from_socket(boost::asio::posix::stream_descriptor &socket)
297 boost::system::error_code ec;
298 boost::asio::read(socket, boost::asio::buffer(&s_size,
sizeof(s_size)), ec);
300 throw Exception(
"Failed to read string size from socket: %s", ec.message().c_str());
302 s_size = ntohl(s_size);
305 boost::asio::read(socket, boost::asio::buffer(s, s_size), ec);
307 throw Exception(
"Failed to read string content from socket: %s", ec.message().c_str());
virtual ~OpenPRSComm()
Destructor.
Fawkes library namespace.
void multicast_message_f(const std::vector< std::string > &recipients, const char *format,...)
Send a message to multiple OpenPRS kernel.
void transmit_command(const char *recipient, const char *message)
Transmit a command to an OpenPRS kernel.
void broadcast_message(const char *message)
Send a message to all OpenPRS kernels.
Base class for exceptions in Fawkes.
void send_message_f(const std::string &recipient, const char *format,...)
Send a formatted message to an OpenPRS kernel.
virtual const char * what_no_backtrace() const
Get primary string (does not implicitly print the back trace).
virtual void log_warn(const char *component, const char *format,...)=0
Log warning message.
void broadcast_message_f(const char *format,...)
Send a formatted message to all OpenPRS kernels.
void transmit_command_f(const std::string &recipient, const char *format,...)
Transmit a command to an OpenPRS kernel.
void multicast_message(std::vector< const char *> &recipients, const char *message)
Send a message to multiple OpenPRS kernel.
void send_message(const char *recipient, const char *message)
Send a message to an OpenPRS kernel.
OpenPRSComm(const char *local_name, const char *hostname, unsigned short port, OpenPRSServerProxy *server_proxy, Logger *logger=NULL)
Constructor.
System ran out of memory and desired operation could not be fulfilled.