Skip to content

Commit bdc679c

Browse files
committed
Added Logger.
1 parent 88a0470 commit bdc679c

24 files changed

Lines changed: 651 additions & 117 deletions

Constants.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace ReClassNET
2+
{
3+
class Constants
4+
{
5+
#if WIN64
6+
public const string Platform = "x64";
7+
#else
8+
public const string Platform = "x86";
9+
#endif
10+
11+
public const string SettingsFile = "settings.xml";
12+
13+
public const string PluginsFolder = "Plugins";
14+
}
15+
}

DataExchange/IReClassImport.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
namespace ReClassNET.DataExchange
2-
{
3-
delegate void ReportError(string message);
1+
using ReClassNET.Logger;
42

3+
namespace ReClassNET.DataExchange
4+
{
55
interface IReClassImport
66
{
7-
SchemaBuilder Load(string filePath, ReportError report);
7+
SchemaBuilder Load(string filePath, ILogger logger);
88
}
99
}

DataExchange/ReClass2007File.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Data;
66
using System.Data.SQLite;
77
using System.Linq;
8+
using ReClassNET.Logger;
89
910
namespace ReClassNET.DataExchange
1011
{
@@ -15,7 +16,7 @@ class ReClass2007File : IReClassImport
1516
1617
private Dictionary<int, SchemaClassNode> classes;
1718
18-
public SchemaBuilder Load(string filePath, ReportError report)
19+
public SchemaBuilder Load(string filePath, ILogger logger)
1920
{
2021
try
2122
{
@@ -36,7 +37,7 @@ public SchemaBuilder Load(string filePath, ReportError report)
3637
var schema = classes
3738
.Select(kv =>
3839
{
39-
kv.Value.Nodes.AddRange(Query(connection, $"SELECT variable, comment, type, length, ref FROM class{kv.Key} WHERE type != 2").AsEnumerable().Select(r => ReadNode(r, null)).Where(n => n != null));
40+
kv.Value.Nodes.AddRange(Query(connection, $"SELECT variable, comment, type, length, ref FROM class{kv.Key} WHERE type != 2").AsEnumerable().Select(r => ReadNode(r, logger)).Where(n => n != null));
4041
return kv.Value;
4142
}).ToList();
4243
@@ -45,7 +46,7 @@ public SchemaBuilder Load(string filePath, ReportError report)
4546
}
4647
catch (Exception ex)
4748
{
48-
report?.Invoke(ex.Message);
49+
logger.Log(ex);
4950
5051
return null;
5152
}
@@ -72,7 +73,7 @@ public SchemaBuilder Load(string filePath, ReportError report)
7273
SchemaType.FunctionPtr
7374
};
7475
75-
private SchemaNode ReadNode(DataRow row, ReportError report)
76+
private SchemaNode ReadNode(DataRow row, ILogger logger)
7677
{
7778
var type = SchemaType.None;
7879
@@ -84,7 +85,8 @@ private SchemaNode ReadNode(DataRow row, ReportError report)
8485
8586
if (type == SchemaType.None)
8687
{
87-
report?.Invoke($"Node has unknown type: " + row.ToString());
88+
logger.Log(LogLevel.Warning, $"Skipping node with unknown type: {row["type"]}");
89+
logger.Log(LogLevel.Warning, row.ToString());
8890
8991
return null;
9092
}
@@ -96,7 +98,8 @@ private SchemaNode ReadNode(DataRow row, ReportError report)
9698
var reference = Convert.ToInt32(row["ref"]);
9799
if (!classes.ContainsKey(reference))
98100
{
99-
report?.Invoke("Can't resolve referenced class: " + row.ToString());
101+
logger.Log(LogLevel.Warning, $"Skipping node with unknown reference: {row["ref"]}");
102+
logger.Log(LogLevel.Warning, row.ToString());
100103
101104
return null;
102105
}

DataExchange/ReClassFile.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Xml.Linq;
5+
using ReClassNET.Logger;
56

67
namespace ReClassNET.DataExchange
78
{
@@ -12,7 +13,7 @@ partial class ReClassFile : IReClassImport
1213

1314
private Dictionary<string, SchemaClassNode> classes;
1415

15-
public SchemaBuilder Load(string filePath, ReportError report)
16+
public SchemaBuilder Load(string filePath, ILogger logger)
1617
{
1718
try
1819
{
@@ -61,21 +62,21 @@ public SchemaBuilder Load(string filePath, ReportError report)
6162
.Select(cls => new { Data = cls, Class = classes[cls.Attribute("Name")?.Value] })
6263
.Select(x =>
6364
{
64-
x.Class.Nodes.AddRange(x.Data.Elements("Node").Select(n => ParseNode(n, typeMap, report)).Where(n => n != null));
65+
x.Class.Nodes.AddRange(x.Data.Elements("Node").Select(n => ParseNode(n, typeMap, logger)).Where(n => n != null));
6566
return x.Class;
6667
});
6768

6869
return SchemaBuilder.FromSchema(schema);
6970
}
7071
catch (Exception ex)
7172
{
72-
report?.Invoke(ex.Message);
73+
logger.Log(ex);
7374

7475
return null;
7576
}
7677
}
7778

78-
private SchemaNode ParseNode(XElement node, SchemaType[] typeMap, ReportError report)
79+
private SchemaNode ParseNode(XElement node, SchemaType[] typeMap, ILogger logger)
7980
{
8081
var type = SchemaType.None;
8182

@@ -90,7 +91,8 @@ private SchemaNode ParseNode(XElement node, SchemaType[] typeMap, ReportError re
9091

9192
if (type == SchemaType.None)
9293
{
93-
report?.Invoke($"Node has unknown type: " + node.ToString());
94+
logger.Log(LogLevel.Warning, $"Skipping node with unknown type: {node.Attribute("Type")?.Value}");
95+
logger.Log(LogLevel.Warning, node.ToString());
9496

9597
return null;
9698
}
@@ -111,7 +113,8 @@ private SchemaNode ParseNode(XElement node, SchemaType[] typeMap, ReportError re
111113

112114
if (reference == null || !classes.ContainsKey(reference))
113115
{
114-
report?.Invoke("Can't resolve referenced class: " + node.ToString());
116+
logger.Log(LogLevel.Warning, $"Skipping node with unknown reference: {reference}");
117+
logger.Log(LogLevel.Warning, node.ToString());
115118

116119
return null;
117120
}

DataExchange/ReClassNetFile.cs

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.IO.Compression;
77
using System.Linq;
88
using System.Xml.Linq;
9+
using ReClassNET.Logger;
910

1011
namespace ReClassNET.DataExchange
1112
{
@@ -33,8 +34,11 @@ class ReClassNetFile : IReClassImport, IReClassExport
3334

3435
private Dictionary<string, SchemaClassNode> classes;
3536

36-
public SchemaBuilder Load(string filePath, ReportError report)
37+
public SchemaBuilder Load(string filePath, ILogger logger)
3738
{
39+
Contract.Requires(filePath != null);
40+
Contract.Requires(logger != null);
41+
3842
try
3943
{
4044
using (var fs = new FileStream(filePath, FileMode.Open))
@@ -44,14 +48,21 @@ public SchemaBuilder Load(string filePath, ReportError report)
4448
var classesEntry = archive.GetEntry(ClassFileName);
4549
if (classesEntry == null)
4650
{
47-
report?.Invoke("File is corrupt.");
51+
logger.Log(LogLevel.Error, $"The file '{filePath}' is corrupt.");
4852

4953
return null;
5054
}
5155
using (var reader = new StreamReader(classesEntry.Open()))
5256
{
5357
var document = XDocument.Load(reader);
5458

59+
var version = document.Root.Attribute(XmlVersionAttribute)?.Value;
60+
var platform = document.Root.Attribute(XmlTypeAttribute)?.Value;
61+
if (platform != Constants.Platform)
62+
{
63+
logger.Log(LogLevel.Warning, $"The platform of the file ('{platform}') doesn't match the program platform ('{Constants.Platform}').");
64+
}
65+
5566
classes = document.Root
5667
.Element(XmlClassesElement)
5768
.Elements(XmlClassElement)
@@ -80,7 +91,7 @@ public SchemaBuilder Load(string filePath, ReportError report)
8091
.Select(cls => new { Data = cls, Class = classes[cls.Attribute(XmlNameAttribute)?.Value] })
8192
.Select(x =>
8293
{
83-
x.Class.Nodes.AddRange(x.Data.Elements(XmlNodeElement).Select(n => ReadNode(n, report)).Where(n => n != null));
94+
x.Class.Nodes.AddRange(x.Data.Elements(XmlNodeElement).Select(n => ReadNode(n, logger)).Where(n => n != null));
8495
return x.Class;
8596
});
8697

@@ -91,18 +102,19 @@ public SchemaBuilder Load(string filePath, ReportError report)
91102
}
92103
catch (Exception ex)
93104
{
94-
report?.Invoke(ex.Message);
105+
logger.Log(ex);
95106

96107
return null;
97108
}
98109
}
99110

100-
private SchemaNode ReadNode(XElement node, ReportError report)
111+
private SchemaNode ReadNode(XElement node, ILogger logger)
101112
{
102113
var type = SchemaType.None;
103114
if (!Enum.TryParse(node.Attribute(XmlTypeAttribute)?.Value, out type))
104115
{
105-
report?.Invoke($"Node has unknown type: " + node.ToString());
116+
logger.Log(LogLevel.Warning, $"Skipping node with unknown type: {node.Attribute(XmlTypeAttribute)?.Value}");
117+
logger.Log(LogLevel.Warning, node.ToString());
106118

107119
return null;
108120
}
@@ -114,7 +126,8 @@ private SchemaNode ReadNode(XElement node, ReportError report)
114126
var reference = node.Attribute(XmlReferenceAttribute)?.Value;
115127
if (reference == null || !classes.ContainsKey(reference))
116128
{
117-
report?.Invoke("Can't resolve referenced class: " + node.ToString());
129+
logger.Log(LogLevel.Warning, $"Skipping node with unknown reference: {reference}");
130+
logger.Log(LogLevel.Warning, node.ToString());
118131

119132
return null;
120133
}
@@ -141,25 +154,23 @@ private SchemaNode ReadNode(XElement node, ReportError report)
141154
sn.Name = node.Attribute(XmlNameAttribute)?.Value;
142155
sn.Comment = node.Attribute(XmlCommentAttribute)?.Value;
143156

144-
var sizeAttr = node.Attribute(XmlSizeAttribute);
145-
if (sizeAttr != null)
157+
switch (type)
146158
{
147-
int size;
148-
int.TryParse(sizeAttr.Value, out size);
149-
150-
switch (type)
151-
{
152-
case SchemaType.Array:
153-
case SchemaType.ClassPtrArray:
154-
case SchemaType.UTF8Text:
155-
case SchemaType.UTF16Text:
156-
case SchemaType.UTF32Text:
157-
case SchemaType.BitField:
158-
sn.Count = size;
159-
break;
160-
}
159+
case SchemaType.Array:
160+
case SchemaType.ClassPtrArray:
161+
case SchemaType.UTF8Text:
162+
case SchemaType.UTF16Text:
163+
case SchemaType.UTF32Text:
164+
case SchemaType.BitField:
165+
int size;
166+
if (!int.TryParse(node.Attribute(XmlSizeAttribute)?.Value, out size))
167+
{
168+
logger.Log(LogLevel.Warning, "Node is missing the size attribute, defaulting to 0.");
169+
logger.Log(LogLevel.Warning, node.ToString());
170+
}
171+
sn.Count = size;
172+
break;
161173
}
162-
163174

164175
return sn;
165176
}
@@ -192,7 +203,10 @@ private XDocument GenerateXml(SchemaBuilder schema)
192203

193204
var document = new XDocument(
194205
new XComment("ReClass.NET by KN4CK3R"),
195-
new XElement(XmlRootElement, new XAttribute(XmlVersionAttribute, "1"),
206+
new XElement(
207+
XmlRootElement,
208+
new XAttribute(XmlVersionAttribute, "1"),
209+
new XAttribute(XmlTypeAttribute, Constants.Platform),
196210
new XElement(XmlClassesElement, schema.BuildSchema().Select(c => WriteNode(c)))
197211
)
198212
);
@@ -213,6 +227,7 @@ private XElement WriteNode(SchemaNode node)
213227
new XAttribute(XmlNameAttribute, node.Name ?? string.Empty),
214228
new XAttribute(XmlCommentAttribute, node.Comment ?? string.Empty),
215229
new XAttribute(XmlAddressAttribute, classNode.Offset.ToInt64().ToString("X")),
230+
//new XAttribute(XmlAddressAttribute, classNode.AddressString ?? string.Empty),
216231
classNode.Nodes.Select(n => WriteNode(n))
217232
);
218233
}

DataExchange/ReClassQtFile.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Globalization;
44
using System.Linq;
55
using System.Xml.Linq;
6+
using ReClassNET.Logger;
67

78
namespace ReClassNET.DataExchange
89
{
@@ -13,7 +14,7 @@ class ReClassQtFile : IReClassImport
1314

1415
private Dictionary<string, SchemaClassNode> classes;
1516

16-
public SchemaBuilder Load(string filePath, ReportError report)
17+
public SchemaBuilder Load(string filePath, ILogger logger)
1718
{
1819
try
1920
{
@@ -47,15 +48,15 @@ public SchemaBuilder Load(string filePath, ReportError report)
4748
.Select(cls => new { Data = cls, Class = classes[cls.Attribute("ClassId")?.Value] })
4849
.Select(x =>
4950
{
50-
x.Class.Nodes.AddRange(x.Data.Elements("Node").Select(n => ReadNode(n, report)).Where(n => n != null));
51+
x.Class.Nodes.AddRange(x.Data.Elements("Node").Select(n => ReadNode(n, logger)).Where(n => n != null));
5152
return x.Class;
5253
});
5354

5455
return SchemaBuilder.FromSchema(schema);
5556
}
5657
catch (Exception ex)
5758
{
58-
report?.Invoke(ex.Message);
59+
logger.Log(ex);
5960

6061
return null;
6162
}
@@ -87,7 +88,7 @@ public SchemaBuilder Load(string filePath, ReportError report)
8788
SchemaType.Vector2
8889
};
8990

90-
private SchemaNode ReadNode(XElement node, ReportError report)
91+
private SchemaNode ReadNode(XElement node, ILogger logger)
9192
{
9293
var type = SchemaType.None;
9394

@@ -102,7 +103,8 @@ private SchemaNode ReadNode(XElement node, ReportError report)
102103

103104
if (type == SchemaType.None)
104105
{
105-
report?.Invoke($"Node has unknown type: " + node.ToString());
106+
logger.Log(LogLevel.Warning, $"Skipping node with unknown type: {node.Attribute("Type")?.Value}");
107+
logger.Log(LogLevel.Warning, node.ToString());
106108

107109
return null;
108110
}
@@ -114,7 +116,8 @@ private SchemaNode ReadNode(XElement node, ReportError report)
114116
var pointToClassId = node.Attribute("PointToClass")?.Value;
115117
if (pointToClassId == null || !classes.ContainsKey(pointToClassId))
116118
{
117-
report?.Invoke("Can't resolve referenced class: " + node.ToString());
119+
logger.Log(LogLevel.Warning, $"Skipping node with unknown reference: {pointToClassId}");
120+
logger.Log(LogLevel.Warning, node.ToString());
118121

119122
return null;
120123
}

0 commit comments

Comments
 (0)