Files
UnrealEngineUWP/Engine/Source/Runtime/Projects/Private/VersionManifest.cpp
Ben Marsh 97c4ea914a Missing files from CL 2641800.
[CL 2641821 by Ben Marsh in Main branch]
2015-08-03 09:03:34 -04:00

107 lines
2.8 KiB
C++

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "ProjectsPrivatePCH.h"
#include "VersionManifest.h"
FVersionManifest::FVersionManifest()
{
Changelist = 0;
}
FString FVersionManifest::GetFileName(const FString& DirectoryName, bool bIsGameFolder)
{
FString FileName = DirectoryName / FPlatformProcess::ExecutableName();
if(FApp::GetBuildConfiguration() == EBuildConfigurations::DebugGame && bIsGameFolder)
{
FileName += FString::Printf(TEXT("-%s-DebugGame"), FPlatformProcess::GetBinariesSubdirectory());
}
return FileName + TEXT(".modules");
}
bool FVersionManifest::TryRead(const FString& FileName, FVersionManifest& Manifest)
{
// Read the file to a string
FString Text;
if (!FFileHelper::LoadFileToString(Text, *FileName))
{
return false;
}
// Deserialize a JSON object from the string
TSharedPtr< FJsonObject > ObjectPtr;
TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(Text);
if (!FJsonSerializer::Deserialize(Reader, ObjectPtr) || !ObjectPtr.IsValid() )
{
return false;
}
FJsonObject& Object = *ObjectPtr.Get();
// Read the changelist and build id
if(!Object.TryGetNumberField(TEXT("Changelist"), Manifest.Changelist) || !Object.TryGetStringField(TEXT("BuildId"), Manifest.BuildId))
{
return false;
}
// Read the module mappings
TSharedPtr<FJsonObject> ModulesObject = Object.GetObjectField(TEXT("Modules"));
if(ModulesObject.IsValid())
{
for(TPair<FString, TSharedPtr<FJsonValue>>& Pair: ModulesObject->Values)
{
if(Pair.Value->Type == EJson::String)
{
Manifest.ModuleNameToFileName.FindOrAdd(Pair.Key) = Pair.Value->AsString();
}
}
}
return true;
}
FVersionedModuleEnumerator::FVersionedModuleEnumerator()
{
}
bool FVersionedModuleEnumerator::RegisterWithModuleManager()
{
FString VersionManifestFileName = FVersionManifest::GetFileName(FPlatformProcess::BaseDir(), false);
if(!FVersionManifest::TryRead(VersionManifestFileName, InitialManifest))
{
return false;
}
FModuleManager::Get().QueryModulesDelegate.BindRaw(this, &FVersionedModuleEnumerator::QueryModules);
return true;
}
const FVersionManifest& FVersionedModuleEnumerator::GetInitialManifest() const
{
return InitialManifest;
}
void FVersionedModuleEnumerator::QueryModules(const FString& InDirectoryName, bool bIsGameDirectory, TMap<FString, FString>& OutModules) const
{
FVersionManifest Manifest;
if(FVersionManifest::TryRead(FVersionManifest::GetFileName(InDirectoryName, bIsGameDirectory), Manifest) && IsMatchingVersion(Manifest))
{
OutModules = Manifest.ModuleNameToFileName;
}
}
bool FVersionedModuleEnumerator::IsMatchingVersion(const FVersionManifest& Manifest) const
{
if(InitialManifest.Changelist == 0)
{
return Manifest.Changelist == 0 && (InitialManifest.BuildId == Manifest.BuildId || Manifest.BuildId.Len() == 0);
}
else
{
return InitialManifest.Changelist == Manifest.Changelist;
}
}