Skip to content

Commit 53b940a

Browse files
committed
release 1.4.0
1 parent 100e6dd commit 53b940a

66 files changed

Lines changed: 1737 additions & 267 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
# host project build artifacts
22
/Engine/
33
/Saved/
4+
# misc stuff copied in here
5+
/Tmp/

DataConfig/DataConfig.uplugin

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"Version" : 1,
44
"VersionName" : "1.0",
55
"FriendlyName" : "Data Config",
6-
"Description" : "Serialization framework for Unreal Engine Property System that just works!",
6+
"Description" : "Serialization framework for Unreal Engine that just works!",
77
"Category" : "Editor",
88
"SupportURL" : "",
99
"EnabledByDefault" : true,
@@ -31,6 +31,16 @@
3131
"Type": "Editor",
3232
"LoadingPhase": "Default"
3333
},
34+
{
35+
"Name": "DataConfigTests5",
36+
"Type": "Editor",
37+
"LoadingPhase": "Default"
38+
},
39+
{
40+
"Name": "DataConfigEditorExtra5",
41+
"Type": "Editor",
42+
"LoadingPhase": "Default"
43+
}
3444
],
3545
"Plugins": [
3646
{
@@ -40,6 +50,10 @@
4050
{
4151
"Name": "SQLiteCore",
4252
"Enabled": true
53+
},
54+
{
55+
"Name": "StructUtils",
56+
"Enabled": true
4357
}
4458
]
4559
}

DataConfig/DataConfig4.uplugin

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"FileVersion" : 3,
3+
"Version" : 1,
4+
"VersionName" : "1.0",
5+
"FriendlyName" : "Data Config UE4",
6+
"Description" : "Serialization framework for Unreal Engine that just works!",
7+
"Category" : "Editor",
8+
"SupportURL" : "",
9+
"EnabledByDefault" : true,
10+
"CanContainContent" : true,
11+
"IsBetaVersion" : false,
12+
"Installed" : false,
13+
"Modules": [
14+
{
15+
"Name": "DataConfigCore",
16+
"Type": "Editor",
17+
"LoadingPhase": "None"
18+
},
19+
{
20+
"Name": "DataConfigExtra",
21+
"Type": "Editor",
22+
"LoadingPhase": "Default"
23+
},
24+
{
25+
"Name": "DataConfigTests",
26+
"Type": "Editor",
27+
"LoadingPhase": "Default"
28+
},
29+
{
30+
"Name": "DataConfigEditorExtra",
31+
"Type": "Editor",
32+
"LoadingPhase": "Default"
33+
}
34+
],
35+
"Plugins": [
36+
{
37+
"Name": "GameplayAbilities",
38+
"Enabled": true
39+
},
40+
{
41+
"Name": "SQLiteCore",
42+
"Enabled": true
43+
}
44+
]
45+
}

DataConfig/Source/DataConfigCore/Private/DataConfig/Automation/DcAutomation.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ bool FDcAutomationBase::TestOk(const FString& Description, const FDcResult& Resu
5656
return TestOk(*Description, Result);
5757
}
5858

