Пример #1
0
        // Send Disconnect or Refuse message
        void SendTerminatingMessage(IPeerNeighbor neighbor, string action, PeerCloseReason closeReason)
        {
            // We do not attempt to send the message if Connector is not open
            // or if the close reason is InvalidNeighbor.
            if (this.state != State.Opened || closeReason == PeerCloseReason.InvalidNeighbor)
                return;

            // Set the neighbor state to disconnecting. TrySetState can fail if the 
            // neighbor is already being closed. Disconnect/Refuse msg not sent in that case.
            if (neighbor.TrySetState(PeerNeighborState.Disconnecting))
            {
                // Get referrals from the maintainer
                Referral[] referrals = maintainer.GetReferrals();

                // Build and send the message
                Message message;
                if (action == PeerStrings.DisconnectAction)
                {
                    DisconnectInfo disconnectInfo = new DisconnectInfo((DisconnectReason)closeReason, referrals);
                    message = DisconnectInfoMessageConverter.ToMessage(disconnectInfo, MessageVersion.Soap12WSAddressing10);
                }
                else
                {
                    RefuseInfo refuseInfo = new RefuseInfo((RefuseReason)closeReason, referrals);
                    message = RefuseInfoMessageConverter.ToMessage(refuseInfo, MessageVersion.Soap12WSAddressing10);
                }
                SendMessageToNeighbor(neighbor, message, null);
            }
            else
                if (!(neighbor.State >= PeerNeighborState.Disconnecting))
                {
                    throw Fx.AssertAndThrow("Neighbor state expected to be >= Disconnecting; it is " + neighbor.State.ToString());
                }
        }
Пример #2
0
        // Process Disconnect message from the neighbor
        public void Disconnect(IPeerNeighbor neighbor, DisconnectInfo disconnectInfo)
        {
            // Don't bother processing the message if Connector has closed
            if (this.state != State.Opened)
                return;

            PeerCloseReason closeReason = PeerCloseReason.InvalidNeighbor;
            IList<Referral> referrals = null;

            if (disconnectInfo.HasBody())
            {
                // We should only receive Disconnect message after the neighbor has transitioned
                // to connected state.
                if (neighbor.State >= PeerNeighborState.Connected)
                {
                    if (PeerConnectorHelper.IsDefined(disconnectInfo.Reason))
                    {
                        closeReason = (PeerCloseReason)disconnectInfo.Reason;
                        referrals = disconnectInfo.Referrals;
                    }
                }
            }

            // Complete processing of disconnect message
            CompleteTerminateMessageProcessing(neighbor, closeReason, referrals);
        }
 public void Disconnect(IPeerNeighbor neighbor, DisconnectInfo disconnectInfo)
 {
     if (this.state == State.Opened)
     {
         PeerCloseReason invalidNeighbor = PeerCloseReason.InvalidNeighbor;
         IList<Referral> referrals = null;
         if ((disconnectInfo.HasBody() && (neighbor.State >= PeerNeighborState.Connected)) && PeerConnectorHelper.IsDefined(disconnectInfo.Reason))
         {
             invalidNeighbor = (PeerCloseReason) disconnectInfo.Reason;
             referrals = disconnectInfo.Referrals;
         }
         this.CompleteTerminateMessageProcessing(neighbor, invalidNeighbor, referrals);
     }
 }
 private void SendTerminatingMessage(IPeerNeighbor neighbor, string action, PeerCloseReason closeReason)
 {
     if ((this.state == State.Opened) && (closeReason != PeerCloseReason.InvalidNeighbor))
     {
         if (neighbor.TrySetState(PeerNeighborState.Disconnecting))
         {
             Message message;
             Referral[] referrals = this.maintainer.GetReferrals();
             if (action == "http://schemas.microsoft.com/net/2006/05/peer/Disconnect")
             {
                 DisconnectInfo typedMessage = new DisconnectInfo((DisconnectReason) closeReason, referrals);
                 message = this.DisconnectInfoMessageConverter.ToMessage(typedMessage, MessageVersion.Soap12WSAddressing10);
             }
             else
             {
                 RefuseInfo info2 = new RefuseInfo((RefuseReason) closeReason, referrals);
                 message = this.RefuseInfoMessageConverter.ToMessage(info2, MessageVersion.Soap12WSAddressing10);
             }
             this.SendMessageToNeighbor(neighbor, message, null);
         }
         else if (neighbor.State < PeerNeighborState.Disconnecting)
         {
             throw Fx.AssertAndThrow("Neighbor state expected to be >= Disconnecting; it is " + neighbor.State.ToString());
         }
     }
 }
 void IPeerServiceContract.Disconnect(DisconnectInfo disconnectInfo)
 {
     IPeerNeighbor neighbor = this.GetNeighbor();
     if (neighbor != null)
     {
         this.connector.Disconnect(neighbor, disconnectInfo);
     }
 }