فهرست منبع

2003-10-25 Atsushi Enomoto <[email protected]>

	* DTDReader.cs,
	  XmlConstructs.cs,
	  XmlTextReader.cs,
	  XmlWriter.cs : Fixed incorrect access modifier.
	* XmlTextWriter.cs : Imported state variable from XmlWriter.
	* DTDValidatingReader.cs : Removed extraneous MonoTODO.
	* XmlConvert.cs : Implemented ToTimeSpan().
	  Modified ToDateTime() to reuse the same array.

svn path=/trunk/mcs/; revision=19373
Atsushi Eno 22 سال پیش
والد
کامیت
4cb580369a

+ 11 - 0
mcs/class/System.XML/System.Xml/ChangeLog

@@ -1,3 +1,14 @@
+2003-10-25  Atsushi Enomoto <[email protected]>
+
+	* DTDReader.cs,
+	  XmlConstructs.cs,
+	  XmlTextReader.cs,
+	  XmlWriter.cs : Fixed incorrect access modifier.
+	* XmlTextWriter.cs : Imported state variable from XmlWriter.
+	* DTDValidatingReader.cs : Removed extraneous MonoTODO.
+	* XmlConvert.cs : Implemented ToTimeSpan().
+	  Modified ToDateTime() to reuse the same array.
+
 2003-10-19  Atsushi Enomoto <[email protected]>
 
 	* XmlAttributeCollection.cs : Fixed synchronization stuff.

+ 2 - 3
mcs/class/System.XML/System.Xml/DTDReader.cs

@@ -14,13 +14,13 @@ using System.Collections;
 using System.Collections.Specialized;
 using System.IO;
 using System.Text;
-using System.Xml.Schema;
 using Mono.Xml;
