// 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()); } }
// 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); } }