| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- //------------------------------------------------------------
- // 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; }
- }
- }
- }
|