1 //---------------------------------------------------------------------------- 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 //---------------------------------------------------------------------------- 4 namespace System.ServiceModel.Channels 5 { 6 using System.Collections.Generic; 7 using System.ServiceModel; 8 using System.IO; 9 using System.Text; 10 using System.Threading; 11 using System.ServiceModel.Diagnostics; 12 using System.Diagnostics; 13 using System.Security.Principal; 14 15 sealed class ExclusiveNamedPipeTransportManager : NamedPipeTransportManager 16 { 17 ConnectionDemuxer connectionDemuxer; 18 IConnectionListener connectionListener; 19 ExclusiveNamedPipeTransportManager(Uri listenUri, NamedPipeChannelListener channelListener)20 public ExclusiveNamedPipeTransportManager(Uri listenUri, NamedPipeChannelListener channelListener) 21 : base(listenUri) 22 { 23 ApplyListenerSettings(channelListener); 24 SetHostNameComparisonMode(channelListener.HostNameComparisonMode); 25 SetAllowedUsers(channelListener.AllowedUsers); 26 } 27 OnOpen()28 internal override void OnOpen() 29 { 30 connectionListener = new BufferedConnectionListener( 31 new PipeConnectionListener(ListenUri, HostNameComparisonMode, ConnectionBufferSize, 32 AllowedUsers, true, int.MaxValue), 33 MaxOutputDelay, ConnectionBufferSize); 34 if (DiagnosticUtility.ShouldUseActivity) 35 { 36 connectionListener = new TracingConnectionListener(connectionListener, this.ListenUri.ToString(), false); 37 } 38 39 connectionDemuxer = new ConnectionDemuxer(connectionListener, 40 MaxPendingAccepts, MaxPendingConnections, ChannelInitializationTimeout, 41 IdleTimeout, MaxPooledConnections, 42 OnGetTransportFactorySettings, 43 OnGetSingletonMessageHandler, 44 OnHandleServerSessionPreamble, 45 OnDemuxerError); 46 47 bool startedDemuxing = false; 48 try 49 { 50 connectionDemuxer.StartDemuxing(); 51 startedDemuxing = true; 52 } 53 finally 54 { 55 if (!startedDemuxing) 56 { 57 connectionDemuxer.Dispose(); 58 } 59 } 60 } 61 OnClose(TimeSpan timeout)62 internal override void OnClose(TimeSpan timeout) 63 { 64 connectionDemuxer.Dispose(); 65 connectionListener.Dispose(); 66 base.OnClose(timeout); 67 } 68 OnAbort()69 internal override void OnAbort() 70 { 71 if (connectionDemuxer != null) 72 { 73 connectionDemuxer.Dispose(); 74 } 75 76 if (connectionListener != null) 77 { 78 connectionListener.Dispose(); 79 } 80 81 base.OnAbort(); 82 } 83 } 84 } 85