// Copyright Epic Games, Inc. All Rights Reserved. #include "DisplayClusterConfigurationMgr.h" #include "Formats/IDisplayClusterConfigurationDataParser.h" #include "Formats/JSON426/DisplayClusterConfigurationJsonParser_426.h" #include "Formats/JSON427/DisplayClusterConfigurationJsonParser_427.h" #include "Formats/JSON500/DisplayClusterConfigurationJsonParser_500.h" #include "VersionChecker/DisplayClusterConfigurationVersionChecker.h" #include "DisplayClusterConfigurationLog.h" #include "DisplayClusterConfigurationTypes.h" #include "DisplayClusterConfigurationVersion.h" #include "Misc/DisplayClusterHelpers.h" #include "Misc/Paths.h" // Alias for current config scheme namespace ACTUAL_CONFIG_SCHEME = JSON500; FDisplayClusterConfigurationMgr& FDisplayClusterConfigurationMgr::Get() { static FDisplayClusterConfigurationMgr Instance; return Instance; } EDisplayClusterConfigurationVersion FDisplayClusterConfigurationMgr::GetConfigVersion(const FString& FilePath) { FString ConfigFile = FilePath.TrimStartAndEnd(); // Process relative paths if (FPaths::IsRelative(ConfigFile)) { ConfigFile = DisplayClusterHelpers::filesystem::GetFullPathForConfig(ConfigFile); } // Detect version TUniquePtr VersionChecker = MakeUnique(); return VersionChecker->GetConfigVersion(ConfigFile); } UDisplayClusterConfigurationData* FDisplayClusterConfigurationMgr::LoadConfig(const FString& FilePath, UObject* Owner) { FString ConfigFile = FilePath.TrimStartAndEnd(); if (FPaths::IsRelative(ConfigFile)) { ConfigFile = DisplayClusterHelpers::filesystem::GetFullPathForConfig(ConfigFile); } if (!FPaths::FileExists(ConfigFile)) { UE_LOG(LogDisplayClusterConfiguration, Error, TEXT("File not found: %s"), *ConfigFile); return nullptr; } // Detect config version and instantiate a proper config parser TUniquePtr Parser; TUniquePtr VersionChecker = MakeUnique(); switch (VersionChecker->GetConfigVersion(ConfigFile)) { case EDisplayClusterConfigurationVersion::Version_426: Parser = MakeUnique(); break; case EDisplayClusterConfigurationVersion::Version_427: Parser = MakeUnique(); break; case EDisplayClusterConfigurationVersion::Version_500: Parser = MakeUnique(); break; case EDisplayClusterConfigurationVersion::Unknown: default: UE_LOG(LogDisplayClusterConfiguration, Error, TEXT("No parser implemented for file: %s"), *ConfigFile); return nullptr; } return Parser->LoadData(ConfigFile); } bool FDisplayClusterConfigurationMgr::SaveConfig(const UDisplayClusterConfigurationData* Config, const FString& FilePath) { // Save to json with current config scheme TUniquePtr Parser = MakeUnique(); check(Parser); return Parser->SaveData(Config, FilePath); } bool FDisplayClusterConfigurationMgr::ConfigAsString(const UDisplayClusterConfigurationData* Config, FString& OutString) { // Stringify to json with current config scheme TUniquePtr Parser = MakeUnique(); check(Parser); return Parser->AsString(Config, OutString); } UDisplayClusterConfigurationData* FDisplayClusterConfigurationMgr::CreateDefaultStandaloneConfigData() { // Not supported yet return nullptr; }