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