aboutsummaryrefslogtreecommitdiff
path: root/src/zenremotestore/operationlogoutput.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-12-11 10:02:06 +0100
committerGitHub Enterprise <[email protected]>2025-12-11 10:02:06 +0100
commita598cb444f311c39bbf8d83e2004dd3545b9412d (patch)
treee2527cd9c7fcb62e89605d0a3982ce3b052d5fba /src/zenremotestore/operationlogoutput.cpp
parentHTTP server API changes for improved extensibility (#684) (diff)
downloadzen-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.cpp94
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