// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. #include "TargetDeviceServicesPrivatePCH.h" /* FTargetDeviceProxyManager structors *****************************************************************************/ FTargetDeviceProxyManager::FTargetDeviceProxyManager() { MessageEndpoint = FMessageEndpoint::Builder("FTargetDeviceProxyManager") .Handling(this, &FTargetDeviceProxyManager::HandlePongMessage); if (MessageEndpoint.IsValid()) { TickDelegate = FTickerDelegate::CreateRaw(this, &FTargetDeviceProxyManager::HandleTicker); TickDelegateHandle = FTicker::GetCoreTicker().AddTicker(TickDelegate, TARGET_DEVICE_SERVICES_PING_INTERVAL); SendPing(); } } FTargetDeviceProxyManager::~FTargetDeviceProxyManager() { FTicker::GetCoreTicker().RemoveTicker(TickDelegateHandle); } /* ITargetDeviceProxyLocator interface *****************************************************************************/ ITargetDeviceProxyPtr FTargetDeviceProxyManager::FindProxy(const FString& Name) { return Proxies.FindRef(Name); } ITargetDeviceProxyRef FTargetDeviceProxyManager::FindOrAddProxy(const FString& Name) { TSharedPtr& Proxy = Proxies.FindOrAdd(Name); if (!Proxy.IsValid()) { Proxy = MakeShareable(new FTargetDeviceProxy(Name)); ProxyAddedDelegate.Broadcast(Proxy.ToSharedRef()); } return Proxy.ToSharedRef(); } ITargetDeviceProxyPtr FTargetDeviceProxyManager::FindProxyDeviceForTargetDevice(const FString& DeviceId) { for (TMap >::TConstIterator ItProxies(Proxies); ItProxies; ++ItProxies) { const TSharedPtr& Proxy = ItProxies.Value(); if (Proxy->HasDeviceId(DeviceId)) { return Proxy; } } return ITargetDeviceProxyPtr(); } void FTargetDeviceProxyManager::GetProxies(FName TargetPlatformName, bool IncludeUnshared, TArray& OutProxies) { OutProxies.Reset(); for (TMap >::TConstIterator It(Proxies); It; ++It) { const TSharedPtr& Proxy = It.Value(); if ((IncludeUnshared || Proxy->IsShared()) || (Proxy->GetHostUser() == FPlatformProcess::UserName(true))) { if (TargetPlatformName == NAME_None || Proxy->HasTargetPlatform(TargetPlatformName)) { OutProxies.Add(Proxy); } } } } /* FTargetDeviceProxyManager implementation *****************************************************************************/ void FTargetDeviceProxyManager::RemoveDeadProxies() { FDateTime CurrentTime = FDateTime::UtcNow(); for (auto ProxyIter = Proxies.CreateIterator(); ProxyIter; ++ProxyIter) { if (ProxyIter.Value()->GetLastUpdateTime() + FTimespan::FromSeconds(3.0 * TARGET_DEVICE_SERVICES_PING_INTERVAL) < CurrentTime) { ITargetDeviceProxyPtr RemovedProxy = ProxyIter.Value(); ProxyIter.RemoveCurrent(); ProxyRemovedDelegate.Broadcast(RemovedProxy.ToSharedRef()); } } } void FTargetDeviceProxyManager::SendPing() { if (MessageEndpoint.IsValid()) { MessageEndpoint->Publish(new FTargetDeviceServicePing(FPlatformProcess::UserName(true)), EMessageScope::Network); } } /* FTargetDeviceProxyManager callbacks *****************************************************************************/ void FTargetDeviceProxyManager::HandlePongMessage(const FTargetDeviceServicePong& Message, const IMessageContextRef& Context) { TSharedPtr& Proxy = Proxies.FindOrAdd(Message.Name); if (!Proxy.IsValid()) { Proxy = MakeShareable(new FTargetDeviceProxy(Message.Name, Message, Context)); ProxyAddedDelegate.Broadcast(Proxy.ToSharedRef()); } else { Proxy->UpdateFromMessage(Message, Context); } } bool FTargetDeviceProxyManager::HandleTicker(float DeltaTime) { RemoveDeadProxies(); SendPing(); return true; }