Merge pull request #1275 from ranma42/fix-lib64
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / XmlCustomFormatter.cs
index 950f5a2a56f18114192c918b7954c25a75df1239..dca5ac50d476444915e872aefbabc4c5fd4341a8 100644 (file)
@@ -66,7 +66,11 @@ namespace System.Xml.Serialization {
 
                internal static string FromDateTime (DateTime value)
                {
+#if NET_2_0
+                       return XmlConvert.ToString (value, XmlDateTimeSerializationMode.RoundtripKind);
+#else
                        return XmlConvert.ToString (value, "yyyy-MM-ddTHH:mm:ss.fffffffzzz");
+#endif
                }
 
                internal static string FromTime (DateTime value)
@@ -161,7 +165,11 @@ namespace System.Xml.Serialization {
 
                internal static DateTime ToDateTime (string value)
                {
+#if NET_2_0
+                       return XmlConvert.ToDateTime (value, XmlDateTimeSerializationMode.RoundtripKind);
+#else
                        return XmlConvert.ToDateTime (value);
+#endif
                }
 
                internal static DateTime ToTime (string value)
@@ -225,9 +233,15 @@ namespace System.Xml.Serialization {
                                case "boolean": return XmlConvert.ToString ((bool)value);
                                case "unsignedByte": return XmlConvert.ToString ((byte)value);
                                case "char": return XmlConvert.ToString ((int)(char)value);
+#if NET_2_0
+                               case "dateTime": return XmlConvert.ToString ((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind);
+                               case "date": return ((DateTime)value).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
+                               case "time": return ((DateTime)value).ToString("HH:mm:ss.FFFFFFF", CultureInfo.InvariantCulture);
+#else
                                case "dateTime": return XmlConvert.ToString ((DateTime)value);
                                case "date": return ((DateTime)value).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
                                case "time": return ((DateTime)value).ToString("HH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture);
+#endif
                                case "decimal": return XmlConvert.ToString ((decimal)value);
                                case "double": return XmlConvert.ToString ((double)value);
                                case "short": return XmlConvert.ToString ((Int16)value);
@@ -242,7 +256,7 @@ namespace System.Xml.Serialization {
                                case "base64":
                                case "base64Binary": return value == null ? String.Empty : Convert.ToBase64String ((byte[])value);
                                case "hexBinary": return value == null ? String.Empty : XmlConvert.ToBinHexString ((byte[]) value);
-                               case "duration": return XmlConvert.ToString ((TimeSpan) value);
+                               case "duration": return (string) value;
                        default: return value is IFormattable ? ((IFormattable) value).ToString (null, CultureInfo.InvariantCulture) : value.ToString ();
                        }
                }
@@ -256,9 +270,15 @@ namespace System.Xml.Serialization {
                                case "boolean": return XmlConvert.ToBoolean (value);
                                case "unsignedByte": return XmlConvert.ToByte (value);
                                case "char": return (char)XmlConvert.ToInt32 (value);
+#if NET_2_0
+                               case "dateTime": return XmlConvert.ToDateTime (value, XmlDateTimeSerializationMode.RoundtripKind);
+                               case "date": return XmlConvert.ToDateTime (value).Date;
+                               case "time": return DateTime.ParseExact (value, "HH:mm:ss.FFFFFFF", null);
+#else
                                case "dateTime": return XmlConvert.ToDateTime (value);
-                               case "date": return DateTime.ParseExact (value, "yyyy-MM-dd", null);
+                               case "date": return XmlConvert.ToDateTime (value).Date;
                                case "time": return DateTime.ParseExact (value, "HH:mm:ss.fffffffzzz", null);
+#endif
                                case "decimal": return XmlConvert.ToDecimal (value);
                                case "double": return XmlConvert.ToDouble (value);
                                case "short": return XmlConvert.ToInt16 (value);
@@ -273,10 +293,10 @@ namespace System.Xml.Serialization {
                                case "base64":
                                case "base64Binary": return Convert.FromBase64String (value);
                                case "hexBinary": return XmlConvert.FromBinHexString (value);
-                               case "duration": return XmlConvert.ToTimeSpan (value);
+                               case "duration": return value;
                                default: 
                                        if (type.Type != null)
-                                               return Convert.ChangeType (value, type.Type);
+                                               return Convert.ChangeType (value, type.Type, null);
                                        else
                                                return value;
                        }
@@ -284,14 +304,30 @@ namespace System.Xml.Serialization {
 
                internal static string GenerateToXmlString (TypeData type, string value)
                {
+                       if (type.NullableOverride)
+                               return "(" + value + " != null ? " + GenerateToXmlStringCore (type, value) + " : null)";
+                       else
+                               return GenerateToXmlStringCore (type, value);
+               }
+
+               static string GenerateToXmlStringCore (TypeData type, string value)
+               {
+                       if (type.NullableOverride)
+                               value = value + ".Value";
                        switch (type.XmlType)
                        {
                                case "boolean": return "(" + value + "?\"true\":\"false\")";
                                case "unsignedByte": return value + ".ToString(CultureInfo.InvariantCulture)";
                                case "char": return "((int)(" + value + ")).ToString(CultureInfo.InvariantCulture)";
+#if NET_2_0
+                               case "dateTime": return "XmlConvert.ToString (" + value + ", XmlDateTimeSerializationMode.RoundtripKind)";
+                               case "date": return value + ".ToString(\"yyyy-MM-dd\", CultureInfo.InvariantCulture)";
+                               case "time": return value + ".ToString(\"HH:mm:ss.FFFFFFF\", CultureInfo.InvariantCulture)";
+#else
                                case "dateTime": return value + ".ToString(\"yyyy-MM-ddTHH:mm:ss.fffffffzzz\", CultureInfo.InvariantCulture)";
                                case "date": return value + ".ToString(\"yyyy-MM-dd\", CultureInfo.InvariantCulture)";
                                case "time": return value + ".ToString(\"HH:mm:ss.fffffffzzz\", CultureInfo.InvariantCulture)";
+#endif
                                case "decimal": return "XmlConvert.ToString (" + value + ")";
                                case "double": return "XmlConvert.ToString (" + value + ")";
                                case "short": return value + ".ToString(CultureInfo.InvariantCulture)";
@@ -305,7 +341,8 @@ namespace System.Xml.Serialization {
                                case "guid": return "XmlConvert.ToString (" + value + ")";
                                case "base64":
                                case "base64Binary": return value + " == null ? String.Empty : Convert.ToBase64String (" + value + ")";
-                               case "duration": return "XmlConvert.ToString (" + value + ")";
+                               case "hexBinary": return value + " == null ? String.Empty : ToBinHexString (" + value + ")";
+                               case "duration": return value;
                                case "NMTOKEN":
                                case "Name":
                                case "NCName":
@@ -322,15 +359,29 @@ namespace System.Xml.Serialization {
                }
 
                internal static string GenerateFromXmlString (TypeData type, string value)
+               {
+                       if (type.NullableOverride)
+                               return String.Concat ("(", value, " != null ? (", type.CSharpName, "?)", GenerateFromXmlStringCore (type, value), " : null)");
+                       else
+                               return GenerateFromXmlStringCore (type, value);
+               }
+
+               static string GenerateFromXmlStringCore (TypeData type, string value)
                {
                        switch (type.XmlType)
                        {
                                case "boolean": return "XmlConvert.ToBoolean (" + value + ")";
                                case "unsignedByte": return "byte.Parse (" + value + ", CultureInfo.InvariantCulture)";
                                case "char": return "(char)Int32.Parse (" + value + ", CultureInfo.InvariantCulture)";
+#if NET_2_0
+                               case "dateTime": return "XmlConvert.ToDateTime (" + value + ", XmlDateTimeSerializationMode.RoundtripKind)";
+                               case "date": return "XmlConvert.ToDateTime (" + value + ").Date";
+                               case "time": return "DateTime.ParseExact (" + value + ", \"HH:mm:ss.FFFFFFF\", CultureInfo.InvariantCulture)";
+#else
                                case "dateTime": return "XmlConvert.ToDateTime (" + value + ")";
-                               case "date": return "DateTime.ParseExact (" + value + ", \"yyyy-MM-dd\", CultureInfo.InvariantCulture)";
+                               case "date": return "XmlConvert.ToDateTime (" + value + ").Date";
                                case "time": return "DateTime.ParseExact (" + value + ", \"HH:mm:ss.fffffffzzz\", CultureInfo.InvariantCulture)";
+#endif
                                case "decimal": return "Decimal.Parse (" + value + ", CultureInfo.InvariantCulture)";
                                case "double": return "XmlConvert.ToDouble (" + value + ")";
                                case "short": return "Int16.Parse (" + value + ", CultureInfo.InvariantCulture)";
@@ -344,7 +395,8 @@ namespace System.Xml.Serialization {
                                case "guid": return "XmlConvert.ToGuid (" + value + ")";
                                case "base64:":
                                case "base64Binary": return "Convert.FromBase64String (" + value + ")";
-                               case "duration": return "XmlConvert.ToTimeSpan (" + value + ")";
+                               case "hexBinary": return "FromBinHexString (" + value + ")";
+                               case "duration": return value;
                                default: return value;
                        }
                }