// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "IMessageContext.h" #include "ITraceController.h" #include "MessageEndpoint.h" #include "TraceControllerCommands.h" #include "TraceControlMessages.h" struct FTraceControlSettings; struct FTraceControlStatus; struct FTraceControlDiscovery; class IMessageBus; class FMessageEndpoint; /** * Interface to control other sessions tracing. */ class FTraceController : public ITraceController { public: FTraceController(const TSharedRef& InMessageBus); virtual ~FTraceController() override; private: virtual void SendDiscoveryRequest(const FGuid& SessionId, const FGuid& InstanceId) const override; virtual void SendDiscoveryRequest() override; virtual void SendStatusUpdateRequest() override; virtual void SendChannelUpdateRequest() override; virtual void SendSettingsUpdateRequest() override; virtual bool HasAvailableInstance(const FGuid& InstanceId) override; virtual void WithInstance(FGuid InstanceId, FCallback Func) override; DECLARE_DERIVED_EVENT(FTraceController, ITraceController::FStatusRecievedEvent, FStatusRecievedEvent); virtual FStatusRecievedEvent& OnStatusReceived() override { return StatusReceivedEvent; } /* Message handlers */ void OnNotification(const FMessageBusNotification& MessageBusNotification); void OnDiscoveryResponse(const FTraceControlDiscovery& Message, const TSharedRef& Context); void OnStatus(const FTraceControlStatus& Message, const TSharedRef& Context); void OnChannelsDesc(const FTraceControlChannelsDesc& Message, const TSharedRef& Context); void OnChannelsStatus(const FTraceControlChannelsStatus& Message, const TSharedRef& Context); void OnSettings(const FTraceControlSettings& Message, const TSharedRef& Context); static void UpdateStatus(const FTraceControlStatus& Message, FTraceStatus& Status); private: struct FTracingInstance { FTraceStatus Status; FTraceControllerCommands Commands; FTracingInstance(const TSharedRef& InMessageBus, FMessageAddress Service); FTracingInstance() = delete; }; /** * Needed to create command instances when new sessions are discovered. We don't need a ref counted * pointer to the message bus. */ TWeakPtr MessageBus; /** Our own endpoint for messages */ TSharedPtr MessageEndpoint; /** Address of the runtime endpoint for trace controls */ FMessageAddress TraceControlAddress; /** Event for status updates on any session */ FStatusRecievedEvent StatusReceivedEvent; /** Lock to protect access to Instances list */ FRWLock InstancesLock; /** Known instances with an active trace service */ TMap Instances; /** Secondary lookup from instance -> address */ TMap InstanceToAddress; };