2002-09-03 Dietmar Maurer <dietmar@ximian.com>
[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 using System.Collections;
10 using System.IO;
11 using System.Net.Sockets;
12 using System.Runtime.Remoting.Messaging;
13 using System.Runtime.Remoting.Channels;
14
15 namespace System.Runtime.Remoting.Channels.Simple
16 {
17
18         internal class SimpleClientTransportSink : IClientChannelSink
19         {
20                 string host;
21                 string object_uri;
22                 int port;
23                 
24                 TcpClient tcpclient;
25                 Stream network_stream;
26                 
27                 public SimpleClientTransportSink (string url)
28                 {
29                         host = SimpleChannel.ParseSimpleURL (url, out object_uri, out port);
30                         tcpclient = new TcpClient ();
31                 }
32
33                 public IDictionary Properties
34                 {
35                         get {
36                                 return null;
37                         }
38                 }
39
40                 public IClientChannelSink NextChannelSink
41                 {
42                         get {
43                                 // we are the last one
44                                 return null;
45                         }
46                 }
47
48                 public void AsyncProcessRequest (IClientChannelSinkStack sinkStack, IMessage msg,
49                                                  ITransportHeaders headers, Stream stream)
50                 {
51                         throw new NotImplementedException ();                   
52                 }
53
54                 public void AsyncProcessResponse (IClientResponseChannelSinkStack sinkStack,
55                                                   object state, ITransportHeaders headers,
56                                                   Stream stream)
57                 {
58                         throw new NotImplementedException ();
59                 }
60
61                 public Stream GetRequestStream (IMessage msg, ITransportHeaders headers)
62                 {
63                         // no direct access to the stream
64                         return null;
65                 }
66                 
67                 public void ProcessMessage (IMessage msg,
68                                             ITransportHeaders requestHeaders,
69                                             Stream requestStream,
70                                             out ITransportHeaders responseHeaders,
71                                             out Stream responseStream)
72                 {
73                         // get a network stream
74                         if (network_stream == null) {
75                                 tcpclient.Connect (host, port);
76                                 network_stream = tcpclient.GetStream ();
77                         }
78         
79                         // send the message
80                         SimpleMessageFormat.SendMessageStream (network_stream, (MemoryStream)requestStream,
81                                                                SimpleMessageFormat.MessageType.Request,
82                                                                object_uri);
83                         
84                         // read the response fro the network an copy it to a memory stream
85                         SimpleMessageFormat.MessageType msg_type;
86                         string uri;
87                         MemoryStream mem_stream = SimpleMessageFormat.ReceiveMessageStream (network_stream, out msg_type, out uri);
88
89                         // close the stream
90                         //tcpclient.Close ();
91
92                         switch (msg_type) {
93                         case SimpleMessageFormat.MessageType.Response:
94                                 //fixme: read response message
95                                 responseHeaders = null;
96                         
97                                 responseStream = mem_stream;
98                 
99                                 break;
100                         default:
101                                 throw new Exception ("unknown response mesage header");
102                         }
103                 }
104                         
105         }
106 }