Author: toad
Date: 2007-12-04 18:14:40 +0000 (Tue, 04 Dec 2007)
New Revision: 16270

Added:
   trunk/freenet/src/freenet/node/AnnouncementCallback.java
Modified:
   trunk/freenet/src/freenet/node/AnnounceSender.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/OpennetManager.java
   trunk/freenet/src/freenet/node/RequestHandler.java
   trunk/freenet/src/freenet/node/RequestSender.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
Log:
Ability to start an announcement from TMCI.

Modified: trunk/freenet/src/freenet/node/AnnounceSender.java
===================================================================
--- trunk/freenet/src/freenet/node/AnnounceSender.java  2007-12-04 17:46:07 UTC 
(rev 16269)
+++ trunk/freenet/src/freenet/node/AnnounceSender.java  2007-12-04 18:14:40 UTC 
(rev 16270)
@@ -30,6 +30,7 @@
        private double nearestLoc;
        private double target;
        private static boolean logMINOR;
+       private final AnnouncementCallback cb;

        public AnnounceSender(Message m, long uid, PeerNode source, 
OpennetManager om, Node node) {
                this.source = source;
@@ -40,8 +41,21 @@
                htl = m.getShort(DMT.HTL);
                target = m.getDouble(DMT.TARGET_LOCATION); // FIXME validate
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               cb = null;
        }

