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;
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;
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 {
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;
}
}
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)
{
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 (
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 ();
}
void ReadBodyStart ()
{
+ if (body_started)
+ return;
+
// read headers in advance.
if (headers == null)
ReadHeaders ();
{
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);
+ }
}
}
+