NativeInterfaceJSStructDeserializerBackend.cpp
2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Engine/Source/Runtime/WebBrowser/Private/Native/NativeJSStructDeserializerBackend.cpp
#include "NativeInterfaceJSStructDeserializerBackend.h"
#include "NativeInterfaceJSScripting.h"
#include "UObject/UnrealType.h"
#include "Templates/Casts.h"
namespace NativeInterfaceFuncs
{
// @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 FPropertyType, typename PropertyType>
bool SetPropertyValue( FProperty* Property, FProperty* Outer, void* Data, int32 ArrayIndex, const PropertyType& Value )
{
PropertyType* ValuePtr = nullptr;
FArrayProperty* ArrayProperty = CastField<FArrayProperty>(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
{
FPropertyType* TypedProperty = CastField<FPropertyType>(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 FNativeInterfaceJSStructDeserializerBackend::ReadProperty( FProperty* Property, FProperty* Outer, void* Data, int32 ArrayIndex )
{
switch (GetLastNotation())
{
case EJsonNotation::String:
{
if (Property->IsA<FStructProperty>())
{
FStructProperty* StructProperty = CastField<FStructProperty>(Property);
if ( StructProperty->Struct == FWebInterfaceJSFunction::StaticStruct())
{
FGuid CallbackID;
if (!FGuid::Parse(GetReader()->GetValueAsString(), CallbackID))
{
return false;
}
FWebInterfaceJSFunction CallbackObject(Scripting, CallbackID);
return NativeInterfaceFuncs::SetPropertyValue<FStructProperty, FWebInterfaceJSFunction>(Property, Outer, Data, ArrayIndex, CallbackObject);
}
}
}
break;
}
// If we reach this, default to parent class behavior
return FJsonStructDeserializerBackend::ReadProperty(Property, Outer, Data, ArrayIndex);
}
FNativeInterfaceJSStructDeserializerBackend::FNativeInterfaceJSStructDeserializerBackend(FNativeInterfaceJSScriptingRef InScripting, FMemoryReader& Reader)
: FJsonStructDeserializerBackend(Reader)
, Scripting(InScripting)
{
}