+       public AnnounceSender(double target, OpennetManager om, Node node, 
AnnouncementCallback cb) {
+               source = null;
+               this.uid = node.random.nextLong();
+               msg = null;
+               this.om = om;
+               this.node = node;
+               this.htl = node.maxHTL();
+               this.target = target;
+               this.cb = cb;
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+       }
+       
        public void run() {
                try {
                        realRun();
@@ -55,12 +69,12 @@

        private void realRun() {
                boolean hasForwarded = false;
-               try {
-                       source.sendAsync(DMT.createFNPAccepted(uid), null, 0, 
null);
-               } catch (NotConnectedException e) {
-                       return;
-               }
                if(source != null) {
+                       try {
+                               source.sendAsync(DMT.createFNPAccepted(uid), 
null, 0, null);
+                       } catch (NotConnectedException e) {
+                               return;
+                       }
                        if(!transferNoderef()) return;
                }

@@ -259,15 +273,32 @@
                }
                SimpleFieldSet fs = om.validateNoderef(noderefBuf, 0, 
noderefLength, source);
                if(fs == null) {
-                       om.rejectRef(uid, source, DMT.NODEREF_REJECTED_INVALID, 
this);
+                       if(cb != null) cb.bogusNoderef("invalid noderef");
                        return true; // Don't relay
                }
-               // Now relay it
-               try {
-                       om.sendAnnouncementReply(uid, source, noderefBuf, this);
-               } catch (NotConnectedException e) {
-                       // Hmmm...!
-                       return false;
+               if(source != null) {
+                       // Now relay it
+                       try {
+                               om.sendAnnouncementReply(uid, source, 
noderefBuf, this);
+                       } catch (NotConnectedException e) {
+                               // Hmmm...!
+                               return false;
+                       }
+               } else {
+                       // Add it
+                       try {
+                               OpennetPeerNode pn = node.addNewOpennetNode(fs);
+                               cb.addedNode(pn);
+                       } catch (FSParseException e) {
+                               Logger.normal(this, "Failed to parse reply: 
"+e, e);
+                               if(cb != null) cb.bogusNoderef("parse failed: 
"+e);
+                       } catch (PeerParseException e) {
+                               Logger.normal(this, "Failed to parse reply: 
"+e, e);
+                               if(cb != null) cb.bogusNoderef("parse failed: 
"+e);
+                       } catch (ReferenceSignatureVerificationException e) {
+                               Logger.normal(this, "Failed to parse reply: 
"+e, e);
+                               if(cb != null) cb.bogusNoderef("parse failed: 
"+e);
+                       }
                }
                return true;
        }
@@ -332,7 +363,7 @@
                }
                // If we want it, add it and send it.
                try {
-                       if(om.addNewOpennetNode(fs)) {
+                       if(om.addNewOpennetNode(fs) != null) {
                                sendOurRef();
                        } else {
                                // Okay, just route it.

Added: trunk/freenet/src/freenet/node/AnnouncementCallback.java
===================================================================
--- trunk/freenet/src/freenet/node/AnnouncementCallback.java                    
        (rev 0)
+++ trunk/freenet/src/freenet/node/AnnouncementCallback.java    2007-12-04 
18:14:40 UTC (rev 16270)
@@ -0,0 +1,12 @@
+package freenet.node;
+
+/**
+ * Callback for a local announcement.
+ */
+public interface AnnouncementCallback {
+       
+       public void completed();
+       public void bogusNoderef(String reason);
+       public void addedNode(PeerNode pn);
+       
+}

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-12-04 17:46:07 UTC (rev 
16269)
+++ trunk/freenet/src/freenet/node/Node.java    2007-12-04 18:14:40 UTC (rev 
16270)
@@ -2737,9 +2737,9 @@
        return new OpennetPeerNode(fs, this, opennet.crypto, opennet, peers, 
false, opennet.crypto.packetMangler);
        }

-       public boolean addNewOpennetNode(SimpleFieldSet fs) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+       public OpennetPeerNode addNewOpennetNode(SimpleFieldSet fs) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
                // FIXME: perhaps this should throw OpennetDisabledExcemption 
rather than returing false?
-               if(opennet == null) return false;
+               if(opennet == null) return null;
                return opennet.addNewOpennetNode(fs);
        }


Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-12-04 17:46:07 UTC 
(rev 16269)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-12-04 18:14:40 UTC 
(rev 16270)
@@ -211,17 +211,18 @@
                        node.peers.removeOpennetPeers();
        }

-       public boolean addNewOpennetNode(SimpleFieldSet fs) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+       public OpennetPeerNode addNewOpennetNode(SimpleFieldSet fs) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
                OpennetPeerNode pn = new OpennetPeerNode(fs, node, crypto, 
this, node.peers, false, crypto.packetMangler);
                if(Arrays.equals(pn.getIdentity(), crypto.myIdentity)) {
                        if(logMINOR) Logger.minor(this, "Not adding self as 
opennet peer");
-                       return false; // Equal to myself
+                       return null; // Equal to myself
                }
                if(peersLRU.contains(pn)) {
                        if(logMINOR) Logger.minor(this, "Not adding 
"+pn.userToString()+" to opennet list as already there");
-                       return false;
+                       return null;
                }
-               return wantPeer(pn, true); 
+               if(wantPeer(pn, true)) return pn;
+               else return null;
                // Start at bottom. Node must prove itself.
        }

@@ -639,4 +640,13 @@
                return ref;
        }

+       /** Do an announcement !!
+        * @param target The location to announce to. In 0.7 we don't try to 
prevent nodes from choosing their
+        * announcement location, because it is easy for them to get the 
location they want later on anyway,
+        * and we can do a much more effective announcement this way. */
+       public void announce(double target, AnnouncementCallback cb) {
+               AnnounceSender sender = new AnnounceSender(target, this, node, 
cb);
+               node.executor.execute(sender, "Announcement to "+target);
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java  2007-12-04 17:46:07 UTC 
(rev 16269)
+++ trunk/freenet/src/freenet/node/RequestHandler.java  2007-12-04 18:14:40 UTC 
(rev 16270)
@@ -347,7 +347,7 @@
                        return false;

            try {
-                       if(!node.addNewOpennetNode(ref)) {
+                       if(node.addNewOpennetNode(ref) == null) {
                                Logger.normal(this, "Asked for opennet ref but 
didn't want it for "+this+" :\n"+ref);
                        } else {
                                Logger.normal(this, "Added opennet noderef in 
"+this);

Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java   2007-12-04 17:46:07 UTC 
(rev 16269)
+++ trunk/freenet/src/freenet/node/RequestSender.java   2007-12-04 18:14:40 UTC 
(rev 16270)
@@ -686,7 +686,7 @@

                if(ref == null) return;

-                       if(!node.addNewOpennetNode(ref)) {
+                       if(node.addNewOpennetNode(ref) == null) {
                                // If we don't want it let somebody else have it
                                synchronized(this) {
                                        opennetNoderef = noderef;

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-12-04 
17:46:07 UTC (rev 16269)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-12-04 
18:14:40 UTC (rev 16270)
@@ -186,6 +186,7 @@
         sb.append("STATUS - display some status information on the node 
including its reference and connections.\r\n");
         sb.append("MEMSTAT - display some memory usage related 
informations.\r\n");
         sb.append("SHUTDOWN - exit the program\r\n");
+        sb.append("ANNOUNCE[:<location>] - announce to the specified 
location");
         if(n.isUsingWrapper())
                sb.append("RESTART - restart the program\r\n");
         if(core != null && core.directTMCI != this) {
@@ -862,7 +863,7 @@
                                        }
                                }
                };
-               System.err.println("Probing keyspace around "+d+" ...");
+               outsb.append("Probing keyspace around "+d+" ...");
                n.dispatcher.startProbe(d, cb, 
NodeDispatcher.PROBE_TYPE_DEFAULT);
                synchronized(this) {
                        while(!doneSomething) {
@@ -884,9 +885,9 @@
                }
         } else if(uline.startsWith("PLUGLOAD:")) {
                if (line.substring("PLUGLOAD:".length()).trim().equals("?")) {
-                       outsb.append("  PLUGLOAD: pluginName         - Load 
official plugin from freenetproject.org");
-                       outsb.append("  PLUGLOAD: file://<filename>  - Load 
plugin from file");
-                       outsb.append("  PLUGLOAD: http://...         - Load 
plugin from online file");
+                       outsb.append("  PLUGLOAD: pluginName         - Load 
official plugin from freenetproject.org\r\n");
+                       outsb.append("  PLUGLOAD: file://<filename>  - Load 
plugin from file\r\n");
+                       outsb.append("  PLUGLOAD: http://...         - Load 
plugin from online file\r\n");
                } else {
                        String name = 
line.substring("PLUGLOAD:".length()).trim();
                        n.pluginManager.startPlugin(name, true);
@@ -895,6 +896,48 @@
                outsb.append(n.pluginManager.dumpPlugins());
         } else if(uline.startsWith("PLUGKILL:")) {
                
n.pluginManager.killPlugin(line.substring("PLUGKILL:".length()).trim(), 
60*1000);
+        } else if(uline.startsWith("ANNOUNCE")) {
+               OpennetManager om = n.getOpennet();
+               if(om == null) {
+                       outsb.append("OPENNET DISABLED, cannot announce.");
+                       return false;
+               }
+               uline = uline.substring("ANNOUNCE".length());
+               double target;
+               if(uline.charAt(0) == ':') {
+                       target = Double.parseDouble(uline);
+               } else {
+                       target = n.random.nextDouble();
+               }
+               om.announce(target, new AnnouncementCallback() {
+                               public void addedNode(PeerNode pn) {
+                                       try {
+                                               out.write(("Added node 
"+pn.shortToString()+"\n").getBytes());
+                                               out.flush();
+                                       } catch (IOException e) {
+                                               // Ignore
+                                       }
+                               }
+
+                               public void bogusNoderef(String reason) {
+                                       try {
+                                               out.write(("Bogus noderef: 
"+reason).getBytes());
+                                               out.flush();
+                                       } catch (IOException e) {
+                                               // Ignore
+                                       }
+                               }
+
+                               public void completed() {
+                                       try {
+                                               out.write(("Completed 
announcement.").getBytes());
+                                               out.flush();
+                                       } catch (IOException e) {
+                                               // Ignore
+                                       }
+                               }
+                       
+               });
         } else {
                if(uline.length() > 0)
                        printHeader(out);


Reply via email to