diff --git a/dump978_main.cc b/dump978_main.cc index 5755952..a8faa6d 100644 --- a/dump978_main.cc +++ b/dump978_main.cc @@ -98,6 +98,7 @@ static int realmain(int argc, char **argv) { ("sdr-device-settings", po::value(), "set SDR device key-value settings") ("stratuxv3", po::value(), "read messages from Stratux v3 UAT dongle on given serial port") ("raw-port", po::value>(), "listen for connections on [host:]port and provide raw messages") + ("raw-legacy-port", po::value>(), "listen for connections on [host:]port and provide raw messages, with no initial metadata header") ("json-port", po::value>(), "listen for connections on [host:]port and provide decoded json"); // clang-format on @@ -184,9 +185,29 @@ static int realmain(int argc, char **argv) { return ok; }; - auto raw_ok = create_output_port("raw-port", &RawOutput::Create); + // Emit initial metadata-only message advertising our version etc + SharedMessageVector header; + if (!opts.count("raw-disable-header")) { + header = std::make_shared(); + + // clang-format off + RawMessage::MetadataMap metadata = { + {"program", "dump978-fa"}, + {"version", VERSION}, + {"fecfix", "1"} // we have a fixed version of the FEC library + }; + // clang-format on + header->push_back(RawMessage(std::move(metadata))); + } + + auto raw_factory = std::bind(&RawOutput::Create, std::placeholders::_1, std::placeholders::_2, header); + auto raw_ok = create_output_port("raw-port", raw_factory); + + auto raw_legacy_factory = std::bind(&RawOutput::Create, std::placeholders::_1, std::placeholders::_2, SharedMessageVector()); + auto raw_legacy_ok = create_output_port("raw-legacy-port", raw_legacy_factory); + auto json_ok = create_output_port("json-port", &JsonOutput::Create); - if (!raw_ok || !json_ok) { + if (!raw_ok || !raw_legacy_ok || !json_ok) { return 1; } diff --git a/socket_output.cc b/socket_output.cc index 7c92ea5..b2adbe3 100644 --- a/socket_output.cc +++ b/socket_output.cc @@ -84,6 +84,12 @@ void SocketOutput::Close() { ////////////// +void RawOutput::Start() { + SocketOutput::Start(); + if (header_) + Write(header_); +} + void RawOutput::InternalWrite(SharedMessageVector messages) { for (const auto &message : *messages) { Buf() << message << '\n'; diff --git a/socket_output.h b/socket_output.h index 40575ac..32c842e 100644 --- a/socket_output.h +++ b/socket_output.h @@ -55,13 +55,17 @@ namespace flightaware::uat { class RawOutput : public SocketOutput { public: // factory method, this class must always be constructed via make_shared - static Pointer Create(boost::asio::io_service &service, boost::asio::ip::tcp::socket &&socket) { return Pointer(new RawOutput(service, std::move(socket))); } + static Pointer Create(boost::asio::io_service &service, boost::asio::ip::tcp::socket &&socket, SharedMessageVector header) { return Pointer(new RawOutput(service, std::move(socket), header)); } + + void Start() override; protected: void InternalWrite(SharedMessageVector messages) override; private: - RawOutput(boost::asio::io_service &service_, boost::asio::ip::tcp::socket &&socket_) : SocketOutput(service_, std::move(socket_)) {} + RawOutput(boost::asio::io_service &service_, boost::asio::ip::tcp::socket &&socket_, SharedMessageVector header) : SocketOutput(service_, std::move(socket_)) { header_ = header; } + + SharedMessageVector header_; }; class JsonOutput : public SocketOutput {