Handler registration overhaul
This commit is contained in:
@@ -265,7 +265,7 @@ FString UWingServer::HandleRequest(const FString& Line)
|
||||
LogCapture.bEnabled = true;
|
||||
HandlerOutput.Reset();
|
||||
SuggestedManualSections.Empty();
|
||||
LastHandlerClass = nullptr;
|
||||
LastHandler = nullptr;
|
||||
|
||||
TryCallHandler(Line);
|
||||
|
||||
@@ -279,7 +279,7 @@ FString UWingServer::HandleRequest(const FString& Line)
|
||||
if (!SuggestedManualSections.IsEmpty())
|
||||
{
|
||||
UWingServer::SuggestManual(WingManual::Section::HandlerHelp);
|
||||
WingManual::PrintManual(SuggestedManualSections, LastHandlerClass, true);
|
||||
WingManual::PrintManual(SuggestedManualSections, LastHandler, true);
|
||||
}
|
||||
FString Result = HandlerOutput.ToString();
|
||||
HandlerOutput.Reset();
|
||||
@@ -312,19 +312,20 @@ void UWingServer::TryCallHandler(const FString &Line)
|
||||
}
|
||||
Request->RemoveField(TEXT("command"));
|
||||
|
||||
// Find the handler UClass for the specified command.
|
||||
TObjectPtr<UClass>* HandlerClass = WingHandlerRegistry.Find(Command);
|
||||
if (!HandlerClass)
|
||||
// Find the handler for the specified command.
|
||||
FWingHandlerConfig* Found = FindHandler(Command);
|
||||
if (!Found)
|
||||
{
|
||||
UWingServer::Printf(TEXT("Unknown command: %s"), *Command);
|
||||
UWingServer::SuggestManual(WingManual::Section::ImportantCommands);
|
||||
return;
|
||||
}
|
||||
LastHandlerClass = *HandlerClass;
|
||||
LastHandler = Found;
|
||||
|
||||
// Make an object of the handler class.
|
||||
TStrongObjectPtr<UObject> HandlerObj(NewObject<UObject>(GetTransientPackage(), *HandlerClass));
|
||||
IWingHandler* Handler = Cast<IWingHandler>(HandlerObj.Get());
|
||||
TStrongObjectPtr<UObject> HandlerObj(NewObject<UObject>(GetTransientPackage(), Found->Class.Get()));
|
||||
UWingHandler* Handler = Cast<UWingHandler>(HandlerObj.Get());
|
||||
Handler->ConfigurationObject = Found->Config.Get();
|
||||
|
||||
// Populate the handler object with the request parameters.
|
||||
if (!FWingProperty::PopulateFromJson(HandlerObj->GetClass(), HandlerObj.Get(), &*Request))
|
||||
@@ -451,10 +452,39 @@ void UWingServer::ClientThreadFunc(UWingServer* Server, TSharedPtr<FClientConnec
|
||||
// BuildWingHandlerRegistry
|
||||
// ============================================================
|
||||
|
||||
void UWingHandler::Register(UWingServer* Server)
|
||||
{
|
||||
UClass* Class = GetClass();
|
||||
Server->AddHandler(WingUtils::GetHandlerName(Class), Class, nullptr, EWingHandlerKind::Normal);
|
||||
}
|
||||
|
||||
void UWingServer::AddHandler(const FString& Name, UClass* Class, UObject* Config, EWingHandlerKind Kind)
|
||||
{
|
||||
FWingHandlerConfig H;
|
||||
H.Name = Name;
|
||||
H.Class = TStrongObjectPtr<UClass>(Class);
|
||||
H.Config = TStrongObjectPtr<UObject>(Config);
|
||||
H.Kind = Kind;
|
||||
|
||||
WingHandlerRegistry.Add(MoveTemp(H));
|
||||
}
|
||||
|
||||
void UWingServer::BuildWingHandlerRegistry()
|
||||
{
|
||||
for (UClass* Class : WingUtils::CollectHandlerClasses())
|
||||
{
|
||||
WingHandlerRegistry.FindOrAdd(WingUtils::GetHandlerName(Class)) = Class;
|
||||
UWingHandler* CDO = Cast<UWingHandler>(Class->GetDefaultObject());
|
||||
CDO->Register(this);
|
||||
}
|
||||
WingHandlerRegistry.Sort([](const FWingHandlerConfig& A, const FWingHandlerConfig& B) { return A.Name < B.Name; });
|
||||
}
|
||||
|
||||
FWingHandlerConfig* UWingServer::FindHandler(const FString& Name)
|
||||
{
|
||||
int32 Index = Algo::LowerBoundBy(WingHandlerRegistry, Name, [](const FWingHandlerConfig& H) { return H.Name; });
|
||||
if (Index < WingHandlerRegistry.Num() && WingHandlerRegistry[Index].Name == Name)
|
||||
{
|
||||
return &WingHandlerRegistry[Index];
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user