From a89a7ad5e88acf37c9e4db6991e3cdf294ca21ab Mon Sep 17 00:00:00 2001 From: Frederik Carlier Date: Tue, 26 Jun 2018 13:59:12 +0200 Subject: [PATCH] Consider booleans to be serialization 'primitives' as well --- plist-cil.test/BinaryPropertyListWriterTests.cs | 16 ++++++++++++++++ plist-cil.test/plist-cil.test.csproj | 3 +++ plist-cil.test/test-files/plist2.bin | Bin 0 -> 1302 bytes ...pertyListWriter.GetObjectEqualityComparer.cs | 10 ++++++++++ plist-cil/BinaryPropertyListWriter.cs | 11 +++++++++-- plist-cil/UID.cs | 6 ++++++ 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 plist-cil.test/test-files/plist2.bin diff --git a/plist-cil.test/BinaryPropertyListWriterTests.cs b/plist-cil.test/BinaryPropertyListWriterTests.cs index 8b966aa..3433949 100644 --- a/plist-cil.test/BinaryPropertyListWriterTests.cs +++ b/plist-cil.test/BinaryPropertyListWriterTests.cs @@ -21,5 +21,21 @@ namespace plistcil.test writer.Write(root); } } + + [Fact] + public void Roundtrip2Test() + { + byte[] data = File.ReadAllBytes("test-files/plist2.bin"); + NSObject root = PropertyListParser.Parse(data); + + using (MemoryStream actualOutput = new MemoryStream()) + using (Stream expectedOutput = File.OpenRead("test-files/plist2.bin")) + using (ValidatingStream validatingStream = new ValidatingStream(actualOutput, expectedOutput)) + { + BinaryPropertyListWriter writer = new BinaryPropertyListWriter(validatingStream); + writer.ReuseObjectIds = false; + writer.Write(root); + } + } } } diff --git a/plist-cil.test/plist-cil.test.csproj b/plist-cil.test/plist-cil.test.csproj index 60093e4..c7698c2 100644 --- a/plist-cil.test/plist-cil.test.csproj +++ b/plist-cil.test/plist-cil.test.csproj @@ -116,6 +116,9 @@ + + PreserveNewest + PreserveNewest diff --git a/plist-cil.test/test-files/plist2.bin b/plist-cil.test/test-files/plist2.bin new file mode 100644 index 0000000000000000000000000000000000000000..cae641df1085e0c25398fb155799d12f796dcada GIT binary patch literal 1302 zcmYc)$jK}&F)+Bo$i&RT$`&0Hp;DGwRGgWg7on1$l$DxXQXHw0Sd^TRS(aK9qEeDy zAjH7fwqPAQhrX$qjf1m`k8faTc&JKVX->|40bx!qZXRAfegQ!tVG&U=aS2H&X&D(g zc?B6I1sNF`b$NL$Z5bK)cmb(`#FC7V{D|cIl+>Wqg8ZVA%)IpA{N(J^l6V2plEk9) z)Dp*nf}G6c#FEVXynw`#jCcXT;?!c0%REz3^GY()GE)|9 z0r`@m)Wj0s%;MtAymY6;;?$hXywqaHVz-W@ z-7=wuNn-c`Vw0y!yntXqQGQBka*1z#N@-52Ut(@*ynq12ACAc-nPr(JnPA&8^D;{^ z6LT`FQr+^4LOnxLi$S3jFCdqgo?euio>-C^T#{IlSzMBtT$WdjLA8Do=hzhFI(>Ct|{dPUGsX<%qzX<&{Qn3a~9lWL`} zuU}AaB;LSFm?Qw zv8vOnNCx@%lDUPYRTLzs@)C1XBOuJw;!wZf&>){hmevt|!T#VJaLHD}&OXL3Sg*7+ zGbO3AB(>OIK)~w8uS7_;B%(W=W8oNZi0KZ?bcWPy7iX*fDxELE3Qk0)x(!j{T!63*W z#h}cf%V5M{&fv!2!%)gFiD4DPK8DK-?-_nGax!W&x-f<@7BRLl&Sc!gc$x7Q<5MOE zCTS*FCV3`BCM70iCRHYNCJiPnCLJa{CIcozCL<;jCNm}rCMzauCMPB@rZA=mrYNQu zrk_mzm^qn+m?fB{nN^rIna!9znZ20Zb8nR}W0nI|$&W}eEtl6eF3 zM&?b-TbOq;pJ%?z{DAo>^9$y;EX*uyEHW&5EQTy*3}C>-2&Nbq;-NH@VzB@KPE(;~ literal 0 HcmV?d00001 diff --git a/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs b/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs index afc7323..9f3eb54 100644 --- a/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs +++ b/plist-cil/BinaryPropertyListWriter.GetObjectEqualityComparer.cs @@ -25,6 +25,10 @@ namespace Claunia.PropertyList { return x.Equals(y); } + else if (x is NSNumber && BinaryPropertyListWriter.IsSerializationPrimitive((NSNumber)x)) + { + return x.Equals(y); + } else if (x is NSString && BinaryPropertyListWriter.IsSerializationPrimitive((NSString)x)) { return x.Equals(y); @@ -48,6 +52,12 @@ namespace Claunia.PropertyList return u.GetHashCode(); } + var n = obj as NSNumber; + if (n != null && BinaryPropertyListWriter.IsSerializationPrimitive(n)) + { + return n.ToObject().GetHashCode(); + } + var s = obj as NSString; if (s != null && BinaryPropertyListWriter.IsSerializationPrimitive(s)) { diff --git a/plist-cil/BinaryPropertyListWriter.cs b/plist-cil/BinaryPropertyListWriter.cs index 919f921..1c7641d 100644 --- a/plist-cil/BinaryPropertyListWriter.cs +++ b/plist-cil/BinaryPropertyListWriter.cs @@ -240,7 +240,7 @@ namespace Claunia.PropertyList long[] offsets = new long[idDict.Count]; // write each object, save offset - foreach(var pair in idDict) + foreach (var pair in idDict) { NSObject obj = pair.Key; int id = pair.Value; @@ -422,11 +422,18 @@ namespace Claunia.PropertyList || content == "$classname" || content == "NS.objects" || content == "NS.keys" + || content == "NSURL" || content == "NSDictionary" || content == "NSObject" || content == "NSMutableDictionary" || content == "NSMutableArray" - || content == "NSArray"; + || content == "NSArray" + || content == "NSUUID"; + } + + internal static bool IsSerializationPrimitive(NSNumber n) + { + return n.isBoolean(); } } } diff --git a/plist-cil/UID.cs b/plist-cil/UID.cs index 3263995..3dd1a8e 100644 --- a/plist-cil/UID.cs +++ b/plist-cil/UID.cs @@ -338,6 +338,12 @@ namespace Claunia.PropertyList { return this.value.GetHashCode(); } + + /// + public override string ToString() + { + return $"{this.value} (UID)"; + } } }