Author: zothar
Date: 2008-01-09 01:54:55 +0000 (Wed, 09 Jan 2008)
New Revision: 16976

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Locally broadcast a differential node reference to the node's connected darknet 
peers when the node's name changes.  Fix a bug in the differential node 
reference handling changes of parseARK()

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2008-01-09 01:08:43 UTC (rev 
16975)
+++ trunk/freenet/src/freenet/node/Node.java    2008-01-09 01:54:55 UTC (rev 
16976)
@@ -149,6 +149,10 @@
                        else if("".equals(val))
                                val = "~none~";
                        myName = val;
+                       // We'll broadcast the new name to our connected 
darknet peers via a differential node reference
+                       SimpleFieldSet fs = new SimpleFieldSet(true);
+                       fs.putSingle("myName", myName);
+                       peers.locallyBroadcastDiffNodeRef(fs, true);
                        // We call the callback once again to ensure 
MeaningfulNodeNameUserAlert
                        // has been unregistered ... see #1595
                        get();

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2008-01-09 01:08:43 UTC 
(rev 16975)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2008-01-09 01:54:55 UTC 
(rev 16976)
@@ -615,6 +615,23 @@
         }
     }

+       /**
+        * Asynchronously send a differential node reference to every 
isConnected() peer.
+        */
+       public void locallyBroadcastDiffNodeRef(SimpleFieldSet fs, boolean 
toDarknetOnly) {
+               PeerNode[] peers;
+               synchronized (this) {
+                       // myPeers not connectedPeers as connectedPeers only 
contains
+                       // ROUTABLE peers and we want to also send to 
non-routable peers
+                       peers = myPeers;
+               }
+               for(int i=0;i<peers.length;i++) {
+                       if(!peers[i].isConnected()) continue;
+                       if(toDarknetOnly && !peers[i].isDarknet()) continue;
+                       peers[i].sendNodeToNodeMessage(fs, 
Node.N2N_MESSAGE_TYPE_DIFFNODEREF, false, 0, false);
+               }
+       }
+
     public PeerNode getRandomPeer() {
         return getRandomPeer(null);
     }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-01-09 01:08:43 UTC 
(rev 16975)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-01-09 01:54:55 UTC 
(rev 16976)
@@ -660,12 +660,12 @@
                                FreenetURI uri = new FreenetURI(arkPubKey);
                                ClientSSK ssk = new ClientSSK(uri);
                                ark = new USK(ssk, arkNo);
-                       } else if(forDiffNodeRef && arkPubKey == null && myARK 
!= null) {
+                       } else if(forDiffNodeRef && arkPubKey == null && myARK 
!= null && arkNo != -1) {
                                // get the ARK URI from the previous ARK and 
the edition from the SFS
                                FreenetURI uri = myARK.getURI();
                                ClientSSK ssk = new ClientSSK(uri);
                                ark = new USK(ssk, arkNo);
-                       } else if(forDiffNodeRef && arkPubKey != null && myARK 
!= null) {
+                       } else if(forDiffNodeRef && arkPubKey != null && myARK 
!= null && arkNo != -1) {
                                // the SFS must contain an edition if it 
contains a arkPubKey
                                Logger.error(this, "Got a differential node 
reference from " + this + " with an arkPubKey but no ARK edition");
                                return false;
@@ -3502,7 +3502,7 @@
        private int handshakeIPAlternator;

        public void sendNodeToNodeMessage(SimpleFieldSet fs, int n2nType, 
boolean includeSentTime, long now, boolean queueOnNotConnected) {
-               fs.put("n2nType", n2nType);
+               fs.putOverwrite("n2nType", Integer.toString(n2nType));
                if(includeSentTime) {
                        fs.put("sentTime", now);
                }


Reply via email to