2014-12-07 19:09:38 -05:00
|
|
|
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
#include "SessionServicesPrivatePCH.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* FSessionManager structors
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
FSessionManager::FSessionManager( const IMessageBusRef& InMessageBus )
|
|
|
|
|
: MessageBusPtr(InMessageBus)
|
|
|
|
|
{
|
|
|
|
|
// fill in the owner array
|
|
|
|
|
FString Filter;
|
|
|
|
|
|
|
|
|
|
if (FParse::Value(FCommandLine::Get(), TEXT("SessionFilter="), Filter))
|
|
|
|
|
{
|
|
|
|
|
// Allow support for -SessionFilter=Filter1+Filter2+Filter3
|
|
|
|
|
int32 PlusIdx = Filter.Find(TEXT("+"));
|
|
|
|
|
|
|
|
|
|
while (PlusIdx != INDEX_NONE)
|
|
|
|
|
{
|
|
|
|
|
FString Owner = Filter.Left(PlusIdx);
|
|
|
|
|
FilteredOwners.Add(Owner);
|
|
|
|
|
Filter = Filter.Right(Filter.Len() - (PlusIdx + 1));
|
|
|
|
|
PlusIdx = Filter.Find(TEXT("+"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FilteredOwners.Add(Filter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// connect to message bus
|
|
|
|
|
MessageEndpoint = FMessageEndpoint::Builder("FSessionManager", InMessageBus)
|
|
|
|
|
.Handling<FEngineServicePong>(this, &FSessionManager::HandleEnginePongMessage)
|
|
|
|
|
.Handling<FSessionServicePong>(this, &FSessionManager::HandleSessionPongMessage);
|
|
|
|
|
|
|
|
|
|
// initialize ticker
|
2015-03-31 13:57:41 -04:00
|
|
|
TickDelegateHandle = FTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateRaw(this, &FSessionManager::HandleTicker), 1.f);
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
SendPing();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-10-17 19:14:57 -04:00
|
|
|
FSessionManager::~FSessionManager()
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2015-01-08 09:29:27 -05:00
|
|
|
FTicker::GetCoreTicker().RemoveTicker(TickDelegateHandle);
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ISessionManager interface
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
void FSessionManager::AddOwner( const FString& InOwner )
|
|
|
|
|
{
|
|
|
|
|
FilteredOwners.Add(InOwner);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FSessionManager::GetSelectedInstances( TArray<ISessionInstanceInfoPtr>& OutInstances) const
|
|
|
|
|
{
|
|
|
|
|
if (SelectedSession.IsValid())
|
|
|
|
|
{
|
|
|
|
|
SelectedSession->GetInstances(OutInstances);
|
|
|
|
|
|
|
|
|
|
for (int32 Index = OutInstances.Num() - 1; Index >= 0 ; --Index)
|
|
|
|
|
{
|
|
|
|
|
if (DeselectedInstances.Contains(OutInstances[Index]))
|
|
|
|
|
{
|
|
|
|
|
OutInstances.RemoveAtSwap(Index);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-12-12 17:38:18 -05:00
|
|
|
const ISessionInfoPtr& FSessionManager::GetSelectedSession() const
|
|
|
|
|
{
|
|
|
|
|
return SelectedSession;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
void FSessionManager::GetSessions( TArray<ISessionInfoPtr>& OutSessions ) const
|
|
|
|
|
{
|
|
|
|
|
OutSessions.Empty(Sessions.Num());
|
|
|
|
|
|
|
|
|
|
for (TMap<FGuid, TSharedPtr<FSessionInfo> >::TConstIterator It(Sessions); It; ++It)
|
|
|
|
|
{
|
|
|
|
|
OutSessions.Add(It.Value());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-12-12 17:38:18 -05:00
|
|
|
bool FSessionManager::IsInstanceSelected( const TSharedRef<ISessionInstanceInfo>& Instance ) const
|
|
|
|
|
{
|
|
|
|
|
return ((Instance->GetOwnerSession() == SelectedSession) && !DeselectedInstances.Contains(Instance));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FSimpleMulticastDelegate& FSessionManager::OnSessionsUpdated()
|
|
|
|
|
{
|
|
|
|
|
return SessionsUpdatedDelegate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FSimpleMulticastDelegate& FSessionManager::OnSessionInstanceUpdated()
|
|
|
|
|
{
|
|
|
|
|
return SessionInstanceUpdatedDelegate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
void FSessionManager::RemoveOwner( const FString& InOwner )
|
|
|
|
|
{
|
|
|
|
|
FilteredOwners.Remove(InOwner);
|
|
|
|
|
RefreshSessions();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool FSessionManager::SelectSession( const ISessionInfoPtr& Session )
|
|
|
|
|
{
|
|
|
|
|
if (Session != SelectedSession)
|
|
|
|
|
{
|
|
|
|
|
if (!Session.IsValid() || Sessions.Contains(Session->GetSessionId()))
|
|
|
|
|
{
|
|
|
|
|
bool CanSelect = true;
|
|
|
|
|
|
|
|
|
|
CanSelectSessionDelegate.Broadcast(Session, CanSelect);
|
|
|
|
|
|
|
|
|
|
if (CanSelect)
|
|
|
|
|
{
|
|
|
|
|
SelectedSession = Session;
|
|
|
|
|
|
2014-12-12 17:38:18 -05:00
|
|
|
SelectedSessionChangedEvent.Broadcast(Session);
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool FSessionManager::SetInstanceSelected( const ISessionInstanceInfoPtr& Instance, bool Selected )
|
|
|
|
|
{
|
|
|
|
|
if (Instance->GetOwnerSession() == SelectedSession)
|
|
|
|
|
{
|
|
|
|
|
if (Selected)
|
|
|
|
|
{
|
|
|
|
|
if (DeselectedInstances.Remove(Instance) > 0)
|
|
|
|
|
{
|
|
|
|
|
InstanceSelectionChangedDelegate.Broadcast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!DeselectedInstances.Contains(Instance))
|
|
|
|
|
{
|
|
|
|
|
DeselectedInstances.Add(Instance);
|
|
|
|
|
InstanceSelectionChangedDelegate.Broadcast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* FSessionManager implementation
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
void FSessionManager::FindExpiredSessions( const FDateTime& Now )
|
|
|
|
|
{
|
|
|
|
|
bool Dirty = false;
|
|
|
|
|
|
2014-10-17 19:14:57 -04:00
|
|
|
for (TMap<FGuid, TSharedPtr<FSessionInfo> >::TIterator It(Sessions); It; ++It)
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
|
|
|
|
if (Now > It.Value()->GetLastUpdateTime() + FTimespan::FromSeconds(10.0))
|
|
|
|
|
{
|
|
|
|
|
It.RemoveCurrent();
|
|
|
|
|
Dirty = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Dirty)
|
|
|
|
|
{
|
|
|
|
|
SessionsUpdatedDelegate.Broadcast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool FSessionManager::IsValidOwner( const FString& Owner )
|
|
|
|
|
{
|
2014-09-12 16:57:10 -04:00
|
|
|
if (Owner == FPlatformProcess::UserName(true))
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (int32 Index = 0; Index < FilteredOwners.Num(); ++Index)
|
|
|
|
|
{
|
|
|
|
|
if (FilteredOwners[Index] == Owner)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FSessionManager::RefreshSessions()
|
|
|
|
|
{
|
|
|
|
|
bool Dirty = false;
|
|
|
|
|
|
2014-10-17 19:14:57 -04:00
|
|
|
for (TMap<FGuid, TSharedPtr<FSessionInfo> >::TIterator It(Sessions); It; ++It)
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
|
|
|
|
if (!IsValidOwner(It.Value()->GetSessionOwner()))
|
|
|
|
|
{
|
|
|
|
|
It.RemoveCurrent();
|
|
|
|
|
|
|
|
|
|
Dirty = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Dirty)
|
|
|
|
|
{
|
|
|
|
|
SessionsUpdatedDelegate.Broadcast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-10-17 19:14:57 -04:00
|
|
|
void FSessionManager::SendPing()
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
|
|
|
|
if (MessageEndpoint.IsValid())
|
|
|
|
|
{
|
|
|
|
|
MessageEndpoint->Publish(new FEngineServicePing(), EMessageScope::Network);
|
|
|
|
|
MessageEndpoint->Publish(new FSessionServicePing(), EMessageScope::Network);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-29 15:56:45 -04:00
|
|
|
LastPingTime = FDateTime::UtcNow();
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-12-12 17:38:18 -05:00
|
|
|
/* FSessionManager callbacks
|
2014-03-14 14:13:41 -04:00
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
void FSessionManager::HandleEnginePongMessage( const FEngineServicePong& Message, const IMessageContextRef& Context )
|
|
|
|
|
{
|
|
|
|
|
if (!Message.SessionId.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// update instance
|
|
|
|
|
TSharedPtr<FSessionInfo> Session = Sessions.FindRef(Message.SessionId);
|
|
|
|
|
|
|
|
|
|
if (Session.IsValid())
|
|
|
|
|
{
|
|
|
|
|
Session->UpdateFromMessage(Message, Context);
|
2014-04-24 12:38:41 -04:00
|
|
|
SessionInstanceUpdatedDelegate.Broadcast();
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FSessionManager::HandleInstanceDiscovered( const ISessionInfoRef& Session, const ISessionInstanceInfoRef& Instance )
|
|
|
|
|
{
|
|
|
|
|
if (Session == SelectedSession)
|
|
|
|
|
{
|
|
|
|
|
InstanceSelectionChangedDelegate.Broadcast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FSessionManager::HandleLogReceived( const ISessionInfoRef& Session, const ISessionInstanceInfoRef& Instance, const FSessionLogMessageRef& Message )
|
|
|
|
|
{
|
|
|
|
|
if (Session == SelectedSession)
|
|
|
|
|
{
|
2014-12-12 17:38:18 -05:00
|
|
|
LogReceivedEvent.Broadcast(Session, Instance, Message);
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FSessionManager::HandleSessionPongMessage( const FSessionServicePong& Message, const IMessageContextRef& Context )
|
|
|
|
|
{
|
|
|
|
|
if (!Message.SessionId.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Message.Standalone && !IsValidOwner(Message.SessionOwner))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IMessageBusPtr MessageBus = MessageBusPtr.Pin();
|
|
|
|
|
|
|
|
|
|
if (!MessageBus.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// update session
|
|
|
|
|
TSharedPtr<FSessionInfo>& Session = Sessions.FindOrAdd(Message.SessionId);
|
|
|
|
|
|
|
|
|
|
if (Session.IsValid())
|
|
|
|
|
{
|
|
|
|
|
Session->UpdateFromMessage(Message, Context);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Session = MakeShareable(new FSessionInfo(Message.SessionId, MessageBus.ToSharedRef()));
|
|
|
|
|
Session->OnInstanceDiscovered().AddSP(this, &FSessionManager::HandleInstanceDiscovered);
|
|
|
|
|
Session->OnLogReceived().AddSP(this, &FSessionManager::HandleLogReceived);
|
|
|
|
|
Session->UpdateFromMessage(Message, Context);
|
|
|
|
|
|
|
|
|
|
SessionsUpdatedDelegate.Broadcast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool FSessionManager::HandleTicker( float DeltaTime )
|
|
|
|
|
{
|
2014-09-29 15:56:45 -04:00
|
|
|
FDateTime Now = FDateTime::UtcNow();
|
2014-03-14 14:13:41 -04:00
|
|
|
|
2014-09-29 15:56:45 -04:00
|
|
|
// @todo gmp: don't expire sessions for now
|
2014-03-14 14:13:41 -04:00
|
|
|
// FindExpiredSessions(Now);
|
|
|
|
|
|
|
|
|
|
if (Now >= LastPingTime + FTimespan::FromSeconds(2.5))
|
|
|
|
|
{
|
|
|
|
|
SendPing();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|