59-
bool FDcAutomationBase::TestDiagnostic(const TCHAR* Description, const FDcResult& Result, uint16 Category, uint16 Code)
59+
bool FDcAutomationBase::TestDiagnosticImpl(const TCHAR* Description, const FDcResult& Result, uint16 Category, uint16 Code)
6060
{
6161
if (Result.Ok())
6262
{
@@ -87,6 +87,15 @@ bool FDcAutomationBase::TestDiagnostic(const TCHAR* Description, const FDcResult
8787
return true;
8888
}
8989

90+
bool FDcAutomationBase::TestDiagnostic(const TCHAR* Description, const FDcResult& Result, uint16 Category, uint16 Code)
91+
{
92+
bool bOk = TestDiagnosticImpl(Description, Result, Category, Code);
93+
#if DO_CHECK
94+
if (!bOk) UE_DEBUG_BREAK();
95+
#endif
96+
return bOk;
97+
}
98+
9099
bool FDcAutomationBase::TestDiagnostic(const FString& Description, const FDcResult& Result, uint16 Category, uint16 Code)
91100
{
92101
return TestDiagnostic(*Description, Result, Category, Code);

DataConfig/Source/DataConfigCore/Private/DataConfig/Automation/DcAutomationUtils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "DataConfig/Diagnostic/DcDiagnosticReadWrite.h"
99
#include "DataConfig/DcCorePrivate.h"
1010
#include "DataConfig/Source/DcSourceUtils.h"
11+
#include "DataConfig/SerDe/DcSerDeUtils.h"
1112

1213
namespace DcAutomationUtils
1314
{
@@ -861,7 +862,7 @@ FString DcReindentStringLiteral(FString Str, FString* Prefix)
861862
void FDcDebug::DumpStruct(char* StructNameChars, void* Ptr)
862863
{
863864
FString StructNameStr(StructNameChars);
864-
UScriptStruct* LoadStruct = FindObject<UScriptStruct>(ANY_PACKAGE, *StructNameStr, true);
865+
UScriptStruct* LoadStruct = DcSerDeUtils::FindFirstObject<UScriptStruct>(*StructNameStr, true);
865866
if (LoadStruct == nullptr)
866867
{
867868
FPlatformMisc::LowLevelOutputDebugString(*FString::Printf(TEXT("- DcDebug DumpStruct: Failed to find struct '%s'"), *StructNameStr));

DataConfig/Source/DataConfigCore/Private/DataConfig/Diagnostic/DcDiagnosticReadWrite.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static FDcDiagnosticDetail _ReadWriteDetails[] = {
3434
{ ReaderCastExpect, TEXT("Reader cast failed. Expected '{0}, Actual '{1}'") },
3535
{ WriterCastExpect, TEXT("Writer cast failed. Expected '{0}, Actual '{1}'") },
3636
{ PeekNoContainerProperty, TEXT("Property Reader/Writer has no container property, Actual: '{0}'"), },
37+
{ WriteObjectReferenceDoNotAcceptNull, TEXT("FPropertyWriter::WriteObjectReference() don't accept nullptr. You should use WriteNil() instead."), },
3738

3839
// putback reader
3940
{ CantUsePutbackValue, TEXT("Cannot use putback value in '{0}'") },

DataConfig/Source/DataConfigCore/Private/DataConfig/Diagnostic/DcDiagnosticSerDe.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ struct FDcDiagnosticDetail _DeserializeDetails[] = {
4646
{ ClassExpectNonAbstract, TEXT("Expect class to be non abstract but failed, Class: '{0}'"), },
4747
{ ClassLhsIsNotChildOfRhs, TEXT("Class '{0}' is not child of '{1}'") },
4848

49+
// Struct
50+
{ StructLhsIsNotChildOfRhs, TEXT("Struct '{0}' is not child of '{1}'") },
51+
4952
// Pipe
5053
{ PipeUnhandledEnded, TEXT("Pipe visit can't handle Ended") },
5154
{ PipeUnhandledExtension, TEXT("Pipe visit can't handle Extension") },

DataConfig/Source/DataConfigCore/Private/DataConfig/Json/DcJsonReader.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,25 +1161,25 @@ FDcResult TDcJsonReader<CharType>::ConsumeRawToken()
11611161
return _ConsumeSingleCharToken(ETokenType::Comma);
11621162
case CharType('t'):
11631163
{
1164-
const static CharType _TRUE[] = { 't','r','u','e',0 };
1164+
const static CharType _TRUE[] = { 't','r','u','e', };
11651165

1166-
DC_TRY(ReadWordExpect(_TRUE));
1166+
DC_TRY(ReadWordExpect(_TRUE, DcDimOf(_TRUE)));
11671167
Token.Type = ETokenType::True;
11681168
return DcOk();
11691169
}
11701170
case CharType('f'):
11711171
{
1172-
const static CharType _FALSE[] = { 'f','a','l','s','e',0 };
1172+
const static CharType _FALSE[] = { 'f','a','l','s','e', };
11731173

1174-
DC_TRY(ReadWordExpect(_FALSE));
1174+
DC_TRY(ReadWordExpect(_FALSE, DcDimOf(_FALSE)));
11751175
Token.Type = ETokenType::False;
11761176
return DcOk();
11771177
}
11781178
case CharType('n'):
11791179
{
1180-
const static CharType _NULL[] = { 'n','u','l','l',0 };
1180+
const static CharType _NULL[] = { 'n','u','l','l', };
11811181

1182-
DC_TRY(ReadWordExpect(_NULL));
1182+
DC_TRY(ReadWordExpect(_NULL, DcDimOf(_NULL)));
11831183
Token.Type = ETokenType::Null;
11841184
return DcOk();
11851185
}
@@ -1266,9 +1266,8 @@ CharType TDcJsonReader<CharType>::PeekChar(int N)
12661266
}
12671267

12681268
template<typename CharType>
1269-
FDcResult TDcJsonReader<CharType>::ReadWordExpect(const CharType* Word)
1269+
FDcResult TDcJsonReader<CharType>::ReadWordExpect(const CharType* Word, int32 WordLen)
12701270
{
1271-
int32 WordLen = CString::Strlen(Word);
12721271
SourceRef WordRef = Token.Ref;
12731272
WordRef.Begin = Cur;
12741273
WordRef.Num = WordLen;

DataConfig/Source/DataConfigCore/Private/DataConfig/Property/DcPropertyWriteStates.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ FDcResult FDcWriteStateStruct::PeekWriteProperty(FDcPropertyWriter* Parent, FFie
160160
else if (State == EState::ExpectValue)
161161
{
162162
return ReadOutOk(OutProperty, Property);
163-
164163
}
165164
else
166165
{
@@ -454,6 +453,9 @@ FDcResult FDcWriteStateClass::WriteObjectReference(FDcPropertyWriter* Parent, co
454453
{
455454
if (State == EState::ExpectReference)
456455
{
456+
if (Value == nullptr)
457+
return DC_FAIL(DcDReadWrite, WriteObjectReferenceDoNotAcceptNull);
458+
457459
// `FObjectProperty::SetObjectPropertyValue` not taking const pointer
458460
ClassObject = const_cast<UObject*>(Value);
459461
Datum.CastFieldChecked<FObjectProperty>()->SetObjectPropertyValue(Datum.DataPtr, const_cast<UObject*>(Value));

DataConfig/Source/DataConfigCore/Private/DataConfig/SerDe/DcSerDeUtils.cpp

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "DataConfig/Property/DcPropertyWriter.h"
77
#include "DataConfig/SerDe/DcSerDeUtils.inl"
88

9+
#include "Misc/EngineVersionComparison.h"
10+
911
namespace DcSerDeUtils {
1012

1113
bool IsMeta(const FString& Str)
@@ -28,6 +30,61 @@ FDcResult DispatchPipeVisit(EDcDataEntry Next, FDcReader* Reader, FDcWriter* Wri
2830
return DcPipe_Dispatch(Next, Reader, Writer);
2931
}
3032

33+
34+
UObject* StaticFindFirstObject(UClass* Class, const TCHAR* Name, bool bExactClass)
35+
{
36+
#if UE_VERSION_OLDER_THAN(5, 1, 0)
37+
UObject* Ret = StaticFindObject(Class, ANY_PACKAGE, Name, bExactClass);
38+
#else
39+
UObject* Ret = StaticFindFirstObject(Class, Name,
40+
EFindFirstObjectOptions::NativeFirst |
41+
(bExactClass ? EFindFirstObjectOptions::ExactClass : EFindFirstObjectOptions::None)
42+
);
43+
#endif
44+
return Ret;
45+
}
46+
47+
FDcResult TryStaticFindFirstObject(UClass* Class, const TCHAR* Name, bool bExactClass, UObject*& OutObject)
48+
{
49+
UObject* Ret = DcSerDeUtils::StaticFindFirstObject(Class, Name, bExactClass);
50+
if (!Ret)
51+
{
52+
return DC_FAIL(DcDSerDe, UObjectByStrNotFound) << Class->GetFName() << Name;
53+
}
54+
else
55+
{
56+
OutObject = Ret;
57+
return DcOk();
58+
}
59+
}
60+
61+
FDcResult TryStaticFindObject(UClass* Class, const FName& PackageName, const FName& AssetName, bool ExactClass, UObject*& OutObject)
62+
{
63+
#if UE_VERSION_OLDER_THAN(5, 1, 0)
64+
UObject* Ret = nullptr;
65+
if (!AssetName.IsNone())
66+
{
67+
UObject* Package = StaticFindObjectFast(UPackage::StaticClass(), nullptr, PackageName);
68+
if (Package)
69+
{
70+
Ret = StaticFindObjectFast(Class, Package, AssetName, ExactClass);
71+
}
72+
}
73+
#else
74+
UObject* Ret = StaticFindObject(Class, FTopLevelAssetPath{PackageName, AssetName}, ExactClass);
75+
#endif
76+
77+
if (!Ret)
78+
{
79+
return DC_FAIL(DcDSerDe, UObjectByStrNotFound) << Class->GetFName() << AssetName;
80+
}
81+
else
82+
{
83+
OutObject = Ret;
84+
return DcOk();
85+
}
86+
}
87+
3188
FDcResult TryStaticFindObject(UClass* Class, UObject* Outer, const TCHAR* Name, bool ExactClass, UObject*& OutObject)
3289
{
3390
check(Class);
@@ -58,14 +115,14 @@ FDcResult TryStaticLoadObject(UClass* Class, UObject* Outer, const TCHAR* LoadPa
58115
}
59116
}
60117

61-
FDcResult TryStaticLocateObject(UClass* Class, const FString& Str, UObject*& OutObject)
118+
FDcResult TryStaticLocateObject(UClass* Class, FStringView Str, UObject*& OutObject)
62119
{
63120
if (Str.StartsWith(TEXT("/")))
64121
{
65122
// /Game/Path/To/Object
66123
// `Game` is a Mount Point, and there's no `.uasset` suffix
67124
UObject* Loaded;
68-
DC_TRY(DcSerDeUtils::TryStaticLoadObject(Class, nullptr, *Str, Loaded));
125+
DC_TRY(DcSerDeUtils::TryStaticLoadObject(Class, nullptr, Str.GetData(), Loaded));
69126

70127
OutObject = Loaded;
71128
return DcOk();
@@ -76,10 +133,10 @@ FDcResult TryStaticLocateObject(UClass* Class, const FString& Str, UObject*& Out
76133
{
77134
// '/Foo/Bar'
78135
// single quoted name, it's object name starting with '/'
79-
FString Unquoted = Str.Mid(1, Str.Len() - 2);
136+
// note that need to use the quoted name to find
80137

81138
UObject* Loaded;
82-
DC_TRY(DcSerDeUtils::TryStaticFindObject(Class, ANY_PACKAGE, *Str, false, Loaded));
139+
DC_TRY(DcSerDeUtils::TryStaticFindFirstObject(Class, Str.GetData(), false, Loaded));
83140

84141
OutObject = Loaded;
85142
return DcOk();
@@ -89,7 +146,7 @@ FDcResult TryStaticLocateObject(UClass* Class, const FString& Str, UObject*& Out
89146
// Foo
90147
// try find by name
91148
UObject* Loaded;
92-
DC_TRY(DcSerDeUtils::TryStaticFindObject(Class, ANY_PACKAGE, *Str, false, Loaded));
149+
DC_TRY(DcSerDeUtils::TryStaticFindFirstObject(Class, Str.GetData(), false, Loaded));
93150

94151
OutObject = Loaded;
95152
return DcOk();

0 commit comments

Comments
 (0)