// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Async/Future.h" #include "Containers/Array.h" #include "Containers/StringView.h" #include "HAL/CriticalSection.h" #include "HAL/Platform.h" #include "IO/IoDispatcher.h" #include "Misc/StringBuilder.h" #include "Serialization/CompactBinaryPackage.h" #include "Templates/UniquePtr.h" #include "ZenServerInterface.h" class FCbPackage; class FCbObject; namespace UE { namespace Zen { struct FZenHttpRequestPool; } /** * HTTP protocol implementation of Zen Store client interface */ class IOSTOREUTILITIES_API FZenStoreHttpClient { public: FZenStoreHttpClient(); FZenStoreHttpClient(FStringView HostName, uint16 Port); FZenStoreHttpClient(UE::Zen::FServiceSettings&& InSettings); ~FZenStoreHttpClient(); bool TryCreateProject(FStringView InProjectId, FStringView InOplogId, FStringView ServerRoot, FStringView EngineRoot, FStringView ProjectRoot); bool TryCreateOplog(FStringView InProjectId, FStringView InOplogId, bool bFullBuild); void InitializeReadOnly(FStringView InProjectId, FStringView InOplogId); bool IsConnected() const; void StartBuildPass(); TIoStatusOr EndBuildPass(FCbPackage OpEntry); TIoStatusOr AppendOp(FCbPackage OpEntry); TIoStatusOr GetChunkSize(const FIoChunkId& Id); TIoStatusOr ReadChunk(const FIoChunkId& Id, uint64 Offset = 0, uint64 Size = ~0ull); TIoStatusOr ReadOpLogAttachment(FStringView Id); #if UE_WITH_ZEN const TCHAR* GetHostName() const { return ZenService.GetInstance().GetHostName(); } uint16 GetPort() const { return ZenService.GetInstance().GetPort(); } const UE::Zen::FZenServiceInstance& GetZenServiceInstance() const { return ZenService.GetInstance(); } #else // Default to localhost:1337 for platforms where Zen wouldn't be supported yet const TCHAR* GetHostName() const { return TEXT("localhost"); } uint16 GetPort() const { return 1337; } #endif TFuture> GetOplog(); TFuture> GetFiles(); static const UTF8CHAR* FindOrAddAttachmentId(FUtf8StringView AttachmentText); static const UTF8CHAR* FindAttachmentId(FUtf8StringView AttachmentText); private: TIoStatusOr ReadOpLogUri(FStringBuilderBase& ChunkUri, uint64 Offset = 0, uint64 Size = ~0ull); static const uint32 PoolEntryCount; #if UE_WITH_ZEN UE::Zen::FScopeZenService ZenService; #endif TUniquePtr RequestPool; FString OplogPath; FString OplogNewEntryPath; FString OplogPrepNewEntryPath; FString TempDirPath; uint64 StandaloneThresholdBytes = 1 * 1024 * 1024; bool bAllowRead = false; bool bAllowEdit = false; bool bConnectionSucceeded = false; }; }