New tests.
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / MessageImpl.cs
index c79a462f19b690ec8f836d591a35b657325edee6..b4c341d029722394abe3282365321c117fbe73ff 100644 (file)
@@ -32,9 +32,6 @@ using System.IO;
 
 namespace System.ServiceModel.Channels
 {
-       // Apparently Microsoft should have split Message class into
-       // two diffferent public classes such as IncomingMessage and
-       // OutgoingMessage.
        internal class XmlReaderMessage : Message
        {
                MessageVersion version;
@@ -44,8 +41,6 @@ namespace System.ServiceModel.Channels
                bool is_empty, is_fault, body_started, body_consumed;
                int max_headers;
 
-               string body;
-
                public XmlReaderMessage (MessageVersion version, XmlDictionaryReader reader, int maxSizeOfHeaders)
                {
                        this.version = version;
@@ -53,16 +48,6 @@ namespace System.ServiceModel.Channels
                        this.max_headers = maxSizeOfHeaders;
 
                        ReadEnvelopeStart ();
-                       // Headers and IsEmpty are consumed at this stage.
-                       // Body content is not.
-                       ReadBodyStart ();
-
-                       StringWriter sw = new StringWriter ();
-                       using (XmlDictionaryWriter bodyXml = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw))) {
-                               while (!reader.EOF && reader.NodeType != XmlNodeType.EndElement)
-                                       bodyXml.WriteNode (reader, false);
-                       }
-                       this.body = sw.ToString ();
                }
 
                public override MessageHeaders Headers {
@@ -75,16 +60,14 @@ namespace System.ServiceModel.Channels
 
                public override bool IsEmpty {
                        get {
-                               if (!body_started)
-                                       ReadBodyStart ();
+                               ReadBodyStart ();
                                return is_empty;
                        }
                }
 
                public override bool IsFault {
                        get {
-                               if (!body_started)
-                                       ReadBodyStart ();
+                               ReadBodyStart ();
                                return is_fault;
                        }
                }
@@ -97,6 +80,15 @@ namespace System.ServiceModel.Channels
                        get { return version; }
                }
 
+               protected override MessageBuffer OnCreateBufferedCopy (
+                       int maxBufferSize)
+               {
+                       ReadBodyStart ();
+                       var headers = new MessageHeaders (Headers);
+                       var props = new MessageProperties (Properties);
+                       return new DefaultMessageBuffer (maxBufferSize, headers, props, new XmlReaderBodyWriter (reader), IsFault);
+               }
+
                protected override string OnGetBodyAttribute (
                        string localName, string ns)
                {
@@ -107,9 +99,15 @@ namespace System.ServiceModel.Channels
 
                protected override XmlDictionaryReader OnGetReaderAtBodyContents ()
                {
-                       XmlDictionaryReader newReader = XmlDictionaryReader.CreateDictionaryReader (XmlReader.Create (new StringReader (this.body)));
-                       newReader.MoveToContent();
-                       return newReader;
+                       if (reader.ReadState == ReadState.Closed)
+                               return reader; // silly, but that's what our test expects.
+                       if (body_consumed)
+                               throw new InvalidOperationException ("The message body XmlReader is already consumed.");
+                       ReadBodyStart ();
+                       if (is_empty)
+                               throw new InvalidOperationException ("The message body is empty.");
+                       body_consumed = true;
+                       return reader;
                }
 
                protected override void OnWriteBodyContents (
@@ -150,13 +148,11 @@ namespace System.ServiceModel.Channels
                        if (isEmptyHeader)
                                return;
 
-                       XmlDocument doc = null;
                        while (!reader.EOF && reader.NodeType != XmlNodeType.EndElement) {
-                               if (doc == null)
-                                       doc = new XmlDocument ();
-                               XmlElement el = doc.ReadNode (reader) as XmlElement;
-                               if (el != null)
-                                       headers.Add (MessageHeader.CreateInternalHeader (el, envNS));
+                               if (reader.NodeType == XmlNodeType.Element)
+                                       headers.Add (new MessageHeader.RawMessageHeader (reader, envNS));
+                               else
+                                       reader.Skip ();
                                // FIXME: handle UnderstoodHeaders as well.
                                reader.MoveToContent ();
                        }
@@ -166,6 +162,9 @@ namespace System.ServiceModel.Channels
 
                void ReadBodyStart ()
                {
+                       if (body_started)
+                               return;
+
                        // read headers in advance.
                        if (headers == null)
                                ReadHeaders ();
@@ -265,5 +264,14 @@ namespace System.ServiceModel.Channels
                {
                        body.WriteBodyContents (writer);
                }
+
+               protected override MessageBuffer OnCreateBufferedCopy (
+                       int maxBufferSize)
+               {
+                       var headers = new MessageHeaders (Headers);
+                       var props = new MessageProperties (Properties);
+                       return new DefaultMessageBuffer (maxBufferSize, headers, props, body.CreateBufferedCopy (maxBufferSize), IsFault);
+               }
        }
 }
+