// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Subsystems/EngineSubsystem.h" #include "DTFluxRemoteMessage.h" #include "HttpRouteHandle.h" #include "IHttpRouter.h" #include "DTFluxRemoteSubsystem.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnTitleReceived, const FDTFluxRemoteTitleData&, TitleData); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnTitleBibReceived, const FDTFluxRemoteBibData&, TitleBibData); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnCommandReceived, const FDTFluxRemoteCommandData&, CommandData); /** * */ UCLASS(BlueprintType, Category="DTFlux|Remote") class DTFLUXREMOTE_API UDTFluxRemoteSubsystem : public UEngineSubsystem { GENERATED_BODY() public: public: virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; UPROPERTY(BlueprintAssignable, Category = "DTFlux API") FOnTitleReceived OnTitleReceived; UPROPERTY(BlueprintAssignable, Category = "DTFlux API") FOnTitleBibReceived OnTitleBibReceived; UPROPERTY(BlueprintAssignable, Category = "DTFlux API") FOnCommandReceived OnCommandReceived; UFUNCTION(BlueprintCallable, Category = "DTFlux API") bool StartHTTPServer(int32 Port = 63350); UFUNCTION(BlueprintCallable, Category = "DTFlux API") void StopHTTPServer(); UFUNCTION(BlueprintCallable, Category = "DTFlux API", BlueprintPure) bool IsHTTPServerRunning() const; UFUNCTION(BlueprintCallable, Category = "DTFlux API", BlueprintPure) int32 GetServerPort() const { return ServerPort; } // Manual data processing (for testing) UFUNCTION(BlueprintCallable, Category = "DTFlux API") bool ProcessTitleData(const FString& JsonString); UFUNCTION(BlueprintCallable, Category = "DTFlux API") bool ProcessTitleBibData(const FString& JsonString); UFUNCTION(BlueprintCallable, Category = "DTFlux API") bool ProcessCommandData(const FString& JsonString); private: void SetupRoutes(); bool HandleTitleRequest(const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete); bool HandleTitleBibRequest(const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete); bool HandleCommandsRequest(const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete); TSharedPtr ParseJsonFromRequest(const FHttpServerRequest& Request); FString CreateSuccessResponse(const FString& Message = TEXT("Success")); FString CreateErrorResponse(const FString& Error, int32 Code = 400); bool ParseTitleData(const TSharedPtr& JsonObject, FDTFluxRemoteTitleData& OutData); bool ParseTitleBibData(const TSharedPtr& JsonObject, FDTFluxRemoteBibData& OutData); bool ParseCommandData(const TSharedPtr& JsonObject, FDTFluxRemoteCommandData& OutData); private: TSharedPtr HttpRouter; int32 ServerPort = 63350; bool bServerRunning = false; FHttpRouteHandle TitleRouteHandle; FHttpRouteHandle TitleBibRouteHandle; FHttpRouteHandle CommandsRouteHandle; };