2010-06-30 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Wed, 30 Jun 2010 07:05:11 +0000 (07:05 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Wed, 30 Jun 2010 07:05:11 +0000 (07:05 -0000)
* XmlDefaultWriter.cs : add state management support.
* XmlWriter.cs : use above feature for "null Settings in source
  writer" case. This brings some minor .NET compatibility and
  should fix bug #607697.

* XmlWriterTests.cs : remove NotWorking everywhere.

svn path=/trunk/mcs/; revision=159714

mcs/class/System.XML/System.Xml/ChangeLog
mcs/class/System.XML/System.Xml/DefaultXmlWriter.cs
mcs/class/System.XML/System.Xml/XmlWriter.cs
mcs/class/System.XML/Test/System.Xml/ChangeLog
mcs/class/System.XML/Test/System.Xml/XmlWriterTests.cs

index 2ecd8ce5b5ea1d65693d501d457d75e786462087..ce917ae240bb40ca08e5ce9cac3f22004cb2b84a 100644 (file)
@@ -1,3 +1,10 @@
+2010-06-30  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XmlDefaultWriter.cs : add state management support. 
+       * XmlWriter.cs : use above feature for "null Settings in source
+         writer" case. This brings some minor .NET compatibility and
+         should fix bug #607697.
+
 2010-06-30  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XmlDefaultWriter.cs : new source (which I once wrote for relaxng
index 2735410fc93bbfb0e2423af62e90329c98851074..1c3895ca7593621da5537a43146469d866f820e8 100644 (file)
@@ -15,19 +15,33 @@ namespace System.Xml
        internal class DefaultXmlWriter : XmlWriter
        {
                XmlWriter writer;
-       
+               WriteState state = WriteState.Start;
+               bool delegate_write_state;
+
                public DefaultXmlWriter (XmlWriter writer)
+                       : this (writer, true)
+               {
+               }
+
+               public DefaultXmlWriter (XmlWriter writer, bool delegateWriteState)
                {
                        this.writer = writer;
+                       delegate_write_state = delegateWriteState;
                }
        
                protected XmlWriter Writer {
                        get { return writer; }
                }
-       
+
+               private void CloseStartElement ()
+               {
+                       state = WriteState.Content;
+               }
+
                public override void Close ()
                {
                        writer.Close ();
+                       state = WriteState.Closed;
                }
        
                public override void Flush ()
@@ -43,71 +57,88 @@ namespace System.Xml
                public override void WriteBase64 (byte [] buffer, int index, int count)
                {
                        writer.WriteBase64 (buffer, index, count);
+                       state = WriteState.Content;
                }
        
                public override void WriteBinHex (byte [] buffer, int index, int count)
                {
                        writer.WriteBinHex (buffer, index, count);
+                       state = WriteState.Content;
                }
        
                public override void WriteCData (string text)
                {
                        writer.WriteCData (text);
+                       state = WriteState.Content;
                }
        
                public override void WriteCharEntity (char ch)
                {
                        writer.WriteCharEntity (ch);
+                       state = WriteState.Content;
                }
        
                public override void WriteChars (char [] buffer, int index, int count)
                {
                        writer.WriteChars (buffer, index, count);
+                       state = WriteState.Content;
                }
        
                public override void WriteComment (string text)
                {
                        writer.WriteComment (text);
+                       if (state == WriteState.Start)
+                               state = WriteState.Prolog;
+                       else
+                               state = WriteState.Content;
                }
        
                public override void WriteDocType (string name, string pubid, string sysid, string subset)
                {
                        writer.WriteDocType (name, pubid, sysid, subset);
+                       state = WriteState.Prolog;
                }
        
                public override void WriteEndAttribute ()
                {
                        writer.WriteEndAttribute ();
+                       state = WriteState.Element;
                }
        
                public override void WriteEndDocument ()
                {
                        writer.WriteEndDocument ();
+                       state = WriteState.Start;
                }
        
                public override void WriteEndElement ()
                {
                        writer.WriteEndElement ();
+                       state = WriteState.Content;
                }
        
                public override void WriteEntityRef (string name)
                {
                        writer.WriteEntityRef (name);
+                       state = WriteState.Content;
                }
        
                public override void WriteFullEndElement ()
                {
                        writer.WriteFullEndElement ();
+                       state = WriteState.Content;
                }
        
                public override void WriteName (string name)
                {
                        writer.WriteName (name);
+                       state = WriteState.Content;
                }
        
                public override void WriteNmToken (string name)
                {
                        writer.WriteNmToken (name);
+                       state = WriteState.Content;
                }
        
                public override void WriteNode (XmlReader reader, bool defattr)
@@ -118,61 +149,87 @@ namespace System.Xml
                public override void WriteProcessingInstruction (string name, string text)
                {
                        writer.WriteProcessingInstruction (name, text);
+                       if (state == WriteState.Start)
+                               state = WriteState.Prolog;
+                       else
+                               state = WriteState.Content;
                }
        
                public override void WriteQualifiedName (string localName, string ns)
                {
                        writer.WriteQualifiedName (localName, ns);
+                       state = WriteState.Content;
                }
        
                public override void WriteRaw (string data)
                {
                        writer.WriteRaw (data);
+                       if (state == WriteState.Start)
+                               state = WriteState.Prolog;
+                       else
+                               state = WriteState.Content;
                }
        
                public override void WriteRaw (char [] buffer, int index, int count)
                {
                        writer.WriteRaw (buffer, index, count);
+                       if (state == WriteState.Start)
+                               state = WriteState.Prolog;
+                       else
+                               state = WriteState.Content;
                }
        
                public override void WriteStartAttribute (string prefix, string localName, string ns)
                {
                        writer.WriteStartAttribute (prefix, localName, ns);
+                       state = WriteState.Attribute;
                }
        
                public override void WriteStartDocument (bool standalone)
                {
                        writer.WriteStartDocument (standalone);
+                       state = WriteState.Prolog;
                }
        
                public override void WriteStartDocument ()
                {
                        writer.WriteStartDocument ();
+                       state = WriteState.Prolog;
                }
        
                public override void WriteStartElement (string prefix, string localName, string ns)
                {
                        writer.WriteStartElement (prefix, localName, ns);
+                       state = WriteState.Element;
                }
        
                public override void WriteString (string text)
                {
                        writer.WriteString (text);
+                       state = WriteState.Content;
                }
        
                public override void WriteSurrogateCharEntity (char lowChar, char highChar)
                {
                        writer.WriteSurrogateCharEntity (lowChar, highChar);
+                       state = WriteState.Content;
                }
        
                public override void WriteWhitespace (string ws)
                {
                        writer.WriteWhitespace (ws);
+                       if (state == WriteState.Start)
+                               state = WriteState.Prolog;
+                       else
+                               state = WriteState.Content;
                }
        
                public override WriteState WriteState {
                        get {
-                               return writer.WriteState;
+                               if (delegate_write_state)
+                                       return writer.WriteState;
+                               else
+                                       return state;
                        }
                }
        
index 3f0483622393e0ffec97d3f41792f5b2cd95478f..b54681130505db35dc0553563bff0f5d53da6bb0 100644 (file)
@@ -141,11 +141,11 @@ namespace System.Xml
                        else
                                settings = settings.Clone ();
 
-                       bool returnNew = false;
                        var src = writer.Settings;
                        if (src == null) {
                                settings.ConformanceLevel = ConformanceLevel.Document; // Huh? Why??
-                               returnNew = true;
+                               writer = new DefaultXmlWriter (writer);
+                               writer.settings = settings;
                        } else {
                                ConformanceLevel dst = src.ConformanceLevel;
                                switch (src.ConformanceLevel) {
@@ -161,14 +161,13 @@ namespace System.Xml
 
                                settings.MergeFrom (src);
 
-                               // It returns a new XmlWriter instance if 1) Settings is *not* overriden, or 2) Settings give a significant difference.
-                               returnNew = src.ConformanceLevel != dst;
+                               // It returns a new XmlWriter instance if 1) Settings is null, or 2) Settings ConformanceLevel (or might be other members as well) give significant difference.
+                               if (src.ConformanceLevel != dst) {
+                                       writer = new DefaultXmlWriter (writer, false);
+                                       writer.settings = settings;
+                               }
                        }
 
-                       if (returnNew) {
-                               writer = new DefaultXmlWriter (writer);
-                               writer.settings = settings;
-                       }
                        return writer;
                }
 
index 2a9911cc1a5791ef0fe7582af3fc35c6baaa0829..f83cec004f864b5b12bbc8257affda9225bfdcc6 100644 (file)
@@ -1,3 +1,7 @@
+2010-06-30  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XmlWriterTests.cs : remove NotWorking everywhere.
+
 2010-06-30  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XmlWriterTests.cs : add a bit more assertions.
index 1432cb5251ca7f6f5f61665f917f7425de8f41dc..2cf11481ffa9283a6cc754db520e7b8bd564afc0 100644 (file)
@@ -608,7 +608,6 @@ namespace MonoTests.System.Xml
                //   and the source settings, it does not create wrapper.\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                public void CreateCLAuto ()\r
                {\r
                        ConformanceLevelAuto cl = new ConformanceLevelAuto ();\r
@@ -630,7 +629,6 @@ namespace MonoTests.System.Xml
                }\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                public void CreateCLFrag ()\r
                {\r
                        ConformanceLevelFragment cl = new ConformanceLevelFragment ();\r
@@ -697,7 +695,6 @@ namespace MonoTests.System.Xml
                }\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                public void CreateCLAutoSettingsCLDoc ()\r
                {\r
                        ConformanceLevelAuto cl = new ConformanceLevelAuto ();\r
@@ -708,7 +705,6 @@ namespace MonoTests.System.Xml
                }\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                public void CreateCLAutoSettingsCLFrag ()\r
                {\r
                        ConformanceLevelAuto cl = new ConformanceLevelAuto ();\r
@@ -741,7 +737,6 @@ namespace MonoTests.System.Xml
                }\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                public void CreateCLDocSettingsCLFrag ()\r
                {\r
                        ConformanceLevelDocument cl = new ConformanceLevelDocument ();\r
@@ -763,7 +758,6 @@ namespace MonoTests.System.Xml
                }\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                public void CreateCLFragSettingsCLDoc ()\r
                {\r
                        ConformanceLevelFragment cl = new ConformanceLevelFragment ();\r