2010-01-21 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / Message.cs
index 10d0eb9e34f9c9f3750b51b07cb364c39dff3107..2a306e705ae2eaaa2f06a89327af7349b04168bc 100644 (file)
@@ -162,13 +162,13 @@ namespace System.ServiceModel.Channels
                                OnWriteBodyContents (writer);
                        else if (Version.Envelope == EnvelopeVersion.None)
                                WriteXsiNil (writer);
+                       State = MessageState.Written;
                }
 
                public void WriteMessage (XmlDictionaryWriter writer)
                {
                        if (State != MessageState.Created)
                                throw new InvalidOperationException (String.Format ("The message is already at {0} state", State));
-                       State = MessageState.Written;
 
                        OnWriteMessage (writer);
                }
@@ -180,9 +180,8 @@ namespace System.ServiceModel.Channels
 
                public void WriteStartBody (XmlDictionaryWriter writer)
                {
-                       if (State != MessageState.Created && State != MessageState.Written)
+                       if (State != MessageState.Created)
                                throw new InvalidOperationException (String.Format ("The message is already at {0} state", State));
-                       State = MessageState.Written;
 
                        OnWriteStartBody (writer);
                }
@@ -195,9 +194,8 @@ namespace System.ServiceModel.Channels
 
                public void WriteStartEnvelope (XmlDictionaryWriter writer)
                {
-                       if (State != MessageState.Created && State != MessageState.Written)
+                       if (State != MessageState.Created)
                                throw new InvalidOperationException (String.Format ("The message is already at {0} state", State));
-                       State = MessageState.Written;
 
                        OnWriteStartEnvelope (writer);
                }
@@ -213,21 +211,19 @@ namespace System.ServiceModel.Channels
                {
                }
 
-               [MonoTODO]
+               [MonoTODO ("use maxBufferSize")]
                protected virtual MessageBuffer OnCreateBufferedCopy (
                        int maxBufferSize)
                {
-#if NET_2_1
+                       var s = new XmlWriterSettings ();
+                       s.OmitXmlDeclaration = true;
+                       s.ConformanceLevel = ConformanceLevel.Auto;
                        StringWriter sw = new StringWriter ();
-                       using (XmlDictionaryWriter w = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw)))
-                               WriteMessage (w);
-                       return new DefaultMessageBuffer (maxBufferSize, Headers, Properties, new XmlReaderBodyWriter (sw.ToString ()), false);
-#else
-                       DTMXPathDocumentWriter2 pw = new DTMXPathDocumentWriter2 (new NameTable (), 100);
-                       XmlDictionaryWriter w = XmlDictionaryWriter.CreateDictionaryWriter (pw);
-                       WriteMessage (w);
-                       return new XPathMessageBuffer (pw.CreateDocument (), Version, Headers.Count, this.Properties);
-#endif
+                       using (XmlDictionaryWriter w = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw, s)))
+                               WriteBodyContents (w);
+                       var headers = new MessageHeaders (Headers);
+                       var props = new MessageProperties (Properties);
+                       return new DefaultMessageBuffer (maxBufferSize, headers, props, new XmlReaderBodyWriter (sw.ToString ()), false);
                }
 
                protected virtual string OnGetBodyAttribute (
@@ -237,30 +233,18 @@ namespace System.ServiceModel.Channels
                        return null;
                }
 
-               [MonoTODO]
                protected virtual XmlDictionaryReader OnGetReaderAtBodyContents ()
                {
-                       XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (TextWriter.Null));
-                       if (Version.Envelope != EnvelopeVersion.None) {
-                               WriteStartEnvelope (writer);
-                               OnWriteStartHeaders (writer);
-                               for (int i = 0, count = Headers.Count; i < count; i++)
-                                       Headers.WriteHeader (i, writer);
-                               writer.WriteEndElement ();
-                               WriteStartBody (writer);
-                       }
-
+                       var ws = new XmlWriterSettings ();
+                       ws.ConformanceLevel = ConformanceLevel.Auto;
                        StringWriter sw = new StringWriter ();
-                       using (XmlDictionaryWriter body = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw))) {
+                       using (XmlDictionaryWriter body = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw, ws))) {
                                WriteBodyContents (body);
                        }
 
-                       if (Version.Envelope != EnvelopeVersion.None) {
-                               writer.WriteEndElement ();
-                               writer.WriteEndElement ();
-                       }
-
-                       return XmlDictionaryReader.CreateDictionaryReader (XmlReader.Create (new StringReader (sw.ToString ())));
+                       var rs = new XmlReaderSettings ();
+                       rs.ConformanceLevel = ConformanceLevel.Auto;
+                       return XmlDictionaryReader.CreateDictionaryReader (XmlReader.Create (new StringReader (sw.ToString ()), rs));
                }
 
                protected abstract void OnWriteBodyContents (
@@ -283,7 +267,6 @@ namespace System.ServiceModel.Channels
                                writer.WriteEndElement ();
                }
 
-               [MonoTODO]
                protected virtual void OnWriteStartBody (
                        XmlDictionaryWriter writer)
                {