| File: FrameworkFork\System.ServiceModel\System\ServiceModel\Dispatcher\ListenerBinder.cs | Web Access |
| Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.ServiceModel.Channels; namespace System.ServiceModel.Dispatcher { internal static class ListenerBinder { internal static IListenerBinder GetBinder(IChannelListener listener, MessageVersion messageVersion) { IChannelListener<IInputChannel> input = listener as IChannelListener<IInputChannel>; if (input != null) return new InputListenerBinder(input, messageVersion); IChannelListener<IInputSessionChannel> inputSession = listener as IChannelListener<IInputSessionChannel>; if (inputSession != null) return new InputSessionListenerBinder(inputSession, messageVersion); IChannelListener<IReplyChannel> reply = listener as IChannelListener<IReplyChannel>; if (reply != null) return new ReplyListenerBinder(reply, messageVersion); IChannelListener<IReplySessionChannel> replySession = listener as IChannelListener<IReplySessionChannel>; if (replySession != null) return new ReplySessionListenerBinder(replySession, messageVersion); IChannelListener<IDuplexChannel> duplex = listener as IChannelListener<IDuplexChannel>; if (duplex != null) return new DuplexListenerBinder(duplex, messageVersion); IChannelListener<IDuplexSessionChannel> duplexSession = listener as IChannelListener<IDuplexSessionChannel>; if (duplexSession != null) return new DuplexSessionListenerBinder(duplexSession, messageVersion); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(string.Format(SRServiceModel.UnknownListenerType1, listener.Uri.AbsoluteUri))); } // ------------------------------------------------------------------------------------------------------------ // Listener Binders internal class DuplexListenerBinder : IListenerBinder { private IRequestReplyCorrelator _correlator; private IChannelListener<IDuplexChannel> _listener; private MessageVersion _messageVersion; internal DuplexListenerBinder(IChannelListener<IDuplexChannel> listener, MessageVersion messageVersion) { _correlator = new RequestReplyCorrelator(); _listener = listener; _messageVersion = messageVersion; } public IChannelListener Listener { get { return _listener; } } public MessageVersion MessageVersion { get { return _messageVersion; } } public IChannelBinder Accept(TimeSpan timeout) { IDuplexChannel channel = _listener.AcceptChannel(timeout); if (channel == null) return null; return new DuplexChannelBinder(channel, _correlator, _listener.Uri); } public IAsyncResult BeginAccept(TimeSpan timeout, AsyncCallback callback, object state) { return _listener.BeginAcceptChannel(timeout, callback, state); } public IChannelBinder EndAccept(IAsyncResult result) { IDuplexChannel channel = _listener.EndAcceptChannel(result); if (channel == null) return null; return new DuplexChannelBinder(channel, _correlator, _listener.Uri); } } internal class DuplexSessionListenerBinder : IListenerBinder { private IRequestReplyCorrelator _correlator; private IChannelListener<IDuplexSessionChannel> _listener; private MessageVersion _messageVersion; internal DuplexSessionListenerBinder(IChannelListener<IDuplexSessionChannel> listener, MessageVersion messageVersion) { _correlator = new RequestReplyCorrelator(); _listener = listener; _messageVersion = messageVersion; } public IChannelListener Listener { get { return _listener; } } public MessageVersion MessageVersion { get { return _messageVersion; } } public IChannelBinder Accept(TimeSpan timeout) { IDuplexSessionChannel channel = _listener.AcceptChannel(timeout); if (channel == null) return null; return new DuplexChannelBinder(channel, _correlator, _listener.Uri); } public IAsyncResult BeginAccept(TimeSpan timeout, AsyncCallback callback, object state) { return _listener.BeginAcceptChannel(timeout, callback, state); } public IChannelBinder EndAccept(IAsyncResult result) { IDuplexSessionChannel channel = _listener.EndAcceptChannel(result); if (channel == null) return null; return new DuplexChannelBinder(channel, _correlator, _listener.Uri); } } internal class InputListenerBinder : IListenerBinder { private IChannelListener<IInputChannel> _listener; private MessageVersion _messageVersion; internal InputListenerBinder(IChannelListener<IInputChannel> listener, MessageVersion messageVersion) { _listener = listener; _messageVersion = messageVersion; } public IChannelListener Listener { get { return _listener; } } public MessageVersion MessageVersion { get { return _messageVersion; } } public IChannelBinder Accept(TimeSpan timeout) { IInputChannel channel = _listener.AcceptChannel(timeout); if (channel == null) return null; return new InputChannelBinder(channel, _listener.Uri); } public IAsyncResult BeginAccept(TimeSpan timeout, AsyncCallback callback, object state) { return _listener.BeginAcceptChannel(timeout, callback, state); } public IChannelBinder EndAccept(IAsyncResult result) { IInputChannel channel = _listener.EndAcceptChannel(result); if (channel == null) return null; return new InputChannelBinder(channel, _listener.Uri); } } internal class InputSessionListenerBinder : IListenerBinder { private IChannelListener<IInputSessionChannel> _listener; private MessageVersion _messageVersion; internal InputSessionListenerBinder(IChannelListener<IInputSessionChannel> listener, MessageVersion messageVersion) { _listener = listener; _messageVersion = messageVersion; } public IChannelListener Listener { get { return _listener; } } public MessageVersion MessageVersion { get { return _messageVersion; } } public IChannelBinder Accept(TimeSpan timeout) { IInputSessionChannel channel = _listener.AcceptChannel(timeout); if (null == channel) return null; return new InputChannelBinder(channel, _listener.Uri); } public IAsyncResult BeginAccept(TimeSpan timeout, AsyncCallback callback, object state) { return _listener.BeginAcceptChannel(timeout, callback, state); } public IChannelBinder EndAccept(IAsyncResult result) { IInputSessionChannel channel = _listener.EndAcceptChannel(result); if (channel == null) return null; return new InputChannelBinder(channel, _listener.Uri); } } internal class ReplyListenerBinder : IListenerBinder { private IChannelListener<IReplyChannel> _listener; private MessageVersion _messageVersion; internal ReplyListenerBinder(IChannelListener<IReplyChannel> listener, MessageVersion messageVersion) { _listener = listener; _messageVersion = messageVersion; } public IChannelListener Listener { get { return _listener; } } public MessageVersion MessageVersion { get { return _messageVersion; } } public IChannelBinder Accept(TimeSpan timeout) { IReplyChannel channel = _listener.AcceptChannel(timeout); if (channel == null) return null; return new ReplyChannelBinder(channel, _listener.Uri); } public IAsyncResult BeginAccept(TimeSpan timeout, AsyncCallback callback, object state) { return _listener.BeginAcceptChannel(timeout, callback, state); } public IChannelBinder EndAccept(IAsyncResult result) { IReplyChannel channel = _listener.EndAcceptChannel(result); if (channel == null) return null; return new ReplyChannelBinder(channel, _listener.Uri); } } internal class ReplySessionListenerBinder : IListenerBinder { private IChannelListener<IReplySessionChannel> _listener; private MessageVersion _messageVersion; internal ReplySessionListenerBinder(IChannelListener<IReplySessionChannel> listener, MessageVersion messageVersion) { _listener = listener; _messageVersion = messageVersion; } public IChannelListener Listener { get { return _listener; } } public MessageVersion MessageVersion { get { return _messageVersion; } } public IChannelBinder Accept(TimeSpan timeout) { IReplySessionChannel channel = _listener.AcceptChannel(timeout); if (channel == null) return null; return new ReplyChannelBinder(channel, _listener.Uri); } public IAsyncResult BeginAccept(TimeSpan timeout, AsyncCallback callback, object state) { return _listener.BeginAcceptChannel(timeout, callback, state); } public IChannelBinder EndAccept(IAsyncResult result) { IReplySessionChannel channel = _listener.EndAcceptChannel(result); if (channel == null) return null; return new ReplyChannelBinder(channel, _listener.Uri); } } } }