2021-06-15 16:38:03 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "Cooker/NetworkFileCookOnTheFlyRequestManager.h"
|
|
|
|
|
#include "CookOnTheFlyServerInterface.h"
|
|
|
|
|
#include "INetworkFileServer.h"
|
|
|
|
|
#include "INetworkFileSystemModule.h"
|
|
|
|
|
#include "Modules/ModuleManager.h"
|
|
|
|
|
|
|
|
|
|
class FNetworkFileCookOnTheFlyRequestManager final
|
|
|
|
|
: public UE::Cook::ICookOnTheFlyRequestManager
|
|
|
|
|
{
|
|
|
|
|
public:
|
2022-05-24 02:50:39 -04:00
|
|
|
FNetworkFileCookOnTheFlyRequestManager(UE::Cook::ICookOnTheFlyServer& InCookOnTheFlyServer, TSharedRef<UE::Cook::ICookOnTheFlyNetworkServer> NetworkServer)
|
2021-06-15 16:38:03 -04:00
|
|
|
: CookOnTheFlyServer(InCookOnTheFlyServer)
|
|
|
|
|
{
|
2022-05-24 02:50:39 -04:00
|
|
|
FNetworkFileDelegateContainer Delegates;
|
|
|
|
|
Delegates.FileRequestDelegate = FFileRequestDelegate::CreateRaw(this, &FNetworkFileCookOnTheFlyRequestManager::OnFileRequest);
|
|
|
|
|
Delegates.SandboxPathOverrideDelegate = FSandboxPathDelegate::CreateRaw(this, &FNetworkFileCookOnTheFlyRequestManager::OnGetSandboxPath);
|
|
|
|
|
Delegates.OnFileModifiedCallback = &FileModifiedDelegate;
|
2021-06-15 16:38:03 -04:00
|
|
|
|
|
|
|
|
NetworkFileServer.Reset(FModuleManager::LoadModuleChecked<INetworkFileSystemModule>("NetworkFileSystem")
|
2022-05-24 02:50:39 -04:00
|
|
|
.CreateNetworkFileServer(NetworkServer, Delegates));
|
2021-06-15 16:38:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual ~FNetworkFileCookOnTheFlyRequestManager()
|
|
|
|
|
{
|
|
|
|
|
Shutdown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual bool Initialize() override
|
|
|
|
|
{
|
|
|
|
|
return NetworkFileServer.IsValid();
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-10 06:11:30 -05:00
|
|
|
virtual void Tick() override
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-15 16:38:03 -04:00
|
|
|
virtual void Shutdown() override
|
|
|
|
|
{
|
|
|
|
|
if (NetworkFileServer.IsValid())
|
|
|
|
|
{
|
|
|
|
|
NetworkFileServer->Shutdown();
|
|
|
|
|
NetworkFileServer.Reset();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-07 02:30:52 -05:00
|
|
|
virtual void OnPackageGenerated(const FName& PackageName) override
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-17 04:54:33 -05:00
|
|
|
virtual bool ShouldUseLegacyScheduling() override
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-15 16:38:03 -04:00
|
|
|
private:
|
|
|
|
|
void OnFileRequest(FString& Filename, const FString& PlatformNameStr, TArray<FString>& UnsolicitedFiles)
|
|
|
|
|
{
|
|
|
|
|
using namespace UE::Cook;
|
|
|
|
|
|
|
|
|
|
FName PlatformName(*PlatformNameStr);
|
|
|
|
|
const bool bIsCookable = FPackageName::IsPackageExtension(*FPaths::GetExtension(Filename, true));
|
|
|
|
|
|
|
|
|
|
if (bIsCookable)
|
|
|
|
|
{
|
|
|
|
|
FEvent* CookCompletedEvent = FPlatformProcess::GetSynchEventFromPool();
|
2022-02-08 02:54:05 -05:00
|
|
|
FCompletionCallback CookRequestCompleted = [this, CookCompletedEvent](UE::Cook::FPackageData*)
|
2021-06-15 16:38:03 -04:00
|
|
|
{
|
|
|
|
|
CookCompletedEvent->Trigger();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const bool bEnqueued = CookOnTheFlyServer.EnqueueCookRequest(UE::Cook::FCookPackageRequest
|
|
|
|
|
{
|
|
|
|
|
PlatformName,
|
|
|
|
|
Filename,
|
|
|
|
|
MoveTemp(CookRequestCompleted)
|
|
|
|
|
});
|
|
|
|
|
check(bEnqueued);
|
|
|
|
|
|
|
|
|
|
CookCompletedEvent->Wait();
|
|
|
|
|
FPlatformProcess::ReturnSynchEventToPool(CookCompletedEvent);
|
|
|
|
|
CookOnTheFlyServer.GetUnsolicitedFiles(PlatformName, Filename, bIsCookable, UnsolicitedFiles);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
CookOnTheFlyServer.GetUnsolicitedFiles(PlatformName, Filename, bIsCookable, UnsolicitedFiles);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FString OnGetSandboxPath()
|
|
|
|
|
{
|
|
|
|
|
return CookOnTheFlyServer.GetSandboxDirectory();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UE::Cook::ICookOnTheFlyServer& CookOnTheFlyServer;
|
|
|
|
|
TUniquePtr<INetworkFileServer> NetworkFileServer;
|
|
|
|
|
FOnFileModifiedDelegate FileModifiedDelegate;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
namespace UE { namespace Cook
|
|
|
|
|
{
|
|
|
|
|
|
2022-05-24 02:50:39 -04:00
|
|
|
TUniquePtr<ICookOnTheFlyRequestManager> MakeNetworkFileCookOnTheFlyRequestManager(ICookOnTheFlyServer& CookOnTheFlyServer, TSharedRef<ICookOnTheFlyNetworkServer> NetworkServer)
|
2021-06-15 16:38:03 -04:00
|
|
|
{
|
2022-05-24 02:50:39 -04:00
|
|
|
return MakeUnique<FNetworkFileCookOnTheFlyRequestManager>(CookOnTheFlyServer, NetworkServer);
|
2021-06-15 16:38:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}} // namespace UE::Cook
|