Author: tubbie
Date: 2005-12-10 14:13:49 +0000 (Sat, 10 Dec 2005)
New Revision: 7704

Modified:
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/node/Version.java
Log:
302:
Added possibility to disconnect from a node without restarting.

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2005-12-10 00:50:31 UTC 
(rev 7703)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2005-12-10 14:13:49 UTC 
(rev 7704)
@@ -12,6 +12,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Vector;
+import java.util.ArrayList;

 import freenet.io.comm.Message;
 import freenet.io.comm.NotConnectedException;
@@ -102,6 +103,38 @@
         Logger.normal(this, "Added "+pn);
         return true;
     }
+    
+    private synchronized boolean removePeer(PeerNode pn) {
+       boolean isInPeers = false;
+        for(int i=0;i<myPeers.length;i++) {
+            if(myPeers[i].equals(pn)) isInPeers=true;
+        }
+        if(!isInPeers) return false;
+                
+        // removing from connectedPeers
+        ArrayList a = new ArrayList();
+        for(int i=0;i<myPeers.length;i++) {
+               if(myPeers[i]!=pn)
+                       a.add(myPeers[i]);
+        }
+        
+        PeerNode[] newConnectedPeers = new PeerNode[a.size()];
+        newConnectedPeers = (PeerNode[]) a.toArray(newConnectedPeers);
+           connectedPeers = newConnectedPeers;
+        
+        // removing from myPeers
+        PeerNode[] newMyPeers = new PeerNode[myPeers.length-1];
+        int positionInNewArray = 0;
+        for(int i=0;i<myPeers.length;i++) {
+               if(myPeers[i]!=pn){
+                       newMyPeers[positionInNewArray] = myPeers[i];
+                       positionInNewArray++;
+               }
+        }
+        myPeers = newMyPeers;
+        Logger.normal(this, "Removed "+pn);
+        return true;
+    }

     public synchronized void addConnectedPeer(PeerNode pn) {
        if(!pn.isConnected()) {
@@ -174,6 +207,13 @@
         }
         addPeer(pn);
     }
+       
+    /**
+     * Disconnect from a specified node
+     */
+    public void disconnect(PeerNode pn){
+       removePeer(pn);
+    }

     /**
      * @return An array of the current locations (as doubles) of all

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-12-10 
00:50:31 UTC (rev 7703)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-12-10 
14:13:49 UTC (rev 7704)
@@ -97,6 +97,7 @@
 //        System.out.println("SUBSCRIBE:<key> - subscribe to a 
publish/subscribe stream by key");
         System.out.println("CONNECT:<filename> - connect to a node from its 
ref in a file.");
         System.out.println("CONNECT:\n<noderef including an End on a line by 
itself> - enter a noderef directly.");
+        System.out.println("DISCONNECT:<ip:port> - disconnect from a node by 
providing it's ip+port");
         System.out.println("NAME:<new node name> - change the node's name.");
 //        System.out.println("SUBFILE:<filename> - append all data received 
from subscriptions to a file, rather than sending it to stdout.");
 //        System.out.println("SAY:<text> - send text to the last 
created/pushed stream");
@@ -348,6 +349,9 @@
                 key = key.substring(0, key.length()-2);
             System.out.println("New name: "+key);
             n.setName(key);
+        } else if(uline.startsWith("DISCONNECT:")) {
+               String ipAndPort = line.substring("DISCONNECT:".length());
+               disconnect(ipAndPort.trim());
         } else {
                if(uline.length() > 0)
                        printHeader();
@@ -451,6 +455,24 @@
             System.out.println("Added peer: "+pn);
         n.peers.writePeers();
     }
+    
+    /**
+     * Disconnect from a node, given its ip and port as a String
+     */
+    private void disconnect(String ipAndPort) {
+       System.out.println("Disconnecting from node at: "+ipAndPort);
+       PeerNode[] pn = n.peers.myPeers;
+       for(int i=0;i<pn.length;i++)
+       {
+               String nodeIpAndPort = 
pn[i].getPeer().getAddress().getHostAddress()+":"+pn[i].getPeer().getPort();
+               if(nodeIpAndPort.equals(ipAndPort))
+               {
+                       n.peers.disconnect(pn[i]);
+                       return;
+               }
+       }
+       System.out.println("No node in peers list at: "+ipAndPort);
+    }

     private String sanitize(String fnam) {
        if(fnam == null) return "";

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-12-10 00:50:31 UTC (rev 
7703)
+++ trunk/freenet/src/freenet/node/Version.java 2005-12-10 14:13:49 UTC (rev 
7704)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       public static final int buildNumber = 301;
+       public static final int buildNumber = 302;

        /** Oldest build of Fred we will talk to */
        public static final int lastGoodBuild = 300;


Reply via email to