Update of /cvsroot/freenet/Freenet0.7Rewrite/src/freenet/node
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11269/src/freenet/node

Modified Files:
        Version.java PeerManager.java TextModeClientInterface.java 
        PeerNode.java 
Log Message:
132:
Don't add a node twice to PeerManager.
Interface improvements for CONNECT at request of ian.
PeerNode.equals, hashCode.

Index: Version.java
===================================================================
RCS file: /cvsroot/freenet/Freenet0.7Rewrite/src/freenet/node/Version.java,v
retrieving revision 1.126
retrieving revision 1.127
diff -u -w -r1.126 -r1.127
--- Version.java        7 Sep 2005 15:22:16 -0000       1.126
+++ Version.java        7 Sep 2005 18:19:01 -0000       1.127
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

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

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

Index: PeerManager.java
===================================================================
RCS file: /cvsroot/freenet/Freenet0.7Rewrite/src/freenet/node/PeerManager.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -w -r1.27 -r1.28
--- PeerManager.java    7 Sep 2005 15:22:16 -0000       1.27
+++ PeerManager.java    7 Sep 2005 18:19:01 -0000       1.28
@@ -93,7 +93,7 @@

     public synchronized boolean addPeer(PeerNode pn) {
         for(int i=0;i<myPeers.length;i++) {
-            if(myPeers[i] == pn) return false;
+            if(myPeers[i].equals(pn)) return false;
         }
         PeerNode[] newMyPeers = new PeerNode[myPeers.length+1];
         System.arraycopy(myPeers, 0, newMyPeers, 0, myPeers.length);

Index: TextModeClientInterface.java
===================================================================
RCS file: 
/cvsroot/freenet/Freenet0.7Rewrite/src/freenet/node/TextModeClientInterface.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -w -r1.18 -r1.19
--- TextModeClientInterface.java        7 Sep 2005 14:56:45 -0000       1.18
+++ TextModeClientInterface.java        7 Sep 2005 18:19:01 -0000       1.19
@@ -194,19 +194,7 @@
                 content = line;
             } else {
                 // Multiple line insert
-                StringBuffer sb = new StringBuffer(1000);
-                while(true) {
-                    try {
-                        line = reader.readLine();
-                        if(line == null) throw new EOFException();
-                    } catch (IOException e1) {
-                        System.err.println("Bye... ("+e1+")");
-                        return;
-                    }
-                    if(line.equals(".")) break;
-                    sb.append(line).append('\n');
-                }
-                content = sb.toString();
+                content = readLines(reader, false);
             }
             // Insert
             byte[] data = content.getBytes();
@@ -292,19 +280,8 @@
                     e.printStackTrace(System.err);
                 }
             } else {
-                StringBuffer sb = new StringBuffer(1000);
-                while(true) {
-                    try {
-                        line = reader.readLine();
-                        if(line == null) throw new EOFException();
-                    } catch (IOException e1) {
-                        System.err.println("Bye... ("+e1+")");
-                        return;
-                    }
-                    if(line.equals(".")) break;
-                    sb.append(line).append('\n');
-                }
-                String content = sb.toString();
+                String content = readLines(reader, true);
+                if(content == null) return;
                 connect(content);
             }
         } else if(line.startsWith("NAME:")) {
@@ -322,6 +299,76 @@
     }

     /**
+     * @return A block of text, input from stdin, ending with a
+     * . on a line by itself. Does some mangling for a fieldset if 
+     * isFieldSet. 
+     */
+    private String readLines(BufferedReader reader, boolean isFieldSet) {
+        StringBuffer sb = new StringBuffer(1000);
+        boolean breakflag = false;
+        while(true) {
+            String line;
+            try {
+                line = reader.readLine();
+                if(line == null) throw new EOFException();
+            } catch (IOException e1) {
+                System.err.println("Bye... ("+e1+")");
+                return null;
+            }
+            if(line.equals(".")) break;
+            if(isFieldSet) {
+                // Mangling
+                // First trim
+                line = line.trim();
+                if(line.equals("End")) {
+                    breakflag = true;
+                } else {
+                    if(line.endsWith("End") && 
+                            
Character.isWhitespace(line.charAt(line.length()-("End".length()+1)))) {
+                        line = "End";
+                        breakflag = true;
+                    } else {
+                        int idx = line.indexOf('=');
+                        if(idx < 0) {
+                            System.err.println("No = and no End in line: 
"+line);
+                            breakflag = true;
+                        } else {
+                            if(idx > 0) {
+                                String after;
+                                if(idx == line.length()-1)
+                                    after = "";
+                                else
+                                    after = line.substring(idx+1);
+                                String before = line.substring(0, idx);
+                                before = before.trim();
+                                int x = 0;
+                                for(int j=before.length()-1;j>=0;j--) {
+                                    char c = before.charAt(j);
+                                    if(c == '.' || 
Character.isLetterOrDigit(c)) {
+                                        // Valid character for field
+                                    } else {
+                                        x=j+1;
+                                        break;
+                                    }
+                                }
+                                before = before.substring(x);
+                                line = before + '=' + line.substring(idx+1);
+                                System.out.println(line);
+                            } else {
+                                System.err.println("Invalid empty field name");
+                                breakflag = true;
+                            }
+                        }
+                    }
+                }
+            }
+            sb.append(line).append('\n');
+            if(breakflag) break;
+        }
+        return sb.toString();
+    }
+
+    /**
      * Connect to a node, given its reference.
      */
     private void connect(String content) {

Index: PeerNode.java
===================================================================
RCS file: /cvsroot/freenet/Freenet0.7Rewrite/src/freenet/node/PeerNode.java,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -w -r1.37 -r1.38
--- PeerNode.java       25 Aug 2005 17:28:19 -0000      1.37
+++ PeerNode.java       7 Sep 2005 18:19:01 -0000       1.38
@@ -26,6 +26,7 @@
 import freenet.io.comm.PeerContext;
 import freenet.io.comm.PeerParseException;
 import freenet.io.xfer.PacketThrottle;
+import freenet.support.Fields;
 import freenet.support.HexUtil;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
@@ -102,6 +103,9 @@
     /** Hash of node identity. Used as setup key. */
     final byte[] identityHash;

+    /** Integer hash of node identity. Used as hashCode(). */
+    final int hashCode;
+    
     /** The Node we serve */
     final Node node;

@@ -191,6 +195,7 @@

         if(identity == null) throw new FSParseException("No identity");
         identityHash = md.digest(identity);
+        hashCode = Fields.hashCode(identityHash);
         version = fs.get("version");
         String locationString = fs.get("location");
         if(locationString == null) throw new FSParseException("No location");
@@ -906,4 +911,16 @@
             requeueMessageItems(new MessageItem[] {mi}, 0, 1, true);
         }
     }
+    
+    public boolean equals(Object o) {
+        if(o == this) return true;
+        if(o instanceof PeerNode) {
+            PeerNode pn = (PeerNode) o;
+            return Arrays.equals(pn.identity, identity);
+        } else return false;
+    }
+    
+    public int hashCode() {
+        return hashCode;
+    }
 }


Reply via email to