//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel { using System; using System.Runtime; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; using System.Threading; public sealed class PeerNode : IOnlineStatus { PeerNodeImplementation innerNode = null; SynchronizationContext synchronizationContext = null; MessageEncodingBindingElement encoderElement; internal PeerNode(PeerNodeImplementation peerNode) { this.innerNode = peerNode; } public event EventHandler Offline; public event EventHandler Online; internal void FireOffline(object source, EventArgs args) { FireEvent(Offline, source, args); } internal void FireOnline(object source, EventArgs args) { FireEvent(Online, source, args); } void FireEvent(EventHandler handler, object source, EventArgs args) { if (handler != null) { try { SynchronizationContext context = synchronizationContext; if (context != null) { context.Send(delegate(object state) { handler(source, args); }, null); } else { handler(source, args); } } catch (Exception e) { if (Fx.IsFatal(e)) throw; throw DiagnosticUtility.ExceptionUtility.ThrowHelperCallback(SR.GetString(SR.NotificationException), e); } } } public bool IsOnline { get { return InnerNode.IsOnline; } } internal bool IsOpen { get { return InnerNode.IsOpen; } } public int Port { get { return InnerNode.ListenerPort; } } public PeerMessagePropagationFilter MessagePropagationFilter { get { return InnerNode.MessagePropagationFilter; } set { InnerNode.MessagePropagationFilter = value; } } internal void OnOpen() { synchronizationContext = ThreadBehavior.GetCurrentSynchronizationContext(); this.innerNode.Offline += FireOffline; this.innerNode.Online += FireOnline; this.innerNode.EncodingElement = this.encoderElement; } internal void OnClose() { this.innerNode.Offline -= FireOffline; this.innerNode.Online -= FireOnline; synchronizationContext = null; } internal PeerNodeImplementation InnerNode { get { return innerNode; } } public void RefreshConnection() { PeerNodeImplementation node = InnerNode; if (node != null) { node.RefreshConnection(); } } public override string ToString() { if (this.IsOpen) { return SR.GetString(SR.PeerNodeToStringFormat, this.InnerNode.MeshId, this.InnerNode.NodeId, this.IsOnline, this.IsOpen, this.Port); } else { return SR.GetString(SR.PeerNodeToStringFormat, "", -1, this.IsOnline, this.IsOpen, -1); } } private MessageEncodingBindingElement EncodingElement { get { return this.encoderElement; } set { this.encoderElement = value; } } } }