diff --git a/plist-cil.test/ChangeLog b/plist-cil.test/ChangeLog index 86afccb..c04aeda 100644 --- a/plist-cil.test/ChangeLog +++ b/plist-cil.test/ChangeLog @@ -1,3 +1,11 @@ +2015-02-19 Natalia Portillo + + * ParseTest.cs: + Convert unix date to .net dates. + Array.Equals() does not compare array internals but object + reference, implement substitute. + String.Substring() has a different API than Java, correct. + 2015-02-19 Natalia Portillo * IssueTest.cs: diff --git a/plist-cil.test/ParseTest.cs b/plist-cil.test/ParseTest.cs index 042ba64..c1392da 100644 --- a/plist-cil.test/ParseTest.cs +++ b/plist-cil.test/ParseTest.cs @@ -48,7 +48,7 @@ namespace plistcil.test Assert.True(((NSString)d.ObjectForKey("keyA")).ToString().Equals("valueA")); Assert.True(((NSString)d.ObjectForKey("key&B")).ToString().Equals("value&B")); Assert.True(((NSDate)d.ObjectForKey("date")).Date.Equals(new DateTime(2011, 11, 28, 9, 21, 30, DateTimeKind.Utc))); - Assert.True(Array.Equals(((NSData)d.ObjectForKey("data")).Bytes, + Assert.True(ArrayEquals(((NSData)d.ObjectForKey("data")).Bytes, new byte[]{ 0x00, 0x00, 0x00, 0x04, 0x10, 0x41, 0x08, 0x20, (byte)0x82 })); NSArray a = (NSArray)d.ObjectForKey("array"); Assert.True(a.Count == 4); @@ -112,8 +112,8 @@ namespace plistcil.test Assert.True(d.Count == 5); Assert.True(((NSString)d.ObjectForKey("keyA")).ToString().Equals("valueA")); Assert.True(((NSString)d.ObjectForKey("key&B")).ToString().Equals("value&B")); - Assert.True(((NSDate)d.ObjectForKey("date")).Date.Equals(new DateTime(1322472090000L))); - Assert.True(Array.Equals(((NSData)d.ObjectForKey("data")).Bytes, + Assert.True(((NSDate)d.ObjectForKey("date")).Date.Equals(new DateTime(2011, 11, 28, 9, 21, 30, DateTimeKind.Utc))); + Assert.True(ArrayEquals(((NSData)d.ObjectForKey("data")).Bytes, new byte[]{ 0x00, 0x00, 0x00, 0x04, 0x10, 0x41, 0x08, 0x20, (byte)0x82 })); NSArray a = (NSArray)d.ObjectForKey("array"); Assert.True(a.Count == 4); @@ -131,8 +131,8 @@ namespace plistcil.test Assert.True(d.Count == 5); Assert.True(((NSString)d.ObjectForKey("keyA")).ToString().Equals("valueA")); Assert.True(((NSString)d.ObjectForKey("key&B")).ToString().Equals("value&B")); - Assert.True(((NSDate)d.ObjectForKey("date")).Date.Equals(new DateTime(1322472090000L))); - Assert.True(Array.Equals(((NSData)d.ObjectForKey("data")).Bytes, + Assert.True(((NSDate)d.ObjectForKey("date")).Date.Equals(new DateTime(2011, 11, 28, 9, 21, 30, DateTimeKind.Utc))); + Assert.True(ArrayEquals(((NSData)d.ObjectForKey("data")).Bytes, new byte[]{ 0x00, 0x00, 0x00, 0x04, 0x10, 0x41, 0x08, 0x20, (byte)0x82 })); NSArray a = (NSArray)d.ObjectForKey("array"); Assert.True(a.Count == 4); @@ -266,6 +266,23 @@ namespace plistcil.test Assert.True(((long)map.get("long")) == lng); Assert.True(((DateTime)map.get("date")).Equals(date));*/ } + + static bool ArrayEquals(byte[] arrayA, byte[] arrayB) + { + if (arrayA.Length == arrayB.Length) + { + for (int i = 0; i < arrayA.Length; i++) + { + if (arrayA[i] != arrayB[i]) + { + return false; + } + } + return true; + } + return false; + } + } } diff --git a/plist-cil/ASCIIPropertyListParser.cs b/plist-cil/ASCIIPropertyListParser.cs index f7c537d..8e641dd 100644 --- a/plist-cil/ASCIIPropertyListParser.cs +++ b/plist-cil/ASCIIPropertyListParser.cs @@ -470,7 +470,7 @@ namespace Claunia.PropertyList int numBytes = dataString.Length / 2; byte[] bytes = new byte[numBytes]; for (int i = 0; i < bytes.Length; i++) { - string byteString = dataString.Substring(i * 2, i * 2 + 2); + string byteString = dataString.Substring(i * 2, 2); int byteValue = Convert.ToInt32(byteString, 16); bytes[i] = (byte) byteValue; } @@ -579,7 +579,7 @@ namespace Claunia.PropertyList i++; } //Build string - string result = Encoding.UTF8.GetString(bytArr); + string result = Encoding.BigEndianUnicode.GetString(bytArr); //emoryStream charBuf = CharBuffer.wrap(result); //If the string can be represented in the ASCII codepage @@ -587,7 +587,7 @@ namespace Claunia.PropertyList try{ if (asciiEncoder == null) asciiEncoder = Encoding.GetEncoding("ascii", EncoderExceptionFallback.ExceptionFallback, DecoderExceptionFallback.ExceptionFallback); - return asciiEncoder.GetString(Encoding.Convert(Encoding.UTF8, asciiEncoder, bytArr)); + return asciiEncoder.GetString(Encoding.Convert(Encoding.BigEndianUnicode, asciiEncoder, bytArr)); } catch { diff --git a/plist-cil/ChangeLog b/plist-cil/ChangeLog index d09d44d..666e29b 100644 --- a/plist-cil/ChangeLog +++ b/plist-cil/ChangeLog @@ -1,3 +1,15 @@ +2015-02-19 Natalia Portillo + + * NSData.cs: + * NSArray.cs: + * NSObject.cs: + * NSDictionary.cs: + * ASCIIPropertyListParser.cs: + Convert unix date to .net dates. + Array.Equals() does not compare array internals but object + reference, implement substitute. + String.Substring() has a different API than Java, correct. + 2015-02-19 Natalia Portillo * plist-cil.csproj: diff --git a/plist-cil/NSArray.cs b/plist-cil/NSArray.cs index da6f447..75581c3 100644 --- a/plist-cil/NSArray.cs +++ b/plist-cil/NSArray.cs @@ -201,14 +201,14 @@ namespace Claunia.PropertyList { if (obj.GetType().Equals(typeof(NSArray))) { - return Array.Equals(((NSArray)obj).GetArray(), this.array); + return ArrayEquals(((NSArray)obj).GetArray(), this.array); } else { NSObject nso = NSObject.Wrap(obj); if (nso.GetType().Equals(typeof(NSArray))) { - return Array.Equals(((NSArray)nso).GetArray(), this.array); + return ArrayEquals(((NSArray)nso).GetArray(), this.array); } } return false; diff --git a/plist-cil/NSData.cs b/plist-cil/NSData.cs index 4b39d87..7963ec4 100644 --- a/plist-cil/NSData.cs +++ b/plist-cil/NSData.cs @@ -114,7 +114,7 @@ namespace Claunia.PropertyList } public override bool Equals(Object obj) { - return obj.GetType().Equals(GetType()) && Array.Equals(((NSData) obj).bytes, bytes); + return obj.GetType().Equals(GetType()) && ArrayEquals(((NSData) obj).bytes, bytes); } public override int GetHashCode() { diff --git a/plist-cil/NSDictionary.cs b/plist-cil/NSDictionary.cs index 3635137..7922fb7 100644 --- a/plist-cil/NSDictionary.cs +++ b/plist-cil/NSDictionary.cs @@ -226,7 +226,7 @@ namespace Claunia.PropertyList foreach (NSObject o in dict.Values) { if (o.GetType().Equals(typeof(NSData))) { NSData dat = (NSData) o; - if (Array.Equals(dat.Bytes, val)) + if (ArrayEquals(dat.Bytes, val)) return true; } } diff --git a/plist-cil/NSObject.cs b/plist-cil/NSObject.cs index d4ad3b4..5bf4fe6 100644 --- a/plist-cil/NSObject.cs +++ b/plist-cil/NSObject.cs @@ -409,6 +409,39 @@ namespace Claunia.PropertyList return this; } } + + internal static bool ArrayEquals(byte[] arrayA, byte[] arrayB) + { + if (arrayA.Length == arrayB.Length) + { + for (int i = 0; i < arrayA.Length; i++) + { + if (arrayA[i] != arrayB[i]) + { + return false; + } + } + return true; + } + return false; + } + + internal static bool ArrayEquals(NSObject[] arrayA, NSObject[] arrayB) + { + if (arrayA.Length == arrayB.Length) + { + for (int i = 0; i < arrayA.Length; i++) + { + if (arrayA[i] != arrayB[i]) + { + return false; + } + } + return true; + } + return false; + } + } }