Mercurial > hg > ucis.core
annotate Windows/WindowsNamedPipe.cs @ 66:b7bc27c6734e
Added WorkQueue class
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 15 Oct 2013 16:22:54 +0200 |
parents | ec222fb577dd |
children | 5e717aac4c1d |
rev | line source |
---|---|
55
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
1 ???using System; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
2 using System.ComponentModel; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
3 using System.IO; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
4 using System.Runtime.InteropServices; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
5 using System.Threading; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
6 using Microsoft.Win32.SafeHandles; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
7 using UCIS.Util; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
8 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
9 namespace UCIS.Windows { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
10 public class WindowsNamedPipe : PacketStream { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
11 delegate Byte[] ReadPacketDelegate(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
12 ReadPacketDelegate ReadPacketDelegateInstance = null; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
13 SafeFileHandle PipeHandle; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
14 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
15 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
16 static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, [MarshalAs(UnmanagedType.U4)] FileShare dwShareMode, IntPtr lpSecurityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode dwCreationDisposition, UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
17 [DllImport("kernel32.dll", SetLastError = true)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
18 static extern unsafe bool ReadFile(SafeFileHandle hFile, Byte* lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, NativeOverlapped* lpOverlapped); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
19 [DllImport("kernel32.dll", SetLastError = true)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
20 static extern unsafe bool WriteFile(SafeFileHandle hFile, Byte* lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, NativeOverlapped* lpOverlapped); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
21 [DllImport("kernel32.dll", SetLastError = true)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
22 static extern unsafe bool GetOverlappedResult(SafeFileHandle hFile, NativeOverlapped* lpOverlapped, out uint lpNumberOfBytesTransferred, Boolean bWait); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
23 [DllImport("kernel32.dll", SetLastError = true)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
24 static extern bool SetNamedPipeHandleState(SafeFileHandle hNamedPipe, ref UInt32 lpMode, IntPtr lpMaxCollectionCount, IntPtr lpCollectDataTimeout); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
25 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
26 static extern SafeFileHandle CreateNamedPipe([MarshalAs(UnmanagedType.LPStr)] String lpName, UInt32 dwOpenMode, UInt32 dwPipeMode, UInt32 nMaxInstances, UInt32 nOutBufferSize, UInt32 nInBufferSize, UInt32 nDefaultTimeOut, IntPtr lpSecurityAttributes); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
27 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
28 static extern unsafe bool ConnectNamedPipe(SafeFileHandle hNamedPipe, NativeOverlapped* lpOverlapped); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
29 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
30 static extern unsafe bool GetNamedPipeInfo(SafeFileHandle hNamedPipe, out UInt32 lpFlags, IntPtr lpOutBufferSize, IntPtr lpInBufferSize, IntPtr lpMaxInstances); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
31 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
32 const UInt32 PIPE_ACCESS_DUPLEX = 0x00000003; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
33 const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
34 const UInt32 PIPE_TYPE_BYTE = 0x00000000; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
35 const UInt32 PIPE_TYPE_MESSAGE = 0x00000004; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
36 const UInt32 PIPE_READMODE_BYTE = 0x00000000; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
37 const UInt32 PIPE_READMODE_MESSAGE = 0x00000002; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
38 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
39 public int InitialMessageBufferSize { get; set; } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
40 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
41 private WindowsNamedPipe(SafeFileHandle handle) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
42 InitialMessageBufferSize = 1024; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
43 this.PipeHandle = handle; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
44 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
45 public static WindowsNamedPipe Create(String name, Boolean messageMode, uint maxClients, uint readBuffer, uint writeBuffer, uint defaultTimeout) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
46 SafeFileHandle handle = CreateNamedPipe(name, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
47 messageMode ? (PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE) : (PIPE_TYPE_BYTE | PIPE_READMODE_BYTE), |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
48 maxClients, writeBuffer, readBuffer, defaultTimeout, IntPtr.Zero); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
49 if (handle.IsInvalid) throw new Win32Exception(Marshal.GetLastWin32Error()); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
50 return new WindowsNamedPipe(handle); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
51 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
52 public static WindowsNamedPipe Connect(String name) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
53 SafeFileHandle handle = CreateFile(name, 0x40000000 | 0x80000000, FileShare.None, IntPtr.Zero, FileMode.Open, 0x40000000, IntPtr.Zero); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
54 if (handle.IsInvalid) throw new Win32Exception(Marshal.GetLastWin32Error()); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
55 UInt32 flags; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
56 if (!GetNamedPipeInfo(handle, out flags, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error()); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
57 UInt32 lpMode = (flags & PIPE_TYPE_MESSAGE) != 0 ? PIPE_READMODE_MESSAGE : PIPE_READMODE_BYTE; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
58 if (!SetNamedPipeHandleState(handle, ref lpMode, IntPtr.Zero, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error()); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
59 return new WindowsNamedPipe(handle); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
60 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
61 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
62 public unsafe void WaitForClient() { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
63 uint nread; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
64 using (ManualResetEvent evt = new ManualResetEvent(false)) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
65 NativeOverlapped overlapped = new NativeOverlapped(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
66 overlapped.EventHandle = evt.SafeWaitHandle.DangerousGetHandle(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
67 if (!ConnectNamedPipe(PipeHandle, &overlapped)) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
68 int err = Marshal.GetLastWin32Error(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
69 if (err != 997) throw new Win32Exception(err); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
70 evt.WaitOne(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
71 if (!GetOverlappedResult(PipeHandle, &overlapped, out nread, false)) throw new Win32Exception(Marshal.GetLastWin32Error()); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
72 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
73 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
74 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
75 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
76 private unsafe int ReadInternal(Byte[] buffer, int offset, int count, out int error) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
77 if (offset < 0 || offset + count > buffer.Length) throw new ArgumentOutOfRangeException("offset", "Specified buffer is outside of array bounds"); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
78 uint nread; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
79 using (ManualResetEvent evt = new ManualResetEvent(false)) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
80 NativeOverlapped overlapped = new NativeOverlapped(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
81 overlapped.EventHandle = evt.SafeWaitHandle.DangerousGetHandle(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
82 fixed (Byte* bufferptr = buffer) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
83 if (ReadFile(PipeHandle, bufferptr + offset, (uint)count, out nread, &overlapped)) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
84 error = 0; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
85 } else { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
86 error = Marshal.GetLastWin32Error(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
87 if (error == 997) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
88 evt.WaitOne(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
89 if (GetOverlappedResult(PipeHandle, &overlapped, out nread, false)) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
90 error = 0; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
91 } else { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
92 error = Marshal.GetLastWin32Error(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
93 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
94 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
95 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
96 return (int)nread; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
97 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
98 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
99 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
100 public override unsafe int Read(byte[] buffer, int offset, int count) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
101 int error; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
102 int nread = ReadInternal(buffer, offset, count, out error); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
103 if (error == 109) return 0; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
104 if (error == 0) return nread; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
105 throw new Win32Exception(error); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
106 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
107 public override unsafe void Write(byte[] buffer, int offset, int count) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
108 if (offset < 0 || offset + count > buffer.Length) throw new ArgumentOutOfRangeException("offset", "Specified buffer is outside of array bounds"); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
109 uint nread; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
110 using (ManualResetEvent evt = new ManualResetEvent(false)) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
111 NativeOverlapped overlapped = new NativeOverlapped(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
112 overlapped.EventHandle = evt.SafeWaitHandle.DangerousGetHandle(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
113 fixed (Byte* bufferptr = buffer) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
114 if (!WriteFile(PipeHandle, bufferptr + offset, (uint)count, out nread, &overlapped)) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
115 int err = Marshal.GetLastWin32Error(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
116 if (err != 997) throw new Win32Exception(err); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
117 evt.WaitOne(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
118 if (!GetOverlappedResult(PipeHandle, &overlapped, out nread, false)) throw new Win32Exception(Marshal.GetLastWin32Error()); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
119 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
120 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
121 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
122 if (nread != count) throw new IOException("Not all data could be written"); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
123 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
124 public override void Close() { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
125 base.Close(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
126 PipeHandle.Close(); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
127 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
128 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
129 public unsafe override byte[] ReadPacket() { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
130 int offset = 0; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
131 Byte[] buffer = new Byte[InitialMessageBufferSize]; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
132 while (true) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
133 int error; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
134 int nread = ReadInternal(buffer, offset, buffer.Length - offset, out error); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
135 offset += nread; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
136 if (error == 109) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
137 return null; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
138 } else if (error == 0) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
139 if (offset != buffer.Length) Array.Resize(ref buffer, offset); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
140 return buffer; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
141 } else if (error == 234) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
142 offset = buffer.Length; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
143 Array.Resize(ref buffer, buffer.Length * 2); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
144 } else { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
145 throw new Win32Exception(error); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
146 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
147 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
148 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
149 public override IAsyncResult BeginReadPacket(AsyncCallback callback, object state) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
150 if (ReadPacketDelegateInstance == null) ReadPacketDelegateInstance = (ReadPacketDelegate)ReadPacket; |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
151 return ReadPacketDelegateInstance.BeginInvoke(callback, state); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
152 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
153 public override byte[] EndReadPacket(IAsyncResult asyncResult) { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
154 return ReadPacketDelegateInstance.EndInvoke(asyncResult); |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
155 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
156 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
157 public override bool CanRead { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
158 get { return !PipeHandle.IsClosed; } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
159 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
160 public override bool CanWrite { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
161 get { return !PipeHandle.IsClosed; } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
162 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
163 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
164 public override void Flush() { } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
165 public override bool CanSeek { get { return false; } } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
166 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
167 public override long Length { get { throw new NotSupportedException(); } } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
168 public override long Position { |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
169 get { throw new NotSupportedException(); } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
170 set { throw new NotSupportedException(); } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
171 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
172 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
173 public override long Seek(long offset, System.IO.SeekOrigin origin) { throw new NotSupportedException(); } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
174 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
175 public override void SetLength(long value) { throw new NotSupportedException(); } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
176 |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
177 } |
ec222fb577dd
Added Windows Named Pipe stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
178 } |