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

 }


Reply via email to