+using System.Xml.Schema;
 using Mono.Xml.Native;
 
 namespace System.Xml
 {
-	public class DTDReader //: IXmlLineInfo
+	internal class DTDReader //: IXmlLineInfo
 	{
 		private XmlParserInput currentInput;
 		private Stack parserInputStack;
@@ -536,7 +536,6 @@ namespace System.Xml
 					"Whitespace is required after name in DTD parameter entity declaration.");
 
 			if (PeekChar () == 'S' || PeekChar () == 'P') {
-//				throw new NotImplementedException ("External parameter entity reference is not implemented yet.");
 				// read publicId/systemId
 				ReadExternalID ();
 				decl.PublicId = cachedPublicId;

+ 0 - 2
mcs/class/System.XML/System.Xml/DTDValidatingReader.cs

@@ -564,7 +564,6 @@ namespace Mono.Xml
 
 		Stack attributeValueEntityStack = new Stack ();
 
-		[MonoTODO ("Resolve recursive attribute values.")]
 		private void ValidateAttributes (DTDAttListDeclaration decl)
 		{
 			while (reader.MoveToNextAttribute ()) {
@@ -592,7 +591,6 @@ namespace Mono.Xml
 								XmlSeverityType.Error);
 							hasError = true;
 						} else {
-//							valueBuilder.Append (edecl.EntityValue);
 							XmlTextReader etr = new XmlTextReader (edecl.EntityValue, XmlNodeType.Attribute, ParserContext);
 							attributeValueEntityStack.Push (targetReader);
 							targetReader = etr;

+ 1 - 1
mcs/class/System.XML/System.Xml/XmlConstructs.cs

@@ -10,7 +10,7 @@ namespace System.Xml
 	/// However, No surrogate support is included in this class.
 	/// This class is currently public. Make it internal after testing completes
 	/// </remarks>
-	public class XmlConstructs
+	internal class XmlConstructs
 	{
 		/** Character flags. */
 		internal static byte[] CHARS = new byte[1 << 16];

+ 170 - 76
mcs/class/System.XML/System.Xml/XmlConvert.cs

@@ -12,12 +12,91 @@
 using System;
 using System.Text;
 using System.Globalization;
+using System.Xml.Schema;
 
 namespace System.Xml {
 
 	public class XmlConvert {
 
-		static string encodedColon = "_x003A_";
+		static string encodedColon;
+		static string [] datetimeFormats;
+
+		static XmlConvert ()
+		{
+			encodedColon = "_x003A_";
+			datetimeFormats = new string[] {
+			  // dateTime
+			  "yyyy-MM-ddTHH:mm:ss",
+			  "yyyy-MM-ddTHH:mm:ss.f",
+			  "yyyy-MM-ddTHH:mm:ss.ff",
+			  "yyyy-MM-ddTHH:mm:ss.fff",
+			  "yyyy-MM-ddTHH:mm:ss.ffff",
+			  "yyyy-MM-ddTHH:mm:ss.fffff",
+			  "yyyy-MM-ddTHH:mm:ss.ffffff",
+			  "yyyy-MM-ddTHH:mm:ss.fffffff",
+			  "yyyy-MM-ddTHH:mm:sszzz",
+			  "yyyy-MM-ddTHH:mm:ss.fzzz",
+			  "yyyy-MM-ddTHH:mm:ss.ffzzz",
+			  "yyyy-MM-ddTHH:mm:ss.fffzzz",
+			  "yyyy-MM-ddTHH:mm:ss.ffffzzz",
+			  "yyyy-MM-ddTHH:mm:ss.fffffzzz",
+			  "yyyy-MM-ddTHH:mm:ss.ffffffzzz",
+			  "yyyy-MM-ddTHH:mm:ss.fffffffzzz",
+			  "yyyy-MM-ddTHH:mm:ssZ",
+			  "yyyy-MM-ddTHH:mm:ss.fZ",
+			  "yyyy-MM-ddTHH:mm:ss.ffZ",
+			  "yyyy-MM-ddTHH:mm:ss.fffZ",
+			  "yyyy-MM-ddTHH:mm:ss.ffffZ",
+			  "yyyy-MM-ddTHH:mm:ss.fffffZ",
+			  "yyyy-MM-ddTHH:mm:ss.ffffffZ",
+			  "yyyy-MM-ddTHH:mm:ss.fffffffZ",
+			  // time
+			  "HH:mm:ss",
+			  "HH:mm:ss.f",
+			  "HH:mm:ss.ff",
+			  "HH:mm:ss.fff",
+			  "HH:mm:ss.ffff",
+			  "HH:mm:ss.fffff",
+			  "HH:mm:ss.ffffff",
+			  "HH:mm:ss.fffffff",
+			  "HH:mm:sszzz",
+			  "HH:mm:ss.fzzz",
+			  "HH:mm:ss.ffzzz",
+			  "HH:mm:ss.fffzzz",
+			  "HH:mm:ss.ffffzzz",
+			  "HH:mm:ss.fffffzzz",
+			  "HH:mm:ss.ffffffzzz",
+			  "HH:mm:ss.fffffffzzz",
+			  "HH:mm:ssZ",
+			  "HH:mm:ss.fZ",
+			  "HH:mm:ss.ffZ",
+			  "HH:mm:ss.fffZ",
+			  "HH:mm:ss.ffffZ",
+			  "HH:mm:ss.fffffZ",
+			  "HH:mm:ss.ffffffZ",
+			  "HH:mm:ss.fffffffZ",
+			  // date
+			  "yyyy-MM-dd",
+			  "yyyy-MM-ddzzz",
+			  "yyyy-MM-ddZ",
+			  // gYearMonth
+			  "yyyy-MM",
+			  "yyyy-MMzzz",
+			  "yyyy-MMZ",
+			  // gYear
+			  "yyyy",
+			  "yyyyzzz",
+			  "yyyyZ",
+			  // gMonthDay
+			  "--MM-dd",
+			  "--MM-ddzzz",
+			  "--MM-ddZ",
+			  // gDay
+			  "---dd",
+			  "---ddzzz",
+			  "---ddZ",
+			};
+		}
 
 		public XmlConvert()
 		{}
@@ -131,78 +210,7 @@ namespace System.Xml {
 
 		public static DateTime ToDateTime(string s)
 		{
-			return ToDateTime(s, new string[] {
-			  // dateTime
-			  "yyyy-MM-ddTHH:mm:ss",
-			  "yyyy-MM-ddTHH:mm:ss.f",
-			  "yyyy-MM-ddTHH:mm:ss.ff",
-			  "yyyy-MM-ddTHH:mm:ss.fff",
-			  "yyyy-MM-ddTHH:mm:ss.ffff",
-			  "yyyy-MM-ddTHH:mm:ss.fffff",
-			  "yyyy-MM-ddTHH:mm:ss.ffffff",
-			  "yyyy-MM-ddTHH:mm:ss.fffffff",
-			  "yyyy-MM-ddTHH:mm:sszzz",
-			  "yyyy-MM-ddTHH:mm:ss.fzzz",
-			  "yyyy-MM-ddTHH:mm:ss.ffzzz",
-			  "yyyy-MM-ddTHH:mm:ss.fffzzz",
-			  "yyyy-MM-ddTHH:mm:ss.ffffzzz",
-			  "yyyy-MM-ddTHH:mm:ss.fffffzzz",
-			  "yyyy-MM-ddTHH:mm:ss.ffffffzzz",
-			  "yyyy-MM-ddTHH:mm:ss.fffffffzzz",
-			  "yyyy-MM-ddTHH:mm:ssZ",
-			  "yyyy-MM-ddTHH:mm:ss.fZ",
-			  "yyyy-MM-ddTHH:mm:ss.ffZ",
-			  "yyyy-MM-ddTHH:mm:ss.fffZ",
-			  "yyyy-MM-ddTHH:mm:ss.ffffZ",
-			  "yyyy-MM-ddTHH:mm:ss.fffffZ",
-			  "yyyy-MM-ddTHH:mm:ss.ffffffZ",
-			  "yyyy-MM-ddTHH:mm:ss.fffffffZ",
-			  // time
-			  "HH:mm:ss",
-			  "HH:mm:ss.f",
-			  "HH:mm:ss.ff",
-			  "HH:mm:ss.fff",
-			  "HH:mm:ss.ffff",
-			  "HH:mm:ss.fffff",
-			  "HH:mm:ss.ffffff",
-			  "HH:mm:ss.fffffff",
-			  "HH:mm:sszzz",
-			  "HH:mm:ss.fzzz",
-			  "HH:mm:ss.ffzzz",
-			  "HH:mm:ss.fffzzz",
-			  "HH:mm:ss.ffffzzz",
-			  "HH:mm:ss.fffffzzz",
-			  "HH:mm:ss.ffffffzzz",
-			  "HH:mm:ss.fffffffzzz",
-			  "HH:mm:ssZ",
-			  "HH:mm:ss.fZ",
-			  "HH:mm:ss.ffZ",
-			  "HH:mm:ss.fffZ",
-			  "HH:mm:ss.ffffZ",
-			  "HH:mm:ss.fffffZ",
-			  "HH:mm:ss.ffffffZ",
-			  "HH:mm:ss.fffffffZ",
-			  // date
-			  "yyyy-MM-dd",
-			  "yyyy-MM-ddzzz",
-			  "yyyy-MM-ddZ",
-			  // gYearMonth
-			  "yyyy-MM",
-			  "yyyy-MMzzz",
-			  "yyyy-MMZ",
-			  // gYear
-			  "yyyy",
-			  "yyyyzzz",
-			  "yyyyZ",
-			  // gMonthDay
-			  "--MM-dd",
-			  "--MM-ddzzz",
-			  "--MM-ddZ",
-			  // gDay
-			  "---dd",
-			  "---ddzzz",
-			  "---ddZ",
-			});
+			return ToDateTime(s, datetimeFormats);
 		}
 		
 		public static DateTime ToDateTime(string s, string format)
@@ -221,7 +229,7 @@ namespace System.Xml {
 		
 		public static Decimal ToDecimal(string s)
 		{
-			return Decimal.Parse(s, CultureInfo.InvariantCulture);
+			return Decimal.Parse(s, NumberFormatInfo.InvariantInfo);
 		}
 		
 		public static double ToDouble(string s)
@@ -379,10 +387,96 @@ namespace System.Xml {
 			return value.ToString(format, CultureInfo.InvariantCulture);
 		}
 
-		[MonoTODO]
 		public static TimeSpan ToTimeSpan(string s)
 		{
-			return TimeSpan.Parse(s); // FIXME: Should Parse according to XML Schema spec
+			if (s.Length == 0)
+				throw new ArgumentException ("Invalid format string for duration schema datatype.");
+
+			int start = 0;
+			if (s [0] == '-')
+				start = 1;
+			bool minusValue = (start == 1);
+
+			if (s [start] != 'P')
+				throw new ArgumentException ("Invalid format string for duration schema datatype.");
+			start++;
+
+			int parseStep = 0;
+			int days = 0;
+			bool isTime = false;
+			int hours = 0;
+			int minutes = 0;
+			int seconds = 0;
+
+			bool error = false;
+
+			int i = start;
+			while (i < s.Length) {
+				if (s [i] == 'T') {
+					isTime = true;
+					parseStep = 4;
+					i++;
+					start = i;
+					continue;
+				}
+				for (; i < s.Length; i++) {
+					if (!Char.IsDigit (s [i]))
+						break;
+				}
+				int value = int.Parse (s.Substring (start, i - start));
+				switch (s [i]) {
+				case 'Y':
+					days += value * 365;
+					if (parseStep > 0)
+						error = true;
+					else
+						parseStep = 1;
+					break;
+				case 'M':
+					if (parseStep < 2) {
+						days += 365 * (value / 12) + 30 * (value % 12);
+						parseStep = 2;
+					} else if (isTime && parseStep < 6) {
+						minutes = value;
+						parseStep = 6;
+					}
+					else
+						error = true;
+					break;
+				case 'D':
+					days += value;
+					if (parseStep > 2)
+						error = true;
+					else
+						parseStep = 3;
+					break;
+				case 'H':
+					hours = value;
+					if (!isTime || parseStep > 4)
+						error = true;
+					else
+						parseStep = 5;
+					break;
+				case 'S':
+					seconds = value;
+					if (!isTime || parseStep > 6)
+						error = true;
+					else
+						parseStep = 7;
+					break;
+				default:
+					error = true;
+					break;
+				}
+				if (error)
+					break;
+				++i;
+				start = i;
+			}
+			if (error)
+				throw new ArgumentException ("Invalid format string for duration schema datatype.");
+			TimeSpan ts = new TimeSpan (days, hours, minutes, seconds);
+			return minusValue ? -ts : ts;
 		}
 
 		[CLSCompliant (false)]

+ 1 - 12
mcs/class/System.XML/System.Xml/XmlTextReader.cs

@@ -1137,18 +1137,7 @@ namespace System.Xml
 			currentAttributeValue = -1;
 		}
 
-		/*
 		private int PeekChar ()
-		{
-			return currentInput.PeekChar ();
-		}
-
-		private int ReadChar ()
-		{
-			return currentInput.ReadChar ();
-		}
-		*/
-		public int PeekChar ()
 		{
 			if (can_seek)
 				return reader.Peek ();
@@ -1164,7 +1153,7 @@ namespace System.Xml
 			return peek_char;
 		}
 
-		public int ReadChar ()
+		private int ReadChar ()
 		{
 			int ch;
 

+ 1 - 0
mcs/class/System.XML/System.Xml/XmlTextWriter.cs

@@ -21,6 +21,7 @@ namespace System.Xml
 		#region Fields
 		const string XmlnsNamespace = "http://www.w3.org/2000/xmlns/";
 
+		WriteState ws = WriteState.Start;
 		TextWriter w;
 		bool nullEncoding = false;
 		bool openWriter = true;

+ 0 - 6
mcs/class/System.XML/System.Xml/XmlWriter.cs

@@ -15,12 +15,6 @@ namespace System.Xml
 {
 	public abstract class XmlWriter
 	{
-		#region Fields
-
-		protected WriteState ws = WriteState.Start;
-
-		#endregion
-
 		#region Constructors
 
 		protected XmlWriter () { }