This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / System.Runtime.Remoting / System.Runtime.Remoting.Channels.Simple / SimpleClientTransportSink.cs
1 //
2 // System.Runtime.Remoting.Channels.Simple.SimpleClientTransportSink.cs
3 //
4 // Author: Dietmar Maurer (dietmar@ximian.com)
5 //
6 // 2002 (C) Copyright, Ximian, Inc.
7 //
8
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 using System.Collections;
31 using System.IO;
32 using System.Net.Sockets;
33 using System.Runtime.Remoting.Messaging;
34 using System.Runtime.Remoting.Channels;
35
36 namespace System.Runtime.Remoting.Channels.Simple
37 {
38
39         internal class SimpleClientTransportSink : IClientChannelSink
40         {
41                 string host;
42                 string object_uri;
43                 int port;
44                 
45                 TcpClient tcpclient;
46                 Stream network_stream;
47                 
48                 public SimpleClientTransportSink (string url)
49                 {
50                         host = SimpleChannel.ParseSimpleURL (url, out object_uri, out port);
51                         tcpclient = new TcpClient ();
52                 }
53
54                 public IDictionary Properties
55                 {
56                         get {
57                                 return null;
58                         }
59                 }
60
61                 public IClientChannelSink NextChannelSink
62                 {
63                         get {
64                                 // we are the last one
65                                 return null;
66                         }
67                 }
68
69                 public void AsyncProcessRequest (IClientChannelSinkStack sinkStack, IMessage msg,
70                                                  ITransportHeaders headers, Stream stream)
71                 {
72                         throw new NotImplementedException ();                   
73                 }
74
75                 public void AsyncProcessResponse (IClientResponseChannelSinkStack sinkStack,
76                                                   object state, ITransportHeaders headers,
77                                                   Stream stream)
78                 {
79                         throw new NotImplementedException ();
80                 }
81
82                 public Stream GetRequestStream (IMessage msg, ITransportHeaders headers)
83                 {
84                         // no direct access to the stream
85                         return null;
86                 }
87                 
88                 public void ProcessMessage (IMessage msg,
89                                             ITransportHeaders requestHeaders,
90                                             Stream requestStream,
91                                             out ITransportHeaders responseHeaders,
92                                             out Stream responseStream)
93                 {
94                         // get a network stream
95                         if (network_stream == null) {
96                                 tcpclient.Connect (host, port);
97                                 network_stream = tcpclient.GetStream ();
98                         }
99         
100                         // send the message
101                         SimpleMessageFormat.SendMessageStream (network_stream, (MemoryStream)requestStream,
102                                                                SimpleMessageFormat.MessageType.Request,
103                                                                object_uri);
104                         
105                         // read the response fro the network an copy it to a memory stream
106                         SimpleMessageFormat.MessageType msg_type;
107                         string uri;
108                         MemoryStream mem_stream = SimpleMessageFormat.ReceiveMessageStream (network_stream, out msg_type, out uri);
109
110                         // close the stream
111                         //tcpclient.Close ();
112
113                         switch (msg_type) {
114                         case SimpleMessageFormat.MessageType.Response:
115                                 //fixme: read response message
116                                 responseHeaders = null;
117                         
118                                 responseStream = mem_stream;
119                 
120                                 break;
121                         default:
122                                 throw new Exception ("unknown response mesage header");
123                         }
124                 }
125                         
126         }
127 }