You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			178 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			178 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | //------------------------------------------------------------ | ||
|  | // Copyright (c) Microsoft Corporation.  All rights reserved. | ||
|  | //------------------------------------------------------------ | ||
|  | namespace System.ServiceModel.Channels | ||
|  | { | ||
|  |     using System.ServiceModel.Activation; | ||
|  |     using System.Collections.Generic; | ||
|  |     using System.Net.Security; | ||
|  |     using System.Runtime.Serialization; | ||
|  |     using System.ServiceModel.Security; | ||
|  | 
 | ||
|  |     using System.Xml; | ||
|  | 
 | ||
|  |     public sealed class MsmqTransportBindingElement : MsmqBindingElementBase | ||
|  |     { | ||
|  |         int maxPoolSize = MsmqDefaults.MaxPoolSize; | ||
|  |         bool useActiveDirectory = MsmqDefaults.UseActiveDirectory; | ||
|  |         QueueTransferProtocol queueTransferProtocol = MsmqDefaults.QueueTransferProtocol; | ||
|  | 
 | ||
|  |         public MsmqTransportBindingElement() { } | ||
|  | 
 | ||
|  |         MsmqTransportBindingElement(MsmqTransportBindingElement elementToBeCloned) | ||
|  |             : base(elementToBeCloned) | ||
|  |         { | ||
|  |             this.useActiveDirectory = elementToBeCloned.useActiveDirectory; | ||
|  |             this.maxPoolSize = elementToBeCloned.maxPoolSize; | ||
|  |             this.queueTransferProtocol = elementToBeCloned.queueTransferProtocol; | ||
|  |         } | ||
|  | 
 | ||
|  |         internal override MsmqUri.IAddressTranslator AddressTranslator | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 switch (this.queueTransferProtocol) | ||
|  |                 { | ||
|  |                     case QueueTransferProtocol.Srmp: | ||
|  |                         return MsmqUri.SrmpAddressTranslator; | ||
|  |                     case QueueTransferProtocol.SrmpSecure: | ||
|  |                         return MsmqUri.SrmpsAddressTranslator; | ||
|  |                     default: | ||
|  |                         return this.useActiveDirectory ? MsmqUri.ActiveDirectoryAddressTranslator : MsmqUri.NetMsmqAddressTranslator; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public int MaxPoolSize | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return this.maxPoolSize; | ||
|  |             } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (value < 0) | ||
|  |                 { | ||
|  |                     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( | ||
|  |                         new ArgumentOutOfRangeException("value", value, SR.GetString(SR.MsmqNonNegativeArgumentExpected))); | ||
|  |                 } | ||
|  |                 this.maxPoolSize = value; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public QueueTransferProtocol QueueTransferProtocol | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return this.queueTransferProtocol; | ||
|  |             } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (!QueueTransferProtocolHelper.IsDefined(value)) | ||
|  |                     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value")); | ||
|  |                 this.queueTransferProtocol = value; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override string Scheme | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return "net.msmq"; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool UseActiveDirectory | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return this.useActiveDirectory; | ||
|  |             } | ||
|  |             set | ||
|  |             { | ||
|  |                 this.useActiveDirectory = value; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         internal override string WsdlTransportUri | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return TransportPolicyConstants.MsmqTransportUri; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override BindingElement Clone() | ||
|  |         { | ||
|  |             return new MsmqTransportBindingElement(this); | ||
|  |         } | ||
|  | 
 | ||
|  |         public override bool CanBuildChannelFactory<TChannel>(BindingContext context) | ||
|  |         { | ||
|  |             return (typeof(TChannel) == typeof(IOutputChannel) | ||
|  |                 || typeof(TChannel) == typeof(IOutputSessionChannel)); | ||
|  |         } | ||
|  | 
 | ||
|  |         public override bool CanBuildChannelListener<TChannel>(BindingContext context) | ||
|  |         { | ||
|  |             return (typeof(TChannel) == typeof(IInputChannel) | ||
|  |                 || typeof(TChannel) == typeof(IInputSessionChannel)); | ||
|  |         } | ||
|  | 
 | ||
|  |         public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context) | ||
|  |         { | ||
|  |             if (context == null) | ||
|  |             { | ||
|  |                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context"); | ||
|  |             } | ||
|  | 
 | ||
|  |             if (typeof(TChannel) == typeof(IOutputChannel)) | ||
|  |             { | ||
|  |                 MsmqChannelFactoryBase<IOutputChannel> factory = new MsmqOutputChannelFactory(this, context); | ||
|  |                 MsmqVerifier.VerifySender<IOutputChannel>(factory); | ||
|  |                 return (IChannelFactory<TChannel>)(object)factory; | ||
|  |             } | ||
|  |             else if (typeof(TChannel) == typeof(IOutputSessionChannel)) | ||
|  |             { | ||
|  |                 MsmqChannelFactoryBase<IOutputSessionChannel> factory = new MsmqOutputSessionChannelFactory(this, context); | ||
|  |                 MsmqVerifier.VerifySender<IOutputSessionChannel>(factory); | ||
|  |                 return (IChannelFactory<TChannel>)(object)factory; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("TChannel", SR.GetString(SR.ChannelTypeNotSupported, typeof(TChannel))); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context) | ||
|  |         { | ||
|  |             if (context == null) | ||
|  |             { | ||
|  |                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context"); | ||
|  |             } | ||
|  | 
 | ||
|  |             TransportChannelListener msmqListener; | ||
|  | 
 | ||
|  |             MsmqTransportReceiveParameters receiveParameters = new MsmqTransportReceiveParameters(this, MsmqUri.NetMsmqAddressTranslator); | ||
|  | 
 | ||
|  |             if (typeof(TChannel) == typeof(IInputChannel)) | ||
|  |             { | ||
|  |                 msmqListener = new MsmqInputChannelListener(this, context, receiveParameters); | ||
|  |             } | ||
|  |             else if (typeof(TChannel) == typeof(IInputSessionChannel)) | ||
|  |             { | ||
|  |                 msmqListener = new MsmqInputSessionChannelListener(this, context, receiveParameters); | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("TChannel", SR.GetString(SR.ChannelTypeNotSupported, typeof(TChannel))); | ||
|  |             } | ||
|  |             AspNetEnvironment.Current.ApplyHostedContext(msmqListener, context); | ||
|  | 
 | ||
|  |             MsmqVerifier.VerifyReceiver(receiveParameters, msmqListener.Uri); | ||
|  | 
 | ||
|  |             return (IChannelListener<TChannel>)(object)msmqListener; | ||
|  |         } | ||
|  |     } | ||
|  | } |