Allows the plugins to add information to the log. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- include/spice-streaming-agent/plugin.hpp | 5 +++++ src/concrete-agent.cpp | 21 +++++++++++++++++---- src/concrete-agent.hpp | 8 +++++++- src/frame-log.cpp | 9 +++++++++ src/frame-log.hpp | 2 ++ src/spice-streaming-agent.cpp | 6 +++--- 6 files changed, 43 insertions(+), 8 deletions(-) Change since v1: - better ConcreteAgent interface, removed ugly SetFrameLog diff --git a/include/spice-streaming-agent/plugin.hpp b/include/spice-streaming-agent/plugin.hpp index 3b265d9..a51f060 100644 --- a/include/spice-streaming-agent/plugin.hpp +++ b/include/spice-streaming-agent/plugin.hpp @@ -116,6 +116,11 @@ public: * \todo passing options to entry point instead? */ virtual const ConfigureOption* Options() const = 0; + /*! + * Write something in the log. + */ + __attribute__ ((format (printf, 2, 3))) + virtual void LogStat(const char* format, ...) = 0; }; typedef bool PluginInitFunc(spice::streaming_agent::Agent* agent); diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp index fb1412b..336bd09 100644 --- a/src/concrete-agent.cpp +++ b/src/concrete-agent.cpp @@ -5,13 +5,15 @@ */ #include <config.h> +#include "concrete-agent.hpp" +#include "frame-log.hpp" + #include <algorithm> #include <syslog.h> #include <glob.h> #include <dlfcn.h> #include <string> - -#include "concrete-agent.hpp" +#include <cstdarg> using namespace spice::streaming_agent; @@ -25,8 +27,9 @@ static inline unsigned MinorVersion(unsigned version) return version & 0xffu; } -ConcreteAgent::ConcreteAgent(const std::vector<ConcreteConfigureOption> &options): - options(options) +ConcreteAgent::ConcreteAgent(const std::vector<ConcreteConfigureOption> &options, FrameLog *logger): + options(options), + logger(logger) { this->options.push_back(ConcreteConfigureOption(nullptr, nullptr)); } @@ -140,3 +143,13 @@ FrameCapture *ConcreteAgent::GetBestFrameCapture(const std::set<SpiceVideoCodecT } return nullptr; } + +void ConcreteAgent::LogStat(const char* format, ...) +{ + if (logger) { + va_list ap; + va_start(ap, format); + logger->log_statv(format, ap); + va_end(ap); + } +} diff --git a/src/concrete-agent.hpp b/src/concrete-agent.hpp index 2c2ebc8..6d1be35 100644 --- a/src/concrete-agent.hpp +++ b/src/concrete-agent.hpp @@ -14,6 +14,8 @@ namespace spice { namespace streaming_agent { +class FrameLog; + struct ConcreteConfigureOption: ConfigureOption { ConcreteConfigureOption(const char *name, const char *value) @@ -26,16 +28,20 @@ struct ConcreteConfigureOption: ConfigureOption class ConcreteAgent final : public Agent { public: - ConcreteAgent(const std::vector<ConcreteConfigureOption> &options); + ConcreteAgent(const std::vector<ConcreteConfigureOption> &options, + FrameLog *logger=nullptr); void Register(const std::shared_ptr<Plugin>& plugin) override; const ConfigureOption* Options() const override; void LoadPlugins(const std::string &directory); FrameCapture *GetBestFrameCapture(const std::set<SpiceVideoCodecType>& codecs); + __attribute__ ((format (printf, 2, 3))) + void LogStat(const char* format, ...) override; private: bool PluginVersionIsCompatible(unsigned pluginVersion) const; void LoadPlugin(const std::string &plugin_filename); std::vector<std::shared_ptr<Plugin>> plugins; std::vector<ConcreteConfigureOption> options; + FrameLog *const logger = nullptr; }; }} // namespace spice::streaming_agent diff --git a/src/frame-log.cpp b/src/frame-log.cpp index 62fffc3..db6b652 100644 --- a/src/frame-log.cpp +++ b/src/frame-log.cpp @@ -52,6 +52,15 @@ void FrameLog::log_stat(const char* format, ...) } } +void FrameLog::log_statv(const char* format, va_list ap) +{ + if (log_file) { + fprintf(log_file, "%" PRIu64 ": ", get_time()); + vfprintf(log_file, format, ap); + fputc('\n', log_file); + } +} + void FrameLog::log_frame(const void* buffer, size_t buffer_size) { if (log_file) { diff --git a/src/frame-log.hpp b/src/frame-log.hpp index 8503345..a104723 100644 --- a/src/frame-log.hpp +++ b/src/frame-log.hpp @@ -24,6 +24,8 @@ public: __attribute__ ((format (printf, 2, 3))) void log_stat(const char* format, ...); + __attribute__ ((format (printf, 2, 0))) + void log_statv(const char* format, va_list ap); void log_frame(const void* buffer, size_t buffer_size); static uint64_t get_time(); diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp index 039d628..49f5dc4 100644 --- a/src/spice-streaming-agent.cpp +++ b/src/spice-streaming-agent.cpp @@ -401,15 +401,15 @@ int main(int argc, char* argv[]) register_interrupts(); try { - ConcreteAgent agent(options); + FrameLog frame_log(log_filename, log_binary, log_frames); + + ConcreteAgent agent(options, &frame_log); // register built-in plugins MjpegPlugin::Register(&agent); agent.LoadPlugins(pluginsdir); - FrameLog frame_log(log_filename, log_binary, log_frames); - for (const std::string& arg: old_args) { frame_log.log_stat("Args: %s", arg.c_str()); } -- 2.20.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel