// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "HAL/CriticalSection.h" #include "IO/IoStatus.h" #include "OnDemandBackendStatus.h" #include "Templates/Function.h" #include "Templates/SharedPointer.h" namespace UE::IoStore { class FOnDemandHostGroup; class FIASHostGroup final { struct FImpl; using FSharedImpl = TSharedPtr; public: static TIoStatusOr Create(FName Name, TConstArrayView HostUrls); static TIoStatusOr Create(FName Name, TConstArrayView HostUrls); FIASHostGroup(); FIASHostGroup(FName Name, FAnsiStringView TestPath); FIASHostGroup(FName Name, FOnDemandHostGroup&& HostGroup); ~FIASHostGroup() = default; FName GetName() const; const FAnsiString& GetTestPath() const; bool IsResolved() const; bool IsConnected() const; FIoStatus Resolve(TConstArrayView HostUrls); FIoStatus Resolve(TConstArrayView HostUrls); void Connect(int32 HostIndex); void Disconnect(); enum class EReconnectionResult : uint8 { AlreadyConnected = 0, Reconnected, FailedToConnect, }; EReconnectionResult AttemptReconnection(uint32 TimeoutMs, std::atomic_bool& CancellationToken); void OnSuccessfulResponse(); bool OnFailedResponse(); FAnsiStringView GetPrimaryHostUrl() const; int32 GetPrimaryHostIndex() const; const FOnDemandHostGroup& GetUnderlyingHostGroup() const; TConstArrayView GetHostUrls() const; private: FIASHostGroup(FSharedImpl&& Impl); void SetPrimaryHost(int32 Index) const; FSharedImpl Impl; }; class FHostGroupManager final { FHostGroupManager() = default; ~FHostGroupManager() = default; public: DECLARE_TS_MULTICAST_DELEGATE(FOnHostGroupDisconnectedDelegate); static FHostGroupManager& Get(); // TODO: Note that currently we have no way to remove FIASHostGroups TIoStatusOr Register(FName Name, FAnsiStringView TestPath); // <- Unresolved TIoStatusOr Register(FName Name, TConstArrayView HostUrls); // <- Resolved FIASHostGroup Find(FName Name); void ForEachHostGroup(TFunctionRef Callback) const; void Tick(uint32 TimeoutMs, std::atomic_bool& CancellationToken); void DisconnectAll(); uint32 GetNumDisconnctedHosts() const; FOnHostGroupDisconnectedDelegate& OnHostGroupDisconncted() { return HostGroupDisconnectedDelegate; } private: TArray HostGroups; FOnHostGroupDisconnectedDelegate HostGroupDisconnectedDelegate; mutable FRWLock Mutex; }; } //namespace UE::IoStore