2009-05-26 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 26 May 2009 09:54:44 +0000 (09:54 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 26 May 2009 09:54:44 +0000 (09:54 -0000)
* TcpDuplexSessionChannel.cs : It seems that buffered stream channel
  only accepts buffered messages, so do as such for write buffers.
  Add RelatesTo header.

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

mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog
mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpDuplexSessionChannel.cs

index 3c9b3bf46adb542d6d38256dbea3f2806817b076..df1abe339f8069ad95ca85c673409defc036418c 100755 (executable)
@@ -1,3 +1,9 @@
+2009-05-26  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * TcpDuplexSessionChannel.cs : It seems that buffered stream channel
+         only accepts buffered messages, so do as such for write buffers.
+         Add RelatesTo header.
+
 2009-05-26  Atsushi Enomoto  <atsushi@ximian.com>
 
        * DuplexSessionChannelBase.cs, DuplexChannelBase.cs:
index cd3dbde1132cc0b97b25ecb8d048949a81c2ac08..f147187dc327bdb1c2e7bdb2b8c5775c4f8054ee 100644 (file)
@@ -110,10 +110,15 @@ namespace System.ServiceModel.Channels
                
                public override void Send (Message message, TimeSpan timeout)
                {
-                       if (!is_service_side && message.Headers.To == null)
-                               message.Headers.To = RemoteAddress.Uri;
-                       if (!is_service_side && message.Headers.ReplyTo == null)
-                               message.Headers.ReplyTo = new EndpointAddress (Constants.WsaAnonymousUri);
+                       if (!is_service_side) {
+                               if (message.Headers.To == null)
+                                       message.Headers.To = RemoteAddress.Uri;
+                               if (message.Headers.ReplyTo == null)
+                                       message.Headers.ReplyTo = new EndpointAddress (Constants.WsaAnonymousUri);
+                       } else {
+                               if (message.Headers.RelatesTo == null)
+                                       message.Headers.RelatesTo = OperationContext.Current.IncomingMessageHeaders.MessageId;
+                       }
 
                        client.SendTimeout = (int) timeout.TotalMilliseconds;
                        frame.WriteSizedMessage (message);
@@ -142,8 +147,6 @@ namespace System.ServiceModel.Channels
                public override Message Receive (TimeSpan timeout)
                {
                        client.ReceiveTimeout = (int) timeout.TotalMilliseconds;
-                       Stream s = client.GetStream ();
-
                        return frame.ReadSizedMessage ();
                }
                
@@ -316,13 +319,15 @@ namespace System.ServiceModel.Channels
                {
                        this.mode = mode;
                        this.s = s;
+                       this.buffer = new MemoryStream ();
                        reader = new MyBinaryReader (s);
-                       writer = new MyBinaryWriter (s);
+                       writer = new MyBinaryWriter (buffer);
 
                        EncodingRecord = 8; // FIXME: it should depend on mode.
                }
 
                Stream s;
+               MemoryStream buffer;
 
                int mode;
 
@@ -353,17 +358,20 @@ namespace System.ServiceModel.Channels
 
                public void ProcessPreambleInitiator ()
                {
-                       s.WriteByte (VersionRecord);
-                       s.WriteByte (1);
-                       s.WriteByte (0);
-                       s.WriteByte (ModeRecord);
-                       s.WriteByte ((byte) mode);
-                       s.WriteByte (ViaRecord);
+                       buffer.Position = 0;
+                       buffer.WriteByte (VersionRecord);
+                       buffer.WriteByte (1);
+                       buffer.WriteByte (0);
+                       buffer.WriteByte (ModeRecord);
+                       buffer.WriteByte ((byte) mode);
+                       buffer.WriteByte (ViaRecord);
                        writer.Write (Via.ToString ());
-                       s.WriteByte (KnownEncodingRecord); // FIXME
-                       s.WriteByte ((byte) EncodingRecord);
-                       s.WriteByte (PreambleEndRecord);
-                       s.Flush ();
+                       buffer.WriteByte (KnownEncodingRecord); // FIXME
+                       buffer.WriteByte ((byte) EncodingRecord);
+                       buffer.WriteByte (PreambleEndRecord);
+                       buffer.Flush ();
+
+                       s.Write (buffer.GetBuffer (), 0, (int) buffer.Position);
 
                        int b = s.ReadByte ();
                        switch (b) {
@@ -449,19 +457,20 @@ namespace System.ServiceModel.Channels
                        Message msg = Encoder.ReadMessage (ms, 0x10000);
                        if (benc != null)
                                benc.CurrentReaderSession = null;
-                       s.Flush ();
 
                        return msg;
                }
 
                public void WriteSizedMessage (Message message)
                {
+                       buffer.Position = 0;
+
                        // FIXME: implement full [MC-NMF] protocol.
 
                        if (EncodingRecord != 8)
                                throw new NotImplementedException (String.Format ("Message encoding {0:X} is not implemented yet", EncodingRecord));
 
-                       s.WriteByte (SizedEnvelopeRecord);
+                       buffer.WriteByte (SizedEnvelopeRecord);
 
                        MemoryStream ms = new MemoryStream ();
                        var session = new MyXmlBinaryWriterSession ();
@@ -488,6 +497,8 @@ namespace System.ServiceModel.Channels
 
                        writer.Write (EndRecord);
                        writer.Flush ();
+
+                       s.Write (buffer.GetBuffer (), 0, (int) buffer.Position);
                }
 
                public void ProcessEndRecordRecipient ()