Switch to compiler-tester
[mono.git] / mcs / class / System.XML / System.Xml / XmlConvert.cs
index 00e39f56618b109232fd26cdd06798bde7bb78ec..1c59e3e4b1f21d385de7884dc7aec396988675e4 100755 (executable)
@@ -31,6 +31,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 using System;
+using System.IO;
 using System.Text;
 using System.Globalization;
 using System.Xml.Schema;
@@ -155,6 +156,9 @@ namespace System.Xml {
 
                public static string EncodeLocalName (string name)
                {
+                       if (name == null)
+                               return name;
+
                        string encoded = EncodeName (name);
                        int pos = encoded.IndexOf (':');
                        if (pos == -1)
@@ -175,6 +179,9 @@ namespace System.Xml {
 
                private static string EncodeName (string name, bool nmtoken)
                {
+                       if (name == null || name.Length == 0)
+                               return name;
+
                        StringBuilder sb = new StringBuilder ();
                        int length = name.Length;
                        for (int i = 0; i < length; i++) {
@@ -194,8 +201,10 @@ namespace System.Xml {
                        return EncodeName (name, false);
                }
                
-               public static string EncodeNmToken(string name)
+               public static string EncodeNmToken (string name)
                {
+                       if (name == String.Empty)
+                               throw new XmlException ("Invalid NmToken: ''");
                        return EncodeName (name, true);
                }
 
@@ -218,6 +227,42 @@ namespace System.Xml {
                        }
                }
 
+               // LAMESPEC: It has been documented as public, but is marked as internal.
+               internal static string ToBinHexString (byte [] buffer)
+               {
+                       StringWriter w = new StringWriter ();
+                       WriteBinHex (buffer, 0, buffer.Length, w);
+                       return w.ToString ();
+               }
+
+               internal static void WriteBinHex (byte [] buffer, int index, int count, TextWriter w)
+               {
+                       if (buffer == null)
+                               throw new ArgumentNullException ("buffer");
+                       if (index < 0)
+                               throw new ArgumentOutOfRangeException ("index", index, "index must be non negative integer.");
+                       if (count < 0)
+                               throw new ArgumentOutOfRangeException ("count", count, "count must be non negative integer.");
+                       if (buffer.Length < index + count)
+                               throw new ArgumentOutOfRangeException ("index and count must be smaller than the length of the buffer.");
+
+                       // Copied from XmlTextWriter.WriteBinHex ()
+                       int end = index + count;
+                       for (int i = index; i < end; i++) {
+                               int val = buffer [i];
+                               int high = val >> 4;
+                               int low = val & 15;
+                               if (high > 9)
+                                       w.Write ((char) (high + 55));
+                               else
+                                       w.Write ((char) (high + 0x30));
+                               if (low > 9)
+                                       w.Write ((char) (low + 55));
+                               else
+                                       w.Write ((char) (low + 0x30));
+                       }
+               }
+
                public static byte ToByte(string s)
                {
                        return Byte.Parse(s, CultureInfo.InvariantCulture);
@@ -228,11 +273,30 @@ namespace System.Xml {
                        return Char.Parse(s);
                }
 
-               public static DateTime ToDateTime(string s)
+#if NET_2_0
+               [Obsolete]
+#endif
+               public static DateTime ToDateTime (string s)
                {
-                       return ToDateTime(s, datetimeFormats);
+                       return ToDateTime (s, datetimeFormats);
                }
                
+#if NET_2_0
+               public static DateTime ToDateTime (string value, XmlDateTimeSerializationMode mode)
+               {
+                       string modestr = null;
+                       switch (mode) {
+                       case XmlDateTimeSerializationMode.Local:
+                       case XmlDateTimeSerializationMode.RoundTripKind:
+                       default:
+                               return ToDateTime (value, "yyyy-MM-ddTHH:mm:ss.fffffffzzz");
+                       case XmlDateTimeSerializationMode.Utc:
+                               return ToDateTime (value, "yyyy-MM-ddTHH:mm:ss.fffffffZ").ToUniversalTime ();
+                       case XmlDateTimeSerializationMode.Unspecified:
+                               return ToDateTime (value, "yyyy-MM-ddTHH:mm:ss.fffffff");
+                       }
+               }
+#endif
                public static DateTime ToDateTime(string s, string format)
                {
                        DateTimeFormatInfo d = new DateTimeFormatInfo();
@@ -388,7 +452,11 @@ namespace System.Xml {
                        if (Double.IsNegativeInfinity(value)) return "-INF";
                        if (Double.IsPositiveInfinity(value)) return "INF";
                        if (Double.IsNaN(value)) return "NaN";
+#if TARGET_JVM
+                       return value.ToString("R", NumberFormatInfo.InvariantInfo);
+#else
                        return value.ToString(CultureInfo.InvariantCulture);
+#endif
                }
 
                public static string ToString(float value)
@@ -396,7 +464,11 @@ namespace System.Xml {
                        if (Single.IsNegativeInfinity(value)) return "-INF";
                        if (Single.IsPositiveInfinity(value)) return "INF";
                        if (Single.IsNaN(value)) return "NaN";
+#if TARGET_JVM
+                       return value.ToString("R", NumberFormatInfo.InvariantInfo);
+#else
                        return value.ToString(CultureInfo.InvariantCulture);
+#endif
                }
 
                [CLSCompliant (false)]
@@ -411,10 +483,39 @@ namespace System.Xml {
                        return value.ToString(CultureInfo.InvariantCulture);
                }
 
-               public static string ToString(DateTime value)
-               {
-                       return value.ToString("yyyy-MM-ddTHH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture);
+#if NET_2_0
+               [Obsolete]
+#endif
+               public static string ToString (DateTime value)
+               {
+                       return value.ToString ("yyyy-MM-ddTHH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture);
+               }
+
+#if NET_2_0
+               public static string ToString (DateTime value, XmlDateTimeSerializationMode mode)
+               {
+                       string modestr = null;
+                       switch (mode) {
+                       case XmlDateTimeSerializationMode.Local:
+                       case XmlDateTimeSerializationMode.RoundTripKind:
+                       default:
+                               return value.ToString (
+                                       "yyyy-MM-ddTHH:mm:ss.fffffffzzz",
+                                       CultureInfo.InvariantCulture);
+                               break;
+                       case XmlDateTimeSerializationMode.Utc:
+                               return value.ToUniversalTime ().ToString (
+                                       "yyyy-MM-ddTHH:mm:ss.fffffffZ",
+                                       CultureInfo.InvariantCulture);
+                               break;
+                       case XmlDateTimeSerializationMode.Unspecified:
+                               return value.ToString (
+                                       "yyyy-MM-ddTHH:mm:ss.fffffff",
+                                       CultureInfo.InvariantCulture);
+                               break;
+                       }
                }
+#endif
 
                public static string ToString(DateTime value, string format)
                {
@@ -533,25 +634,40 @@ namespace System.Xml {
 
                public static string VerifyName (string name)
                {
-                       if(name == null)
+                       if (name == null)
                                throw new ArgumentNullException("name");
 
-                       if(!XmlChar.IsName (name))
+                       if (!XmlChar.IsName (name))
                                throw new XmlException("'" + name + "' is not a valid XML Name");
                        return name;
                        
                }
 
-               public static string VerifyNCName(string ncname)
+               public static string VerifyNCName (string ncname)
                {
-                       if(ncname == null)
+                       if (ncname == null)
                                throw new ArgumentNullException("ncname");
 
-                       if(!XmlChar.IsNCName (ncname))
+                       if (!XmlChar.IsNCName (ncname))
                                throw new XmlException ("'" + ncname + "' is not a valid XML NCName");
                        return ncname;
                }
 
+#if NET_2_0
+               public static string VerifyNMTOKEN (string name)
+#else
+               internal static string VerifyNMTOKEN (string name)
+#endif
+               {
+                       if (name == null)
+                               throw new ArgumentNullException("name");
+
+                       if (!XmlChar.IsNmToken (name))
+                               throw new XmlException("'" + name + "' is not a valid XML NMTOKEN");
+                       return name;
+                       
+               }
+
                // It is documented as public method, but in fact it is not.
                internal static byte [] FromBinHexString (string s)
                {