public unsafe IAsyncResult BeginWaitForConnection(AsyncCallback callback, object state) { this.CheckConnectOperationsServer(); if (!base.IsAsync) { throw new InvalidOperationException(System.SR.GetString("InvalidOperation_PipeNotAsync")); } PipeAsyncResult ar = new PipeAsyncResult { _handle = base.InternalHandle, _userCallback = callback, _userStateObject = state }; ManualResetEvent event2 = new ManualResetEvent(false); ar._waitHandle = event2; NativeOverlapped *overlapped = new Overlapped(0, 0, IntPtr.Zero, ar).Pack(WaitForConnectionCallback, null); ar._overlapped = overlapped; if (!Microsoft.Win32.UnsafeNativeMethods.ConnectNamedPipe(base.InternalHandle, overlapped)) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == 0x217) { overlapped->InternalLow = IntPtr.Zero; if (base.State == PipeState.Connected) { throw new InvalidOperationException(System.SR.GetString("InvalidOperation_PipeAlreadyConnected")); } ar.CallUserCallback(); return(ar); } if (errorCode != 0x3e5) { System.IO.__Error.WinIOError(errorCode, string.Empty); } } return(ar); }
private unsafe IAsyncResult BeginWaitForConnection(AsyncCallback callback, Object state) { CheckConnectOperationsServerWithHandle(); if (!IsAsync) { throw new InvalidOperationException(SR.InvalidOperation_PipeNotAsync); } // Create and store async stream class library specific data in the // async result PipeAsyncResult asyncResult = new PipeAsyncResult(); asyncResult._threadPoolBinding = _threadPoolBinding; asyncResult._userCallback = callback; asyncResult._userStateObject = state; IOCancellationHelper cancellationHelper = state as IOCancellationHelper; // Create wait handle and store in async result ManualResetEvent waitHandle = new ManualResetEvent(false); asyncResult._waitHandle = waitHandle; NativeOverlapped *intOverlapped = _threadPoolBinding.AllocateNativeOverlapped((errorCode, numBytes, pOverlapped) => { // Unpack overlapped, free the pinned overlapped, and complete the operation PipeAsyncResult ar = (PipeAsyncResult)ThreadPoolBoundHandle.GetNativeOverlappedState(pOverlapped); Debug.Assert(ar._overlapped == pOverlapped); ar._threadPoolBinding.FreeNativeOverlapped(pOverlapped); ar._overlapped = null; AsyncWaitForConnectionCallback(errorCode, numBytes, ar); }, asyncResult, null); asyncResult._overlapped = intOverlapped; if (!Interop.mincore.ConnectNamedPipe(InternalHandle, intOverlapped)) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == Interop.mincore.Errors.ERROR_IO_PENDING) { if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return(asyncResult); } // WaitForConnectionCallback will not be called because we completed synchronously. // Either the pipe is already connected, or there was an error. Unpin and free the overlapped again. _threadPoolBinding.FreeNativeOverlapped(intOverlapped); asyncResult._overlapped = null; // Did the client already connect to us? if (errorCode == Interop.mincore.Errors.ERROR_PIPE_CONNECTED) { if (State == PipeState.Connected) { throw new InvalidOperationException(SR.InvalidOperation_PipeAlreadyConnected); } asyncResult.CallUserCallback(); return(asyncResult); } throw Win32Marshal.GetExceptionForWin32Error(errorCode); } // will set state to Connected when EndWait is called if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return(asyncResult); }
public unsafe IAsyncResult BeginWaitForConnection(AsyncCallback callback, Object state) { CheckConnectOperationsServer(); if (!IsAsync) { throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_PipeNotAsync)); } // Create and store async stream class library specific data in the // async result PipeAsyncResult asyncResult = new PipeAsyncResult(); asyncResult._handle = InternalHandle; asyncResult._userCallback = callback; asyncResult._userStateObject = state; IOCancellationHelper cancellationHelper = state as IOCancellationHelper; // Create wait handle and store in async result ManualResetEvent waitHandle = new ManualResetEvent(false); asyncResult._waitHandle = waitHandle; // Create a managed overlapped class // We will set the file offsets later Overlapped overlapped = new Overlapped(0, 0, IntPtr.Zero, asyncResult); // Pack the Overlapped class, and store it in the async result NativeOverlapped* intOverlapped = overlapped.Pack(WaitForConnectionCallback, null); asyncResult._overlapped = intOverlapped; if (!UnsafeNativeMethods.ConnectNamedPipe(InternalHandle, intOverlapped)) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == UnsafeNativeMethods.ERROR_IO_PENDING) { if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return asyncResult; } // WaitForConnectionCallback will not be called becasue we completed synchronously. // Either the pipe is already connected, or there was an error. Unpin and free the overlapped again. Overlapped.Free(intOverlapped); asyncResult._overlapped = null; // Did the client already connect to us? if (errorCode == UnsafeNativeMethods.ERROR_PIPE_CONNECTED) { if (State == PipeState.Connected) { throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_PipeAlreadyConnected)); } asyncResult.CallUserCallback(); return asyncResult; } __Error.WinIOError(errorCode, String.Empty); } // will set state to Connected when EndWait is called if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return asyncResult; }
private unsafe IAsyncResult BeginWaitForConnection(AsyncCallback callback, Object state) { CheckConnectOperationsServerWithHandle(); if (!IsAsync) { throw new InvalidOperationException(SR.InvalidOperation_PipeNotAsync); } // Create and store async stream class library specific data in the // async result PipeAsyncResult asyncResult = new PipeAsyncResult(); asyncResult._handle = InternalHandle; asyncResult._userCallback = callback; asyncResult._userStateObject = state; IOCancellationHelper cancellationHelper = state as IOCancellationHelper; // Create wait handle and store in async result ManualResetEvent waitHandle = new ManualResetEvent(false); asyncResult._waitHandle = waitHandle; // Create a managed overlapped class // We will set the file offsets later Overlapped overlapped = new Overlapped(); overlapped.OffsetLow = 0; overlapped.OffsetHigh = 0; overlapped.AsyncResult = asyncResult; // Pack the Overlapped class, and store it in the async result NativeOverlapped *intOverlapped = overlapped.Pack(s_WaitForConnectionCallback, null); asyncResult._overlapped = intOverlapped; if (!Interop.mincore.ConnectNamedPipe(InternalHandle, intOverlapped)) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == Interop.ERROR_IO_PENDING) { if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return(asyncResult); } // WaitForConnectionCallback will not be called because we completed synchronously. // Either the pipe is already connected, or there was an error. Unpin and free the overlapped again. Overlapped.Free(intOverlapped); asyncResult._overlapped = null; // Did the client already connect to us? if (errorCode == Interop.ERROR_PIPE_CONNECTED) { if (State == PipeState.Connected) { throw new InvalidOperationException(SR.InvalidOperation_PipeAlreadyConnected); } asyncResult.CallUserCallback(); return(asyncResult); } throw Win32Marshal.GetExceptionForWin32Error(errorCode); } // will set state to Connected when EndWait is called if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return(asyncResult); }
public unsafe IAsyncResult BeginWaitForConnection(AsyncCallback callback, object state) { this.CheckConnectOperationsServer(); if (!base.IsAsync) { throw new InvalidOperationException(System.SR.GetString("InvalidOperation_PipeNotAsync")); } PipeAsyncResult ar = new PipeAsyncResult { _handle = base.InternalHandle, _userCallback = callback, _userStateObject = state }; ManualResetEvent event2 = new ManualResetEvent(false); ar._waitHandle = event2; NativeOverlapped* overlapped = new Overlapped(0, 0, IntPtr.Zero, ar).Pack(WaitForConnectionCallback, null); ar._overlapped = overlapped; if (!Microsoft.Win32.UnsafeNativeMethods.ConnectNamedPipe(base.InternalHandle, overlapped)) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == 0x217) { overlapped->InternalLow = IntPtr.Zero; if (base.State == PipeState.Connected) { throw new InvalidOperationException(System.SR.GetString("InvalidOperation_PipeAlreadyConnected")); } ar.CallUserCallback(); return ar; } if (errorCode != 0x3e5) { System.IO.__Error.WinIOError(errorCode, string.Empty); } } return ar; }
private unsafe IAsyncResult BeginWaitForConnection(AsyncCallback callback, Object state) { CheckConnectOperationsServerWithHandle(); if (!IsAsync) { throw new InvalidOperationException(SR.InvalidOperation_PipeNotAsync); } // Create and store async stream class library specific data in the // async result PipeAsyncResult asyncResult = new PipeAsyncResult(); asyncResult._threadPoolBinding = _threadPoolBinding; asyncResult._userCallback = callback; asyncResult._userStateObject = state; IOCancellationHelper cancellationHelper = state as IOCancellationHelper; // Create wait handle and store in async result ManualResetEvent waitHandle = new ManualResetEvent(false); asyncResult._waitHandle = waitHandle; NativeOverlapped* intOverlapped = _threadPoolBinding.AllocateNativeOverlapped((errorCode, numBytes, pOverlapped) => { // Unpack overlapped, free the pinned overlapped, and complete the operation PipeAsyncResult ar = (PipeAsyncResult)ThreadPoolBoundHandle.GetNativeOverlappedState(pOverlapped); Debug.Assert(ar._overlapped == pOverlapped); ar._threadPoolBinding.FreeNativeOverlapped(pOverlapped); ar._overlapped = null; AsyncWaitForConnectionCallback(errorCode, numBytes, ar); }, asyncResult, null); asyncResult._overlapped = intOverlapped; if (!Interop.mincore.ConnectNamedPipe(InternalHandle, intOverlapped)) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == Interop.mincore.Errors.ERROR_IO_PENDING) { if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return asyncResult; } // WaitForConnectionCallback will not be called because we completed synchronously. // Either the pipe is already connected, or there was an error. Unpin and free the overlapped again. _threadPoolBinding.FreeNativeOverlapped(intOverlapped); asyncResult._overlapped = null; // Did the client already connect to us? if (errorCode == Interop.mincore.Errors.ERROR_PIPE_CONNECTED) { if (State == PipeState.Connected) { throw new InvalidOperationException(SR.InvalidOperation_PipeAlreadyConnected); } asyncResult.CallUserCallback(); return asyncResult; } throw Win32Marshal.GetExceptionForWin32Error(errorCode); } // will set state to Connected when EndWait is called if (cancellationHelper != null) { cancellationHelper.AllowCancellation(InternalHandle, intOverlapped); } return asyncResult; }