// Copyright Epic Games, Inc. All Rights Reserved. #include "SessionInfo.h" #include "EngineServiceMessages.h" #include "SessionServiceMessages.h" #include "SessionInstanceInfo.h" /* FSessionInfo structors *****************************************************************************/ FSessionInfo::FSessionInfo(const FGuid& InSessionId, const TSharedRef& InMessageBus) : MessageBusPtr(InMessageBus) , SessionId(InSessionId) { } /* FSessionInfo interface *****************************************************************************/ void FSessionInfo::UpdateFromMessage(const FEngineServicePong& Message, const TSharedRef& Context) { if (Message.SessionId != SessionId) { return; } // update instance // @todo gmp: reconsider merging EngineService and SessionService /*TSharedPtr Instance = Instances.FindRef(Context->GetSender()); if (Instance.IsValid()) { Instance->UpdateFromMessage(Message, Context); }*/ for (TMap >::TIterator It(Instances); It; ++It) { if (It.Value()->GetInstanceId() == Message.InstanceId) { It.Value()->UpdateFromMessage(Message, Context); break; } } } void FSessionInfo::UpdateFromMessage(const FSessionServicePong& Message, const TSharedRef& Context) { if (Message.SessionId != SessionId) { return; } // update session info Standalone = Message.Standalone; SessionOwner = Message.SessionOwner; SessionName = Message.SessionName; // update instance TSharedPtr& Instance = Instances.FindOrAdd(Context->GetSender()); if (Instance.IsValid()) { Instance->UpdateFromMessage(Message, Context); } else { auto MessageBus = MessageBusPtr.Pin(); if (MessageBus.IsValid()) { Instance = MakeShareable(new FSessionInstanceInfo(Message.InstanceId, AsShared(), MessageBus.ToSharedRef())); Instance->OnLogReceived().AddSP(this, &FSessionInfo::HandleLogReceived); Instance->UpdateFromMessage(Message, Context); InstanceDiscoveredEvent.Broadcast(AsShared(), Instance.ToSharedRef()); } } LastUpdateTime = FDateTime::UtcNow(); } /* ISessionInfo interface *****************************************************************************/ void FSessionInfo::GetInstances(TArray>& OutInstances) const { OutInstances.Empty(); for (TMap >::TConstIterator It(Instances); It; ++It) { OutInstances.Add(It.Value()); } } const FDateTime& FSessionInfo::GetLastUpdateTime() const { return LastUpdateTime; } const int32 FSessionInfo::GetNumInstances() const { return Instances.Num(); } const FGuid& FSessionInfo::GetSessionId() const { return SessionId; } const FString& FSessionInfo::GetSessionName() const { return SessionName; } const FString& FSessionInfo::GetSessionOwner() const { return SessionOwner; } const bool FSessionInfo::IsStandalone() const { return Standalone; } void FSessionInfo::Terminate() { for (TMap >::TIterator It(Instances); It; ++It) { It.Value()->Terminate(); } } /* FSessionInfo callbacks *****************************************************************************/ void FSessionInfo::HandleLogReceived(const TSharedRef& Instance, const TSharedRef& LogMessage) { LogReceivedEvent.Broadcast(AsShared(), Instance, LogMessage); }