From 7c369b5b135fc53ef30f184a687988c703630394 Mon Sep 17 00:00:00 2001
From: mbellgardt <bellgardt@vr.rwth-aachen.de>
Date: Tue, 26 Jan 2021 11:50:53 +0100
Subject: [PATCH] Finish implementation of LogFileManager. Multiple streams can
 now point to the same file.

---
 .../Private/LogFileManager.cpp                | 19 +++++++++++++++++++
 .../UniversalLogging/Private/LogFileManager.h | 17 +++++++++++++++++
 Source/UniversalLogging/Private/LogStream.cpp |  2 +-
 .../Private/UniversalLogging.cpp              |  7 +++++++
 .../Private/UniversalLogging.h                |  4 ++++
 5 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/Source/UniversalLogging/Private/LogFileManager.cpp b/Source/UniversalLogging/Private/LogFileManager.cpp
index e69de29..d5f085b 100644
--- a/Source/UniversalLogging/Private/LogFileManager.cpp
+++ b/Source/UniversalLogging/Private/LogFileManager.cpp
@@ -0,0 +1,19 @@
+#include "LogFileManager.h"
+
+LogFileStream* LogFileManager::GetLogFileStream(FString FilePath, FString FileName)
+{
+  FString Full_Path = FPaths::Combine(FilePath, FileName);
+  if (Streams.Contains(Full_Path))
+    return Streams[Full_Path].Get();
+  else
+    Streams.Add(Full_Path, MakeUnique<LogFileStream>(FilePath, FileName));
+  return Streams[Full_Path].Get();
+}
+
+LogFileManager::LogFileManager()
+{
+}
+
+LogFileManager::~LogFileManager()
+{
+}
diff --git a/Source/UniversalLogging/Private/LogFileManager.h b/Source/UniversalLogging/Private/LogFileManager.h
index e69de29..d339d83 100644
--- a/Source/UniversalLogging/Private/LogFileManager.h
+++ b/Source/UniversalLogging/Private/LogFileManager.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "LogFileStream.h"
+
+class LogFileManager
+{
+public:
+  LogFileStream* GetLogFileStream(FString FilePath, FString FileName);
+
+private:
+  friend class UniversalLoggingImpl;
+  LogFileManager();
+  virtual ~LogFileManager();
+
+private:
+  TMap<FString, TUniquePtr<LogFileStream>> Streams;
+};
\ No newline at end of file
diff --git a/Source/UniversalLogging/Private/LogStream.cpp b/Source/UniversalLogging/Private/LogStream.cpp
index a7cfe0e..fd9d6a7 100644
--- a/Source/UniversalLogging/Private/LogStream.cpp
+++ b/Source/UniversalLogging/Private/LogStream.cpp
@@ -152,7 +152,7 @@ void LogStreamImpl::Open()
   FString File_Path = Filepath;
   if(bPer_Session)
     File_Path = FPaths::Combine(File_Path, UniLog.GetSessionIdentifier());
-  Log_File_Stream = new LogFileStream(File_Path, Filename); // this will not stay like this, as LogFileStreams will be managed by LogFileManager
+  Log_File_Stream = UniversalLoggingImpl::GetLogFileManager()->GetLogFileStream(File_Path, Filename); // this will not stay like this, as LogFileStreams will be managed by LogFileManager
   Log_File_Stream->Open();
   if (!Log_File_Stream->GetIsOpen())
   {
diff --git a/Source/UniversalLogging/Private/UniversalLogging.cpp b/Source/UniversalLogging/Private/UniversalLogging.cpp
index 873db43..b31f1af 100644
--- a/Source/UniversalLogging/Private/UniversalLogging.cpp
+++ b/Source/UniversalLogging/Private/UniversalLogging.cpp
@@ -7,6 +7,8 @@
 #include "Cluster/IDisplayClusterClusterManager.h"
 #include "Misc/CommandLine.h"
 
+LogFileManager UniversalLoggingImpl::Log_File_Manager = LogFileManager();
+
 void UniversalLoggingImpl::StartupModule()
 {
   Streams.Add("", MakeUnique<LogStreamImpl>());
@@ -174,4 +176,9 @@ FString UniversalLoggingImpl::GetNodeName()
     return FString(TEXT("Localhost"));
 }
 
+LogFileManager* UniversalLoggingImpl::GetLogFileManager()
+{
+  return &Log_File_Manager;
+}
+
 IMPLEMENT_MODULE(UniversalLoggingImpl, UniversalLogging)
diff --git a/Source/UniversalLogging/Private/UniversalLogging.h b/Source/UniversalLogging/Private/UniversalLogging.h
index 209e2a2..e8e1f19 100644
--- a/Source/UniversalLogging/Private/UniversalLogging.h
+++ b/Source/UniversalLogging/Private/UniversalLogging.h
@@ -3,6 +3,7 @@
 #include "LogStream.h"
 #include "OnScreenLog.h"
 #include "IUniversalLogging.h"
+#include "LogFileManager.h"
 
 #include "Engine/World.h"
 
@@ -32,7 +33,10 @@ public:
   static bool IsClusterMaster(); 
   static FString GetNodeName();
 
+  static LogFileManager* GetLogFileManager();
+
 private:
+  static LogFileManager Log_File_Manager;
   TMap<FString, TUniquePtr<LogStreamImpl>> Streams;
   FString Session_ID;
   TBaseDelegate<void, UWorld*, const UWorld::InitializationValues> On_Post_World_Initialization_Delegate;
-- 
GitLab