83 lines
3.1 KiB
C
83 lines
3.1 KiB
C
|
|
// 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<FJsonObject> ParseJsonFromRequest(const FHttpServerRequest& Request);
|
|||
|
|
FString CreateSuccessResponse(const FString& Message = TEXT("Success"));
|
|||
|
|
FString CreateErrorResponse(const FString& Error, int32 Code = 400);
|
|||
|
|
|
|||
|
|
bool ParseTitleData(const TSharedPtr<FJsonObject>& JsonObject, FDTFluxRemoteTitleData& OutData);
|
|||
|
|
bool ParseTitleBibData(const TSharedPtr<FJsonObject>& JsonObject, FDTFluxRemoteBibData& OutData);
|
|||
|
|
bool ParseCommandData(const TSharedPtr<FJsonObject>& JsonObject, FDTFluxRemoteCommandData& OutData);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
TSharedPtr<IHttpRouter> HttpRouter;
|
|||
|
|
int32 ServerPort = 63350;
|
|||
|
|
bool bServerRunning = false;
|
|||
|
|
|
|||
|
|
FHttpRouteHandle TitleRouteHandle;
|
|||
|
|
FHttpRouteHandle TitleBibRouteHandle;
|
|||
|
|
FHttpRouteHandle CommandsRouteHandle;
|
|||
|
|
};
|