/** * When we get a new link message from an edge, we must * check several conditions to see if we can proceed with * the Link protocol. * This function checks those conditions and returns true * if we can proceed. * If we cannot proceed, it gives an ErrorMessage to send * back to the other side. * @param cph The CphState * @param err ErrorMessage to return. Is null if there is no error * @return true if we can connect, if false, err != null */ protected bool CanConnect(CphState cph, out ErrorMessage err) { ConnectionTable tab = _node.ConnectionTable; Address local_add = _node.Address; LinkMessage lm = cph.LM; err = null; /* We lock the connection table so it doesn't change between * the call to Contains and the call to Lock */ if( lm.Attributes["realm"] != _node.Realm ) { err = new ErrorMessage(ErrorMessage.ErrorCode.RealmMismatch, "We are not in the same realm"); } else if( (lm.Remote.Address != null ) && !local_add.Equals( lm.Remote.Address ) ) { /* * They are trying to reach a specific node, but it's not * us */ err = new ErrorMessage(ErrorMessage.ErrorCode.TargetMismatch, String.Format("target is {0}, but reached {1}", lm.Remote.Address, local_add)); } else if( lm.Local.Address.Equals( local_add ) ) { //You are me!!! err = new ErrorMessage(ErrorMessage.ErrorCode.ConnectToSelf, "You are me: "); } else if( 1 == _disconnecting ) { err = new ErrorMessage(ErrorMessage.ErrorCode.Disconnecting, String.Format("I am disconnecting. local: {0}", local_add)); } else { /* * Now we go to the ConnectionTable and try to * get a lock on the address so we can go forward * with the linking */ try { if(ProtocolLog.LinkDebug.Enabled) ProtocolLog.Write(ProtocolLog.LinkDebug, String.Format( "ConnectionPacketHandler - Trying to lock connection table: {0},{1}", lm.Local.Address, lm.ConTypeString)); tab.Lock( lm.Local.Address, lm.ConTypeString, cph ); if(ProtocolLog.LinkDebug.Enabled) ProtocolLog.Write(ProtocolLog.LinkDebug, String.Format( "ConnectionPacketHandler - Successfully locked connection table: {0},{1}", lm.Local.Address, lm.ConTypeString)); } catch(ConnectionExistsException) { //We already have a connection of this type to this address err = new ErrorMessage(ErrorMessage.ErrorCode.AlreadyConnected, String.Format("We are already connected: {0}", local_add)); } catch(CTLockException) { if(ProtocolLog.LinkDebug.Enabled) ProtocolLog.Write(ProtocolLog.LinkDebug, String.Format( "ConnectionPacketHandler - Cannot lock connection table: {0},{1}", lm.Local.Address, lm.ConTypeString)); //Lock can throw this type of exception err = new ErrorMessage(ErrorMessage.ErrorCode.InProgress, "Address: " + lm.Local.Address.ToString() + " is locked"); } } return ( err == null ); }
public void EMTest() { ErrorMessage em1 = new ErrorMessage(ErrorMessage.ErrorCode.UnexpectedRequest, "Who are you???"); ErrorMessage em2 = new ErrorMessage(ErrorMessage.ErrorCode.AlreadyConnected, "We are BFF"); }
/** * @param ec The ErrorCode for this message * @param message the string in the message */ public ErrorMessage(ErrorMessage.ErrorCode ec, string message) { _ec = ec;; _message = message; }
public LinkException(string message, bool crit, ErrorMessage em) : base(message) { _critical = crit; _em = em; }