/*
Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012
Her Majesty the Queen in Right of Canada (Communications Research
Center Canada)
Copyright (C) 2023
Matthias P. Braendli, matthias.braendli@mpb.li
http://www.opendigitalradio.org
*/
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include "Events.h"
EventSender events;
EventSender::EventSender() :
m_zmq_context(1),
m_socket(m_zmq_context, zmq::socket_type::pub)
{
int linger = 2000;
m_socket.setsockopt(ZMQ_LINGER, &linger, sizeof(linger));
}
EventSender::~EventSender()
{ }
void EventSender::bind(const std::string& bind_endpoint)
{
try {
m_socket.bind(bind_endpoint);
m_socket_valid = true;
}
catch (const zmq::error_t& err) {
fprintf(stderr, "Cannot bind event socket: %s", err.what());
}
}
void EventSender::send(const std::string& event_name, const json::map_t& detail)
{
if (not m_socket_valid) {
return;
}
zmq::message_t zmsg1(event_name.data(), event_name.size());
const auto detail_json = json::map_to_json(detail);
zmq::message_t zmsg2(detail_json.data(), detail_json.size());
try {
m_socket.send(zmsg1, zmq::send_flags::sndmore);
m_socket.send(zmsg2, zmq::send_flags::none);
}
catch (const zmq::error_t& err) {
fprintf(stderr, "Cannot send event %s: %s", event_name.c_str(), err.what());
}
}
void LogToEventSender::log(log_level_t level, const std::string& message)
{
std::string event_name;
if (level == log_level_t::warn) { event_name = "warn"; }
else if (level == log_level_t::error) { event_name = "error"; }
else if (level == log_level_t::alert) { event_name = "alert"; }
else if (level == log_level_t::emerg) { event_name = "emerg"; }
if (not event_name.empty()) {
json::map_t detail;
detail["message"].v = message;
events.send(event_name, detail);
}
}
std::string LogToEventSender::get_name() const
{
return "EventSender";
}