Author: toad
Date: 2007-09-14 19:47:37 +0000 (Fri, 14 Sep 2007)
New Revision: 15181

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
Log:
Handle explicit disconnect message

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-09-14 19:40:53 UTC (rev 
15180)
+++ trunk/freenet/src/freenet/node/Node.java    2007-09-14 19:47:37 UTC (rev 
15181)
@@ -2329,7 +2329,7 @@
        /**
         * Handle a received node to node message
         */
-       public void receivedNodeToNodeMessage(Message m) {
+       public void receivedNodeToNodeMessage(Message m, boolean parting) {
          PeerNode src = (PeerNode) m.getSource();
          if(!(src instanceof DarknetPeerNode)) {
                Logger.error(this, "Got N2NTM from opennet node ?!?!?!: "+m+" 
from "+src);

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java  2007-09-14 19:40:53 UTC 
(rev 15180)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java  2007-09-14 19:47:37 UTC 
(rev 15181)
@@ -87,8 +87,11 @@
                        return handleTime(m, source);
                } else if(spec == DMT.FNPVoid) {
                        return true;
+               } else if(spec == DMT.FNPDisconnect) {
+                       handleDisconnect(m, source);
+                       return true;
                } else if(spec == DMT.nodeToNodeMessage) {
-                       node.receivedNodeToNodeMessage(m);
+                       node.receivedNodeToNodeMessage(m, false);
                        return true;
                } else if(spec == DMT.UOMAnnounce) {
                        return node.nodeUpdater.uom.handleAnnounce(m, source);
@@ -144,6 +147,22 @@
                return false;
        }

+       private void handleDisconnect(Message m, PeerNode source) {
+               source.disconnected();
+               // If true, remove from active routing table, likely to be down 
for a while.
+               // Otherwise just dump all current connection state and keep 
trying to connect.
+               boolean remove = m.getBoolean(DMT.REMOVE);
+               if(remove)
+                       node.peers.disconnect(source);
+               // If true, purge all references to this node. Otherwise, we 
can keep the node
+               // around in secondary tables etc in order to more easily 
reconnect later. 
+               // (Mostly used on opennet)
+               // Not used at the moment - FIXME
+               boolean purge = m.getBoolean(DMT.PURGE);
+               // Process parting message
+               node.receivedNodeToNodeMessage(m, true);
+       }
+
        private boolean handleTime(Message m, PeerNode source) {
                long delta = m.getLong(DMT.TIME) - System.currentTimeMillis();
                source.setTimeDelta(delta);


Reply via email to