Skip to content

Commit 0418c96

Browse files
committed
Added serialisation of enums.
1 parent 83073af commit 0418c96

File tree

5 files changed

+90
-18
lines changed

5 files changed

+90
-18
lines changed

ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public partial class ReClassNetFile
1616
public const string XmlRootElement = "reclass";
1717
public const string XmlCustomDataElement = "custom_data";
1818
public const string XmlTypeMappingElement = "type_mapping";
19+
public const string XmlEnumsElement = "enums";
20+
public const string XmlEnumElement = "enum";
1921
public const string XmlClassesElement = "classes";
2022
public const string XmlClassElement = "class";
2123
public const string XmlNodeElement = "node";
@@ -32,6 +34,10 @@ public partial class ReClassNetFile
3234
public const string XmlCountAttribute = "count";
3335
public const string XmlBitsAttribute = "bits";
3436
public const string XmlLengthAttribute = "length";
37+
public const string XmlSizeAttribute = "size";
3538
public const string XmlSignatureAttribute = "signature";
39+
public const string XmlFlagsAttribute = "flags";
40+
public const string XmlItemElement = "item";
41+
public const string XmlValueAttribute = "value";
3642
}
3743
}

ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,57 @@ public void Load(Stream input, ILogger logger)
6767
project.TypeMapping.Deserialize(typeMappingElement);
6868
}
6969

70-
var classes = new List<Tuple<XElement, ClassNode>>();
71-
72-
foreach (var element in document.Root
73-
.Element(XmlClassesElement)
74-
.Elements(XmlClassElement)
75-
.DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value))
70+
var enumsElement = document.Root.Element(XmlEnumsElement);
71+
if (enumsElement != null)
7672
{
77-
var node = new ClassNode(false)
73+
foreach (var enumElement in enumsElement.Elements(XmlEnumElement))
7874
{
79-
Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true),
80-
Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty,
81-
Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty,
82-
AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty
83-
};
75+
var name = enumElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty;
76+
var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false;
77+
var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue<EnumMetaData.UnderlyingTypeSize>();
78+
79+
var values = new Dictionary<long, string>();
80+
foreach (var itemElement in enumElement.Elements(XmlItemElement))
81+
{
82+
var itemName = itemElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty;
83+
var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0;
84+
85+
values.Add(itemValue, itemName);
86+
}
87+
88+
var @enum = new EnumMetaData
89+
{
90+
Name = name
91+
};
92+
@enum.SetData(useFlagsMode, size, values);
93+
94+
project.AddEnum(@enum);
95+
}
96+
}
8497

85-
if (!project.ContainsClass(node.Uuid))
86-
{
87-
project.AddClass(node);
98+
var classes = new List<Tuple<XElement, ClassNode>>();
8899

89-
classes.Add(Tuple.Create(element, node));
100+
var classesElement = document.Root.Element(XmlClassesElement);
101+
if (classesElement != null)
102+
{
103+
foreach (var element in classesElement
104+
.Elements(XmlClassElement)
105+
.DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value))
106+
{
107+
var node = new ClassNode(false)
108+
{
109+
Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true),
110+
Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty,
111+
Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty,
112+
AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty
113+
};
114+
115+
if (!project.ContainsClass(node.Uuid))
116+
{
117+
project.AddClass(node);
118+
119+
classes.Add(Tuple.Create(element, node));
120+
}
90121
}
91122
}
92123

ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ public void Save(Stream output, ILogger logger)
3434
XmlRootElement,
3535
new XAttribute(XmlVersionAttribute, FileVersion),
3636
new XAttribute(XmlPlatformAttribute, Constants.Platform),
37-
new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger)),
3837
project.CustomData.Serialize(XmlCustomDataElement),
39-
project.TypeMapping.Serialize(XmlTypeMappingElement)
38+
project.TypeMapping.Serialize(XmlTypeMappingElement),
39+
new XElement(XmlEnumsElement, CreateEnumElements(project.Enums)),
40+
new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger))
4041
)
4142
);
4243

@@ -45,6 +46,21 @@ public void Save(Stream output, ILogger logger)
4546
}
4647
}
4748

49+
private static IEnumerable<XElement> CreateEnumElements(IEnumerable<EnumMetaData> enums)
50+
{
51+
return enums.Select(e => new XElement(
52+
XmlEnumElement,
53+
new XAttribute(XmlNameAttribute, e.Name),
54+
new XAttribute(XmlSizeAttribute, e.Size),
55+
new XAttribute(XmlFlagsAttribute, e.UseFlagsMode),
56+
e.Values.Select(kv => new XElement(
57+
XmlItemElement,
58+
new XAttribute(XmlValueAttribute, kv.Key),
59+
new XAttribute(XmlNameAttribute, kv.Value)
60+
))
61+
));
62+
}
63+
4864
private static IEnumerable<XElement> CreateClassElements(IEnumerable<ClassNode> classes, ILogger logger)
4965
{
5066
Contract.Requires(classes != null);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
using System.Xml.Linq;
3+
4+
namespace ReClassNET.Extensions
5+
{
6+
public static class XAttributeExtensions
7+
{
8+
public static TEnum GetEnumValue<TEnum>(this XAttribute attribute) where TEnum : struct, Enum
9+
{
10+
TEnum @enum = default;
11+
if (attribute != null)
12+
{
13+
Enum.TryParse(attribute.Value, out @enum);
14+
}
15+
return @enum;
16+
}
17+
}
18+
}

ReClass.NET/ReClass.NET.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@
172172
<Compile Include="Debugger\RemoteDebugger.Thread.cs" />
173173
<Compile Include="Debugger\SoftwareBreakpoint.cs" />
174174
<Compile Include="Extensions\StringBuilderExtensions.cs" />
175+
<Compile Include="Extensions\XAttributeExtensions.cs" />
175176
<Compile Include="Forms\EnumEditorForm.cs">
176177
<SubType>Form</SubType>
177178
</Compile>

0 commit comments

Comments
 (0)