// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" namespace UGSCore { class FLineBasedTextWriter : public FOutputDevice { public: FLineBasedTextWriter(); virtual ~FLineBasedTextWriter(); void Write(TCHAR Character); void WriteLine(const FString& Line); virtual void Serialize(const TCHAR* V, ELogVerbosity::Type Verbosity, const class FName& Category) override final; virtual void FlushLine(const FString& Line) = 0; private: FString CurrentLine; }; class FNullTextWriter : public FLineBasedTextWriter { public: virtual void FlushLine(const FString& Line) override; }; class FBufferedTextWriter : public FLineBasedTextWriter { public: FBufferedTextWriter(); virtual ~FBufferedTextWriter(); void Attach(const TSharedRef& InInner); void Detach(); virtual void FlushLine(const FString& Line) override; private: TArray BufferedLines; TSharedPtr Inner; }; class FPrefixedTextWriter : public FLineBasedTextWriter { public: FPrefixedTextWriter(const TCHAR* InPrefix, TSharedRef InInner); virtual ~FPrefixedTextWriter() override; virtual void FlushLine(const FString& Line) override; private: FString Prefix; TSharedRef Inner; }; class FBoundedLogWriter : public FLineBasedTextWriter { public: FBoundedLogWriter(const TCHAR* InFileName, int32 InMaxSize); virtual ~FBoundedLogWriter() override; virtual void FlushLine(const FString& Line) override; private: FString FileName; FString BackupFileName; int32 MaxSize; FArchive* Inner; void OpenInner(); void CloseInner(); }; class FComposedTextWriter : public FLineBasedTextWriter { public: FComposedTextWriter(const TArray>& InInners); virtual ~FComposedTextWriter() override; virtual void FlushLine(const FString& Line) override; private: TArray> Inners; }; class FProgressValue { public: FProgressValue(); ~FProgressValue(); void Clear(); TTuple GetCurrent() const; void Set(const TCHAR* Message); void Set(const TCHAR* Message, float Fraction); void Set(float Fraction); void Increment(float Fraction); void Push(float MaxFraction); void Pop(); private: TTuple State; TArray> Ranges; float RelativeToAbsoluteFraction(float Fraction); }; class FProgressTextWriter : public FLineBasedTextWriter { public: FProgressTextWriter(const FProgressValue& InValue, const TSharedRef& InInner); virtual ~FProgressTextWriter() override; virtual void FlushLine(const FString& Line) override; private: static const FString DirectivePrefix; FProgressValue Value; TSharedRef Inner; void ProcessInternal(const FString& Line, bool& bSkipLine); static TArray ParseTokens(const FString& Line); static bool ReadFraction(const TArray& Tokens, int& TokenIdx, float& Fraction); }; } // namespace UGSCore