58 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | #include "CSBindsManager.h"
 | ||
|  | #include "UnrealSharpBinds.h"
 | ||
|  | 
 | ||
|  | FCSBindsManager* FCSBindsManager::BindsManagerInstance = nullptr; | ||
|  | 
 | ||
|  | FCSBindsManager* FCSBindsManager::Get() | ||
|  | { | ||
|  | 	if (!BindsManagerInstance) | ||
|  | 	{ | ||
|  | 		BindsManagerInstance = new FCSBindsManager(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return BindsManagerInstance; | ||
|  | } | ||
|  | 
 | ||
|  | void FCSBindsManager::RegisterExportedFunction(const FName& ClassName, const FCSExportedFunction& ExportedFunction) | ||
|  | { | ||
|  | 	FCSBindsManager* Instance = Get(); | ||
|  | 	TArray<FCSExportedFunction>& ExportedFunctions = Instance->ExportedFunctionsMap.FindOrAdd(ClassName); | ||
|  | 	ExportedFunctions.Add(ExportedFunction); | ||
|  | } | ||
|  | 
 | ||
|  | void* FCSBindsManager::GetBoundFunction(const TCHAR* InOuterName, const TCHAR* InFunctionName, int32 ManagedFunctionSize) | ||
|  | { | ||
|  | 	TRACE_CPUPROFILER_EVENT_SCOPE(UCSBindsManager::GetBoundFunction); | ||
|  | 	 | ||
|  | 	FCSBindsManager* Instance = Get(); | ||
|  | 	FName ManagedOuterName = FName(InOuterName); | ||
|  | 	FName ManagedFunctionName = FName(InFunctionName); | ||
|  | 	 | ||
|  | 	TArray<FCSExportedFunction>* ExportedFunctions = Instance->ExportedFunctionsMap.Find(ManagedOuterName); | ||
|  | 
 | ||
|  | 	if (!ExportedFunctions) | ||
|  | 	{ | ||
|  | 		UE_LOG(LogUnrealSharpBinds, Error, TEXT("Failed to get BoundNativeFunction: No exported functions found for %s"), InOuterName); | ||
|  | 		return nullptr; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	for (FCSExportedFunction& NativeFunction : *ExportedFunctions) | ||
|  | 	{ | ||
|  | 		if (NativeFunction.Name != ManagedFunctionName) | ||
|  | 		{ | ||
|  | 			continue; | ||
|  | 		} | ||
|  | 			 | ||
|  | 		if (NativeFunction.Size != ManagedFunctionSize) | ||
|  | 		{ | ||
|  | 			UE_LOG(LogUnrealSharpBinds, Error, TEXT("Failed to get BoundNativeFunction: Function size mismatch for %s::%s."), InOuterName, InFunctionName); | ||
|  | 			return nullptr; | ||
|  | 		} | ||
|  | 			 | ||
|  | 		return NativeFunction.FunctionPointer; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	UE_LOG(LogUnrealSharpBinds, Error, TEXT("Failed to get BoundNativeFunction: No function found for %s.%s"), *ManagedOuterName.ToString(), *ManagedFunctionName.ToString()); | ||
|  | 	return nullptr; | ||
|  | } |