diff options
| -rw-r--r-- | src/monitor-cmd.cc | 35 | ||||
| -rw-r--r-- | src/packages.cc | 10 | ||||
| -rw-r--r-- | src/packages.hh | 5 |
3 files changed, 39 insertions, 11 deletions
diff --git a/src/monitor-cmd.cc b/src/monitor-cmd.cc index b67ae7a..580f45f 100644 --- a/src/monitor-cmd.cc +++ b/src/monitor-cmd.cc @@ -16,6 +16,7 @@ #include "io.hh" #include "ios_save.hh" #include "looper.hh" +#include "packages.hh" #include "resolver.hh" #include "monitor.hh" @@ -23,8 +24,10 @@ namespace { class Delegate : public Monitor::Delegate { public: - Delegate(std::ostream& out, bool interleave, Looper* looper) - : out_(out), interleave_(interleave), looper_(looper), attached_(false) { + Delegate(std::ostream& out, bool interleave, + std::unique_ptr<PackagesWriter>&& writer, Looper* looper) + : out_(out), interleave_(interleave), writer_(std::move(writer)), + looper_(looper), attached_(false) { } void state(Monitor* monitor, Monitor::State state) override { @@ -96,6 +99,11 @@ public: private: void print_package(Package& pkg, bool last, char const* data, size_t size) { if (size == 0 && !last) return; + if (writer_) { + assert(last); + writer_->write(pkg, data, size); + return; + } { ios_save save(out_); out_ << "*** " << pkg.timestamp.tv_sec << '.' @@ -132,6 +140,7 @@ private: std::ostream& out_; bool interleave_; + std::unique_ptr<PackagesWriter> writer_; Looper* looper_; bool attached_; std::unordered_map<uint32_t, Package> packages_; @@ -153,11 +162,12 @@ void quit_loop(Looper* looper, int, uint8_t) { } bool run(std::ostream& out, bool interleave, + std::unique_ptr<PackagesWriter>&& writer, std::string const& host, uint16_t port) { std::unique_ptr<Looper> looper(Looper::create()); std::unique_ptr<Resolver> resolver(Resolver::create(looper.get())); std::unique_ptr<Delegate> delegate( - new Delegate(out, interleave, looper.get())); + new Delegate(out, interleave, std::move(writer), looper.get())); std::unique_ptr<Monitor> monitor( Monitor::create(looper.get(), resolver.get(), delegate.get())); out << "# Connecting to " << host << ':' << port << std::endl; @@ -182,6 +192,7 @@ int main(int argc, char** argv) { args->add('i', "interleave", "unless set packages are not output until they are complete"); args->add('o', "output", "FILE", "output packages to FILE instead of stdout"); + args->add("tpp", "write tpp output format instead of readable text"); args->add('h', "help", "display this text and exit"); args->add('V', "version", "display version and exit"); if (!args->run(argc, argv)) { @@ -223,6 +234,10 @@ int main(int argc, char** argv) { port = 9000; } auto interleave = args->is_set('i'); + if (interleave && args->is_set("tpp")) { + std::cerr << "Interleave and tpp options cannot be combined." << std::endl; + return EXIT_FAILURE; + } auto output = args->arg('o', nullptr); if (output) { std::ofstream out(output, std::ofstream::trunc); @@ -230,8 +245,18 @@ int main(int argc, char** argv) { std::cerr << "Unable to open " << output << " for writing." << std::endl; return EXIT_FAILURE; } - return run(out, interleave, host, port); + if (args->is_set("tpp")) { + return run(std::cout, interleave, std::unique_ptr<PackagesWriter>( + PackagesWriter::create(&out)), host, port); + } else { + return run(out, interleave, nullptr, host, port); + } } else { - return run(std::cout, interleave, host, port); + if (args->is_set("tpp")) { + return run(std::cerr, interleave, std::unique_ptr<PackagesWriter>( + PackagesWriter::create(&std::cout)), host, port); + } else { + return run(std::cout, interleave, nullptr, host, port); + } } } diff --git a/src/packages.cc b/src/packages.cc index f2c4ba6..70f9de4 100644 --- a/src/packages.cc +++ b/src/packages.cc @@ -29,7 +29,7 @@ public: } } - void write(Package const& package, std::string const& data) override { + void write(Package const& package, char const* data, size_t size) override { if (!open_) { assert(false); return; @@ -43,12 +43,12 @@ public: ptr = backup.get(); write_package(package, ptr, need); } - uint8_t size[8]; - write_u64(size, need + data.size()); - out_->write(reinterpret_cast<char*>(size), 8); + uint8_t size_data[8]; + write_u64(size_data, need + size); + out_->write(reinterpret_cast<char*>(size_data), 8); out_->write(reinterpret_cast<char*>(ptr), need); backup.reset(); - out_->write(data.data(), data.size()); + out_->write(data, size); count_++; } diff --git a/src/packages.hh b/src/packages.hh index f696212..682a75b 100644 --- a/src/packages.hh +++ b/src/packages.hh @@ -11,7 +11,10 @@ public: static PackagesWriter* create(std::ostream* out); - virtual void write(Package const& package, std::string const& data) = 0; + virtual void write(Package const& package, char const* data, size_t size) = 0; + void write(Package const& package, std::string const& data) { + write(package, data.data(), data.size()); + } virtual void flush() = 0; protected: |
