[freenet-cvs] r16270 - trunk/freenet/src/freenet/node

toad at freenetproject.org toad at freenetproject.org
Tue Dec 4 18:14:40 UTC 2007


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);




More information about the cvs mailing list