//---------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- namespace System.ServiceModel.Channels { using System; using System.Net; public sealed class RemoteEndpointMessageProperty { string address; int port; IPEndPoint remoteEndPoint; IRemoteEndpointProvider remoteEndpointProvider; InitializationState state; object thisLock = new object(); public RemoteEndpointMessageProperty(string address, int port) { if (string.IsNullOrEmpty(address)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address"); } if (port < IPEndPoint.MinPort || port > IPEndPoint.MaxPort) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("port", SR.GetString(SR.ValueMustBeInRange, IPEndPoint.MinPort, IPEndPoint.MaxPort)); } this.port = port; this.address = address; this.state = InitializationState.All; } internal RemoteEndpointMessageProperty(IRemoteEndpointProvider remoteEndpointProvider) { this.remoteEndpointProvider = remoteEndpointProvider; } internal RemoteEndpointMessageProperty(IPEndPoint remoteEndPoint) { this.remoteEndPoint = remoteEndPoint; } public static string Name { get { return "System.ServiceModel.Channels.RemoteEndpointMessageProperty"; } } public string Address { get { if ((this.state & InitializationState.Address) != InitializationState.Address) { lock (ThisLock) { if ((this.state & InitializationState.Address) != InitializationState.Address) { Initialize(false); } } } return this.address; } } public int Port { get { if ((this.state & InitializationState.Port) != InitializationState.Port) { lock (ThisLock) { if ((this.state & InitializationState.Port) != InitializationState.Port) { Initialize(true); } } } return this.port; } } object ThisLock { get { return thisLock; } } void Initialize(bool getHostedPort) { if (remoteEndPoint != null) { this.address = remoteEndPoint.Address.ToString(); this.port = remoteEndPoint.Port; this.state = InitializationState.All; this.remoteEndPoint = null; } else { if ((this.state & InitializationState.Address) != InitializationState.Address) { this.address = remoteEndpointProvider.GetAddress(); this.state |= InitializationState.Address; } if (getHostedPort) { this.port = remoteEndpointProvider.GetPort(); this.state |= InitializationState.Port; this.remoteEndpointProvider = null; } } } internal interface IRemoteEndpointProvider { string GetAddress(); int GetPort(); } [Flags] enum InitializationState { None = 0, Address = 1, Port = 2, All = 3 } } }