2010-01-21 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / System.Runtime.Remoting / System.Runtime.Remoting.Channels.Ipc.Win32 / NamedPipeStream.cs
1 //
2 // System.Runtime.Remoting.Channels.Ipc.Win32.NamedPipeStream.cs
3 //
4 // Author: Robert Jordan (robertj@gmx.net)
5 //
6 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
7 //
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 #if NET_2_0
30
31 using System;
32 using System.IO;
33 using System.Runtime.Remoting.Messaging;
34
35 namespace System.Runtime.Remoting.Channels.Ipc.Win32
36 {
37     /// <summary>
38     /// Provides the underlying stream of data for local Named Pipe access.
39     /// </summary>
40     internal class NamedPipeStream : Stream
41     {
42         readonly NamedPipeSocket socket;
43         readonly bool ownsSocket;
44
45         /// <summary>
46         /// Creates a new instance of the NamedPipeStream class for the specified NamedPipeSocket.
47         /// </summary>
48         /// <param name="socket"></param>
49         public NamedPipeStream(NamedPipeSocket socket, bool ownsSocket)
50         {
51             this.socket = socket;
52             this.ownsSocket = ownsSocket;
53         }
54
55         public override bool CanRead
56         {
57             get { return true; }
58         }
59
60         public override bool CanSeek
61         {
62             get { return false; }
63         }
64
65         public override bool CanWrite
66         {
67             get { return true; }
68         }
69
70         public override long Length
71         {
72             get { throw new NotSupportedException(); }
73         }
74
75         public override long Position
76         {
77             get { throw new NotSupportedException(); }
78             set { throw new NotSupportedException(); }
79         }
80
81         public override long Seek(long offset, SeekOrigin origin)
82         {
83             throw new NotSupportedException();
84         }
85
86         public override void SetLength(long value)
87         {
88             throw new NotSupportedException();
89         }
90
91         public override void Close() 
92         {
93             if (ownsSocket) socket.Close();
94         }
95
96         public override void Flush() 
97         {
98         }
99
100         public override int Read(byte[] buffer, int offset, int count)
101         {
102             return socket.Receive(buffer, offset, count);
103         }
104
105         delegate int ReadMethod(byte[] buffer, int offset, int count);
106
107         public override IAsyncResult BeginRead(byte[] buffer, int offset, int count,
108             AsyncCallback callback, object state)
109         {
110             return new ReadMethod(Read).BeginInvoke(buffer, offset, count, callback, state);
111         }
112
113         public override int EndRead(IAsyncResult asyncResult)
114         {
115             AsyncResult ar = asyncResult as AsyncResult;
116             return ((ReadMethod)ar.AsyncDelegate).EndInvoke(ar);
117         }
118
119         public override void Write(byte[] buffer, int offset, int count)
120         {
121             int written = socket.Send(buffer, offset, count);
122             if (written != count)
123                 throw new IOException("Cannot write data");
124         }
125         
126         delegate void WriteMethod(byte[] buffer, int offset, int count);
127
128         public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count,
129             AsyncCallback callback, object state)
130         {
131             return new WriteMethod(Write).BeginInvoke(buffer, offset, count, callback, state);
132         }
133
134         public override void EndWrite(IAsyncResult asyncResult)
135         {
136             AsyncResult ar = asyncResult as AsyncResult;
137             ((WriteMethod)ar.AsyncDelegate).EndInvoke(asyncResult);
138         }
139
140     }
141 }
142
143 #endif