From 424450bcccb2ceea3c833d2f5b8f915981df43b0 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 11 May 2014 07:24:06 -0600 Subject: [PATCH] EventSender: Allow sending of new-format events. --- src/util/EventSender.cpp | 76 ++++++++++++++++++++++++++++++++++++++++ src/util/EventSender.h | 24 +++++++++++++ 2 files changed, 100 insertions(+) diff --git a/src/util/EventSender.cpp b/src/util/EventSender.cpp index 5114b2e1e..fd5839653 100644 --- a/src/util/EventSender.cpp +++ b/src/util/EventSender.cpp @@ -44,3 +44,79 @@ void EventSender::send(const DatagramHandle dg) } EventSender g_eventsender; + +// And now the convenience class: +LoggedEvent::LoggedEvent() : LoggedEvent("unset", "unset") { } + +LoggedEvent::LoggedEvent(const std::string &type) : LoggedEvent(type, "unset") { } + +LoggedEvent::LoggedEvent(const std::string &type, const std::string &sender) +{ + add("type", type); + add("sender", sender); +} + +void LoggedEvent::add(const std::string &key, const std::string &value) +{ + if(m_keys.find(key) == m_keys.end()) + { + m_keys[key] = m_kv.size(); + m_kv.push_back(std::make_pair(key, value)); + } + else + { + m_kv[m_keys[key]] = std::make_pair(key, value); + } +} + +static inline void pack_string(DatagramPtr dg, const std::string &str) +{ + size_t size = str.size(); + + if(size < 32) + { + // Small enough for fixstr: + dg->add_uint8(0xa0 + size); + } + else + { + // Use a str16. + // We don't have to worry about str32, nothing that big will fit in a + // single UDP packet anyway. + dg->add_uint8(0xda); + dg->add_uint8(size>>8 & 0xFF); + dg->add_uint8(size & 0xFF); + } + + dg->add_data(str); +} + +DatagramHandle LoggedEvent::make_datagram() const +{ + DatagramPtr dg = Datagram::create(); + + // First, append the size of our map: + size_t size = m_kv.size(); + if(size < 16) + { + // Small enough for fixmap: + dg->add_uint8(0x80 + size); + } + else + { + // Use a map16. + // We don't have to worry about map32, nothing that big will fit in a + // single UDP packet anyway. + dg->add_uint8(0xde); + dg->add_uint8(size>>8 & 0xFF); + dg->add_uint8(size & 0xFF); + } + + for(auto &it : m_kv) + { + pack_string(dg, it.first); + pack_string(dg, it.second); + } + + return dg; +} diff --git a/src/util/EventSender.h b/src/util/EventSender.h index f9d699eb0..cbf73ab6a 100644 --- a/src/util/EventSender.h +++ b/src/util/EventSender.h @@ -1,4 +1,7 @@ #pragma once +#include +#include +#include #include #include @@ -6,6 +9,23 @@ using boost::asio::ip::udp; +// This is a convenience class for building up MessagePack logs. +class LoggedEvent +{ + public: + LoggedEvent(); + LoggedEvent(const std::string &type); + LoggedEvent(const std::string &type, const std::string &sender); + + void add(const std::string &key, const std::string &value); + + DatagramHandle make_datagram() const; + + private: + std::vector > m_kv; + std::unordered_map m_keys; +}; + class EventSender { public: @@ -13,6 +33,10 @@ class EventSender void init(const std::string &target); void send(const DatagramHandle dg); + inline void send(const LoggedEvent &event) + { + send(event.make_datagram()); + } private: LogCategory m_log; udp::socket m_socket;