Author: toad
Date: 2005-11-10 14:19:21 +0000 (Thu, 10 Nov 2005)
New Revision: 7514
Added:
trunk/freenet/src/freenet/client/events/
trunk/freenet/src/freenet/client/events/ClientEvent.java
trunk/freenet/src/freenet/client/events/ClientEventListener.java
trunk/freenet/src/freenet/client/events/ClientEventProducer.java
trunk/freenet/src/freenet/client/events/DecodedBlockEvent.java
trunk/freenet/src/freenet/client/events/EventDumper.java
trunk/freenet/src/freenet/client/events/EventLogger.java
trunk/freenet/src/freenet/client/events/FetchedMetadataEvent.java
trunk/freenet/src/freenet/client/events/GotBlockEvent.java
trunk/freenet/src/freenet/client/events/SimpleEventProducer.java
Modified:
trunk/freenet/src/freenet/client/Fetcher.java
trunk/freenet/src/freenet/client/FetcherContext.java
trunk/freenet/src/freenet/client/HighLevelSimpleClient.java
trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
trunk/freenet/src/freenet/keys/CHKBlock.java
trunk/freenet/src/freenet/keys/ClientCHK.java
trunk/freenet/src/freenet/keys/ClientCHKBlock.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/support/Logger.java
trunk/freenet/src/freenet/support/compress/Compressor.java
trunk/freenet/src/freenet/support/compress/GzipCompressor.java
Log:
150:
Small inserts, with and without compression, working.
Some client events. Events are very similar to logging but easier to hook into
and handle.
Modified: trunk/freenet/src/freenet/client/Fetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/Fetcher.java 2005-11-10 01:23:20 UTC
(rev 7513)
+++ trunk/freenet/src/freenet/client/Fetcher.java 2005-11-10 14:19:21 UTC
(rev 7514)
@@ -4,6 +4,9 @@
import java.net.MalformedURLException;
import java.util.LinkedList;
+import freenet.client.events.DecodedBlockEvent;
+import freenet.client.events.FetchedMetadataEvent;
+import freenet.client.events.GotBlockEvent;
import freenet.keys.ClientKey;
import freenet.keys.FreenetURI;
import freenet.keys.KeyBlock;
@@ -129,13 +132,17 @@
}
}
+ ctx.eventProducer.produceEvent(new GotBlockEvent(key));
+
byte[] data;
try {
data = block.decode(key);
} catch (KeyDecodeException e1) {
- throw new
FetchException(FetchException.BLOCK_DECODE_ERROR);
+ throw new
FetchException(FetchException.BLOCK_DECODE_ERROR, e1.getMessage());
}
+ ctx.eventProducer.produceEvent(new DecodedBlockEvent(key));
+
if(!key.isMetadata()) {
// Just return the data
try {
@@ -149,6 +156,8 @@
Metadata metadata = Metadata.construct(data);
+ ctx.eventProducer.produceEvent(new FetchedMetadataEvent());
+
FetchResult result = runMetadata(dm, recursionLevel, key,
metaStrings, metadata, null, key.getURI(), dontEnterImplicitArchives);
if(metaStrings.isEmpty()) return result;
// Still got some meta-strings
@@ -259,7 +268,9 @@
Bucket data = fr.data;
Bucket output;
try {
- output = codec.decompress(data,
ctx.bucketFactory);
+ long maxLen = ctx.maxTempLength;
+ if(maxLen < 0) maxLen = Long.MAX_VALUE;
+ output = codec.decompress(data,
ctx.bucketFactory, maxLen);
} catch (IOException e) {
throw new
FetchException(FetchException.BUCKET_ERROR, e);
}
@@ -293,7 +304,9 @@
if(metadata.compressed) {
Compressor codec =
Compressor.getCompressionAlgorithmByMetadataID(metadata.compressionCodec);
try {
- sfResult = codec.decompress(sfResult,
ctx.bucketFactory);
+ long maxLen = ctx.maxTempLength;
+ if(maxLen < 0) maxLen = Long.MAX_VALUE;
+ sfResult = codec.decompress(sfResult,
ctx.bucketFactory, maxLen);
} catch (IOException e) {
throw new
FetchException(FetchException.BUCKET_ERROR, e);
}
Modified: trunk/freenet/src/freenet/client/FetcherContext.java
===================================================================
--- trunk/freenet/src/freenet/client/FetcherContext.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/FetcherContext.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -1,5 +1,6 @@
package freenet.client;
+import freenet.client.events.ClientEventProducer;
import freenet.crypt.RandomSource;
import freenet.node.SimpleLowLevelClient;
import freenet.support.BucketFactory;
@@ -26,6 +27,7 @@
final boolean allowSplitfiles;
final boolean followRedirects;
final boolean localRequestOnly;
+ final ClientEventProducer eventProducer;
/** Whether to allow non-full blocks, or blocks which are not direct
CHKs, in splitfiles.
* Set by the splitfile metadata and the mask constructor, so we don't
need to pass it in. */
final boolean splitfileUseLengths;
@@ -35,7 +37,8 @@
boolean dontEnterImplicitArchives, int
maxSplitfileThreads,
int maxSplitfileBlockRetries, int
maxNonSplitfileRetries,
boolean allowSplitfiles, boolean followRedirects,
boolean localRequestOnly,
- RandomSource random, ArchiveManager archiveManager,
BucketFactory bucketFactory) {
+ RandomSource random, ArchiveManager archiveManager,
BucketFactory bucketFactory,
+ ClientEventProducer producer) {
this.client = client;
this.maxOutputLength = curMaxLength;
this.maxTempLength = curMaxTempLength;
@@ -52,6 +55,7 @@
this.followRedirects = followRedirects;
this.localRequestOnly = localRequestOnly;
this.splitfileUseLengths = false;
+ this.eventProducer = producer;
}
public FetcherContext(FetcherContext ctx, int maskID) {
@@ -72,6 +76,7 @@
this.followRedirects = false;
this.localRequestOnly = ctx.localRequestOnly;
this.splitfileUseLengths = false;
+ this.eventProducer = ctx.eventProducer;
} else if(maskID == SPLITFILE_DEFAULT_MASK) {
this.client = ctx.client;
this.maxOutputLength = ctx.maxOutputLength;
@@ -89,6 +94,7 @@
this.followRedirects = ctx.followRedirects;
this.localRequestOnly = ctx.localRequestOnly;
this.splitfileUseLengths = false;
+ this.eventProducer = ctx.eventProducer;
} else if(maskID == SPLITFILE_USE_LENGTHS_MASK) {
this.client = ctx.client;
this.maxOutputLength = ctx.maxOutputLength;
@@ -106,6 +112,7 @@
this.followRedirects = ctx.followRedirects;
this.localRequestOnly = ctx.localRequestOnly;
this.splitfileUseLengths = true;
+ this.eventProducer = ctx.eventProducer;
} else throw new IllegalArgumentException();
}
Modified: trunk/freenet/src/freenet/client/HighLevelSimpleClient.java
===================================================================
--- trunk/freenet/src/freenet/client/HighLevelSimpleClient.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/HighLevelSimpleClient.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -1,5 +1,6 @@
package freenet.client;
+import freenet.client.events.ClientEventListener;
import freenet.keys.FreenetURI;
public interface HighLevelSimpleClient {
@@ -25,4 +26,9 @@
* @throws InserterException If there is an error inserting the data
*/
public FreenetURI insert(InsertBlock insert) throws InserterException;
+
+ /**
+ * Add a ClientEventListener.
+ */
+ public void addGlobalHook(ClientEventListener listener);
}
Modified: trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
===================================================================
--- trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
2005-11-10 01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
2005-11-10 14:19:21 UTC (rev 7514)
@@ -1,15 +1,22 @@
package freenet.client;
+import freenet.client.events.ClientEventListener;
+import freenet.client.events.ClientEventProducer;
+import freenet.client.events.EventLogger;
+import freenet.client.events.SimpleEventProducer;
import freenet.crypt.RandomSource;
import freenet.keys.FreenetURI;
import freenet.node.SimpleLowLevelClient;
import freenet.support.BucketFactory;
+import freenet.support.Logger;
public class HighLevelSimpleClientImpl implements HighLevelSimpleClient {
private final SimpleLowLevelClient client;
private final ArchiveManager archiveManager;
private final BucketFactory bucketFactory;
+ /** One CEP for all requests and inserts */
+ private final ClientEventProducer globalEventProducer;
private long curMaxLength;
private long curMaxTempLength;
private final RandomSource random;
@@ -42,6 +49,8 @@
archiveManager = mgr;
bucketFactory = bf;
random = r;
+ this.globalEventProducer = new SimpleEventProducer();
+ globalEventProducer.addEventListener(new
EventLogger(Logger.MINOR));
}
public void setMaxLength(long maxLength) {
@@ -61,7 +70,7 @@
MAX_RECURSION, MAX_ARCHIVE_RESTARTS,
DONT_ENTER_IMPLICIT_ARCHIVES,
SPLITFILE_THREADS, SPLITFILE_BLOCK_RETRIES,
NON_SPLITFILE_RETRIES,
FETCH_SPLITFILES, FOLLOW_REDIRECTS,
LOCAL_REQUESTS_ONLY,
- random, archiveManager, bucketFactory);
+ random, archiveManager, bucketFactory,
globalEventProducer);
Fetcher f = new Fetcher(uri, context);
return f.run();
}
@@ -72,4 +81,7 @@
return i.run(insert, false);
}
+ public void addGlobalHook(ClientEventListener listener) {
+ globalEventProducer.addEventListener(listener);
+ }
}
Added: trunk/freenet/src/freenet/client/events/ClientEvent.java
===================================================================
--- trunk/freenet/src/freenet/client/events/ClientEvent.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/ClientEvent.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -0,0 +1,20 @@
+package freenet.client.events;
+/**
+ * Event handeling for clients.
+ *
+ * @author oskar
+ **/
+
+public interface ClientEvent {
+
+ /**
+ * Returns a string descriping the event.
+ **/
+ public String getDescription();
+
+ /**
+ * Returns a code for this event.
+ **/
+ public int getCode();
+
+}
Added: trunk/freenet/src/freenet/client/events/ClientEventListener.java
===================================================================
--- trunk/freenet/src/freenet/client/events/ClientEventListener.java
2005-11-10 01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/ClientEventListener.java
2005-11-10 14:19:21 UTC (rev 7514)
@@ -0,0 +1,18 @@
+package freenet.client.events;
+
+
+/**
+ * Event handling for clients.
+ *
+ * @author oskar
+ **/
+
+
+public interface ClientEventListener {
+
+ /**
+ * Hears an event.
+ **/
+ public void receive(ClientEvent ce);
+
+}
Added: trunk/freenet/src/freenet/client/events/ClientEventProducer.java
===================================================================
--- trunk/freenet/src/freenet/client/events/ClientEventProducer.java
2005-11-10 01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/ClientEventProducer.java
2005-11-10 14:19:21 UTC (rev 7514)
@@ -0,0 +1,33 @@
+package freenet.client.events;
+
+
+/**
+ * Event handling for clients.
+ *
+ * @author oskar
+ */
+public interface ClientEventProducer {
+
+ /**
+ * Sends the event to all registered EventListeners.
+ * @param ce the ClientEvent to raise
+ */
+ void produceEvent(ClientEvent ce);
+
+ /**
+ * Adds an EventListener that will receive all events produced
+ * by the implementing object.
+ * @param cel The ClientEventListener to add.
+ */
+ void addEventListener(ClientEventListener cel);
+
+ /**
+ * Removes an EventListener that will no loger receive events
+ * produced by the implementing object.
+ * @param cel The ClientEventListener to remove.
+ * @return true if a Listener was removed, false otherwise.
+ */
+ boolean removeEventListener(ClientEventListener cel);
+}
+
+
Added: trunk/freenet/src/freenet/client/events/DecodedBlockEvent.java
===================================================================
--- trunk/freenet/src/freenet/client/events/DecodedBlockEvent.java
2005-11-10 01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/DecodedBlockEvent.java
2005-11-10 14:19:21 UTC (rev 7514)
@@ -0,0 +1,22 @@
+package freenet.client.events;
+
+import freenet.keys.ClientKey;
+
+public class DecodedBlockEvent implements ClientEvent {
+
+ public static final int code = 0x03;
+ public final ClientKey key;
+
+ public DecodedBlockEvent(ClientKey key) {
+ this.key = key;
+ }
+
+ public String getDescription() {
+ return "Decoded a block of data: "+key.getURI();
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+}
Added: trunk/freenet/src/freenet/client/events/EventDumper.java
===================================================================
--- trunk/freenet/src/freenet/client/events/EventDumper.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/EventDumper.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -0,0 +1,9 @@
+package freenet.client.events;
+
+public class EventDumper implements ClientEventListener {
+
+ public void receive(ClientEvent ce) {
+ System.err.println(ce.getCode()+":"+ce.getDescription());
+ }
+
+}
Added: trunk/freenet/src/freenet/client/events/EventLogger.java
===================================================================
--- trunk/freenet/src/freenet/client/events/EventLogger.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/EventLogger.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -0,0 +1,27 @@
+package freenet.client.events;
+
+import freenet.support.Logger;
+
+/**
+ * Event handeling for clients.
+ *
+ * @author oskar
+ */
+public class EventLogger implements ClientEventListener {
+
+ final int logPrio;
+
+ public EventLogger(int prio) {
+ logPrio = prio;
+ }
+
+ /**
+ * Logs an event
+ *
+ * @param ce
+ * The event that occured
+ */
+ public void receive(ClientEvent ce) {
+ Logger.logStatic(ce, ce.getDescription(), logPrio);
+ }
+}
Added: trunk/freenet/src/freenet/client/events/FetchedMetadataEvent.java
===================================================================
--- trunk/freenet/src/freenet/client/events/FetchedMetadataEvent.java
2005-11-10 01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/FetchedMetadataEvent.java
2005-11-10 14:19:21 UTC (rev 7514)
@@ -0,0 +1,16 @@
+package freenet.client.events;
+
+
+public class FetchedMetadataEvent implements ClientEvent {
+
+ public final static int code = 0x01;
+
+ public String getDescription() {
+ return "Fetched metadata";
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+}
Added: trunk/freenet/src/freenet/client/events/GotBlockEvent.java
===================================================================
--- trunk/freenet/src/freenet/client/events/GotBlockEvent.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/GotBlockEvent.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -0,0 +1,25 @@
+package freenet.client.events;
+
+import freenet.keys.ClientKey;
+
+/**
+ * Fetched a block of data.
+ */
+public class GotBlockEvent implements ClientEvent {
+
+ public static final int code = 0x02;
+ public final ClientKey key;
+
+ public GotBlockEvent(ClientKey key) {
+ this.key = key;
+ }
+
+ public String getDescription() {
+ return "Fetched a block of data: "+key.getURI();
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+}
Added: trunk/freenet/src/freenet/client/events/SimpleEventProducer.java
===================================================================
--- trunk/freenet/src/freenet/client/events/SimpleEventProducer.java
2005-11-10 01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/client/events/SimpleEventProducer.java
2005-11-10 14:19:21 UTC (rev 7514)
@@ -0,0 +1,78 @@
+package freenet.client.events;
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+import java.util.Vector;
+
+import freenet.support.Logger;
+
+/**
+ * Event handeling for clients. SimpleEventProducer is a simple
+ * ClientEventProducer implementation that can be used for others.
+ *
+ * @author oskar
+ **/
+public class SimpleEventProducer implements ClientEventProducer {
+
+ private Vector listeners;
+
+ /**
+ * Create a new SimpleEventProducer
+ *
+ **/
+ public SimpleEventProducer() {
+ listeners = new Vector();
+ }
+
+ /** Create a new SimpleEventProducer with the given listeners. */
+ public SimpleEventProducer(ClientEventListener[] cela) {
+ this();
+ for (int i = 0 ; i < cela.length ; i++)
+ addEventListener(cela[i]);
+ }
+
+ public void addEventListener(ClientEventListener cel) {
+ if(cel != null)
+ listeners.addElement(cel);
+ else
+ throw new IllegalArgumentException("Adding a null listener!");
+ }
+
+ public boolean removeEventListener(ClientEventListener cel) {
+ boolean b = listeners.removeElement(cel);
+ listeners.trimToSize();
+ return b;
+ }
+
+ /**
+ * Sends the ClientEvent to all registered listeners of this object.
+ **/
+ public void produceEvent(ClientEvent ce) {
+ for (Enumeration e = listeners.elements() ;
+ e.hasMoreElements();) {
+ try {
+ ((ClientEventListener) e.nextElement()).receive(ce);
+ } catch (NoSuchElementException ne) {
+ Logger.normal(this, "Concurrent modification in "+
+ "produceEvent!: "+this);
+ } catch (Exception ue) {
+ System.err.println("---Unexpected
Exception------------------");
+ ue.printStackTrace();
+
System.err.println("-----------------------------------------");
+ }
+ }
+ }
+
+ /** Returns the listeners as an array. */
+ public ClientEventListener[] getEventListeners() {
+ ClientEventListener[] ret =
+ new ClientEventListener[listeners.size()];
+ listeners.copyInto(ret);
+ return ret;
+ }
+
+ /** Adds all listeners in the given array. */
+ public void addEventListeners(ClientEventListener[] cela) {
+ for (int i = 0 ; i < cela.length ; i++)
+ addEventListener(cela[i]);
+ }
+}
Modified: trunk/freenet/src/freenet/keys/CHKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/CHKBlock.java 2005-11-10 01:23:20 UTC
(rev 7513)
+++ trunk/freenet/src/freenet/keys/CHKBlock.java 2005-11-10 14:19:21 UTC
(rev 7514)
@@ -9,6 +9,7 @@
import freenet.crypt.UnsupportedCipherException;
import freenet.crypt.ciphers.Rijndael;
import freenet.node.Node;
+import freenet.support.Logger;
import freenet.support.compress.Compressor;
import freenet.support.compress.DecompressException;
@@ -136,6 +137,7 @@
if(size > 32768 || size < 0)
throw new CHKDecodeException("Invalid size: "+size);
if(key.isCompressed()) {
+ Logger.minor(this, "Decompressing in decode: "+key.getURI()+"
with codec "+key.compressionAlgorithm);
if(size < 4) throw new CHKDecodeException("No bytes to
decompress");
// Decompress
// First get the length
Modified: trunk/freenet/src/freenet/keys/ClientCHK.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientCHK.java 2005-11-10 01:23:20 UTC
(rev 7513)
+++ trunk/freenet/src/freenet/keys/ClientCHK.java 2005-11-10 14:19:21 UTC
(rev 7514)
@@ -151,6 +151,6 @@
}
public boolean isCompressed() {
- return compressionAlgorithm > 0;
+ return compressionAlgorithm >= 0;
}
}
Modified: trunk/freenet/src/freenet/keys/ClientCHKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientCHKBlock.java 2005-11-10 01:23:20 UTC
(rev 7513)
+++ trunk/freenet/src/freenet/keys/ClientCHKBlock.java 2005-11-10 14:19:21 UTC
(rev 7514)
@@ -76,28 +76,33 @@
compressionAlgorithm = alreadyCompressedCodec;
cbuf = sourceData;
} else {
- // Determine the best algorithm
- Bucket bucket = new ArrayBucket(sourceData);
- bucket.setReadOnly();
- for(int i=0;i<Compressor.countCompressAlgorithms();i++) {
- Compressor comp =
Compressor.getCompressionAlgorithmByDifficulty(i);
- ArrayBucket compressedData;
- try {
- compressedData = (ArrayBucket)
comp.compress(bucket, new ArrayBucketFactory());
- } catch (IOException e) {
- throw new Error(e);
- }
- if(compressedData.size() <= MAX_COMPRESSED_DATA_LENGTH)
{
- compressionAlgorithm =
comp.codecNumberForMetadata();
- try {
- cbuf =
BucketTools.toByteArray(compressedData);
- // FIXME provide a method in
ArrayBucket
- } catch (IOException e) {
- throw new Error(e);
- }
- break;
- }
- }
+ if (sourceData.length > NodeCHK.BLOCK_SIZE) {
+ // Determine the best algorithm
+ Bucket bucket = new
ArrayBucket(sourceData);
+ bucket.setReadOnly();
+ for (int i = 0; i <
Compressor.countCompressAlgorithms(); i++) {
+ Compressor comp = Compressor
+
.getCompressionAlgorithmByDifficulty(i);
+ ArrayBucket compressedData;
+ try {
+ compressedData =
(ArrayBucket) comp.compress(
+ bucket,
new ArrayBucketFactory());
+ } catch (IOException e) {
+ throw new Error(e);
+ }
+ if (compressedData.size() <=
MAX_COMPRESSED_DATA_LENGTH) {
+ compressionAlgorithm =
comp
+
.codecNumberForMetadata();
+ try {
+ cbuf =
BucketTools.toByteArray(compressedData);
+ // FIXME
provide a method in ArrayBucket
+ } catch (IOException e)
{
+ throw new
Error(e);
+ }
+ break;
+ }
+ }
+ }
}
if(cbuf != null) {
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2005-11-10 01:23:20 UTC (rev
7513)
+++ trunk/freenet/src/freenet/node/Node.java 2005-11-10 14:19:21 UTC (rev
7514)
@@ -245,8 +245,7 @@
System.out.println("Usage: $ java freenet.node.Node
<portNumber> [ipOverride]");
return;
}
-
-
+
int port = Integer.parseInt(args[0]);
System.out.println("Port number: "+port);
FileLoggerHook logger = new FileLoggerHook("freenet-"+port+".log", "d
(c, t, p): m", "MMM dd, yyyy HH:mm:ss:SSS", Logger.MINOR, false, true);
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -15,6 +15,7 @@
import freenet.client.FetchException;
import freenet.client.FetchResult;
import freenet.client.HighLevelSimpleClient;
+import freenet.client.events.EventDumper;
import freenet.crypt.RandomSource;
import freenet.io.comm.PeerParseException;
import freenet.keys.CHKEncodeException;
@@ -43,6 +44,7 @@
TextModeClientInterface(Node n) {
this.n = n;
client = n.makeClient();
+ client.addGlobalHook(new EventDumper());
this.r = n.random;
streams = new Hashtable();
new Thread(this).start();
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-11-10 01:23:20 UTC (rev
7513)
+++ trunk/freenet/src/freenet/node/Version.java 2005-11-10 14:19:21 UTC (rev
7514)
@@ -20,10 +20,10 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- public static final int buildNumber = 149;
+ public static final int buildNumber = 150;
/** Oldest build of Fred we will talk to */
- public static final int lastGoodBuild = 144;
+ public static final int lastGoodBuild = 150;
/** The highest reported build of fred */
public static int highestSeenBuild = buildNumber;
Modified: trunk/freenet/src/freenet/support/Logger.java
===================================================================
--- trunk/freenet/src/freenet/support/Logger.java 2005-11-10 01:23:20 UTC
(rev 7513)
+++ trunk/freenet/src/freenet/support/Logger.java 2005-11-10 14:19:21 UTC
(rev 7514)
@@ -88,6 +88,10 @@
logger.log(c, s, NORMAL);
}
+ public static void logStatic(Object o, String s, int prio) {
+ logger.log(o, s, prio);
+ }
+
/**
* Log a message
*
Modified: trunk/freenet/src/freenet/support/compress/Compressor.java
===================================================================
--- trunk/freenet/src/freenet/support/compress/Compressor.java 2005-11-10
01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/support/compress/Compressor.java 2005-11-10
14:19:21 UTC (rev 7514)
@@ -16,7 +16,7 @@
public abstract Bucket compress(Bucket data, BucketFactory bf) throws
IOException;
- public abstract Bucket decompress(Bucket data, BucketFactory
bucketFactory) throws IOException;
+ public abstract Bucket decompress(Bucket data, BucketFactory
bucketFactory, long maxLength) throws IOException;
public short codecNumberForMetadata() {
return Metadata.COMPRESS_GZIP;
Modified: trunk/freenet/src/freenet/support/compress/GzipCompressor.java
===================================================================
--- trunk/freenet/src/freenet/support/compress/GzipCompressor.java
2005-11-10 01:23:20 UTC (rev 7513)
+++ trunk/freenet/src/freenet/support/compress/GzipCompressor.java
2005-11-10 14:19:21 UTC (rev 7514)
@@ -1,5 +1,7 @@
package freenet.support.compress;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -30,34 +32,46 @@
return output;
}
- public Bucket decompress(Bucket data, BucketFactory bf) throws
IOException {
+ public Bucket decompress(Bucket data, BucketFactory bf, long maxLength)
throws IOException {
Bucket output = bf.makeBucket(-1);
InputStream is = data.getInputStream();
OutputStream os = output.getOutputStream();
+ decompress(is, os, maxLength);
+ os.close();
+ is.close();
+ return output;
+ }
+
+ private long decompress(InputStream is, OutputStream os, long
maxLength) throws IOException {
GZIPInputStream gis = new GZIPInputStream(is);
+ long written = 0;
byte[] buffer = new byte[4096];
while(true) {
- int x = gis.read(buffer);
- if(x <= -1) break;
+ int l = (int) Math.min(buffer.length, maxLength -
written);
+ if(l <= 0)
+ return written;
+ int x = gis.read(buffer, 0, l);
+ if(x <= -1) return written;
if(x == 0) throw new IOException("Returned zero from
read()");
os.write(buffer, 0, x);
+ written += x;
}
- os.close();
- gis.close();
- return output;
}
public int decompress(byte[] dbuf, int i, int j, byte[] output) throws
DecompressException {
- Inflater decompressor = new Inflater();
- decompressor.setInput(dbuf, i, j);
- try {
- int resultLength = decompressor.inflate(output);
- return resultLength;
- } catch (DataFormatException e) {
- throw new DecompressException("Invalid data: "+e);
- } catch (ArrayIndexOutOfBoundsException e) {
- throw new DecompressException("Invalid data: "+e);
- }
+ // Didn't work with Inflater.
+ // FIXME fix sometimes to use Inflater - format issue?
+ ByteArrayInputStream bais = new ByteArrayInputStream(dbuf, i,
j);
+ ByteArrayOutputStream baos = new
ByteArrayOutputStream(output.length);
+ int bytes = 0;
+ try {
+ bytes = (int)decompress(bais, baos, output.length);
+ } catch (IOException e) {
+ throw new DecompressException("Got IOException:
"+e.getMessage());
+ }
+ byte[] buf = baos.toByteArray();
+ System.arraycopy(buf, 0, output, 0, bytes);
+ return bytes;
}
}