-//
-// XmlConvert.cs: Xml data type conversion
-//
-// Only a stub for now
-//
-using System;
-
-namespace System.Xml {
-
- public class XmlConvert {
-
- public static string VerifyNCName (string name)
- {
- throw new NotImplementedException ();
- }
- }
-}
+//\r
+// System.Xml.XmlConvert\r
+//\r
+// Authors:\r
+// Dwivedi, Ajay kumar (Adwiv@Yahoo.com)\r
+// Gonzalo Paniagua Javier (gonzalo@ximian.com)\r
+//\r
+// (C) 2002 Ximian, Inc (http://www.ximian.com)\r
+//\r
+using System;\r
+using System.Text;\r
+using System.Globalization;\r
+\r
+namespace System.Xml {\r
+\r
+ public class XmlConvert {\r
+\r
+ static string encodedColon = "_x003A_";\r
+\r
+ public XmlConvert()\r
+ {}\r
+\r
+ private static string TryDecoding (string s)\r
+ {\r
+ if (s == null || s.Length < 6)\r
+ return s;\r
+\r
+ char c = '\uFFFF';\r
+ try {\r
+ c = (char) Int32.Parse (s.Substring (1, 4), NumberStyles.HexNumber);\r
+ } catch {\r
+ return s [0] + DecodeName (s.Substring (1));\r
+ }\r
+ \r
+ if (s.Length == 6)\r
+ return c.ToString ();\r
+ return c + DecodeName (s.Substring (6));\r
+ }\r
+ \r
+ public static string DecodeName (string name)\r
+ {\r
+ if (name == null || name.Length == 0)\r
+ return name;\r
+\r
+ int pos = name.IndexOf ('_');\r
+ if (pos == -1 || pos + 6 >= name.Length)\r
+ return name;\r
+\r
+ if (Char.ToUpper (name [pos + 1]) != 'X' || name [pos + 6] != '_')\r
+ return name [0] + DecodeName (name.Substring (1));\r
+\r
+ return name.Substring (0, pos) + TryDecoding (name.Substring (pos + 1));\r
+ }\r
+\r
+ public static string EncodeLocalName (string name)\r
+ {\r
+ string encoded = EncodeName (name);\r
+ int pos = encoded.IndexOf (':');\r
+ if (pos == -1)\r
+ return encoded;\r
+ return encoded.Replace (":", encodedColon);\r
+ }\r
+\r
+ private static bool IsInvalid (char c, bool firstOnlyLetter)\r
+ {\r
+ if (c == ':') // Special case. allowed in EncodeName, but encoded in EncodeLocalName\r
+ return false;\r
+ \r
+ if (firstOnlyLetter && !Char.IsLetter (c) && c != '_')\r
+ return false;\r
+ \r
+ return !Char.IsLetterOrDigit (c);\r
+ }\r
+\r
+ private static string EncodeName (string name, bool nmtoken)\r
+ {\r
+ StringBuilder sb = new StringBuilder ();\r
+ int length = name.Length;\r
+ for (int i = 0; i < length; i++) {\r
+ char c = name [i];\r
+ if (c != '_' || i + 6 >= length) {\r
+ bool firstOnlyLetter = (i == 0 && !nmtoken);\r
+ if (IsInvalid (c, firstOnlyLetter)) {\r
+ sb.AppendFormat ("_x{0:X4}_", (int) c);\r
+ continue;\r
+ }\r
+ } else { \r
+ if (Char.ToUpper (name [i + 1]) == 'X' && name [i + 6] == '_') {\r
+ string decoded = TryDecoding (name.Substring (i + 1, 6));\r
+ if (decoded.Length == 1) {\r
+ sb.AppendFormat ("_x{0:X4}_", (int) c);\r
+ continue;\r
+ }\r
+ }\r
+ }\r
+ sb.Append (c);\r
+ }\r
+ return sb.ToString ();\r
+ }\r
+\r
+ public static string EncodeName (string name)\r
+ {\r
+ return EncodeName (name, false);\r
+ }\r
+ \r
+ public static string EncodeNmToken(string name)\r
+ {\r
+ return EncodeName (name, true);\r
+ }\r
+\r
+ // {true, false, 1, 0}\r
+ public static bool ToBoolean(string s)\r
+ {\r
+ s = s.Trim();\r
+ switch(s)\r
+ {\r
+ case "1":\r
+ return true;\r
+ case "true":\r
+ return true;\r
+ case "0":\r
+ return false;\r
+ case "false":\r
+ return false;\r
+ default:\r
+ throw new FormatException(s + " is not a valid boolean value");\r
+ }\r
+ }\r
+\r
+ public static byte ToByte(string s)\r
+ {\r
+ return Byte.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static char ToChar(string s)\r
+ {\r
+ return Char.Parse(s);\r
+ }\r
+\r
+ public static DateTime ToDateTime(string s)\r
+ {\r
+ return DateTime.Parse(s);\r
+ }\r
+\r
+ public static DateTime ToDateTime(string s, string format)\r
+ {\r
+ DateTimeFormatInfo d = new DateTimeFormatInfo();\r
+ d.FullDateTimePattern = format;\r
+ return DateTime.Parse(s, d);\r
+ }\r
+\r
+ public static DateTime ToDateTime(string s, string[] formats)\r
+ {\r
+ DateTimeStyles style = DateTimeStyles.AllowLeadingWhite |\r
+ DateTimeStyles.AllowTrailingWhite;\r
+ return DateTime.ParseExact (s, formats, DateTimeFormatInfo.InvariantInfo, style);\r
+ }\r
+ \r
+ public static Decimal ToDecimal(string s)\r
+ {\r
+ return Decimal.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+ \r
+ public static double ToDouble(string s)\r
+ {\r
+ return Double.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static Guid ToGuid(string s)\r
+ {\r
+ return new Guid(s);\r
+ }\r
+\r
+ public static short ToInt16(string s)\r
+ {\r
+ return Int16.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static int ToInt32(string s)\r
+ {\r
+ return Int32.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static long ToInt64(string s)\r
+ {\r
+ return Int64.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static SByte ToSByte(string s)\r
+ {\r
+ return SByte.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static float ToSingle(string s)\r
+ {\r
+ return Single.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string ToString(Guid value)\r
+ {\r
+ return value.ToString("D",CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string ToString(int value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string ToString(short value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string ToString(byte value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string ToString(long value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string ToString(char value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string ToString(bool value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static string ToString(SByte value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+ public static string ToString(Decimal value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static string ToString(UInt64 value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+ public static string ToString(TimeSpan value)\r
+ {\r
+ return value.ToString();\r
+ }\r
+ public static string ToString(double value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+ public static string ToString(float value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static string ToString(UInt32 value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static string ToString(UInt16 value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+ public static string ToString(DateTime value)\r
+ {\r
+ return value.ToString(CultureInfo.InvariantCulture);\r
+ }\r
+ public static string ToString(DateTime value, string format)\r
+ {\r
+ return value.ToString(format, CultureInfo.InvariantCulture);\r
+ }\r
+ public static TimeSpan ToTimeSpan(string s)\r
+ {\r
+ return TimeSpan.Parse(s);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static UInt16 ToUInt16(string s)\r
+ {\r
+ return UInt16.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static UInt32 ToUInt32(string s)\r
+ {\r
+ return UInt32.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ [CLSCompliant (false)]\r
+ public static UInt64 ToUInt64(string s)\r
+ {\r
+ return UInt64.Parse(s, CultureInfo.InvariantCulture);\r
+ }\r
+\r
+ public static string VerifyName(string name)\r
+ {\r
+ Exception innerEx;\r
+ if(name == null)\r
+ throw new ArgumentNullException("name");\r
+\r
+ if(XmlConstructs.IsValidName(name, out innerEx))\r
+ return name;\r
+ \r
+ throw new XmlException("'"+name+"' is not a valid XML Name",null);\r
+ }\r
+\r
+ public static string VerifyNCName(string ncname)\r
+ {\r
+ Exception innerEx;\r
+ if(ncname == null)\r
+ throw new ArgumentNullException("ncname");\r
+\r
+ if(XmlConstructs.IsValidName(ncname, out innerEx))\r
+ return ncname;\r
+ \r
+ throw new XmlException("'"+ncname+"' is not a valid XML NCName",innerEx);\r
+ }\r
+ }\r
+}\r