Author: toad
Date: 2007-10-24 18:58:38 +0000 (Wed, 24 Oct 2007)
New Revision: 15549

Modified:
   trunk/freenet/src/freenet/node/OpennetManager.java
   trunk/freenet/src/freenet/node/RequestHandler.java
   trunk/freenet/src/freenet/node/RequestSender.java
Log:
Factor out sending of opennet noderef messages into OpennetManager.
Some minor related refactoring.

Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-10-24 18:30:32 UTC 
(rev 15548)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-10-24 18:58:38 UTC 
(rev 15549)
@@ -15,11 +15,16 @@
 import java.util.Comparator;
 import java.util.Vector;

+import freenet.io.comm.ByteCounter;
+import freenet.io.comm.DMT;
+import freenet.io.comm.Message;
+import freenet.io.comm.NotConnectedException;
 import freenet.io.comm.Peer;
 import freenet.io.comm.PeerParseException;
 import freenet.io.comm.ReferenceSignatureVerificationException;
 import freenet.support.LRUQueue;
 import freenet.support.Logger;
+import freenet.support.ShortBuffer;
 import freenet.support.SimpleFieldSet;
 import freenet.support.transport.ip.HostnameSyntaxException;

@@ -448,4 +453,19 @@
                return MAX_PEERS - node.peers.countConnectedDarknetPeers();
        }

+       /**
+        * Send our opennet noderef to a node.
+        * @param isReply If true, send an FNPOpennetConnectReply, else send an 
FNPOpennetConnectDestination.
+        * @param uid The unique ID of the request chain involved.
+        * @param peer The node to send the noderef to.
+        * @param cs The full compressed noderef to send.
+        * @throws NotConnectedException If the peer becomes disconnected while 
we are trying to send the noderef.
+        */
+       public void sendOpennetRef(boolean isReply, long uid, PeerNode peer, 
byte[] noderef, ByteCounter ctr) throws NotConnectedException {
+               ShortBuffer buf = new ShortBuffer(noderef);
+               Message msg = isReply ? DMT.createFNPOpennetConnectReply(uid, 
buf) : 
+                       DMT.createFNPOpennetConnectDestination(uid, buf);
+               peer.sendAsync(msg, null, 0, ctr);
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java  2007-10-24 18:30:32 UTC 
(rev 15548)
+++ trunk/freenet/src/freenet/node/RequestHandler.java  2007-10-24 18:58:38 UTC 
(rev 15549)
@@ -151,7 +151,7 @@
                        // We've fetched it from our datastore, so there won't 
be a downstream noderef.
                        // But we want to send at least an 
FNPOpennetCompletedAck, otherwise the request source
                        // may have to timeout waiting for one.
-                               finishOpennetNoRelayInner();
+                               finishOpennetNoRelay();
                }
             }
             return;
@@ -278,30 +278,56 @@
                finishOpennetInner();
        }

+       private void finishOpennetNoRelay() {
+               OpennetManager om = node.getOpennet();
+               
+               if(om == null) {
+                       Message msg = DMT.createFNPOpennetCompletedAck(uid);
+                       try {
+                               source.sendAsync(msg, null, 0, this);
+                       } catch (NotConnectedException e) {
+                               // Oh well...
+                       }
+                       return;
+               }
+               
+               finishOpennetNoRelayInner(om);
+       }
+       
        private void finishOpennetInner() {
+               OpennetManager om = node.getOpennet();
+               
+               if(om == null) {
+                       Message msg = DMT.createFNPOpennetCompletedAck(uid);
+                       try {
+                               source.sendAsync(msg, null, 0, this);
+                       } catch (NotConnectedException e) {
+                               // Oh well...
+                       }
+                       return;
+               }
+               
                byte[] noderef = rs.waitForOpennetNoderef();
                if(noderef == null) {
-                       finishOpennetNoRelayInner();
+                       finishOpennetNoRelayInner(om);
                        return;
                }

                if(node.random.nextInt(OpennetManager.RESET_PATH_FOLDING_PROB) 
== 0) {
-                       finishOpennetNoRelayInner();
+                       finishOpennetNoRelayInner(om);
                        return;
                }

-       finishOpennetRelay(noderef);
+       finishOpennetRelay(noderef, om);
     }

