Files
UnrealEngineUWP/Engine/Source/Runtime/WebBrowser/Private/Native/NativeJSStructDeserializerBackend.cpp
josh adams 019c12863e - Merging Dev-Kairos/Engine/... to Main/Engine/...
- Brings over the necessary engine changes for embedding UE4 mobile as a dylib/so in native mobile app
- Various changes for facial animation, screen recording, others
- ARKit and ARCore plugins were removed, as deemed "not ready"
#rb many people

#ROBOMERGE-OWNER: ryan.vance
#ROBOMERGE-AUTHOR: josh.adams
#ROBOMERGE-SOURCE: CL 5201138 via CL 5203024 via CL 5226277
#ROBOMERGE-BOT: DEVVR (Main -> Dev-VR)

[CL 5244512 by josh adams in Dev-VR branch]
2019-02-28 17:06:02 -05:00

99 lines
2.7 KiB
C++

// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#include "NativeJSStructDeserializerBackend.h"
#include "NativeJSScripting.h"
#include "UObject/UnrealType.h"
#include "Templates/Casts.h"
namespace NativeFuncs
{
// @todo: this function is copied from CEFJSStructDeserializerBackend.cpp. Move shared utility code to a common header file
/**
* Sets the value of the given property.
*
* @param Property The property to set.
* @param Outer The property that contains the property to be set, if any.
* @param Data A pointer to the memory holding the property's data.
* @param ArrayIndex The index of the element to set (if the property is an array).
* @return true on success, false otherwise.
* @see ClearPropertyValue
*/
template<typename UPropertyType, typename PropertyType>
bool SetPropertyValue( UProperty* Property, UProperty* Outer, void* Data, int32 ArrayIndex, const PropertyType& Value )
{
PropertyType* ValuePtr = nullptr;
UArrayProperty* ArrayProperty = Cast<UArrayProperty>(Outer);
if (ArrayProperty != nullptr)
{
if (ArrayProperty->Inner != Property)
{
return false;
}
FScriptArrayHelper ArrayHelper(ArrayProperty, ArrayProperty->template ContainerPtrToValuePtr<void>(Data));
int32 Index = ArrayHelper.AddValue();
ValuePtr = (PropertyType*)ArrayHelper.GetRawPtr(Index);
}
else
{
UPropertyType* TypedProperty = Cast<UPropertyType>(Property);
if (TypedProperty == nullptr || ArrayIndex >= TypedProperty->ArrayDim)
{
return false;
}
ValuePtr = TypedProperty->template ContainerPtrToValuePtr<PropertyType>(Data, ArrayIndex);
}
if (ValuePtr == nullptr)
{
return false;
}
*ValuePtr = Value;
return true;
}
}
bool FNativeJSStructDeserializerBackend::ReadProperty( UProperty* Property, UProperty* Outer, void* Data, int32 ArrayIndex )
{
switch (GetLastNotation())
{
case EJsonNotation::String:
{
if (Property->IsA<UStructProperty>())
{
UStructProperty* StructProperty = Cast<UStructProperty>(Property);
if ( StructProperty->Struct == FWebJSFunction::StaticStruct())
{
FGuid CallbackID;
if (!FGuid::Parse(GetReader()->GetValueAsString(), CallbackID))
{
return false;
}
FWebJSFunction CallbackObject(Scripting, CallbackID);
return NativeFuncs::SetPropertyValue<UStructProperty, FWebJSFunction>(Property, Outer, Data, ArrayIndex, CallbackObject);
}
}
}
break;
}
// If we reach this, default to parent class behavior
return FJsonStructDeserializerBackend::ReadProperty(Property, Outer, Data, ArrayIndex);
}
FNativeJSStructDeserializerBackend::FNativeJSStructDeserializerBackend(FNativeJSScriptingRef InScripting, FMemoryReader& Reader)
: FJsonStructDeserializerBackend(Reader)
, Scripting(InScripting)
{
}