Merge pull request #66 from quamotion/fixes/xml-uid-deserialize

XmlPropertyListParser: Support deserializing UID values
This commit is contained in:
2020-08-24 23:11:14 +01:00
committed by GitHub
3 changed files with 26 additions and 13 deletions

View File

@@ -1,3 +1,5 @@
image: Visual Studio 2019
build_script: build_script:
- cmd: dotnet build -c Release --version-suffix r%APPVEYOR_BUILD_NUMBER% - cmd: dotnet build -c Release --version-suffix r%APPVEYOR_BUILD_NUMBER%
- cmd: dotnet test plist-cil.test\plist-cil.test.csproj - cmd: dotnet test plist-cil.test\plist-cil.test.csproj

View File

@@ -88,9 +88,8 @@ namespace plistcil.test
// UIDs don't exist in XML property lists, but they are represented as dictionaries // UIDs don't exist in XML property lists, but they are represented as dictionaries
// for compability purposes // for compability purposes
var roundtrip = XmlPropertyListParser.ParseString(plist) as NSDictionary; var roundtrip = XmlPropertyListParser.ParseString(plist) as UID;
Assert.Single(roundtrip.Keys, "CF$UID"); Assert.Equal(0xabcdUL, roundtrip.ToUInt64());
Assert.Single(roundtrip.Values, new NSNumber(0xabcd));
} }
} }
} }

View File

@@ -146,6 +146,17 @@ namespace Claunia.PropertyList
static NSObject ParseObject(XmlNode n) static NSObject ParseObject(XmlNode n)
{ {
if(n.Name.Equals("dict")) if(n.Name.Equals("dict"))
{
// Special case for UID values
if(n.ChildNodes.Count == 2
&& n.ChildNodes[0].Name == "key"
&& n.ChildNodes[0].InnerText == "CF$UID"
&& n.ChildNodes[1].Name == "integer"
&& uint.TryParse(n.ChildNodes[1].InnerText, out uint uidValue))
{
return new UID(uidValue);
}
else
{ {
NSDictionary dict = new NSDictionary(); NSDictionary dict = new NSDictionary();
List<XmlNode> children = FilterElementNodes(n.ChildNodes); List<XmlNode> children = FilterElementNodes(n.ChildNodes);
@@ -161,6 +172,7 @@ namespace Claunia.PropertyList
return dict; return dict;
} }
}
if(n.Name.Equals("array")) if(n.Name.Equals("array"))
{ {