// Copyright Epic Games, Inc. All Rights Reserved. #if WITH_WEBSOCKETS && WITH_WINHTTPWEBSOCKETS #include "WinHttp/WinHttpWebSocketsManager.h" #include "WinHttp/WinHttpWebSocket.h" #include "WinHttp/WinHttpHttpManager.h" #include "Http.h" #include "Modules/ModuleManager.h" #include "HttpModule.h" #include "Containers/BackgroundableTicker.h" #include "Stats/Stats.h" void FWinHttpWebSocketsManager::InitWebSockets(TArrayView Protocols) { if (FWinHttpHttpManager::GetManager() == nullptr) { InitHttpManager(); } if (ensure(!TickHandle.IsValid())) { TickHandle = FTSBackgroundableTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateRaw(this, &FWinHttpWebSocketsManager::GameThreadTick), 0.0f); } } void FWinHttpWebSocketsManager::InitHttpManager() { WinHttpHttpManager = FPlatformHttp::CreateWinHttpHttpManager(); check(WinHttpHttpManager); } void FWinHttpWebSocketsManager::ShutdownWebSockets() { if (WinHttpHttpManager) { delete WinHttpHttpManager; WinHttpHttpManager = nullptr; } for (TWeakPtr& WeakWebSocket : ActiveWebSockets) { if (TSharedPtr StrongWebSocket = WeakWebSocket.Pin()) { StrongWebSocket->Close(); } } ActiveWebSockets.Empty(); if (ensure(TickHandle.IsValid())) { FTSBackgroundableTicker::GetCoreTicker().RemoveTicker(TickHandle); TickHandle.Reset(); } } TSharedRef FWinHttpWebSocketsManager::CreateWebSocket(const FString& Url, const TArray& Protocols, const TMap& UpgradeHeaders) { TSharedRef WebSocket = MakeShared(Url, Protocols, UpgradeHeaders); ActiveWebSockets.Emplace(WebSocket); return WebSocket; } bool FWinHttpWebSocketsManager::GameThreadTick(float /*DeltaTime*/) { QUICK_SCOPE_CYCLE_COUNTER(STAT_FWinHttpWebSocketsManager_GameThreadTick); for (TArray>::TIterator It = ActiveWebSockets.CreateIterator(); It; ++It) { if (TSharedPtr StrongWebSocket = It->Pin()) { StrongWebSocket->GameThreadTick(); } else { It.RemoveCurrent(); } } return true; } #endif // WITH_WEBSOCKETS && WITH_WINHTTPWEBSOCKETS