// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GenericPlatform/GenericPlatformFile.h" #include "Containers/StringView.h" #if !UE_BUILD_SHIPPING class FStorageServerFileHandle; class FStorageServerConnection; #if WITH_COTF namespace UE::Cook { class FCookOnTheFlyMessage; } #endif class FStorageServerFileSystemTOC { public: ~FStorageServerFileSystemTOC(); void AddFile(FStringView Path, int32 Index); bool FileExists(const FString& Path); bool DirectoryExists(const FString& Path); int32* FindFileIndex(const FString& Path); bool IterateDirectory(const FString& Path, TFunctionRef Callback); private: struct FDirectory { TArray Directories; TArray Files; }; FDirectory* AddDirectoriesRecursive(const FString& DirectoryPath); FDirectory Root; TMap Directories; TMap FileIndexToPathMap; TMap FilePathToIndexMap; FRWLock TocLock; }; class FStorageServerPlatformFile : public IPlatformFile { public: FStorageServerPlatformFile(); virtual ~FStorageServerPlatformFile(); virtual bool ShouldBeUsed(IPlatformFile* Inner, const TCHAR* CmdLine) const override; virtual bool Initialize(IPlatformFile* Inner, const TCHAR* CmdLine) override; virtual IPlatformFile* GetLowerLevel() override { return LowerLevel; } virtual void SetLowerLevel(IPlatformFile* NewLowerLevel) override { LowerLevel = NewLowerLevel; } virtual const TCHAR* GetName() const override { return TEXT("StorageServer"); } virtual bool FileExists(const TCHAR* Filename) override; virtual int64 FileSize(const TCHAR* Filename) override; virtual bool IsReadOnly(const TCHAR* Filename) override; virtual FDateTime GetTimeStamp(const TCHAR* Filename) override; virtual FDateTime GetAccessTimeStamp(const TCHAR* Filename) override; virtual IFileHandle* OpenRead(const TCHAR* Filename, bool bAllowWrite = false) override; virtual bool DirectoryExists(const TCHAR* Directory) override; virtual FFileStatData GetStatData(const TCHAR* FilenameOrDirectory) override; virtual bool IterateDirectory(const TCHAR* Directory, FDirectoryVisitor& Visitor) override; virtual bool IterateDirectoryStat(const TCHAR* Directory, FDirectoryStatVisitor& Visitor) override; virtual FString GetFilenameOnDisk(const TCHAR* Filename) override; virtual bool DeleteFile(const TCHAR* Filename) override; virtual bool MoveFile(const TCHAR* To, const TCHAR* From) override; virtual bool SetReadOnly(const TCHAR* Filename, bool bNewReadOnlyValue) override; virtual void SetTimeStamp(const TCHAR* Filename, FDateTime DateTime) override; virtual IFileHandle* OpenWrite(const TCHAR* Filename, bool bAppend = false, bool bAllowRead = false) override; virtual bool CreateDirectory(const TCHAR* Directory) override; virtual bool DeleteDirectory(const TCHAR* Directory) override; private: friend class FStorageServerFileHandle; bool MakeStorageServerPath(const TCHAR* LocalFilenameOrDirectory, FStringBuilderBase& OutPath) const; bool MakeLocalPath(const TCHAR* ServerFilenameOrDirectory, FStringBuilderBase& OutPath) const; IFileHandle* InternalOpenFile(int32 FileIndex, const TCHAR* LocalFilename); bool SendGetFileListMessage(); FFileStatData SendGetStatDataMessage(int32 FileIndex); int64 SendReadMessage(uint8* Destination, int32 FileIndex, int64 Offset, int64 BytesToRead); #if WITH_COTF void OnCookOnTheFlyMessage(const UE::Cook::FCookOnTheFlyMessage& Message); #endif IPlatformFile* LowerLevel = nullptr; FStringView ServerEngineDirView = FStringView(TEXT("/{engine}/")); FStringView ServerProjectDirView = FStringView(TEXT("/{project}/")); TUniquePtr Connection; FStorageServerFileSystemTOC ServerToc; mutable TArray HostAddrs; }; #endif