//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Channels { using System.Collections.Generic; using System.ServiceModel; using System.Diagnostics; using System.Runtime.Serialization; using System.ServiceModel.Diagnostics; [MessageContract(IsWrapped = false)] class ConnectInfo { [DataContract(Name = "ConnectInfo", Namespace = PeerStrings.Namespace)] class ConnectInfoDC { [DataMember(Name = "NodeId")] public ulong nodeId; [DataMember(Name = "Address")] public PeerNodeAddress address; public ConnectInfoDC() { } public ConnectInfoDC(ulong nodeId, PeerNodeAddress address) { this.nodeId = nodeId; this.address = address; } } [MessageBodyMember(Name = "Connect", Namespace = PeerStrings.Namespace)] ConnectInfoDC body; public ConnectInfo() { this.body = new ConnectInfoDC(); } public ConnectInfo(ulong nodeId, PeerNodeAddress address) { this.body = new ConnectInfoDC(nodeId, address); } public PeerNodeAddress Address { get { return this.body.address; } } public ulong NodeId { get { return this.body.nodeId; } } public bool HasBody() { return body != null; } } [MessageContract(IsWrapped = false)] class DisconnectInfo { [DataContract(Name = "DisconnectInfo", Namespace = PeerStrings.Namespace)] class DisconnectInfoDC { [DataMember(Name = "Reason")] public DisconnectReason reason; [DataMember(Name = "Referrals")] public Referral[] referrals; public DisconnectInfoDC() { } public DisconnectInfoDC(DisconnectReason reason, Referral[] referrals) { this.reason = reason; this.referrals = referrals; } } [MessageBodyMember(Name = "Disconnect", Namespace = PeerStrings.Namespace)] DisconnectInfoDC body; public DisconnectInfo() { body = new DisconnectInfoDC(); } public DisconnectInfo(DisconnectReason reason, Referral[] referrals) { this.body = new DisconnectInfoDC(reason, referrals); } public DisconnectReason Reason { get { return this.body.reason; } } public IList Referrals { get { return this.body.referrals != null ? Array.AsReadOnly(this.body.referrals) : null; } } public bool HasBody() { return body != null; } } // Reasons for sending a Disconnect message enum DisconnectReason { LeavingMesh = PeerCloseReason.LeavingMesh, NotUsefulNeighbor = PeerCloseReason.NotUsefulNeighbor, DuplicateNeighbor = PeerCloseReason.DuplicateNeighbor, DuplicateNodeId = PeerCloseReason.DuplicateNodeId, NodeBusy = PeerCloseReason.NodeBusy, InternalFailure = PeerCloseReason.InternalFailure, } // // Service contract used for neighbor-to-neighbor communication // Sending messages is asynchronous and processing incoming messages is synchronous. // Used for Service implementation // [ServiceContract(Name = PeerStrings.ServiceContractName, Namespace = PeerStrings.Namespace, SessionMode = SessionMode.Required, CallbackContract = typeof(IPeerServiceContract))] interface IPeerServiceContract { [OperationContract(IsOneWay = true, Action = PeerStrings.ConnectAction)] void Connect(ConnectInfo connectInfo); [OperationContract(IsOneWay = true, Action = PeerStrings.DisconnectAction)] void Disconnect(DisconnectInfo disconnectInfo); [OperationContract(IsOneWay = true, Action = PeerStrings.RefuseAction)] void Refuse(RefuseInfo refuseInfo); [OperationContract(IsOneWay = true, Action = PeerStrings.WelcomeAction)] void Welcome(WelcomeInfo welcomeInfo); [OperationContract(IsOneWay = true, Action = PeerStrings.FloodAction, AsyncPattern = true)] IAsyncResult BeginFloodMessage(Message floodedInfo, AsyncCallback callback, object state); void EndFloodMessage(IAsyncResult result); [OperationContract(IsOneWay = true, Action = PeerStrings.LinkUtilityAction)] void LinkUtility(UtilityInfo utilityInfo); [OperationContract( Action = TrustFeb2005Strings.RequestSecurityToken, ReplyAction = TrustFeb2005Strings.RequestSecurityTokenResponse)] Message ProcessRequestSecurityToken(Message message); [OperationContract(IsOneWay = true, Action = PeerStrings.PingAction)] void Ping(Message message); [OperationContract(IsOneWay = true, Action = Addressing10Strings.FaultAction)] void Fault(Message message); } [ServiceContract(Name = PeerStrings.ServiceContractName, Namespace = PeerStrings.Namespace, SessionMode = SessionMode.Required, CallbackContract = typeof(IPeerService))] interface IPeerProxy : IPeerServiceContract, IOutputChannel { } [ServiceContract(Name = PeerStrings.ServiceContractName, Namespace = PeerStrings.Namespace, SessionMode = SessionMode.Required, CallbackContract = typeof(IPeerProxy))] interface IPeerService : IPeerServiceContract { } static class PeerConnectorHelper { public static bool IsDefined(DisconnectReason value) { return ((value == DisconnectReason.LeavingMesh) || (value == DisconnectReason.NotUsefulNeighbor) || (value == DisconnectReason.DuplicateNeighbor) || (value == DisconnectReason.DuplicateNodeId) || (value == DisconnectReason.NodeBusy) || (value == DisconnectReason.InternalFailure)); } public static bool IsDefined(RefuseReason value) { return ((value == RefuseReason.DuplicateNodeId) || (value == RefuseReason.DuplicateNeighbor) || (value == RefuseReason.NodeBusy)); } } [DataContract(Name = "Referral", Namespace = PeerStrings.Namespace)] class Referral { [DataMember(Name = "NodeId")] ulong nodeId; // Referral NodeId [DataMember(Name = "Address")] PeerNodeAddress address; // Referral address public Referral(ulong nodeId, PeerNodeAddress address) { this.nodeId = nodeId; this.address = address; } public PeerNodeAddress Address { get { return this.address; } set { this.address = value; } } public ulong NodeId { get { return this.nodeId; } set { this.nodeId = value; } } } [MessageContract(IsWrapped = false)] class RefuseInfo { [DataContract(Name = "RefuseInfo", Namespace = PeerStrings.Namespace)] class RefuseInfoDC { [DataMember(Name = "Reason")] public RefuseReason reason; [DataMember(Name = "Referrals")] public Referral[] referrals; public RefuseInfoDC() { } public RefuseInfoDC(RefuseReason reason, Referral[] referrals) { this.reason = reason; this.referrals = referrals; } } public RefuseInfo() { this.body = new RefuseInfoDC(); } public RefuseInfo(RefuseReason reason, Referral[] referrals) { this.body = new RefuseInfoDC(reason, referrals); } [MessageBodyMember(Name = "Refuse", Namespace = PeerStrings.Namespace)] RefuseInfoDC body; public RefuseReason Reason { get { return this.body.reason; } } public IList Referrals { get { return this.body.referrals != null ? Array.AsReadOnly(this.body.referrals) : null; } } public bool HasBody() { return body != null; } } // Reasons for sending a Refuse message enum RefuseReason { DuplicateNeighbor = PeerCloseReason.DuplicateNeighbor, DuplicateNodeId = PeerCloseReason.DuplicateNodeId, NodeBusy = PeerCloseReason.NodeBusy, } [MessageContract(IsWrapped = false)] class UtilityInfo { [DataContract(Name = "LinkUtilityInfo", Namespace = PeerStrings.Namespace)] class UtilityInfoDC { [DataMember(Name = "Useful")] public uint useful; [DataMember(Name = "Total")] public uint total; public UtilityInfoDC() { } public UtilityInfoDC(uint useful, uint total) { this.useful = useful; this.total = total; } } public UtilityInfo() { this.body = new UtilityInfoDC(); } public UtilityInfo(uint useful, uint total) { this.body = new UtilityInfoDC(useful, total); } [MessageBodyMember(Name = "LinkUtility", Namespace = PeerStrings.Namespace)] UtilityInfoDC body; public uint Useful { get { return body.useful; } } public uint Total { get { return body.total; } } public bool HasBody() { return body != null; } } [MessageContract(IsWrapped = false)] class WelcomeInfo { [DataContract(Name = "WelcomeInfo", Namespace = PeerStrings.Namespace)] class WelcomeInfoDC { [DataMember(Name = "NodeId")] public ulong nodeId; [DataMember(Name = "Referrals")] public Referral[] referrals; public WelcomeInfoDC() { } public WelcomeInfoDC(ulong nodeId, Referral[] referrals) { this.nodeId = nodeId; this.referrals = referrals; } } public WelcomeInfo() { this.body = new WelcomeInfoDC(); } public WelcomeInfo(ulong nodeId, Referral[] referrals) { this.body = new WelcomeInfoDC(nodeId, referrals); } [MessageBodyMember(Name = "Welcome", Namespace = PeerStrings.Namespace)] WelcomeInfoDC body; public ulong NodeId { get { return this.body.nodeId; } } public IList Referrals { get { return this.body.referrals != null ? Array.AsReadOnly(this.body.referrals) : null; } } public bool HasBody() { return body != null; } } }