-    private void finishOpennetNoRelayInner() {
+    private void finishOpennetNoRelayInner(OpennetManager om) {
        if(logMINOR)
                Logger.minor(this, "Finishing opennet: sending own reference");
-               OpennetManager om = node.getOpennet();
-               if(om != null && (source.isOpennet() || 
node.passOpennetRefsThroughDarknet())) {
                        if(om.wantPeer(null, false)) {
-                       Message msg = 
DMT.createFNPOpennetConnectDestination(uid, new 
ShortBuffer(om.crypto.myCompressedFullRef()));
+                               
                                try {
-                                       source.sendAsync(msg, null, 0, this);
+                                       om.sendOpennetRef(false, uid, source, 
om.crypto.myCompressedFullRef(), this);
                                } catch (NotConnectedException e) {
                                        Logger.normal(this, "Can't send opennet 
ref because node disconnected on "+this);
                                        // Oh well...
@@ -311,6 +337,7 @@
                                // Wait for response

                                MessageFilter mf = 
MessageFilter.create().setSource(source).setField(DMT.UID, 
uid).setTimeout(RequestSender.OPENNET_TIMEOUT).setType(DMT.FNPOpennetConnectReply);
+                               Message msg;

                                try {
                                        msg = node.usm.waitFor(mf, this);
@@ -350,25 +377,16 @@
                                }
                                return;
                        }
-               }
-               Message msg = DMT.createFNPOpennetCompletedAck(uid);
-               try {
-                       source.sendAsync(msg, null, 0, this);
-               } catch (NotConnectedException e) {
-                       // Oh well...
-               }
     }

-       private void finishOpennetRelay(byte[] noderef) {
+       private void finishOpennetRelay(byte[] noderef, OpennetManager om) {
        if(logMINOR)
                Logger.minor(this, "Finishing opennet: relaying reference from 
"+rs.successFrom());
                // Send it back to the handler, then wait for the ConnectReply
                PeerNode dataSource = rs.successFrom();

-               Message msg = DMT.createFNPOpennetConnectDestination(uid, new 
ShortBuffer(noderef));
-               
                try {
-                       source.sendAsync(msg, null, 0, this);
+                       om.sendOpennetRef(false, uid, source, 
om.crypto.myCompressedFullRef(), this);
                } catch (NotConnectedException e) {
                        // Lost contact with request source, nothing we can do
                        return;
@@ -377,7 +395,8 @@
                // Now wait for reply from the request source

                MessageFilter mf = 
MessageFilter.create().setSource(source).setField(DMT.UID, 
uid).setTimeout(RequestSender.OPENNET_TIMEOUT).setType(DMT.FNPOpennetConnectReply);
-               
+
+               Message msg;
                try {
                        msg = node.usm.waitFor(mf, this);
                } catch (DisconnectedException e) {
@@ -393,13 +412,16 @@

                try {
                        SimpleFieldSet fs = 
PeerNode.compressedNoderefToFieldSet(noderef, 0, noderef.length);
-                       if(!fs.getBoolean("opennet", false)) {
-                               msg = DMT.createFNPOpennetCompletedAck(uid);
-                       } else {
-                               msg = DMT.createFNPOpennetConnectReply(uid, new 
ShortBuffer(noderef));
+                       if(fs.getBoolean("opennet", false)) {
+                               try {
+                                       om.sendOpennetRef(true, uid, 
dataSource, noderef, this);
+                               } catch (NotConnectedException e) {
+                                       // How sad
+                                       return;
+                               }
                        }
                } catch (FSParseException e1) {
-                       msg = DMT.createFNPOpennetCompletedAck(uid);
+                       // Invalid, clear it
                }

                try {

Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java   2007-10-24 18:30:32 UTC 
(rev 15548)
+++ trunk/freenet/src/freenet/node/RequestSender.java   2007-10-24 18:58:38 UTC 
(rev 15549)
@@ -730,10 +730,8 @@

        // Send our reference

-       Message msg = DMT.createFNPOpennetConnectReply(uid, new ShortBuffer( 
om.crypto.myCompressedFullRef()));
-       
        try {
-                       next.sendAsync(msg, null, 0, this);
+               om.sendOpennetRef(true, uid, source, 
om.crypto.myCompressedFullRef(), this);
                } catch (NotConnectedException e) {
                        // Hmmm... let the LRU deal with it
                        if(logMINOR)


Reply via email to