diff options
| author | Dan Engelbrecht <[email protected]> | 2025-12-11 10:02:06 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-12-11 10:02:06 +0100 |
| commit | a598cb444f311c39bbf8d83e2004dd3545b9412d (patch) | |
| tree | e2527cd9c7fcb62e89605d0a3982ce3b052d5fba /src/zenremotestore/operationlogoutput.cpp | |
| parent | HTTP server API changes for improved extensibility (#684) (diff) | |
| download | zen-a598cb444f311c39bbf8d83e2004dd3545b9412d.tar.xz zen-a598cb444f311c39bbf8d83e2004dd3545b9412d.zip | |
remove direct console output from code that is used from service mode (#688)
Diffstat (limited to 'src/zenremotestore/operationlogoutput.cpp')
| -rw-r--r-- | src/zenremotestore/operationlogoutput.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/zenremotestore/operationlogoutput.cpp b/src/zenremotestore/operationlogoutput.cpp index 8d8a6dc78..0837ed716 100644 --- a/src/zenremotestore/operationlogoutput.cpp +++ b/src/zenremotestore/operationlogoutput.cpp @@ -4,6 +4,100 @@ #include <zencore/logging.h> +ZEN_THIRD_PARTY_INCLUDES_START +#include <gsl/gsl-lite.hpp> +ZEN_THIRD_PARTY_INCLUDES_END + namespace zen { +class StandardLogOutput; + +class StandardLogOutputProgressBar : public OperationLogOutput::ProgressBar +{ +public: + StandardLogOutputProgressBar(StandardLogOutput& Output, std::string_view InSubTask) : m_Output(Output), m_SubTask(InSubTask) {} + + virtual void UpdateState(const State& NewState, bool DoLinebreak) override; + virtual void Finish() override; + +private: + StandardLogOutput& m_Output; + std::string m_SubTask; + State m_State; +}; + +class StandardLogOutput : public OperationLogOutput +{ +public: + StandardLogOutput(LoggerRef& Log) : m_Log(Log) {} + virtual void EmitLogMessage(int LogLevel, std::string_view Format, fmt::format_args Args) override + { + if (m_Log.ShouldLog(LogLevel)) + { + fmt::basic_memory_buffer<char, 250> MessageBuffer; + fmt::vformat_to(fmt::appender(MessageBuffer), Format, Args); + ZEN_LOG(m_Log, LogLevel, "{}", std::string_view(MessageBuffer.data(), MessageBuffer.size())); + } + } + + virtual void SetLogOperationName(std::string_view Name) override + { + m_LogOperationName = Name; + ZEN_OPERATION_LOG_INFO(*this, "{}", m_LogOperationName); + } + virtual void SetLogOperationProgress(uint32_t StepIndex, uint32_t StepCount) override + { + const size_t PercentDone = StepCount > 0u ? gsl::narrow<uint8_t>((100 * StepIndex) / StepCount) : 0u; + ZEN_OPERATION_LOG_INFO(*this, "{}: {}%", m_LogOperationName, PercentDone); + } + virtual uint32_t GetProgressUpdateDelayMS() override { return 2000; } + virtual ProgressBar* CreateProgressBar(std::string_view InSubTask) override + { + return new StandardLogOutputProgressBar(*this, InSubTask); + } + +private: + LoggerRef m_Log; + std::string m_LogOperationName; +}; + +void +StandardLogOutputProgressBar::UpdateState(const State& NewState, bool DoLinebreak) +{ + ZEN_UNUSED(DoLinebreak); + const size_t PercentDone = + NewState.TotalCount > 0u ? gsl::narrow<uint8_t>((100 * (NewState.TotalCount - NewState.RemainingCount)) / NewState.TotalCount) : 0u; + std::string Task = NewState.Task; + switch (NewState.Status) + { + case State::EStatus::Aborted: + Task = "Aborting"; + break; + case State::EStatus::Paused: + Task = "Paused"; + break; + default: + break; + } + ZEN_OPERATION_LOG_INFO(m_Output, "{}: {}%{}", Task, PercentDone, NewState.Details.empty() ? "" : fmt::format(" {}", NewState.Details)); + m_State = NewState; +} +void +StandardLogOutputProgressBar::Finish() +{ + if (m_State.RemainingCount > 0) + { + State NewState = m_State; + NewState.RemainingCount = 0; + NewState.Details = ""; + UpdateState(NewState, /*DoLinebreak*/ true); + } +} + +OperationLogOutput* +CreateStandardLogOutput(LoggerRef& Log) +{ + return new StandardLogOutput(Log); +} + } // namespace zen |