Author: toad
Date: 2008-09-24 23:10:15 +0000 (Wed, 24 Sep 2008)
New Revision: 22827

Added:
   branches/db4o/freenet/src/freenet/pluginmanager/FredPluginL10n.java
   branches/db4o/freenet/src/freenet/pluginmanager/FredPluginThemed.java
Modified:
   branches/db4o/freenet/.settings/org.eclipse.core.resources.prefs
   branches/db4o/freenet/src/freenet/client/ArchiveContext.java
   branches/db4o/freenet/src/freenet/client/ArchiveManager.java
   branches/db4o/freenet/src/freenet/client/DefaultMIMETypes.java
   branches/db4o/freenet/src/freenet/client/FailureCodeTracker.java
   branches/db4o/freenet/src/freenet/client/FetchContext.java
   branches/db4o/freenet/src/freenet/client/async/BackgroundBlockEncoder.java
   branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
   branches/db4o/freenet/src/freenet/client/async/OfferedKeysList.java
   branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
   branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
   branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/PageMaker.java
   branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java
   branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/ToadletContainer.java
   branches/db4o/freenet/src/freenet/clients/http/TranslationToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/filter/GIFFilter.java
   branches/db4o/freenet/src/freenet/clients/http/filter/JPEGFilter.java
   branches/db4o/freenet/src/freenet/clients/http/filter/PNGFilter.java
   branches/db4o/freenet/src/freenet/config/NodeNeedRestartException.java
   branches/db4o/freenet/src/freenet/crypt/SSL.java
   branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java
   branches/db4o/freenet/src/freenet/keys/FreenetURI.java
   branches/db4o/freenet/src/freenet/l10n/L10n.java
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties
   branches/db4o/freenet/src/freenet/node/Announcer.java
   branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java
   branches/db4o/freenet/src/freenet/node/KeyTracker.java
   branches/db4o/freenet/src/freenet/node/LocationManager.java
   branches/db4o/freenet/src/freenet/node/Node.java
   branches/db4o/freenet/src/freenet/node/NodeClientCore.java
   branches/db4o/freenet/src/freenet/node/NodeCrypto.java
   branches/db4o/freenet/src/freenet/node/NodeStarter.java
   branches/db4o/freenet/src/freenet/node/NodeStats.java
   branches/db4o/freenet/src/freenet/node/PeerManager.java
   branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
   branches/db4o/freenet/src/freenet/node/TestnetHandler.java
   branches/db4o/freenet/src/freenet/node/TextModeClientInterfaceServer.java
   branches/db4o/freenet/src/freenet/node/UptimeEstimator.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
   branches/db4o/freenet/src/freenet/node/fcp/NodeHelloMessage.java
   
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
   branches/db4o/freenet/src/freenet/pluginmanager/ForwardPortCallback.java
   branches/db4o/freenet/src/freenet/pluginmanager/FredPluginPortForward.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginHandler.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginRespirator.java
   branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
   branches/db4o/freenet/src/freenet/store/FreenetStore.java
   branches/db4o/freenet/src/freenet/store/RAMFreenetStore.java
   branches/db4o/freenet/src/freenet/support/Fields.java
   branches/db4o/freenet/src/freenet/support/FileLoggerHook.java
   branches/db4o/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java
   branches/db4o/freenet/src/freenet/support/Logger.java
   branches/db4o/freenet/src/freenet/support/LoggerHook.java
   branches/db4o/freenet/src/freenet/support/NumberedRecentItems.java
   branches/db4o/freenet/src/freenet/support/Serializer.java
   
branches/db4o/freenet/src/freenet/support/SimpleIntNumberedItemComparator.java
   branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java
   branches/db4o/freenet/src/freenet/support/compress/GzipCompressor.java
   branches/db4o/freenet/src/freenet/support/io/ArrayBucket.java
   branches/db4o/freenet/src/freenet/support/io/ArrayBucketFactory.java
   branches/db4o/freenet/src/freenet/support/io/BaseFileBucket.java
   branches/db4o/freenet/src/freenet/support/io/BucketTools.java
   branches/db4o/freenet/src/freenet/support/io/FileUtil.java
   branches/db4o/freenet/src/freenet/support/io/LineReadingInputStream.java
   
branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
   branches/db4o/freenet/src/freenet/support/io/TempBucketFactory.java
   branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
   branches/db4o/freenet/test/freenet/support/HTMLNodeTest.java
   branches/db4o/freenet/test/freenet/support/LRUHashtableTest.java
   branches/db4o/freenet/test/freenet/support/MultiValueTableTest.java
   branches/db4o/freenet/test/freenet/support/compress/GzipCompressorTest.java
Log:
Merge 1159 into db4o: all changes from 22011 to 22306


Modified: branches/db4o/freenet/.settings/org.eclipse.core.resources.prefs
===================================================================
--- branches/db4o/freenet/.settings/org.eclipse.core.resources.prefs    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/.settings/org.eclipse.core.resources.prefs    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -1,9 +1,10 @@
-#Thu Jan 24 19:11:26 GMT 2008
+#Fri Aug 22 17:35:28 BST 2008
 eclipse.preferences.version=1
 encoding//src/freenet/l10n/freenet.l10n.da.properties=UTF-8
 encoding//src/freenet/l10n/freenet.l10n.de.properties=UTF-8
 encoding//src/freenet/l10n/freenet.l10n.en.properties=UTF-8
 encoding//src/freenet/l10n/freenet.l10n.es.properties=UTF-8
+encoding//src/freenet/l10n/freenet.l10n.fi.properties=UTF-8
 encoding//src/freenet/l10n/freenet.l10n.fr.properties=UTF-8
 encoding//src/freenet/l10n/freenet.l10n.it.properties=UTF-8
 encoding//src/freenet/l10n/freenet.l10n.no.properties=UTF-8

Modified: branches/db4o/freenet/src/freenet/client/ArchiveContext.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/ArchiveContext.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/ArchiveContext.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -17,9 +17,11 @@

        HashSet soFar = new HashSet();
        final int maxArchiveLevels;
+       final long maxArchiveSize;

-       public ArchiveContext(int max) {
+       public ArchiveContext(long maxArchiveSize, int max) {
                this.maxArchiveLevels = max;
+               this.maxArchiveSize = maxArchiveSize;
        }

        /**

Modified: branches/db4o/freenet/src/freenet/client/ArchiveManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/ArchiveManager.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/ArchiveManager.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -215,7 +215,7 @@
                                throwAtExit = true;
                        ctx.setLastHash(realHash);
                }
-               if(data.size() > maxArchiveSize)
+               if(data.size() > Math.max(maxArchiveSize, 
archiveContext.maxArchiveSize))
                        throw new ArchiveFailureException("Archive too big 
("+data.size()+" > "+maxArchiveSize+")!");
                if(archiveType != Metadata.ARCHIVE_ZIP)
                        throw new ArchiveFailureException("Unknown or 
unsupported archive algorithm "+archiveType);

Modified: branches/db4o/freenet/src/freenet/client/DefaultMIMETypes.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/DefaultMIMETypes.java      
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/DefaultMIMETypes.java      
2008-09-24 23:10:15 UTC (rev 22827)
@@ -49,7 +49,7 @@
                        mimeTypesByNumber.add(number, null);
                }
                mimeTypesByNumber.set(number, type);
-               mimeTypesByName.put(type, new Short(number));
+               mimeTypesByName.put(type, number);
        }

        /**
@@ -763,15 +763,14 @@
        public synchronized static String getExtension(String type) {
                short typeNumber = byName(type);
                if(typeNumber < 0) return null;
-               return (String) primaryExtensionByMimeNumber.get(new 
Short(typeNumber));
+               return (String) primaryExtensionByMimeNumber.get(typeNumber);
        }

        public synchronized static boolean isValidExt(String expectedMimeType, 
String oldExt) {
                short typeNumber = byName(expectedMimeType);
                if(typeNumber < 0) return false;

-               Short s = new Short(typeNumber);
-               String[] extensions = (String[]) 
allExtensionsByMimeNumber.get(s);
+               String[] extensions = (String[]) 
allExtensionsByMimeNumber.get(typeNumber);
                if(extensions == null) return false;
                for(int i=0;i<extensions.length;i++)
                        if(oldExt.equals(extensions[i])) return true;

Modified: branches/db4o/freenet/src/freenet/client/FailureCodeTracker.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/FailureCodeTracker.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/FailureCodeTracker.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -60,10 +60,9 @@
        final HashMap map = new HashMap();

        public synchronized void inc(int k) {
-               Integer key = new Integer(k);
-               Item i = (Item) map.get(key);
+               Item i = (Item) map.get(k);
                if(i == null)
-                       map.put(key, i = new Item());
+                       map.put(k, i = new Item());
                i.x++;
                total++;
        }

Modified: branches/db4o/freenet/src/freenet/client/FetchContext.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/FetchContext.java  2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/FetchContext.java  2008-09-24 
23:10:15 UTC (rev 22827)
@@ -159,6 +159,7 @@
        }

        /** Make public, but just call parent for a field for field copy */
+       @Override
        public Object clone() {
                try {
                        return super.clone();

Modified: 
branches/db4o/freenet/src/freenet/client/async/BackgroundBlockEncoder.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/BackgroundBlockEncoder.java  
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/async/BackgroundBlockEncoder.java  
2008-09-24 23:10:15 UTC (rev 22827)
@@ -18,11 +18,11 @@
 public class BackgroundBlockEncoder implements PrioRunnable {

        // Minimize memory usage at the cost of having to encode from the end
-       private final ArrayList queue;
+       private final ArrayList<SoftReference<SingleBlockInserter>> queue;
        private ClientContext context;

        public BackgroundBlockEncoder() {
-               queue = new ArrayList();
+               queue = new ArrayList<SoftReference<SingleBlockInserter>>();
        }

        public void setContext(ClientContext context) {
@@ -36,7 +36,7 @@
                        queuePersistent(sbi, container, context);
                        runPersistentQueue(context);
                } else {
-                       SoftReference ref = new SoftReference(sbi);
+                       SoftReference<SingleBlockInserter> ref = new 
SoftReference<SingleBlockInserter>(sbi);
                        synchronized(this) {
                                queue.add(ref);
                                Logger.minor(this, "Queueing encode of "+sbi);
@@ -54,7 +54,7 @@
                                if(inserter.resultingURI != null) continue;
                                if(inserter.persistent()) continue;
                                Logger.minor(this, "Queueing encode of 
"+inserter);
-                               SoftReference ref = new SoftReference(inserter);
+                               SoftReference<SingleBlockInserter> ref = new 
SoftReference<SingleBlockInserter>(inserter);
                                queue.add(ref);
                        }
                        notifyAll();
@@ -95,8 +95,8 @@
                                        }
                                }
                                while(!queue.isEmpty()) {
-                                       SoftReference ref = (SoftReference) 
queue.remove(queue.size()-1);
-                                       sbi = (SingleBlockInserter) ref.get();
+                                       SoftReference<SingleBlockInserter> ref 
= queue.remove(queue.size()-1);
+                                       sbi = ref.get();
                                        if(sbi != null) break;
                                }
                        }

Modified: branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientGetter.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/async/ClientGetter.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -69,7 +69,7 @@
                this.uri = uri;
                this.ctx = ctx;
                this.finished = false;
-               this.actx = new ArchiveContext(ctx.maxArchiveLevels);
+               this.actx = new ArchiveContext(ctx.maxTempLength, 
ctx.maxArchiveLevels);
                this.binaryBlobBucket = binaryBlobBucket;
                if(binaryBlobBucket != null) {
                        binaryBlobKeysAddedAlready = new HashSet();
@@ -282,6 +282,7 @@
                return start(true, redirect, container, context);
        }

+       @Override
        public String toString() {
                return super.toString()+ ':' +uri;
        }

Modified: branches/db4o/freenet/src/freenet/client/async/OfferedKeysList.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/OfferedKeysList.java 
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/async/OfferedKeysList.java 
2008-09-24 23:10:15 UTC (rev 22827)
@@ -36,8 +36,8 @@
  */
 public class OfferedKeysList extends BaseSendableGet implements RequestClient {

-       private final HashSet keys;
-       private final Vector keysList; // O(1) remove random element the way we 
use it, see chooseKey().
+       private final HashSet<Key> keys;
+       private final Vector<Key> keysList; // O(1) remove random element the 
way we use it, see chooseKey().
        private static boolean logMINOR;
        private final RandomSource random;
        private final short priorityClass;
@@ -46,8 +46,8 @@

        OfferedKeysList(NodeClientCore core, RandomSource random, short 
priorityClass, boolean isSSK) {
                super(false);
-               this.keys = new HashSet();
-               this.keysList = new Vector();
+               this.keys = new HashSet<Key>();
+               this.keysList = new Vector<Key>();
                this.random = random;
                this.priorityClass = priorityClass;
                this.core = core;
@@ -55,7 +55,7 @@
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
        }

-       /** Called when a key is found, when it no longer belogns to this list 
etc. */
+       /** Called when a key is found, when it no longer belongs to this list 
etc. */
        public synchronized void remove(Key key) {
                assert(keysList.size() == keys.size());
                logMINOR = Logger.shouldLog(Logger.MINOR, this);

Modified: branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKFetcher.java      
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcher.java      
2008-09-24 23:10:15 UTC (rev 22827)
@@ -74,7 +74,7 @@
        private final USK origUSK;

        /** Callbacks */
-       private final LinkedList callbacks;
+       private final LinkedList<USKFetcherCallback> callbacks;

        /** Fetcher context */
        final FetchContext ctx;
@@ -180,7 +180,7 @@
                }
        }

-       private final Vector runningAttempts;
+       private final Vector<USKAttempt> runningAttempts;

        private long lastFetchedEdition;
        private long lastAddedEdition;
@@ -224,9 +224,9 @@
                this.origUSK = origUSK;
                this.uskManager = manager;
                this.minFailures = this.origMinFailures = minFailures;
-               runningAttempts = new Vector();
-               callbacks = new LinkedList();
-               subscribers = new HashSet();
+               runningAttempts = new Vector<USKAttempt>();
+               callbacks = new LinkedList<USKFetcherCallback>();
+               subscribers = new HashSet<USKCallback>();
                lastFetchedEdition = -1;
                lastAddedEdition = -1;
                this.ctx = ctx;
@@ -289,7 +289,7 @@
                        USKFetcherCallback[] cb;
                        synchronized(this) {
                                completed = true;
-                               cb = (USKFetcherCallback[]) 
callbacks.toArray(new USKFetcherCallback[callbacks.size()]);
+                               cb = callbacks.toArray(new 
USKFetcherCallback[callbacks.size()]);
                        }
                        byte[] data;
                        if(lastRequestData == null)
@@ -302,14 +302,19 @@
                                        data = null;
                                }
                        }
-                       for(int i=0;i<cb.length;i++)
-                               cb[i].onFoundEdition(ed, origUSK.copy(ed), 
null, context, lastWasMetadata, lastCompressionCodec, data);
+                       for(int i=0;i<cb.length;i++) {
+                               try {
+                                       cb[i].onFoundEdition(ed, 
origUSK.copy(ed), null, context, lastWasMetadata, lastCompressionCodec, data);
+                               } catch (Exception e) {
+                                       Logger.error(this, "An exception 
occured while dealing with a callback:"+cb[i].toString()+"\n"+e.getMessage(),e);
+                               }
+                       }
                }
        }

        void onSuccess(USKAttempt att, boolean dontUpdate, ClientSSKBlock 
block, final ClientContext context) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
-               LinkedList l = null;
+               LinkedList<USKAttempt> l = null;
                final long lastEd = uskManager.lookup(origUSK);
                long curLatest;
                boolean decode = false;
@@ -324,7 +329,7 @@
                        long addFrom = Math.max(lastAddedEdition + 1, curLatest 
+ 1);
                        if(logMINOR) Logger.minor(this, "Adding from 
"+addFrom+" to "+addTo+" for "+origUSK);
                        if(addTo >= addFrom) {
-                               l = new LinkedList();
+                               l = new LinkedList<USKAttempt>();
                                for(long i=addFrom;i<=addTo;i++) {
                                        if(logMINOR) Logger.minor(this, "Adding 
checker for edition "+i+" for "+origUSK);
                                        l.add(add(i));
@@ -340,6 +345,7 @@
                                data = null;
                        } catch (IOException e) {
                                data = null;
+                               Logger.error(this, "An IOE occured while 
decoding: "+e.getMessage(),e);
                        }
                }
                synchronized(this) {
@@ -358,16 +364,16 @@
                if(!dontUpdate)
                        uskManager.update(origUSK, curLatest, context);
                if(l == null) return;
-               final LinkedList toSched = l;
+               final LinkedList<USKAttempt> toSched = l;
                // If we schedule them here, we don't get icky recursion 
problems.
                if(!cancelled) {
                        context.mainExecutor.execute(new Runnable() {
                                public void run() {
                                        long last = lastEd;
-                                       for(Iterator 
i=toSched.iterator();i.hasNext();) {
+                                       for(Iterator<USKAttempt> 
i=toSched.iterator();i.hasNext();) {
                                                // We may be called recursively 
through onSuccess().
                                                // So don't start obsolete 
requests.
-                                               USKAttempt a = (USKAttempt) 
i.next();
+                                               USKAttempt a = i.next();
                                                last = 
uskManager.lookup(origUSK);
                                                if((last <= a.number) && 
!a.cancelled)
                                                        a.schedule(null, 
context);
@@ -396,7 +402,7 @@
                USKFetcherCallback[] cb;
                synchronized(this) {
                        completed = true;
-                       cb = (USKFetcherCallback[]) callbacks.toArray(new 
USKFetcherCallback[callbacks.size()]);
+                       cb = callbacks.toArray(new 
USKFetcherCallback[callbacks.size()]);
                }
                for(int i=0;i<cb.length;i++)
                        cb[i].onCancelled(null, context);
@@ -411,13 +417,13 @@
        }

        private void cancelBefore(long curLatest, ClientContext context) {
-               Vector v = null;
+               Vector<USKAttempt> v = null;
                int count = 0;
                synchronized(this) {
-                       for(Iterator i=runningAttempts.iterator();i.hasNext();) 
{
-                               USKAttempt att = (USKAttempt) (i.next());
+                       for(Iterator<USKAttempt> 
i=runningAttempts.iterator();i.hasNext();) {
+                               USKAttempt att = i.next();
                                if(att.number < curLatest) {
-                                       if(v == null) v = new 
Vector(runningAttempts.size()-count);
+                                       if(v == null) v = new 
Vector<USKAttempt>(runningAttempts.size()-count);
                                        v.add(att);
                                        i.remove();
                                }
@@ -426,7 +432,7 @@
                }
                if(v != null) {
                        for(int i=0;i<v.size();i++) {
-                               USKAttempt att = (USKAttempt) v.get(i);
+                               USKAttempt att = v.get(i);
                                att.cancel(null, context);
                        }
                }
@@ -440,7 +446,7 @@
                if(cancelled) return null;
                if(logMINOR) Logger.minor(this, "Adding USKAttempt for "+i+" 
for "+origUSK.getURI());
                if(!runningAttempts.isEmpty()) {
-                       USKAttempt last = (USKAttempt) 
runningAttempts.lastElement();
+                       USKAttempt last = runningAttempts.lastElement();
                        if(last.number >= i) {
                                if(logMINOR) Logger.minor(this, "Returning 
because last.number="+i+" for "+origUSK.getURI());
                                return null;
@@ -489,7 +495,7 @@
                        long startPoint = Math.max(origUSK.suggestedEdition, 
valueAtSchedule);
                        for(long i=startPoint;i<startPoint+minFailures;i++)
                                add(i);
-                       attempts = (USKAttempt[]) runningAttempts.toArray(new 
USKAttempt[runningAttempts.size()]);
+                       attempts = runningAttempts.toArray(new 
USKAttempt[runningAttempts.size()]);
                        started = true;
                }
                if(!cancelled) {
@@ -514,7 +520,7 @@
                USKAttempt[] attempts;
                synchronized(this) {
                        cancelled = true;
-                       attempts = (USKAttempt[]) runningAttempts.toArray(new 
USKAttempt[runningAttempts.size()]);
+                       attempts = runningAttempts.toArray(new 
USKAttempt[runningAttempts.size()]);
                }
                for(int i=0;i<attempts.length;i++)
                        attempts[i].cancel(container, context);
@@ -526,7 +532,7 @@
         * an alternative to a refcount. This could be replaced with a 
         * Bloom filter or whatever, we only need .exists and .count.
         */
-       final HashSet subscribers;
+       final HashSet<USKCallback> subscribers;

        public void addSubscriber(USKCallback cb) {
                synchronized(this) {
@@ -541,18 +547,18 @@
                // take locks...
                short normalPrio = RequestStarter.MINIMUM_PRIORITY_CLASS;
                short progressPrio = RequestStarter.MINIMUM_PRIORITY_CLASS;
-               USKCallback[] callbacks;
+               USKCallback[] localCallbacks;
                synchronized(this) {
-                       callbacks = (USKCallback[]) subscribers.toArray(new 
USKCallback[subscribers.size()]);
+                       localCallbacks = subscribers.toArray(new 
USKCallback[subscribers.size()]);
                }
-               if(callbacks.length == 0) {
+               if(localCallbacks.length == 0) {
                        normalPollPriority = DEFAULT_NORMAL_POLL_PRIORITY;
                        progressPollPriority = DEFAULT_PROGRESS_POLL_PRIORITY;
                        return;
                }

-               for(int i=0;i<callbacks.length;i++) {
-                       USKCallback cb = callbacks[i];
+               for(int i=0;i<localCallbacks.length;i++) {
+                       USKCallback cb = localCallbacks[i];
                        short prio = cb.getPollingPriorityNormal();
                        if(prio < normalPrio) normalPrio = prio;
                        prio = cb.getPollingPriorityProgress();
@@ -567,13 +573,10 @@
        }

        public void removeSubscriber(USKCallback cb, ClientContext context) {
-               boolean kill = false;
                synchronized(this) {
                        subscribers.remove(cb);
-                       if(!(subscribers.isEmpty() && killOnLoseSubscribers)) 
kill = true;
                }
                updatePriorities();
-               if(kill) cancel(null, context);
        }

        public synchronized boolean hasLastData() {

Modified: branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKRetriever.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/client/async/USKRetriever.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -46,7 +46,7 @@
                FreenetURI uri = key.getSSK(l).getURI();
                try {
                        SingleFileFetcher getter =
-                               (SingleFileFetcher) 
SingleFileFetcher.create(this, this, new ClientMetadata(), uri, ctx, new 
ArchiveContext(ctx.maxArchiveLevels), 
+                               (SingleFileFetcher) 
SingleFileFetcher.create(this, this, new ClientMetadata(), uri, ctx, new 
ArchiveContext(ctx.maxTempLength, ctx.maxArchiveLevels), 
                                                ctx.maxNonSplitfileRetries, 0, 
true, l, true, null, false, null, context);
                        getter.schedule(null, context);
                } catch (MalformedURLException e) {

Modified: branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java   
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java   
2008-09-24 23:10:15 UTC (rev 22827)
@@ -236,7 +236,7 @@
                if(mode >= PageMaker.MODE_ADVANCED){
                        HTMLNode navigationBar = 
ctx.getPageMaker().getInfobox("navbar", l10n("configNavTitle"));
                        HTMLNode navigationContent = 
ctx.getPageMaker().getContentNode(navigationBar).addChild("ul");
-                       
if(!L10n.getSelectedLanguage().equals(L10n.FALLBACK_DEFAULT))
+                       
if(!L10n.getSelectedLanguage().equals(L10n.LANGUAGE.getDefault()))
                                navigationContent.addChild("a", "href", 
TranslationToadlet.TOADLET_URL, l10n("contributeTranslation"));
                        HTMLNode navigationTable = 
navigationContent.addChild("table", "class", "config_navigation");
                        HTMLNode navigationTableRow = 
navigationTable.addChild("tr");

Modified: branches/db4o/freenet/src/freenet/clients/http/PageMaker.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/PageMaker.java       
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/PageMaker.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -2,21 +2,16 @@

 import java.io.File;
 import java.io.IOException;
-import java.net.JarURLConnection;
 import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLDecoder;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;

 import freenet.l10n.L10n;
 import freenet.node.NodeClientCore;
+import freenet.pluginmanager.FredPluginL10n;
 import freenet.support.HTMLNode;
 import freenet.support.Logger;
 import freenet.support.api.HTTPRequest;
@@ -26,10 +21,48 @@
 */
 public final class PageMaker {

-       public static final String DEFAULT_THEME = "clean";
+       public enum THEME {
+               BOXED("boxed", "Boxed", ""),
+               CLEAN("clean", "Clean", "Mr. Proper"),
+               GRAYANDBLUE("grayandblue", "Gray And Blue", ""),
+               SKY("sky", "Sky", "");
+               
+               public static final String[] possibleValues = {
+                       BOXED.code,
+                       CLEAN.code,
+                       GRAYANDBLUE.code,
+                       SKY.code
+               };
+               
+               public final String code;  // the internal name
+               public final String name;  // the name in "human form"
+               public final String description; // description
+               
+               private THEME(String code, String name, String description) {
+                       this.code = code;
+                       this.name = name;
+                       this.description = description;
+               }
+
+               public static THEME themeFromName(String cssName) {
+                       for(THEME t : THEME.values()) {
+                               if(t.code.equalsIgnoreCase(cssName) ||
+                                  t.name.equalsIgnoreCase(cssName))
+                               {
+                                       return t;
+                               }
+                       }
+                       return getDefault();
+               }
+
+               public static THEME getDefault() {
+                       return THEME.CLEAN;
+               }
+       }       
+       
        public static final int MODE_SIMPLE = 1;
        public static final int MODE_ADVANCED = 2;
-       private String theme;
+       private THEME theme;
        private File override;
        private final List navigationLinkTexts = new ArrayList();
        private final List navigationLinkTextsNonFull = new ArrayList();
@@ -39,30 +72,43 @@
        private final Map/*<HTMLNode, HTMLNode>*/ headNodes = new HashMap();
        private final Map /* <String, LinkEnabledCallback> */ 
navigationLinkCallbacks = new HashMap();

-       /** Cache for themes read from the JAR file. */
-       private List jarThemesCache = null;
+       private final FredPluginL10n plugin; 
+       private final boolean pluginMode;

-       public PageMaker(String t) {
+       public PageMaker(FredPluginL10n plug, THEME t) {
                setTheme(t);
+               plugin = plug;
+               pluginMode = true;
        }

+       protected PageMaker(THEME t) {
+               setTheme(t);
+               plugin = null;
+               pluginMode = false;
+       }
+       
        void setOverride(File f) {
                this.override = f;
        }

-       void setTheme(String theme) {
-               if (theme == null) {
-                       this.theme = DEFAULT_THEME;
+       public void setTheme(THEME theme2) {
+               if (theme2 == null) {
+                       this.theme = THEME.getDefault();
                } else {
-                       URL themeurl = 
getClass().getResource("staticfiles/themes/" + theme + "/theme.css");
+                       URL themeurl = 
getClass().getResource("staticfiles/themes/" + theme2.code + "/theme.css");
                        if (themeurl == null)
-                               this.theme = DEFAULT_THEME;
+                               this.theme = THEME.getDefault();
                        else
-                               this.theme = theme;
+                               this.theme = theme2;
                }
        }

        public void addNavigationLink(String path, String name, String title, 
boolean fullOnly, LinkEnabledCallback cb) {
+               if (pluginMode && (plugin == null)) {
+                       // FIXME invent a check on compile time
+                       // log only
+                       Logger.error(this, "Deprecated way to use Pagemaker 
from plugin, your plugin need to implement FredPluginL10n to do so", new 
Error("FIXME"));
+               }
                navigationLinkTexts.add(name);
                if(!fullOnly)
                        navigationLinkTextsNonFull.add(name);
@@ -94,17 +140,16 @@
        public HTMLNode getPageNode(String title, boolean 
renderNavigationLinks, ToadletContext ctx) {
                boolean fullAccess = ctx == null ? false : 
ctx.isAllowedFullAccess();
                HTMLNode pageNode = new HTMLNode.HTMLDoctype("html", 
"-//W3C//DTD XHTML 1.1//EN");
-               HTMLNode htmlNode = pageNode.addChild("html", "xml:lang", 
L10n.getSelectedLanguage());
+               HTMLNode htmlNode = pageNode.addChild("html", "xml:lang", 
L10n.getSelectedLanguage().isoCode);
                HTMLNode headNode = htmlNode.addChild("head");
                headNode.addChild("meta", new String[] { "http-equiv", 
"content" }, new String[] { "Content-Type", "text/html; charset=utf-8" });
                headNode.addChild("title", title + " - Freenet");
                if(override == null)
-                       headNode.addChild("link", new String[] { "rel", "href", 
"type", "title" }, new String[] { "stylesheet", "/static/themes/" + theme + 
"/theme.css", "text/css", theme });
+                       headNode.addChild("link", new String[] { "rel", "href", 
"type", "title" }, new String[] { "stylesheet", "/static/themes/" + theme.code 
+ "/theme.css", "text/css", theme.code });
                else
                        headNode.addChild(getOverrideContent());
-               List themes = getThemes();
-               for (Iterator themesIterator = themes.iterator(); 
themesIterator.hasNext();) {
-                       String themeName = (String) themesIterator.next();
+               for (THEME t: THEME.values()) {
+                       String themeName = t.code;
                        headNode.addChild("link", new String[] { "rel", "href", 
"type", "media", "title" }, new String[] { "alternate stylesheet", 
"/static/themes/" + themeName + "/theme.css", "text/css", "screen", themeName 
});
                }

@@ -122,7 +167,10 @@
                                String navigationTitle = (String) 
navigationLinkTitles.get(navigationLink);
                                String navigationPath = (String) 
navigationLinks.get(navigationLink);
                                HTMLNode listItem = navbarUl.addChild("li");
-                               listItem.addChild("a", new String[] { "href", 
"title" }, new String[] { navigationPath, L10n.getString(navigationTitle) }, 
L10n.getString(navigationLink));
+                               if (plugin != null)
+                                       listItem.addChild("a", new String[] { 
"href", "title" }, new String[] { navigationPath, 
plugin.getString(navigationTitle) }, plugin.getString(navigationLink));
+                               else
+                                       listItem.addChild("a", new String[] { 
"href", "title" }, new String[] { navigationPath, 
L10n.getString(navigationTitle) }, L10n.getString(navigationLink));
                        }
                }
                HTMLNode contentDiv = pageDiv.addChild("div", "id", "content");
@@ -194,63 +242,6 @@
                return infobox;
        }

-       /**
-        * Returns an {@link ArrayList} containing the names of all available
-        * themes. If Freenet was started from a JAR file the list is cached
-        * (because the JAR file only changes between invocations), otherwise 
the
-        * filesystem is read on every page access.
-        * 
-        * @return An {@link ArrayList} containing the names of all available 
themes
-        */
-       public List<String> getThemes() {
-               if (jarThemesCache != null) {
-                       return jarThemesCache;
-               }
-               List<String> themes = new ArrayList<String>();
-               try {
-                       URL url = getClass().getResource("staticfiles/themes/");
-                       URLConnection urlConnection = url.openConnection();
-                       if (url.getProtocol().equals("file")) {
-                               File themesDirectory = new 
File(URLDecoder.decode(url.getPath(), "ISO-8859-1").replaceAll("\\|", ":"));
-                               File[] themeDirectories = 
themesDirectory.listFiles();
-                               for (int themeIndex = 0; (themeDirectories != 
null) && (themeIndex < themeDirectories.length); themeIndex++) {
-                                       File themeDirectory = 
themeDirectories[themeIndex];
-                                       if (themeDirectory.isDirectory() && 
!themeDirectory.getName().startsWith(".")) {
-                                               
themes.add(themeDirectory.getName());
-                                       }
-                               }       
-                       } else if (urlConnection instanceof JarURLConnection) {
-                               JarURLConnection jarUrlConnection = 
(JarURLConnection) urlConnection;
-                               JarFile jarFile = jarUrlConnection.getJarFile();
-                               Enumeration entries = jarFile.entries();
-                               while (entries.hasMoreElements()) {
-                                       JarEntry entry = (JarEntry) 
entries.nextElement();
-                                       String name = entry.getName();
-                                       if 
(name.startsWith("freenet/clients/http/staticfiles/themes/")) {
-                                               name = 
name.substring("freenet/clients/http/staticfiles/themes/".length());
-                                               if (name.indexOf('/') != -1) {
-                                                       String themeName = 
name.substring(0, name.indexOf('/'));
-                                                       if 
(!themes.contains(themeName)) {
-                                                               
themes.add(themeName);
-                                                       }
-                                               }
-                                       }
-                               }
-                               jarThemesCache = themes;
-                       }
-               } catch (IOException ioe1) {
-                       Logger.error(this, "error creating list of themes", 
ioe1);
-               } catch (NullPointerException npe) {
-                       Logger.error(this, "error creating list of themes (if 
you're using the gnu-classpath, it's \"normal\")", npe);
-                       themes.add("clean");
-               } finally {
-                       if (!themes.contains("clean")) {
-                               themes.add("clean");
-                       }
-               }
-               return themes;
-       }
-       
        private HTMLNode getOverrideContent() {
                HTMLNode result = new HTMLNode("style", "type", "text/css");


Modified: branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java   
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java   
2008-09-24 23:10:15 UTC (rev 22827)
@@ -2,7 +2,6 @@

 import java.io.IOException;
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;

Modified: branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -1418,10 +1418,6 @@
                                return;
                        }
                        long size = ((ClientPut)req).getDataSize();
-                       if(uri == null) {
-                               Logger.error(this, "uri is null for "+req+" for 
"+identifier);
-                               return;
-                       }
                        String name = uri.getPreferredFilename();
                        String title = l10n("uploadSucceededTitle", "filename", 
name);
                        HTMLNode text = new HTMLNode("div");

Modified: 
branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java     
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java     
2008-09-24 23:10:15 UTC (rev 22827)
@@ -23,6 +23,7 @@
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;

+import freenet.clients.http.PageMaker.THEME;
 import freenet.clients.http.bookmark.BookmarkManager;
 import freenet.config.EnumerableOptionCallback;
 import freenet.config.InvalidConfigValueException;
@@ -63,7 +64,7 @@
        BucketFactory bf;
        NetworkInterface networkInterface;
        private final LinkedList toadlets;
-       private String cssName;
+       private THEME cssTheme;
        private File cssOverride;
        private Thread myThread;
        private boolean advancedModeEnabled;
@@ -86,7 +87,8 @@
                        return ssl;
                }
                public void set(Boolean val) throws InvalidConfigValueException 
{
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        if(!SSL.available()) {
                                throw new InvalidConfigValueException("Enable 
SSL support before use ssl with Fproxy");
                        }
@@ -106,7 +108,8 @@
                }

                public void set(Long val) throws InvalidConfigValueException {
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        FProxyToadlet.MAX_LENGTH = val;
                }
        }
@@ -165,14 +168,16 @@
        class FProxyCSSNameCallback extends StringCallback implements 
EnumerableOptionCallback {

                public String get() {
-                       return cssName;
+                       return cssTheme.code;
                }

                public void set(String CSSName) throws 
InvalidConfigValueException {
                        if((CSSName.indexOf(':') != -1) || 
(CSSName.indexOf('/') != -1))
                                throw new 
InvalidConfigValueException(l10n("illegalCSSName"));
-                       cssName = CSSName;
-                       pageMaker.setTheme(cssName);
+                       cssTheme = THEME.themeFromName(CSSName);
+                       pageMaker.setTheme(cssTheme);
+                       if (core.node.pluginManager != null)
+                               
core.node.pluginManager.setFProxyTheme(cssTheme);
                }

                public void setPossibleValues(String[] val) {
@@ -180,7 +185,7 @@
                }

                public String[] getPossibleValues() {
-                       return pageMaker.getThemes().toArray(new String[0]);
+                       return THEME.possibleValues;
                }
        }

@@ -214,7 +219,8 @@
                        }
                }
                public void set(Boolean val) throws InvalidConfigValueException 
{
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        synchronized(SimpleToadletServer.this) {
                                if(val) {
                                        // Start it
@@ -261,7 +267,8 @@
                }

                public void set(Boolean val) throws InvalidConfigValueException 
{
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                                ts.enableAdvancedMode(val);
                }
        }
@@ -279,7 +286,8 @@
                }

                public void set(Boolean val) throws InvalidConfigValueException 
{
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                                ts.enableFProxyJavascript(val);
                }
        }
@@ -448,10 +456,11 @@
                this.bf = bucketFactory;
                port = fproxyConfig.getInt("port");
                bindTo = fproxyConfig.getString("bindTo");
-               cssName = fproxyConfig.getString("css");
+               String cssName = fproxyConfig.getString("css");
                if((cssName.indexOf(':') != -1) || (cssName.indexOf('/') != -1))
                        throw new InvalidConfigValueException("CSS name must 
not contain slashes or colons!");
-               pageMaker = new PageMaker(cssName);
+               cssTheme = THEME.themeFromName(cssName);
+               pageMaker = new PageMaker(cssTheme);

                if(!fproxyConfig.getOption("CSSOverride").isDefault()) {
                        cssOverride = new 
File(fproxyConfig.getString("CSSOverride"));                  
@@ -625,12 +634,12 @@

        }

-       public String getCSSName() {
-               return this.cssName;
+       public THEME getTheme() {
+               return this.cssTheme;
        }

-       public void setCSSName(String name) {
-               this.cssName = name;
+       public void setCSSName(THEME theme) {
+               this.cssTheme = theme;
        }

        public synchronized boolean isAdvancedModeEnabled() {

Modified: branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -1048,6 +1048,8 @@
                                name = name.substring(0, name.indexOf(" for "));
                        if(name.indexOf("@") != -1)
                                name = name.substring(0, name.indexOf("@"));
+                       if (name.indexOf("(") != -1)
+                               name = name.substring(0, name.indexOf("("));
                        ThreadBunch bunch = (ThreadBunch) map.get(name);
                        if(bunch != null) {
                                bunch.count++;

Modified: branches/db4o/freenet/src/freenet/clients/http/ToadletContainer.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/ToadletContainer.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/ToadletContainer.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -7,6 +7,7 @@
 import java.net.URI;
 import java.net.URISyntaxException;

+import freenet.clients.http.PageMaker.THEME;
 import freenet.support.HTMLNode;
 import freenet.support.api.BucketFactory;

@@ -31,7 +32,7 @@
        /**
         * Get the name of the theme to be used by all the Toadlets
         */
-       public String getCSSName();
+       public THEME getTheme();

        /**
         * Get the form password

Modified: branches/db4o/freenet/src/freenet/clients/http/TranslationToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/TranslationToadlet.java      
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/TranslationToadlet.java      
2008-09-24 23:10:15 UTC (rev 22827)
@@ -48,7 +48,7 @@
                        }
                        byte[] data = sfs.toOrderedString().getBytes("UTF-8");
                        MultiValueTable head = new MultiValueTable();
-                       head.put("Content-Disposition", "attachment; 
filename=\"" + L10n.PREFIX +L10n.getSelectedLanguage()+ L10n.OVERRIDE_SUFFIX + 
'"');
+                       head.put("Content-Disposition", "attachment; 
filename=\"" + L10n.getSelectedLanguage().l10nOverrideFilename+ '"');
                        ctx.sendReplyHeaders(200, "Found", head, "text/plain; 
charset=utf-8", data.length);
                        ctx.writeData(data);
                        return;
@@ -154,7 +154,7 @@

                HTMLNode translationNode = contentNode.addChild("div", "class", 
"translation");
                HTMLNode translationHeaderNode = translationNode.addChild("p");
-               translationHeaderNode.addChild("#", 
l10n("contributingToLabelWithLang", "lang", L10n.getSelectedLanguage()));
+               translationHeaderNode.addChild("#", 
l10n("contributingToLabelWithLang", "lang", 
L10n.getSelectedLanguage().fullName));
                translationHeaderNode.addChild("a", "href", 
TOADLET_URL+"?getOverrideTranlationFile").addChild("#", 
l10n("downloadTranslationsFile"));
                translationHeaderNode.addChild("#", " ");
                if(showEverything)

Modified: branches/db4o/freenet/src/freenet/clients/http/filter/GIFFilter.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/filter/GIFFilter.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/filter/GIFFilter.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -41,7 +41,7 @@
                try {
                        // Check the header
                        byte[] headerCheck = new byte[HEADER_SIZE];
-                       dis.read(headerCheck);
+                       dis.readFully(headerCheck);
                        if((!Arrays.equals(headerCheck, gif87aHeader)) && 
(!Arrays.equals(headerCheck, gif89aHeader))) {
                                throwHeaderError(l10n("invalidHeaderTitle"), 
l10n("invalidHeader"));
                        }

Modified: branches/db4o/freenet/src/freenet/clients/http/filter/JPEGFilter.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/filter/JPEGFilter.java       
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/filter/JPEGFilter.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -420,7 +420,7 @@

        private void assertHeader(DataInputStream dis, byte[] expected) throws 
IOException {
                byte[] read = new byte[expected.length];
-               dis.read(read);
+               dis.readFully(read);
                if(!Arrays.equals(read, expected))
                        throwError("Invalid header", "The file does not start 
with a valid JPEG (JFIF) header.");
        }

Modified: branches/db4o/freenet/src/freenet/clients/http/filter/PNGFilter.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/filter/PNGFilter.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/clients/http/filter/PNGFilter.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -4,11 +4,19 @@
 package freenet.clients.http.filter;

 import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.zip.CRC32;

 import freenet.l10n.L10n;
 import freenet.support.HTMLNode;
@@ -21,14 +29,6 @@
 import freenet.support.io.BucketTools;
 import freenet.support.io.Closer;
 import freenet.support.io.FileBucket;
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.OutputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.zip.CRC32;

 /**
  * Content filter for PNG's. Only allows valid chunks (valid CRC, known chunk 
type).
@@ -110,7 +110,7 @@
                        dis = new DataInputStream(bis);
                        // Check the header
                        byte[] headerCheck = new byte[pngHeader.length];
-                       dis.read(headerCheck);
+                       dis.readFully(headerCheck);
                        if(!Arrays.equals(headerCheck, pngHeader)) {
                                // Throw an exception
                                String message = l10n("invalidHeader");

Modified: branches/db4o/freenet/src/freenet/config/NodeNeedRestartException.java
===================================================================
--- branches/db4o/freenet/src/freenet/config/NodeNeedRestartException.java      
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/config/NodeNeedRestartException.java      
2008-09-24 23:10:15 UTC (rev 22827)
@@ -4,11 +4,9 @@
 package freenet.config;

 /**
- * Thrown when the node refuses to set a config variable to a particular
- * value because it is invalid. Just because this is not thrown does not
- * necessarily mean that there are no problems with the value defined,
- * it merely means that there are no immediately detectable problems with 
- * it.
+ * Thrown when the node must be restarted for a config setting to be applied.
+ * The thrower must ensure that the value reaches the config file, even though
+ * it cannot be immediately used.
  */
 public class NodeNeedRestartException extends ConfigException {


Modified: branches/db4o/freenet/src/freenet/crypt/SSL.java
===================================================================
--- branches/db4o/freenet/src/freenet/crypt/SSL.java    2008-09-24 22:52:41 UTC 
(rev 22826)
+++ branches/db4o/freenet/src/freenet/crypt/SSL.java    2008-09-24 23:10:15 UTC 
(rev 22827)
@@ -19,9 +19,12 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 import java.net.ServerSocket;
 import java.security.Key;
 import java.security.KeyStore;
+import java.security.PrivateKey;
 import java.security.cert.Certificate;

 import javax.net.ServerSocketFactory;
@@ -69,7 +72,7 @@
                                }

                                public void set(Boolean newValue) throws 
InvalidConfigValueException {
-                                       if(newValue != get()) {
+                                       if (!get().equals(newValue)) {
                                                enable = newValue;
                                                if(enable)
                                                        try {
@@ -215,24 +218,36 @@
                                fis = new FileInputStream(keyStore);
                                keystore.load(fis, keyStorePass.toCharArray());
                        } catch(FileNotFoundException fnfe) {
-                               throw new UnsupportedOperationException("Not 
implemented yet!");
-//                             //If keystore not exist, create keystore and 
server certificat
-//                             keystore.load(null, keyStorePass.toCharArray());
-//                             CertAndKeyGen keypair = new 
CertAndKeyGen("DSA", "SHA1WithDSA");
-//                             X500Name x500Name = new X500Name(
-//                                     "Freenet",
-//                                     "Freenet",
-//                                     "Freenet",
-//                                     "",
-//                                     "",
-//                                     "");
-//                             keypair.generate(1024);
-//                             PrivateKey privKey = keypair.getPrivateKey();
-//                             X509Certificate[] chain = new 
X509Certificate[1];
-//                             chain[0] = keypair.getSelfCertificate(x500Name, 
1L * 365 * 24 * 60 * 60);
-//                             keystore.setKeyEntry("freenet", privKey, 
keyPass.toCharArray(), chain);
-//                             storeKeyStore();
-//                             createSSLContext();
+                               // If keystore not exist, create keystore and 
server certificate
+                               keystore.load(null, keyStorePass.toCharArray());
+                               try {
+                                       Class certAndKeyGenClazz = 
Class.forName("sun.security.x509.CertAndKeyGen");
+                                       Constructor certAndKeyGenCtor = 
certAndKeyGenClazz.getConstructor(String.class, String.class);
+                                       Object keypair = 
certAndKeyGenCtor.newInstance("DSA", "SHA1WithDSA");
+
+                                       Class x500NameClazz = 
Class.forName("sun.security.x509.X500Name");
+                                       Constructor x500NameCtor = 
x500NameClazz.getConstructor(String.class, String.class, String.class,
+                                               String.class, String.class, 
String.class);
+                                       Object x500Name = 
x500NameCtor.newInstance("Freenet", "Freenet", "Freenet", "", "", "");
+                                       
+                                       Method certAndKeyGenGenerate = 
certAndKeyGenClazz.getMethod("generate", int.class);
+                                       certAndKeyGenGenerate.invoke(keypair, 
1024);
+                                       
+                                       Method certAndKeyGetPrivateKey = 
certAndKeyGenClazz.getMethod("getPrivateKey");
+                                       PrivateKey privKey = (PrivateKey) 
certAndKeyGetPrivateKey.invoke(keypair);
+
+                                       Certificate[] chain = new 
Certificate[1];
+                                       Method certAndKeyGenGetSelfCertificate 
= certAndKeyGenClazz.getMethod("getSelfCertificate",
+                                               x500NameClazz, long.class);
+                                       chain[0] = (Certificate) 
certAndKeyGenGetSelfCertificate.invoke(keypair, x500Name, 1L * 365 * 24
+                                               * 60 * 60);
+
+                                       keystore.setKeyEntry("freenet", 
privKey, keyPass.toCharArray(), chain);
+                                       storeKeyStore();
+                                       createSSLContext();
+                               } catch (NoSuchMethodException nsme) {
+                                       throw new 
UnsupportedOperationException("The JVM you are using is not supported!", nsme);
+                               }
                        } finally {
                                Closer.close(fis);
                        }

Modified: branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java     
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java     
2008-09-24 23:10:15 UTC (rev 22827)
@@ -73,7 +73,7 @@
                // Only used for debugging, no need to seed from Yarrow
                dropRandom = node.fastWeakRandom;
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
-               logDEBUG = Logger.shouldLog(Logger.MINOR, this);
+               logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
                tracker = AddressTracker.create(node.lastBootID, 
node.getNodeDir(), listenPort);
                tracker.startSend(startupTime);
        }
@@ -192,7 +192,7 @@
                                Logger.error(this, "Caught " + t + " from "
                                                + lowLevelFilter, t);
                        }
-               } else if(logDEBUG) Logger.minor(this, "No packet received");
+               } else if(logDEBUG) Logger.debug(this, "No packet received");
        }

     private static final int MAX_RECEIVE_SIZE = 1500;
@@ -303,7 +303,7 @@
                }
                node.executor.execute(this, "UdpSocketHandler for port 
"+listenPort);
                if(!disableHangChecker) {
-                       node.executor.execute(new USMChecker(), 
"UdpSockerHandler watchdog");
+                       node.executor.execute(new USMChecker(), 
"UdpSocketHandler watchdog");
                }
        }


Modified: branches/db4o/freenet/src/freenet/keys/FreenetURI.java
===================================================================
--- branches/db4o/freenet/src/freenet/keys/FreenetURI.java      2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/keys/FreenetURI.java      2008-09-24 
23:10:15 UTC (rev 22827)
@@ -16,10 +16,10 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.StringTokenizer;
-import java.util.Vector;

 import com.db4o.ObjectContainer;

+import freenet.client.InsertException;
 import freenet.support.Base64;
 import freenet.support.Fields;
 import freenet.support.HexUtil;
@@ -29,7 +29,6 @@
 import freenet.support.URLEncodedFormatException;
 import freenet.support.URLEncoder;
 import freenet.support.io.FileUtil;
-import freenet.client.InsertException;

 /**
  * Note that the metadata pairs below are not presently supported. They are 
supported
@@ -271,9 +270,9 @@
                        throw new MalformedURLException("Invalid key type: " + 
keyType);

                // decode metaString
-               Vector sv = null;
+               ArrayList<String> sv = null;
                int slash2;
-               sv = new Vector();
+               sv = new ArrayList<String>();
                while((slash2 = URI.lastIndexOf("/")) != -1) {
                        String s;
                        try {
@@ -284,7 +283,7 @@
                                throw ue;
                        }
                        if(s != null)
-                               sv.addElement(s);
+                               sv.add(s);
                        URI = URI.substring(0, slash2);
                }

@@ -299,12 +298,12 @@

                        if(sv.isEmpty())
                                throw new MalformedURLException("No docname for 
" + keyType);
-                       docName = (String) sv.remove(sv.size() - 1);
+                       docName = sv.remove(sv.size() - 1);
                        if(isUSK) {
                                if(sv.isEmpty())
                                        throw new MalformedURLException("No 
suggested edition number for USK");
                                try {
-                                       suggestedEdition = 
Long.parseLong((String) sv.remove(sv.size() - 1));
+                                       suggestedEdition = 
Long.parseLong(sv.remove(sv.size() - 1));
                                } catch(NumberFormatException e) {
                                        MalformedURLException e1 = new 
MalformedURLException("Invalid suggested edition: " + e);
                                        e1.initCause(e);
@@ -325,7 +324,7 @@
                if(!sv.isEmpty()) {
                        metaStr = new String[sv.size()];
                        for(int i = 0; i < metaStr.length; i++) {
-                               metaStr[i] = ((String) 
sv.elementAt(metaStr.length - 1 - i)).intern();
+                               metaStr[i] = sv.get(metaStr.length - 1 - 
i).intern();
                                if(metaStr[i] == null)
                                        throw new NullPointerException();
                        }
@@ -446,10 +445,12 @@
         */
        public FreenetURI popMetaString() {
                String[] newMetaStr = null;
-               final int metaStrLength = metaStr.length;
-               if((metaStr != null) && (metaStrLength > 1)) {
-                       newMetaStr = new String[metaStrLength - 1];
-                       System.arraycopy(metaStr, 1, newMetaStr, 0, 
newMetaStr.length);
+               if (metaStr != null) {
+                       final int metaStrLength = metaStr.length;
+                       if (metaStrLength > 1) {
+                               newMetaStr = new String[metaStrLength - 1];
+                               System.arraycopy(metaStr, 1, newMetaStr, 0, 
newMetaStr.length);
+                       }
                }
                return setMetaString(newMetaStr);
        }
@@ -503,8 +504,8 @@
                }
        }

-       public FreenetURI addMetaStrings(List metaStrings) {
-               return addMetaStrings((String[]) metaStrings.toArray(new 
String[metaStrings.size()]));
+       public FreenetURI addMetaStrings(List<String> metaStrings) {
+               return addMetaStrings(metaStrings.toArray(new 
String[metaStrings.size()]));
        }

        /**
@@ -548,11 +549,11 @@
                                Logger.minor(this, "Not activated?? in 
toString("+prefix+","+pureAscii+")");
                        return null;
                }
-               StringBuffer b;
+               StringBuilder b;
                if(prefix)
-                       b = new StringBuffer("freenet:");
+                       b = new StringBuilder("freenet:");
                else
-                       b = new StringBuffer();
+                       b = new StringBuilder();

                b.append(keyType).append('@');

@@ -612,13 +613,13 @@
                return extra;
        }

-       public ArrayList listMetaStrings() {
+       public ArrayList<String> listMetaStrings() {
                if(metaStr != null) {
-                       ArrayList l = new ArrayList(metaStr.length);
+                       ArrayList<String> l = new 
ArrayList<String>(metaStr.length);
                        for(int i = 0; i < metaStr.length; i++)
                                l.add(metaStr[i]);
                        return l;
-               } else return new ArrayList(0);
+               } else return new ArrayList<String>(0);
        }
        static final byte CHK = 1;
        static final byte SSK = 2;
@@ -750,7 +751,7 @@
        public String getPreferredFilename() {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                Logger.minor(this, "Getting preferred filename for " + this);
-               Vector names = new Vector();
+               ArrayList<String> names = new ArrayList<String>();
                if(keyType != null && (keyType.equals("KSK") || 
keyType.equals("SSK") || keyType.equals("USK"))) {
                        if(logMINOR)
                                Logger.minor(this, "Adding docName: " + 
docName);
@@ -764,9 +765,9 @@
                                        Logger.minor(this, "Adding metaString " 
+ i + ": " + metaStr[i]);
                                names.add(metaStr[i]);
                        }
-               StringBuffer out = new StringBuffer();
+               StringBuilder out = new StringBuilder();
                for(int i = 0; i < names.size(); i++) {
-                       String s = (String) names.get(i);
+                       String s = names.get(i);
                        if(logMINOR)
                                Logger.minor(this, "name " + i + " = " + s);
                        s = FileUtil.sanitize(s);

Modified: branches/db4o/freenet/src/freenet/l10n/L10n.java
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/L10n.java    2008-09-24 22:52:41 UTC 
(rev 22826)
+++ branches/db4o/freenet/src/freenet/l10n/L10n.java    2008-09-24 23:10:15 UTC 
(rev 22827)
@@ -27,29 +27,74 @@
 */
 public class L10n {
        public static final String CLASS_NAME = "L10n";
-       public static final String PREFIX = "freenet.l10n.";
-       public static final String SUFFIX = ".properties";
-       public static final String OVERRIDE_SUFFIX = ".override" + SUFFIX;

-       public static final String FALLBACK_DEFAULT = "en";
        /** @see http://www.omniglot.com/language/names.htm */
-       public static final String[][] AVAILABLE_LANGUAGES = {
-               new String[] { "en", "English", "eng" },
-               new String[] { "es", "Espa?ol", "spa" },
-               new String[] { "da", "Dansk", "dan" },
-               new String[] { "de", "Deutsch", "deu" },
-               new String[] { "fi", "Suomi", "fin" },
-               new String[] { "fr", "Fran?ais", "fra" },
-               new String[] { "it", "Italiano", "ita" },
-               new String[] { "no", "Norsk", "nor" },
-               new String[] { "pl", "Polski", "pol" },
-               new String[] { "se", "Svenska", "svk" },
-               new String[] { "zh-cn", "??(??)", "chn" },
-               new String[] { "zh-tw", "??(??)", "zh-tw" },
-               new String[] { "unlisted", "unlisted", "unlisted"},
-       };
-       private final String selectedLanguage;
+       public enum LANGUAGE {
+               ENGLISH("en", "English", "eng"),
+               SPANISH("es", "Espa?ol", "spa"),
+               DANISH("da", "Dansk", "dan"),
+               GERMAN("de", "Deutsch", "deu"),
+               FINNISH("fi", "Suomi", "fin"),
+               FRENCH("fr", "Fran?ais", "fra"),
+               ITALIAN("it", "Italiano", "ita"),
+               NORWEGIAN("no", "Norsk", "nor"),
+               POLISH("pl", "Polski", "pol"),
+               SWEDISH("se", "Svenska", "svk"),
+               CHINESE("zh-cn", "??(??)", "chn"),
+               CHINESE_TAIWAN("zh-tw", "??(??)", "zh-tw"),
+               UNLISTED("unlisted", "unlisted", "unlisted");
+               
+               /** The identifier we use internally : MUST BE UNIQUE! */
+               public final String shortCode;
+               /** The identifier shown to the user */
+               public final String fullName;
+               /** The mapping with the installer's l10n (@see bug #2424); 
MUST BE UNIQUE! */
+               public final String isoCode;
+               
+               public final String l10nFilename;
+               public final String l10nOverrideFilename;
+               
+               private LANGUAGE(String shortCode, String fullName, String 
isoCode) {
+                       this.shortCode = shortCode;
+                       this.fullName = fullName;
+                       this.isoCode = isoCode;
+                       this.l10nFilename = 
"freenet/l10n/freenet.l10n."+shortCode+".properties";
+                       this.l10nOverrideFilename = 
"freenet.l10n."+shortCode+".override.properties";
+               }
+
+               LANGUAGE(LANGUAGE l) {
+                       this(l.shortCode, l.fullName, l.isoCode);
+               }
+               
+               public static LANGUAGE mapToLanguage(String whatever) {
+                       for(LANGUAGE currentLanguage : LANGUAGE.values()) {
+                               
if(currentLanguage.shortCode.equalsIgnoreCase(whatever) ||
+                                  
currentLanguage.fullName.equalsIgnoreCase(whatever) ||
+                                  
currentLanguage.isoCode.equalsIgnoreCase(whatever) ||
+                                  
currentLanguage.toString().equalsIgnoreCase(whatever))
+                               {
+                                       return currentLanguage;
+                               }
+                       }
+                       return null;
+               }
+               
+               public static String[] valuesWithFullNames() {
+                       LANGUAGE[] allValues = values();
+                       String[] result = new String[allValues.length];
+                       for(int i=0; i<allValues.length; i++)
+                               result[i] = allValues[i].fullName;
+                       
+                       return result;
+               }
+               
+               public static LANGUAGE getDefault() {
+                       return ENGLISH;
+               }
+       }

+       private final LANGUAGE selectedLanguage;
+       
        private static SimpleFieldSet currentTranslation = null;
        private static SimpleFieldSet fallbackTranslation = null;
        private static L10n currentClass = null;
@@ -57,11 +102,10 @@
        private static SimpleFieldSet translationOverride;
        private static final Object sync = new Object();

-       L10n(String selected) {
-               selectedLanguage = mapLanguageNameToShortCode(selected);
-               File tmpFile = new File(L10n.PREFIX + selectedLanguage + 
L10n.OVERRIDE_SUFFIX);
-               
+       L10n(LANGUAGE selected) {               
+               selectedLanguage = selected;
                try {
+                       File tmpFile = new File(selected.l10nOverrideFilename);
                        if(tmpFile.exists() && tmpFile.canRead() && 
tmpFile.length() > 0) {
                                Logger.normal(this, "Override file detected : 
let's try to load it");
                                translationOverride = 
SimpleFieldSet.readFrom(tmpFile, false, false);
@@ -94,15 +138,17 @@
        * @throws MissingResourceException
        */
        public static void setLanguage(String selectedLanguage) throws 
MissingResourceException {
-               selectedLanguage = mapLanguageNameToLongName(selectedLanguage);
                synchronized (sync) {
                        Logger.normal(CLASS_NAME, "Changing the current 
language to : " + selectedLanguage);
-                       currentClass = new L10n(selectedLanguage);
-                       if(currentClass == null) {
-                               currentClass = new L10n(FALLBACK_DEFAULT);
+                       L10n oldClass = currentClass;
+                       LANGUAGE lang = 
LANGUAGE.mapToLanguage(selectedLanguage);
+                       if(lang == null) {
+                               currentClass = (oldClass != null ? oldClass : 
new L10n(LANGUAGE.getDefault()));
                                Logger.error(CLASS_NAME, "The requested 
translation is not available!" + selectedLanguage);
                                throw new MissingResourceException("The 
requested translation (" + selectedLanguage + ") hasn't been found!", 
CLASS_NAME, selectedLanguage);
-                       }
+                       } else
+                               currentClass = new L10n(lang);
+                       
                }
        }

@@ -123,7 +169,7 @@

                                // Set the value of the override
                                translationOverride.putOverwrite(key, value);
-                               Logger.normal("L10n", "Got a new translation 
key: set the Override!");
+                               Logger.normal(CLASS_NAME, "Got a new 
translation key: set the Override!");
                        }

                        // Save the file to disk
@@ -133,20 +179,21 @@

        private static void _saveTranslationFile() {
                FileOutputStream fos = null;
-               File finalFile = new File(L10n.PREFIX + 
L10n.getSelectedLanguage() + L10n.OVERRIDE_SUFFIX);
+               File finalFile = new 
File(getSelectedLanguage().l10nOverrideFilename);

                try {
                        // We don't set deleteOnExit on it : if the save 
operation fails, we want a backup
+                       // FIXME: REDFLAG: not symlink-race proof!
                        File tempFile = new File(finalFile.getParentFile(), 
finalFile.getName()+".bak");
-                       Logger.minor("L10n", "The temporary filename is : " + 
tempFile);
+                       Logger.minor(CLASS_NAME, "The temporary filename is : " 
+ tempFile);

                        fos = new FileOutputStream(tempFile);
                         L10n.translationOverride.writeTo(fos);

                        FileUtil.renameTo(tempFile, finalFile);
-                       Logger.normal("L10n", "Override file saved 
successfully!");
+                       Logger.normal(CLASS_NAME, "Override file saved 
successfully!");
                } catch (IOException e) {
-                       Logger.error("L10n", "Error while saving the 
translation override: "+ e.getMessage(), e);
+                       Logger.error(CLASS_NAME, "Error while saving the 
translation override: "+ e.getMessage(), e);
                } finally {
                        Closer.close(fos);
                }
@@ -182,7 +229,7 @@
        public static SimpleFieldSet getDefaultLanguageTranslation() {
                synchronized (sync) {
                        if(fallbackTranslation == null)
-                               fallbackTranslation = 
loadTranslation(FALLBACK_DEFAULT);
+                               fallbackTranslation = 
loadTranslation(LANGUAGE.getDefault());

                        return new SimpleFieldSet(fallbackTranslation); 
                }
@@ -254,7 +301,7 @@
                // We instanciate it only if necessary
                synchronized (sync) {
                        if(fallbackTranslation == null)
-                               fallbackTranslation = 
loadTranslation(FALLBACK_DEFAULT);
+                               fallbackTranslation = 
loadTranslation(LANGUAGE.getDefault());

                        result = fallbackTranslation.get(key);  
                }
@@ -270,7 +317,7 @@

        /**
        * Allows things like :
-       * L10n.getString("testing.test", new String[]{ "test1", "test2" }, new 
String[] { "a", "b" })
+       * L10n.getString("testing.test", new String[]{ "test1", "test2" }, "a", 
"b" })
        *
        * @param key
        * @param patterns : a list of patterns wich are matchable from the 
translation
@@ -311,10 +358,10 @@
        *
        * @return String
        */
-       public static String getSelectedLanguage() {
+       public static LANGUAGE getSelectedLanguage() {
                synchronized (sync) {
                        if((currentClass == null) || 
(currentClass.selectedLanguage == null))
-                               return FALLBACK_DEFAULT;
+                               return LANGUAGE.getDefault();
                        else
                                return currentClass.selectedLanguage;   
                }
@@ -326,26 +373,18 @@
        * @param name
        * @return the Properties object or null if not found
        */
-       public static SimpleFieldSet loadTranslation(String name) {
-               String shortCountryCode = mapLanguageNameToShortCode(name);
-               if(shortCountryCode == null) { 
-                       Logger.error("L10n", "Can't map "+name+" to a country 
code!");
-                       return null;
-               } else
-                       name = shortCountryCode;
-               name = PREFIX.replace ('.', 
'/').concat(PREFIX.concat(name.concat(SUFFIX)));
-               
+       public static SimpleFieldSet loadTranslation(LANGUAGE lang) {
                SimpleFieldSet result = null;
                InputStream in = null;
                try {
                        ClassLoader loader = ClassLoader.getSystemClassLoader();

                        // Returns null on lookup failures:
-                       in = loader.getResourceAsStream(name);
+                       in = loader.getResourceAsStream(lang.l10nFilename);
                        if(in != null)
                                result = SimpleFieldSet.readFrom(in, false, 
false);
                } catch (Exception e) {
-                       Logger.error("L10n", "Error while loading the l10n file 
from " + name + " :" + e.getMessage(), e);
+                       Logger.error(CLASS_NAME, "Error while loading the l10n 
file from " + lang.l10nFilename + " :" + e.getMessage(), e);
                        result = null;
                } finally {
                        Closer.close(in);
@@ -353,43 +392,7 @@

                return result;
        }
-       
-       /**
-        * Map a full string language name to the corresponding country short 
code
-        * 
-        * @param The name to look for
-        * @return The two letters short code OR null if not found
-        */
-       public static String mapLanguageNameToShortCode(String name) {
-               for(int i=0; i<AVAILABLE_LANGUAGES.length; i++) {
-                       String currentShortCode = AVAILABLE_LANGUAGES[i][0];
-                       String currentLongName = AVAILABLE_LANGUAGES[i][1];
-                       String currentCountryCodeName = 
AVAILABLE_LANGUAGES[i][2];
-                       
-                       if(currentShortCode.equalsIgnoreCase(name) || 
currentLongName.equalsIgnoreCase(name) || 
currentCountryCodeName.equalsIgnoreCase(name))
-                               return currentShortCode;
-               }
-               return null;
-       }

-       /**
-        * Map a language identifier to its corresponding long name
-        * 
-        * @param The name to look for
-        * @return The full text language name OR null if not found
-        */
-       public static String mapLanguageNameToLongName(String name) {
-               for(int i=0; i<AVAILABLE_LANGUAGES.length; i++) {
-                       String currentShortCode = AVAILABLE_LANGUAGES[i][0];
-                       String currentLongName = AVAILABLE_LANGUAGES[i][1];
-                       String currentCountryCodeName = 
AVAILABLE_LANGUAGES[i][2];
-                       
-                       if(currentShortCode.equalsIgnoreCase(name) || 
currentLongName.equalsIgnoreCase(name) || 
currentCountryCodeName.equalsIgnoreCase(name))
-                               return currentLongName;
-               }
-               return null;
-       }
-
        public static boolean isOverridden(String key) {
                synchronized(sync) {
                        if(translationOverride == null) return false;

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties   
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties   
2008-09-24 23:10:15 UTC (rev 22827)
@@ -731,6 +731,8 @@
 NodeClientCore.fileForClientStatsLong=Datei in der die Drosselungs-Statistiken 
gespeichert werden (wird ben?tigt um herauszufinden wie oft Anfragen gesendet 
werden sollen).
 NodeClientCore.lazyResume=Vervollst?ndige das Laden persistenter Anfragen beim 
Start? (Braucht mehr Speicher)
 NodeClientCore.lazyResumeLong=Der Knoten kann persistente (dauerhafte) 
anstehende Anfragen beim Starten laden, oder er kann die Daten in den Speicher 
einlesen und dann die Anfragen nachdem der Knoten vollst?ndig gestartet ist 
komplettieren. K?rzere Start-Zeiten, braucht aber mehr Speicher.
+NodeClientCore.maxArchiveSize=Maximale Gr??e eines Archivs
+NodeClientCore.maxArchiveSizeLong=Maximale Gr??e eines Archivs
 NodeClientCore.maxRAMBucketSize=Maximale Gr??e eines RAMBuckets
 NodeClientCore.maxRAMBucketSizeLong=Maximale Gr??e eines RAMBuckets (gr??ere 
Buckets werden als Dateien auf der Festplatte gespeichert)
 NodeClientCore.maxUSKFetchers=Maximal erlaubte Anzahl von USK-Abrufern

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties   
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties   
2008-09-24 23:10:15 UTC (rev 22827)
@@ -1 +1,417 @@
+BookmarkEditorToadlet.addBookmark=Lis?? kirjanmerkki
+BookmarkEditorToadlet.addCategory=Lis?? kategoria
+BookmarkEditorToadlet.addNewBookmark=Lis?? uusi kirjanmerkki
+BookmarkEditorToadlet.addNewCategory=Lis?? uusi kategoria
+BookmarkEditorToadlet.addedNewBookmark=Uusi kirjanmerkki on lis?tty 
onnistuneesti
+BookmarkEditorToadlet.addedNewBookmarkTitle=Uusi kirjanmerkki lis?tty
+BookmarkEditorToadlet.bookmarkDoesNotExist=Kirjanmerkki? "${bookmark}" ei ole 
olemassa
+BookmarkEditorToadlet.cancelCut=Peruuta leikkaus
+BookmarkEditorToadlet.changesSaved=Muutokset ovat tallennettu onnistuneesti
+BookmarkEditorToadlet.changesSavedTitle=Muutokset tallennettu
+BookmarkEditorToadlet.confirmDelete=Poista
+BookmarkEditorToadlet.addDefaultBookmarks=Uudelleenlis?? alkuper?iset 
kirjanmerkit
+BookmarkEditorToadlet.cut=Leikkaa
+BookmarkEditorToadlet.delete=Poista
+BookmarkEditorToadlet.deleteBookmark=Poista kirjanmerkki
+BookmarkEditorToadlet.deleteBookmarkConfirm=Haluatko varmasti poistaa 
kirjanmerkin ${bookmark}?
+BookmarkEditorToadlet.deleteCategory=Poista kategoria
+BookmarkEditorToadlet.deleteCategoryConfirm=Haluatko varmasti poistaa 
kategorian ${bookmark} ja kaikki sen lapset?
+BookmarkEditorToadlet.deleteSucceeded=Kirjanmerkki on poistettu onnistuneesti.
+BookmarkEditorToadlet.deleteSucceededTitle=Poisto onnistui
+BookmarkEditorToadlet.descLabel=Kirjanmerkin kuvaus:
+BookmarkEditorToadlet.edit=Muokkaa
+BookmarkEditorToadlet.editBookmarkTitle=Muokkaa kirjanmerkki?
+BookmarkEditorToadlet.editCategoryTitle=Muokkaa kategoriaa
+BookmarkEditorToadlet.error=Virhe
+BookmarkEditorToadlet.hasAnActivelinkLabel=Onko ?vapaasivulla? 
activelink-kuvaa?
+BookmarkEditorToadlet.invalidKeyTitle=Ep?kelpo avain
+BookmarkEditorToadlet.invalidKeyWithReason=Ep?kelpo freenet-avain
+BookmarkEditorToadlet.invalidKey=Freenet-avain on ep?kelpo.
+BookmarkEditorToadlet.keyLabel=Avain:
+BookmarkEditorToadlet.moveDown=Alas
+BookmarkEditorToadlet.moveUp=Yl?s
+BookmarkEditorToadlet.myBookmarksTitle=Kirjanmerkkini
+BookmarkEditorToadlet.nameLabel=Nimi:
+BookmarkEditorToadlet.paste=Liit?
+BookmarkEditorToadlet.pasteOrCancel=Klikkaa liitt??ksesi kuvakkeen tai 
peruaksesi.
+BookmarkEditorToadlet.pasteTitle=Leikkaa/Liit?
+BookmarkEditorToadlet.save=Tallenna
+BookmarkEditorToadlet.title=Kirjanmerkkieditori
+BookmarkEditorToadlet.urlDecodeError=URL-dekoodausvirhe
+BookmarkItem.bookmarkUpdated=Sivusto ${name} on p?ivittynyt uudempaan 
versioon, ${edition}.
+BookmarkItem.bookmarkUpdatedTitle=Kirjanmerkki p?ivitetty: ${name}
+BookmarkItem.bookmarkUpdatedWithLink=Sivusto ${link}${name}${/link} on 
p?ivittynyt uudempaan versioon, ${edition}.
+BookmarkItem.deleteBookmarkUpdateNotification=Poista huomautus
+BookmarkItem.unnamedBookmark=Smarnimetty kirjanmerkki
+BookmarkManager.list=Kirjanmerkkilista
+BookmarkManager.listLong=merkittyjen ?vapaasivujen? lista
+BookmarkManager.malformedBookmark=V??r?nlainen kirjanmerkki
+BooleanOption.parseError=Tunnistamaton totuusarvo ${val} - kokeile arvoa true 
tai false
+BuildOldAgeUserAlert.tooOldTitle=Liian vanha versio
+ClockProblemDetectedUserAlert.text=Freenet on huomannut, ett? tietokoneesi 
kello (sek? kello ett? p?iv?m??r?) ei ole ajassa. Freenet ei toimi kunnolla, 
ennen kuin korjaat aika-asetuksesi ja uudelleenk?ynnist?t solmun.
+ClockProblemDetectedUserAlert.title=Tietokoneesi kello ei ole ajassa.
+CSSTokenizerFilter.deletedDisallowedString=Vaarallinen rivi poistettu
+CSSTokenizerFilter.deletedUnmatchedChar=t?sm??m?t?n merkki ohitettu:
+CSSTokenizerFilter.deletedUnofficialIdent=Ep?virallinen tunniste poistettu
+CSSTokenizerFilter.deletedUnofficialIdentWithURL=Ep?virallinen 
tunniste(URL:ll?) poistettu
+CSSTokenizerFilter.invalidURLContents=Ep?kelpoa sis?lt?? kohdassa url()
+CSSTokenizerFilter.supplementalCharsNotSupported=UCS-4 MERKIT KOHDAN 0xFFFF 
YL?PUOLELLA EI TUETTU!
+CSSTokenizerFilter.unknownAtIdentifierLabel=Tuntematon @identifier:
+ConfigToadlet.appliedFailureExceptions=Asetuksesi hyv?ksyttiin seuraavilla 
poikkeuksilla:
+ConfigToadlet.appliedFailureTitle=Asetuksiasi ei hyv?ksytty.
+ConfigToadlet.appliedSuccess=Asetusmuutokset tallennettu onnistuneesti.
+ConfigToadlet.appliedTitle=Asetukset hyv?ksytty
+ConfigToadlet.apply=Hyv?ksy
+ConfigToadlet.configNavTitle=Asetusvalikko
+ConfigToadlet.console=konsoli
+ConfigToadlet.contributeTranslation=Osallistu k??nt?miseen
+ConfigToadlet.defaultIs=Vakioasetus t?lle asetukselle on: '${default}'.
+ConfigToadlet.false=ep?tosi
+ConfigToadlet.fullTitle=Freenet-solmun asetukset ${name}:lle
+ConfigToadlet.logger=logger
+ConfigToadlet.node=node
+ConfigToadlet.node.load=node.load
+ConfigToadlet.node.opennet=node.opennet
+ConfigToadlet.node.scheduler=node.scheduler
+ConfigToadlet.node.testnet=node.testnet
+ConfigToadlet.node.updater=node.updater
+ConfigToadlet.pluginmanager=pluginmanager
+ConfigToadlet.pluginmanager2=pluginmanager2
+ConfigToadlet.reset=Nollaa
+ConfigToadlet.returnToNodeConfig=Palaa solmun asetuksiin
+ConfigToadlet.shortTitle=Asetukset
+ConfigToadlet.ssl=SSL (ei vaikuta k?ynniss? oleviin servereihin, tarvitsee 
uudelleenk?ynnistyksen)
+ConfigToadlet.title=Freenet-solmun asetukset
+ConfigToadlet.toadletsymlinker=toadletsymlinker
+ConfigToadlet.true=tosi
+ConfigurablePersister.doesNotExistCannotCreate=Tiedostoa ei ole olemassa, eik? 
sit? voida luoda
+ConfigurablePersister.existsCannotReadWrite=Tiedosto on olemassa, mutta siihen 
ei voida kirjoittaa
+ConnectivityToadlet.addressTitle=Osoite
+ConnectivityToadlet.sentReceivedTitle=L?hetetyt/Vastaanotetut paketit
+ConnectivityToadlet.local=PAIKALLINEN
+ConnectivityToadlet.remote=ET?
+ConnectivityToadlet.noreply=EI VASTAUSTA
+ConnectivityToadlet.summaryTitle=Yhdistett?vyys
+ConnectionsToadlet.nodeStatus.CONNECTED=YHDISTETTY
+ConnectionsToadlet.nodeStatus.BACKED OFF=SAAVUTTAMATTOMISSA
+ConnectionsToadlet.nodeStatus.TOO NEW=LIIAN UUSI
+ConnectionsToadlet.nodeStatus.TOO OLD=LIIAN VANHA
+ConnectionsToadlet.nodeStatus.DISCONNECTED=KATKENNUT
+ConnectionsToadlet.nodeStatus.NEVER CONNECTED=EI IKIN? YHDISTETTY
+ConnectionsToadlet.nodeStatus.DISABLED=POIS K?YT?ST?
+ConnectionsToadlet.nodeStatus.LISTEN ONLY=VAIN KUUNNELTAVA
+ConnectionsToadlet.nodeStatus.LISTENING=KUUNTELEE
+ConnectionsToadlet.nodeStatus.BURSTING=HALKEILEE
+ConnectionsToadlet.nodeStatus.CLOCK PROBLEM=KELLO-ONGELMA
+ConnectionsToadlet.nodeStatus.CONNECTION ERROR=YHTEYSVIRHE
+ConnectionsToadlet.nodeStatus.DISCONNECTING=SULKEE YHTEYTT?
+ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=TUNTEMATON TILA
+ConnectionsToadlet.nodeStatus.BUSY=VARATTU
+ConnectionsToadlet.nodeStatus.ROUTING DISABLED=EI REITIT? LIIKENNETT?
+ContentDataFilter.unknownCharsetTitle=Tuntematon merkist?!
+ContentDataFilter.warningUnknownCharsetTitle=Varoitus: Tuntematon merkist? 
(${charset})
+ContentFilter.applicationPdfReadAdvice=Adobe(R) PDF-dokumentti - Eritt?in 
vaarallinen!
+ContentFilter.applicationPdfWriteAdvice=Adobe(R) PDF-dokumentti - Eritt?in 
vaarallinen!
+ContentFilter.imageGifReadAdvice=GIF-kuva - mahdollisesti ei vaarallinen
+ContentFilter.imageGifWriteAdvice=GIF-kuva - mahdollisesti ei vaarallinen, 
mutta sinun kannattaa tuhota kaikki kommentit
+ContentFilter.imageIcoReadAdvice=Ikonitiedosto - mahdollisesti ei vaarallinen
+ContentFilter.imageIcoWriteAdvice=Ikonitiedosto - mahdollisesti ei vaarallinen 
(mutta voi sis?lt?? muuta tietoa johtuen tasoitteesta?)
+ContentFilter.imageJpegReadAdvice=JPEG-kuva - mahdollisesti ei vaarallinen
+ContentFilter.imageJpegWriteAdvice=JPEG-kuva - mahdollisesti ei vaarallinen, 
mutta voi sis?lt?? EXIF-tietoa
+ContentFilter.imagePngReadAdvice=PNG-kuva - mahdollisesti ei vaarallinen
+ContentFilter.imagePngWriteAdvice=PNG-kuva - mahdollisesti ei vaarallinen, 
mutta sinun kannattaa tuhota kaikki kommentit tai tekstikent?t
+ContentFilter.textCssReadAdvice=CSS (cascading style sheet, usein k?ytetty 
HTML:n kanssa) - mahdollisesti ei vaarallinen jos suodatettu, mutta suodatin ei 
perustu hyv?ksyttyjen elementtien listaan
+ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, usein k?ytetty 
HTML:n kanssa) - t?m? voi sis?lt?? metadataa, varmista se k?sin
+ContentFilter.textHtmlReadAdvice=HTML - ei vaarallinen, jos suodatettu
+ContentFilter.textHtmlWriteAdvice=HTML - voi sis?lt?? metadataa jne.; tarkista 
k?sin
+ContentFilter.textPlainReadAdvice=Tekstitiedosto - ei vaarallinen, ellei 
selaimesi ole tyhm? (e.g Internet Explorer)
+ContentFilter.textPlainWriteAdvice=Tekstitiedosto - ei vaarallinen, ellet 
lis?? tiivistetty? tietoa
+DarknetConnectionsToadlet.activityTitle=T?m?nhetkinen aktiviteetti
+DarknetConnectionsToadlet.add=Lis??
+DarknetConnectionsToadlet.addPeerTitle=Lis?? toinen vertainen
+DarknetConnectionsToadlet.alreadyInReferences=Meill? on jo annettu referenssi.
+DarknetConnectionsToadlet.backedOff=Yhdistetty mutta saavuttamattomissa: 
N?ihin vertaisiin on yhteys, mutta he ovat saavuttamattomissa, joten solmu ei 
ohjaa pyynt?j? heille.
+DarknetConnectionsToadlet.backedOffShort=Saavuttamattomissa
+DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=Solmun poisto
+DarknetConnectionsToadlet.connectedShort=Yhdistetty
+DarknetConnectionsToadlet.disabledShort=Poissa k?yt?st?
+DarknetConnectionsToadlet.enterDescription=Sy?t? kuvaus:
+DarknetConnectionsToadlet.connError=Yhteys ep?onnistui(buginen solmu?)
+DarknetConnectionsToadlet.connErrorShort=Yhteysongelma
+DarknetConnectionsToadlet.failedToAddNodeTitle=Solmun lis?ys ep?onnistui
+DarknetConnectionsToadlet.forceRemove=Pakota poisto
+DarknetConnectionsToadlet.go=Mene
+DarknetConnectionsToadlet.idleTimeTitle=Yhdistetty / Lep??
+DarknetConnectionsToadlet.ipAddress=Solmun verkko-osoite muodossa IP:Port
+DarknetConnectionsToadlet.ipAddressTitle=Osoite
+DarknetConnectionsToadlet.listenOnlyShort=Vain kuunneltava
+DarknetConnectionsToadlet.nameTitle=Nimi
+DarknetConnectionsToadlet.neverConnectedShort=Ei ikin? yhdistetty
+DarknetConnectionsToadlet.nodePortsTitle=Solmun k?ytt?m?t portit
+DarknetConnectionsToadlet.notConnectedShort=Katkennut
+DarknetConnectionsToadlet.privateNoteTitle=Yksityismerkint?
+DarknetConnectionsToadlet.remove=Poista se!
+DarknetConnectionsToadlet.removePeers=Poista valitut vertaiset
+DarknetConnectionsToadlet.seedServers=Solmut, joita k?yt?mme l?hdesolmuina
+DarknetConnectionsToadlet.seedServersShort=L?hdesolmut
+DarknetConnectionsToadlet.seedClients=Solmut, joille me olemme l?hdesolmuna
+DarknetConnectionsToadlet.seedClientsShort=Seeding for
+DarknetConnectionsToadlet.selectAction=-- Valitse toiminto --
+DarknetConnectionsToadlet.sendMessageTitle=L?het? Solmulta Solmulle(N2NTM) 
-viesti
+DarknetConnectionsToadlet.sendMessageToPeers=L?het? N2NTM valituille 
vertaisille.
+DarknetConnectionsToadlet.separator=-- -- --
+DarknetConnectionsToadlet.statusTitle=Tila
+DarknetConnectionsToadlet.tooNewShort=Liian uusi
+DarknetConnectionsToadlet.unknownAddress=(tuntematon osoite)
+DarknetConnectionsToadlet.updateChangedPrivnotes=P?ivit? muutetut 
yksityismerkinn?t
+DarknetConnectionsToadlet.versionTitle=Versio
+ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext on liian vanha
+FirstTimeWizardToadlet.homepageTitle=Freenetin ensimm?isen kerran velho
+FirstTimeWizardToadlet.chooseNodeName=Solmun nimi on pakollinen!
+FirstTimeWizardToadlet.connectToStrangers=Yhdist? tuntemattomiin?
+FirstTimeWizardToadlet.enableOpennet=Tunnetko ket??n, joka k?ytt?? freenetti??
+FirstTimeWizardToadlet.warningTitle=Varoitus!
+FirstTimeWizardToadlet.welcomeInfoboxTitle=Tervetuloa Freenetin ensimm?isen 
kerran velhoon!
+FirstTimeWizardToadlet.bandwidthLimit=Nopeusrajoitukset
+FirstTimeWizardToadlet.clickContinue=Klikkaa t?st? jatkaaksesi
+FirstTimeWizardToadlet.continue=Jatka
+FirstTimeWizardToadlet.continueEnd=Klikkaa t?st? aloittaaksesi Freenetin 
k?yt?n!
+FirstTimeWizardToadlet.datastoreSize=Datavaraston koko
+FirstTimeWizardToadlet.isNetworkTrusted=Onko paikallinen verkkosi luotettava?
+FirstTimeWizardToadlet.congratz=Tervetuloa laivaan!
+FirstTimeWizardToadlet.step1Title=Freenetin ensimm?isen kerran velho! - 
Yst?v?t ja muukalaiset
+FirstTimeWizardToadlet.step2Title=Freenetin ensimm?isen kerran velho! - 
Valitse solmun nimi
+FirstTimeWizardToadlet.step3Title=Freenetin ensimm?isen kerran velho! - 
Nopeusrajoitukset
+FirstTimeWizardToadlet.step4Title=Freenetin ensimm?isen kerran velho! - 
Datavaraston koko
+FirstTimeWizardToadlet.step5Title=Freenetin ensimm?isen kerran velho! - Verkon 
asetukset
+FirstTimeWizardToadlet.step6Title=Freenetin ensimm?isen kerran velho! - 
Onnitteluni, solmusi on nyt konfiguroitu!
+FirstTimeWizardToadlet.skipWizard=En ole ensikertalainen, haluan j?tt?? velhon 
v?liin!
+FProxyToadlet.abortToHomepage=Peru ja siirry FProxyn etusivulle.
+FProxyToadlet.cantBindPort=FProxya ei voida sitoa tuohon porttiin.
+FProxyToadlet.config=konfiguroi solmusi
+FProxyToadlet.configTitle=Asetukset
+FProxyToadlet.dangerousContentTitle=Mahdollisesti vaarallista sis?lt??
+FProxyToadlet.dangerousRSSSubtitle=RSS-sy?te voi olla vaarallinen
+FProxyToadlet.dangerousRSSTitle=Mahdollisesti vaarallista sis?lt??! (RSS)
+FProxyToadlet.errorWithReason=Virhe: ${error}
+FProxyToadlet.expectedKeyButGot=Odotettiin Freenet-avainta, mutta saatiin:
+FProxyToadlet.expectedMimeType=Odotettu MIME-tyyppi: ${mime}
+FProxyToadlet.explanationTitle=Selitys
+FProxyToadlet.fileInformationTitle=Tiedoston tiedot
+FProxyToadlet.filenameLabel=Tiedoston nimi:
+FProxyToadlet.friends=hallitse f2f-yhteyksi?
+FProxyToadlet.friendsTitle=Yst?v?t
+FProxyToadlet.goBack=Mene takaisin
+FProxyToadlet.goBackToPrev=Takaisin edelliselle sivulle
+FProxyToadlet.invalidKeyTitle=Ep?kelpo avain
+FProxyToadlet.invalidKeyWithReason=Ep?kelpo avain: ${reason}
+FProxyToadlet.largeFile=Suuri tiedosto
+FProxyToadlet.mayChange= (voi vaihtua)
+FProxyToadlet.mimeType=MIME-tyyppi: ${mime}
+FProxyToadlet.notEnoughMetaStrings=Ei tarpeeksi metatietoa
+FProxyToadlet.notFoundTitle=Ei l?ydetty
+FProxyToadlet.opennet=Hallitse ep?luotettavia yhteyksi?
+FProxyToadlet.opennetTitle=Muukalaiset
+FProxyToadlet.options=Asetuksesi ovat:
+FProxyToadlet.pathNotFound=M??ritelty? polkua ei ole olemassa
+FProxyToadlet.pathNotFoundTitle=Polkua ei l?ytynyt
+FProxyToadlet.plugins=konfiguroi ja hallitse liit?nn?isi?
+FProxyToadlet.pluginsTitle=Liit?nn?iset
+FProxyToadlet.queue=hallitse jonossa olevia pyynt?j?
+FProxyToadlet.queueTitle=Jono
+FProxyToadlet.retryNow=Yrit? uudelleen heti
+FProxyToadlet.sizeLabel=Koko:
+FProxyToadlet.sizeUnknown=Koko: tuntematon
+FProxyToadlet.stats=Katsontatilastot
+FProxyToadlet.statsTitle=Tilastot
+FProxyToadlet.unableToRetrieve=Freenet ei onnistunut hankkimaan t?t? tiedostoa
+FProxyToadlet.unknownMIMEType=MIME-tyyppi: tuntematon
+FProxyToadlet.welcome=kotisivu
+FProxyToadlet.welcomeTitle=Koti
+FcpServer.allowedHosts=Sallitut is?nn?t (lue varoitus!)
+FetchException.longError.10=Tiedosto ei ole arkistossa
+FetchException.longError.13=Sis?lt?? ei l?ydetty
+FetchException.longError.17=Sis?inen virhe, luultavasti bugi
+FetchException.longError.18=Tiedosto l?ydetty, mutta se menetettiin sit? 
hakiessa
+FetchException.longError.20=Ep?kelpo URI
+FetchException.longError.21=Liian suuri
+FetchException.longError.22=Metatieto liian suuri
+FetchException.longError.23=Liian monta lohkoa / segmentti
+FetchException.longError.25=Peruutettu
+FetchException.longError.26=Arkisto uudelleenk?ynnistetty
+FetchException.longError.4=Metatiedon parsinta ep?onnistui
+FetchException.longError.6=Lohkon purku ep?onnistui
+FetchException.shortError.10=Ei ole arkistossa
+FetchException.shortError.11=Liian monta polkukomponenttia
+FileOffer.askUserTitle=Suora tiedostonsiirto
+FileOffer.offeredFileHeader=Solmu ${name} tarjosi tiedostoa:
+FileOffer.fileLabel=Tiedosto:
+FileOffer.senderLabel=L?hett?j?:
+FileOffer.commentLabel=Kommentti:
+FileOffer.mimeLabel=MIME-tyyppi:
+FileOffer.sizeLabel=Koko:
+FileOffer.acceptTransferButton=Hyv?ksy siirto
+FileOffer.rejectTransferButton=Hylk?? siirto
+FileOffer.failedReceiveHeader=Tiedoston ${filename} siirto solmulta ${node} 
ep?onnistui.
+FileOffer.failedReceiveTitle=Tiedoston vastaanotto ep?onnistui
+FileOffer.succeededReceiveTitle=Tiedoston vastaanotto onnistui
+FileOffer.succeededReceiveHeader=Tiedoston ${filename} siirto solmulta ${node} 
onnistui.
+GIFFilter.invalidHeader=Tiedostolla ei ole kelvollista GIF-otsikkotietoa.
+GIFFilter.invalidHeaderTitle=Ep?kelpo otsikkotieto
+GIFFilter.tooShortTitle=Liian lyhyt
+HTMLFilter.deletedUnknownStyle=tuntematon tyyli poistettu
+JPEGFilter.tooShort=Tiedosto on liian lyhyt ollakseen JPEG.
+JPEGFilter.tooShortTitle=Liian lyhyt
+LocalFileInsertToadlet.fileHeader=Tiedosto
+LocalFileInsertToadlet.insert=Lis??
+LocalFileInsertToadlet.sizeHeader=Koko
+N2NTMToadlet.delayedTitle=Viiv?stetty
+N2NTMToadlet.failedTitle=Ep?onnistui
+N2NTMToadlet.friends=Yst?v?t
+N2NTMToadlet.peerName=Vertaisen nimi
+N2NTMToadlet.peerNotFoundTitle=Vertaista ei l?ytynyt
+N2NTMToadlet.queuedTitle=Jonossa
+N2NTMToadlet.returnToFriends=Palaa yst?v?listalle
+N2NTMToadlet.sendMessageShort=L?het? viesti
+N2NTMToadlet.sent=Viesti l?hetetty vertaiselle
+N2NTMToadlet.sentTitle=L?hetetty
+N2NTMToadlet.tooLong=N2NTM-viestit ovat rajoitettu 1024:n merkkiin
+N2NTMToadlet.tooLongTitle=Liian pitk?
+N2NTMUserAlert.delete=Poista
+N2NTMUserAlert.reply=Vastaa
+Node.storeSize=Varaston koko tavuissa
+Node.storeSizeLong=Varaston koko tavuissa
+NodeIPDectector.inclLocalAddress=Sis?llyt? paikalliset osoitteet 
solmuviitteeseen
+NodeIPDectector.inclLocalAddressLong=M??ritt??, sis?llytet??nk? paikalliset 
osoitteet(LAN ja localhost) solmun viitteisiin. T?m? ei ole hy?dyllist?, 
elleiv?t molemmat puolet aseta kohtaa allowLocalAddresses=true toistensa 
referensseihin.
+NodeIPDectector.ipOverride=IP-osoitteen korvaus
+NodeIPDectector.ipOverrideLong=IP-osoitteen korvaus (yleens? turha) - aseta 
t?m?, jos sinulla on *staattinen* IP-osoite tai domain-nimi (esim. dyndns:n 
kautta) ja olet palomuurin takana.
+NodeIPDectector.tempAddressHint=V?liaikainen IP-osoitteen vihje
+NodeIPDectector.tempAddressHintLong=V?liaikainen vihje omasta IP:st?; 
poistetaan k?yt?n j?lkeen
+PluginToadlet.addPluginTitle=Lis?? liit?nn?inen
+PluginToadlet.failedToLoadPlugin=Liit?nn?isen lis?ys ep?onnistui.
+PluginToadlet.failedToLoadPluginTitle=Liit?nn?isen lataus ep?onnistui
+PluginToadlet.internalNameTitle=Sis?inen nimi
+PluginToadlet.loadPluginCommand=Lataa liit?nn?inen
+PluginToadlet.noWebInterfaceTitle=Liit?nn?isell? ei ole web-liittym??
+PluginToadlet.pluginList=Liit?nn?islista
+PluginToadlet.pluginListTitle=Lista liit?nn?isist?
+PluginToadlet.pluginNameTitle=Liit?nn?isen nimi
+PluginToadlet.pluginNotFoundTitle=Liit?nn?ist? ei l?ytynyt
+PluginToadlet.visit=Vieraile
+PproxyToadlet.changeReloadOnStartup=Muuta
+PproxyToadlet.classNameTitle=Luokan nimi
+PproxyToadlet.Error=Virhe
+PproxyToadlet.internalIDTitle=Sis?inen ID
+PproxyToadlet.Load=Lataa
+PproxyToadlet.loadOfficialPlugin=Lis?? virallinen liit?nn?inen
+PproxyToadlet.loadOfficialPluginLabel=Lataa virallinen liit?nn?inen
+PproxyToadlet.loadOtherPlugin=Lis?? ep?virallinen liit?nn?inen
+PproxyToadlet.loadOtherURLLabel=Liit?nn?isen URL
+PproxyToadlet.noPlugins=Ei liit?nn?isi? ladattu
+PproxyToadlet.pluginUnloaded=Liit?nn?inen poistettu k?yt?st?
+PproxyToadlet.plugins=Liit?nn?iset
+PproxyToadlet.startingPluginName=Liit?nn?isen nimi
+PproxyToadlet.startingPluginStatus=Nykyinen tila
+PproxyToadlet.startingPluginStatus.downloading=luodaan paikallista kopiota...
+PproxyToadlet.startingPluginStatus.starting=k?ynnistet??n
+PproxyToadlet.startingPluginTime=Aikaa tuhlattu
+PproxyToadlet.pluginStopping=Liit?nn?ist? pys?ytet??n...
+PproxyToadlet.unload=Poista k?yt?st?
+PproxyToadlet.unloadPluginTitle=Poista liit?nn?inen k?yt?st??
+PproxyToadlet.unloadPurge=Poista liit?nn?inen v?limuistista?
+QueueToadlet.DUinProgress=Aktiiviset kansion l?hetykset
+QueueToadlet.DinProgress=Aktiiviset lataukset
+QueueToadlet.UinProgress=Aktiiviset l?hetykset
+QueueToadlet.change=Vaihda
+QueueToadlet.completedDU=Onnistuneet kansion l?hetykset
+QueueToadlet.completedDtoDisk=Onnistuneet lataukset levylle
+QueueToadlet.completedDtoTemp=Onnistuneet lataukset v?limuistiin
+QueueToadlet.completedU=Onnistuneet: L?hetykset (${size})
+QueueToadlet.completedUDirectory=Onnistuneet: Kansion l?hetykset (${size})
+QueueToadlet.download=Lataa
+QueueToadlet.errorAccessDenied=Virhe: Ei oikeuksia!
+QueueToadlet.errorDToDisk=Ei voida ladata levylle
+QueueToadlet.errorDownloadNotCompleted=Lataus ei valmis
+QueueToadlet.errorDownloadNotFound=Latausta ei l?ydetty
+QueueToadlet.errorInvalidURI=Ep?kelpo URI
+QueueToadlet.errorNoFileSelected=Ei tiedostoa valittuna
+QueueToadlet.errorNoFileSelectedU=Et valinnut tiedostoa l?hetett?v?ksi.
+QueueToadlet.errorNoKey=Ei avainta annettu ladattavaksi
+QueueToadlet.errorNoKeyToD=Et m??ritt?nyt ladattavaa avainta
+QueueToadlet.failedD=Ep?onnistuneet lataukset
+QueueToadlet.failedD=Ep?onnistunut: Lataukset (${size})
+QueueToadlet.failedDU=Ep?onnistuneet hakemiston l?hetykset
+QueueToadlet.failedDU=Ep?onnistunut: Hakemiston l?hetykset (${size})
+QueueToadlet.failedU=Ep?onnistuneet l?hetykset
+QueueToadlet.failedU=Ep?onnistunut: L?hetykset (${size})
+QueueToadlet.fcpIsMissing=FCP-serveri puuttuu
+QueueToadlet.fileName=Tiedostonimi
+QueueToadlet.files=Tiedostoja
+QueueToadlet.follow=Seuraa uudelleenohjausta
+QueueToadlet.globalQueueIsEmpty=Globaali jono on tyhj?
+QueueToadlet.identifier=Tunniste
+QueueToadlet.insertFile=Sy?t? tiedosto
+QueueToadlet.insertFileLabel=Tiedosto
+QueueToadlet.insertFileCompressLabel=Pakkaa
+QueueToadlet.insertFileInsertFileLabel=Sy?t? tiedosto
+QueueToadlet.insertFileBrowseLabel=Selaa
+QueueToadlet.insertFileResetForm=Nollaa lomake
+QueueToadlet.key=Avain
+QueueToadlet.mimeType=MIME-tyyppi
+QueueToadlet.none=tyhj?
+QueueToadlet.panicButton=Paniikkinappula
+QueueToadlet.persistence=Itsep?isyys
+QueueToadlet.persistenceForever=loppumaton
+QueueToadlet.persistenceNone=olematon
+QueueToadlet.persistenceReboot=uudelleenk?ynnist?
+QueueToadlet.priority0=h?t?tapaus
+QueueToadlet.priority1=eritt?in suuri
+QueueToadlet.priority2=korkea
+QueueToadlet.priority3=keskitaso
+QueueToadlet.priority4=matala
+QueueToadlet.priority5=eritt?in matala
+QueueToadlet.priority6=ei tule valmistumaan
+QueueToadlet.priority=Prioriteetti
+QueueToadlet.progress=Edistyminen
+QueueToadlet.reason=Syy
+QueueToadlet.remove=Poista
+QueueToadlet.requestNavigation=Request Navigation
+QueueToadlet.restart=Uudelleenk?ynnist?
+QueueToadlet.size=Koko
+QueueToadlet.starting=K?YNNISTET??N
+QueueToadlet.totalSize=Kokonaiskoko
+QueueToadlet.unknown=Tuntematon
+QueueToadlet.warningUnsafeContent=Mahdollisesti turvatonta sis?lt??
+SimpleToadletServer.advancedMode=K?yt? edistynytt? tilaa?
+StatisticsToadlet.bandwidthTitle=Kaistanleveys
+StatisticsToadlet.cpus=K?ytett?viss? olevat prosessorit: ${count}
+StatisticsToadlet.fullTitle=Tilastot ${name}:lle
+StatisticsToadlet.getLogs=Nappaa edellisen solmun lokitiedosto
+TestnetHandler.port=Testnetin portti
+TextModeClientInterfaceServer.enabled=Salli TCMI
+TextModeClientInterfaceServer.enabledLong=M??ritt??, halutaanko TCMI sallia
+Toadlet.yes=Kyll?
+Toadlet.no=Ei
+Toadlet.cancel=Peruuta
+Toadlet.clickHere=Napsauta t?h?n
+Toadlet.internalErrorPleaseReport=Sis?inen virhe: raportoi siit?, kiitoksia
+Toadlet.internalErrorTitle=Sis?inen virhe
+Toadlet.nodeHomepage=Solmun kotisivu
+Toadlet.notSupportedTitle=Ei tuettu
+Toadlet.homepage=Kotisivu
+TranslationToadlet.currentTranslationLabel=Nykyinen k??nn?s
+TranslationToadlet.downloadTranslationsFile=Lataa nykyinen k??nn?stiedosto
+TranslationToadlet.hideAlreadyTranslated=Piilota jo k??nnetyt rivit
+TranslationToadlet.reEdit=Muokkaa k??nn?st? uudelleen
+TranslationToadlet.remove=Poista
+TranslationToadlet.returnToTranslations=Palaa k??nn?ssivulle
+TranslationToadlet.showEverything=N?yt? kaikki, mukaanlukien k??nnetyt rivit
+TranslationToadlet.translationKeyLabel=K??nn?ksen avain
+UpdatedVersionAvailableUserAlert.title=Uusi vakaa versio Freenetist? on 
julkaista, sinun kannattaisi p?ivitt?? mahdollisimman nopeasti
+UpdatedVersionAvailableUserAlert.updateASAPButton=P?ivit? mahdollisimman 
nopeasti
+UpdatedVersionAvailableUserAlert.updateASAPQuestion=Haluaisitko solmun 
k?ynnist?v?n itsens? uudelleen heti kun se on ladannut uusimman version?
+UpdatedVersionAvailableUserAlert.updateNowButton=P?ivit? nyt!
+UserAlert.apply=Hyv?ksy
+UserAlert.hide=Piilota
+UserAlert.reset=Nollaa
 End

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties   
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties   
2008-09-24 23:10:15 UTC (rev 22827)
@@ -90,11 +90,15 @@
 ConfigToadlet.modeAdvancedTooltip=Options de configuration utiles uniquement 
aux utilisateurs exp?riment?s et aux d?veloppeurs
 ConfigToadlet.modeSimple=Options de configuration simple
 ConfigToadlet.modeSimpleTooltip=Options de configuration utiles ? tous les 
utilisateurs
+ConfigToadlet.needRestart=L'activation d'un param?tre n?cessite un 
red?marrage, veuillez red?marrer Freenet imm?diatement.
+ConfigToadlet.needRestartShort=L'activation d'un param?tre n?cessite un 
red?marrage, veuillez red?marrer Freenet imm?diatement.
+ConfigToadlet.needRestartTitle=Red?marrage de Freenet n?cessaire
 ConfigToadlet.node=noeud
 ConfigToadlet.pluginmanager=gestionnaire de plugins
 ConfigToadlet.pluginmanager2=gestionnaire de plugins 2
 ConfigToadlet.possibilitiesTitle=Continuer
 ConfigToadlet.reset=R?initialiser
+ConfigToadlet.restartNode=Red?marrer maintenant
 ConfigToadlet.returnToNodeConfig=Retourner ? la page de configuration
 ConfigToadlet.shortTitle=Configuration
 ConfigToadlet.ssl=SSL (red?marrage n?cessaire)
@@ -429,12 +433,12 @@
 FirstTimeWizardToadlet.congratz=Bienvenue ? bord !
 FirstTimeWizardToadlet.congratzLong=F?licitations, la configuration de votre 
noeud est termin?e. Vous pouvez modifier cette configuration ? tout moment en 
cliquant sur le lien "Configuration" dans le menu de gauche. Notez que Freenet 
sera lent au d?but et acc?l?rera par la suite. Vous pouvez commencer en 
visitant les marque-pages pr?sents sur la prochaine page. Bienvenue sur Freenet.
 FirstTimeWizardToadlet.connectToStrangers=Se connecter aux Inconnus ?
-FirstTimeWizardToadlet.connectToStrangersLong=Id?alement, les utilisateurs de 
Freenet ne devraient se connecter qu'? des gens qu'ils connaissent. C'est 
beaucoup plus s?r car il devient tr?s difficile de savoir que vous utilisez 
Freenet. Cependant, si vous ne connaissez pas au moins 5 personnes utilisant 
Freenet, vous pouvez choisir de vous connecter ? des inconnus. Notez que vous 
pourrez toujours d?sactiver ?a par la suite.
+FirstTimeWizardToadlet.connectToStrangersLong=Pour utiliser Freenet, vous 
devez vous connecter au moins ? 5 autres personnes. Id?alement, il faudrait que 
ce soit des gens que vous connaisse et en qui vous avez confiance. Si vous 
n'avez pas assez d'amis qui utilisent Freenet, vous pouvez choisir de vous 
connecter ? des inconnus. Cependant, vous connecter ? des inconnus permet ? 
d'autres de savoir que vous utilisez Freenet et vous expose ? des risques de 
s?curit? suppl?mentaires. Si vous avez besoin de cacher le fait que vous 
utilisez Freenet, cel? pourrait vous attirer des ennuis.Id?alement, les 
utilisateurs de Freenet ne devraient se connecter qu'? des gens qu'ils 
connaissent. C'est beaucoup plus s?r car il devient tr?s difficile de savoir 
que vous utilisez Freenet. Cependant, si vous ne connaissez pas au moins 5 
personnes utilisant Freenet, vous pouvez choisir de vous connecter ? des 
inconnus. Notez que vous pourrez toujours d?sactiver ?a par la suite.
 FirstTimeWizardToadlet.continue=Continuer
 FirstTimeWizardToadlet.continueEnd=Cliquez ici pour commencer ? utiliser 
Freenet !
 FirstTimeWizardToadlet.datastoreSize=Taille du store
 FirstTimeWizardToadlet.datastoreSizeLong=Veuillez sp?cifier la taille de votre 
datastore. Le datastore agit comme un cache ; stocker les donn?es du r?seau 
am?liorera les performances quand vous t?l?chargerez des fichiers populaires. 
Plus vous stockez de donn?es, plus vous aidez la communaut? et plus votre noeud 
sera rapide (surtout les t?l?chargements).
-FirstTimeWizardToadlet.enableOpennet=Connaissez-vous des gens qui utilisent 
Freenet ?
+FirstTimeWizardToadlet.enableOpennet=Il est possible de d?sactiver la 
connexion aux ?trangers par la suite, quand vous aurez assez de connexions avec 
des amis, mais vous aurez r?v?l? des informations l'intervale. Freenet est 
toujours exp?rimental, et nous ne garantissons pas la s?curit?.
 FirstTimeWizardToadlet.fivePercentDisk=(= 5% de l'espace libre)
 FirstTimeWizardToadlet.homepageTitle=Assistant de d?marrage Freenet !
 FirstTimeWizardToadlet.iDoTrust=Faites-vous confiance aux personnes connect?s 
par ${interface} (${ip}) ?
@@ -444,9 +448,9 @@
 FirstTimeWizardToadlet.memoryLimitLong=Combien de m?moire voulez-vous laisser 
Freenet utiliser ? Si vous avez beaucoup de t?l?chargements ou insertions en 
cours, Freenet aura besoin de plus de m?moire. Nous sugg?rons de ne pas 
descendre en dessous de 128Mo ? moins que vous ayez tr?s peu de m?moire. Si 
vous avez 1Go ou plus, vous devriez mettre au moins 256Mo. Ca prendra effet 
apr?s le red?marrage de Freenet.
 FirstTimeWizardToadlet.noNetworkIF=Pas d'autre carte r?seau trouv?e
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet n'a pas trouv? d'autre carte 
r?seau. Il consid?rera que vous vous y connectez seulement depuis votre 
ordinateur.
-FirstTimeWizardToadlet.opennetNo=Oui, j'ai au moins 5 amis qui utilisent 
Freenet et je vais les ajouter manuellement sur la page Amis.
+FirstTimeWizardToadlet.opennetNo=J'ai au moins 5 amis qui utilisent Freenet et 
je vais les ajouter manuellement sur la page Amis.
 FirstTimeWizardToadlet.opennetWarning=Freenet est peut-?tre ill?gal dans votre 
pays, car il permet une libert? d'expression sans restrictions. Si c'est le 
cas, et que vous utilisez la connexion automatique ? des inconnus, votre 
gouvernement pourra savoir facilement que vous utilisez Freenet; vous ne 
devriez donc pas activer ce mode et ne devriez vous connecter qu'? des gens que 
vous connaissez (et en qui vous avez confiance). Freenet est toujours 
exp?rimental, nous ne garantissons pas qu'il est exempt de bugs, et par 
cons?quent, ne pouvons garantir votre anonymat/s?curit?. Il faut faire 
particuli?rement attention aux gens avec qui vous vous connectez: ils occupent 
la meilleure place pour espionner vos requ?tes.
-FirstTimeWizardToadlet.opennetYes=Non, je veux que le n?ud trouve 
automatiquement des gens ? qui se connecter.
+FirstTimeWizardToadlet.opennetYes=Je veux que le n?ud trouve automatiquement 
des gens ? qui se connecter.
 FirstTimeWizardToadlet.skipWizard=Je ne suis pas un d?butant, passer 
l'assistant !
 FirstTimeWizardToadlet.step1Title=Assistant de d?marrage Freenet ! - Amis et 
Inconnus
 FirstTimeWizardToadlet.step2Title=Assistant de d?marrage Freenet ! - 
Choisissez le nom de votre noeud
@@ -727,16 +731,26 @@
 NodeClientCore.downloadAllowedDirsLong=Liste de dossiers (s?par?s par des ';') 
o? le t?l?chargement est autoris?. "downloads" correspond au dossier de 
t?l?chargement, laissez-la vide pour n'autoriser aucun t?l?chargement sur le 
disque dur, "all" autorise les t?l?chargements partout !
 NodeClientCore.downloadDir=R?peroire de t?l?chargement
 NodeClientCore.downloadDirLong=Dossier o? sauvegarder les fichiers t?l?charg?s 
par d?faut
+NodeClientCore.encryptPersistentTempBuckets=Chiffrer les fichiers temporaires 
persistants ? NE PAS TOUCHER !
+NodeClientCore.encryptPersistentTempBucketsLong=Chiffre les fichiers 
temporaires persistants ? Dans certains cas (si votre disque et votre swap sont 
chiffr?s), ce n'est peut-?tre pas n?cessaire. NE PAS TOUCHER, SAUF SI VOUS 
SAVEZ CE QUE VOUS FAITES !
+NodeClientCore.encryptTempBuckets=Chiffrer les fichiers temporaires ? NE PAS 
TOUCHER !
+NodeClientCore.encryptTempBucketsLong=Chiffrer les fichiers temporaires ? Dans 
certains cas (si votre disque et votre swap sont chiffr?s), ce n'est peut-?tre 
pas n?cessaire. NE PAS TOUCHER, SAUF SI VOUS SAVEZ CE QUE VOUS FAITES !
 NodeClientCore.fileForClientStats=Fichier o? stocker les statistiques des 
clients
 NodeClientCore.fileForClientStatsLong=Fichier o? stocker les statistiques de 
transfert (utilis?es pour d?cider ? quelle fr?quence envoyer les requ?tes)
 NodeClientCore.lazyResume=Terminer le chargement des requ?tes persistantes 
apr?s le d?marrage ? (Utilise plus de m?moire)
 NodeClientCore.lazyResumeLong=Le noeud peut charger les requ?tes persistantes 
en attente pendant le d?marrage, ou il peut lire les infos en m?moire et 
relancer les requ?tes apr?s le d?marrage. Le d?marrage est plus rapide mais 
cela consomme plus de m?moire.
+NodeClientCore.maxArchiveSize=Taille maximum d'une archive
+NodeClientCore.maxArchiveSizeLong=Taille maximum d'une archive
+NodeClientCore.maxRAMBucketSize=Taille maximum d'un bloc en m?moire
+NodeClientCore.maxRAMBucketSizeLong=Taille maximale de fichier en m?moire (les 
fichiers plus gros seront stock?s sur disque)
 NodeClientCore.maxUSKFetchers=Nombre maximum de r?cup?rateurs d'USK
 NodeClientCore.maxUSKFetchersLong=Nombre maximum de r?cup?rateurs d'USK
 NodeClientCore.maxUSKFetchersMustBeGreaterThanZero=Doit ?tre sup?rieur ? z?ro
 NodeClientCore.movingTempDirOnTheFlyNotSupported=D?placer le dossier 
temporaire ? la vol?e n'est pas possible pour le moment
 NodeClientCore.persistentTempDir=Dossier pour les fichiers temporaires 
persistants
 NodeClientCore.persistentTempDirLong=Dossier o? placer les fichiers 
temporaires persistants
+NodeClientCore.ramBucketPoolSize=Quantit? de RAM d?di?e aux fichiers 
temporaires
+NodeClientCore.ramBucketPoolSizeLong=Quantit? de RAM d?di?e aux fichiers 
temporaires. Economisez de la m?moire ou des E/S.
 NodeClientCore.startingUp=Veuillez laisser un peu de temps ? Freenet pour 
terminer son d?marrage. En attendant, certaines choses ne marcheront pas et le 
n?ud sera plus lent que la normale.
 NodeClientCore.startingUpShort=Freenet est en train de d?marrer, certaines 
choses peuvent ne pas marcher et le noeud peut ?tre lent.
 NodeClientCore.startingUpTitle=Freenet est en train de d?marrer
@@ -1070,11 +1084,13 @@
 SimpleToadletServer.illegalCSSName=Le nom du CSS ne doit contenir ni slash, ni 
points !
 SimpleToadletServer.panicButton=Afficher le bouton panique ?
 SimpleToadletServer.panicButtonLong=Afficher un "bouton panique" sur la page 
/File d'attente/ qui supprimera toutes les requ?tes sans confirmation.
+SimpleToadletServer.passthroughMaxSize=Taille maximum d'un fichier pass? par 
FProxy de fa?on transparente
+SimpleToadletServer.passthroughMaxSizeLong=Taille maximum d'un fichier pass? 
par FProxy de fa?on transparente
 SimpleToadletServer.port=Port FProxy
 SimpleToadletServer.portLong=Port TCP ?cout? par FProxy
 SimpleToadletServer.ssl=Activer SSL ?
 SimpleToadletServer.sslLong=Activer SSL pour FProxy
-StartupToadlet.entropyErrorContent=Il n'y a pas assez d'entropy sur votre 
syst?me... Freenet ne d?marrera pas avant d'en avoir suffisament.
+StartupToadlet.entropyErrorContent=Il n'y a pas assez d'entropie sur votre 
syst?me... Freenet ne d?marrera pas avant d'en avoir suffisament.
 StartupToadlet.entropyErrorTitle=Pas assez d'entropie disponible !
 StartupToadlet.isStartingUp=D?marrage de Freenet en cours, veuillez patienter.
 StartupToadlet.title=D?marrage de Freenet

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties   
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties   
2008-09-24 23:10:15 UTC (rev 22827)
@@ -1,13 +1,13 @@
-Announcer.announceAlertIntro=Il nodo sta cercando di connettersi con i 
seednode ed annunciare s? stesso all' OpenNet (network di Sconosciuti). Possono 
essere necessari alcuni minuti per completare l'operazione.
-Announcer.announceAlertNoSeednodes=Non e' stato trovato il file seednodes.fref 
e quindi il nodo non pu? connettersi automaticamente ad Opennet. Aggiungere 
alcuni nodi manualmente o scaricare il file seednodes da 
http://downloads.freenetproject.org/alpha/opennet/ .
-Announcer.announceAlertShort=Il nodo sta cercando di connettersi alla rete, 
nel frattempo sar? pi? lento.
+Announcer.announceAlertIntro=Il nodo sta cercando di connettersi con i 
seednode ed annunciare s? stesso all' OpenNet (network di Sconosciuti). Possono 
essere necessari alcuni minuti per completare l'operazione.
+Announcer.announceAlertNoSeednodes=Non e' stato trovato il file seednodes.fref 
e quindi il nodo non pu? connettersi automaticamente ad Opennet. Aggiungere 
alcuni nodi manualmente o scaricare il file seednodes da 
http://downloads.freenetproject.org/alpha/opennet/ .
+Announcer.announceAlertShort=Il nodo sta cercando di connettersi alla rete, 
nel frattempo sar? pi? lento.
 Announcer.announceAlertTitle=Annuncio Nodo in corso
-Announcer.announceDetails=Il nodo ha recentemente inoltrato 
${recentSentAnnouncements} annunci, ${runningAnnouncements} dei quali ancora in 
corso, ed aggiunto ${addedNodes} nodi (${refusedNodes} nodi hanno rifiutato la 
connessione). In questo momento il nodo ? connesso a ${connectedSeednodes} 
seednode e sta cercando di connettersi ad altri ${disconnectedSeednodes}.
-Announcer.announceDisabledTooOld=Il software utilizzato dal nodo ? obsoleto ed 
inadatto alla connessione con la version corrente della rete Freenet. 
L'annuncio ? stato diabilitato in quanto comunque inutile. Si prega di 
aggiornare il nodo appena possibile (auto-aggiornamento potrebbe essere in 
attesa di input o disabilitato)
-Announcer.announceDisabledTooOldShort=Il nodo non riesce a connettersi alla 
rete perch? la versione di Freenet utilizzata ? obsoleta. Si prega di eseguire 
l'aggiornamento.
+Announcer.announceDetails=Il nodo ha recentemente inoltrato 
${recentSentAnnouncements} annunci, ${runningAnnouncements} dei quali ancora in 
corso, ed aggiunto ${addedNodes} nodi (${refusedNodes} nodi hanno rifiutato la 
connessione). In questo momento il nodo ? connesso a ${connectedSeednodes} 
seednode e sta cercando di connettersi ad altri ${disconnectedSeednodes}.
+Announcer.announceDisabledTooOld=Il software utilizzato dal nodo ? obsoleto ed 
inadatto alla connessione con la version corrente della rete Freenet. 
L'annuncio ? stato diabilitato in quanto comunque inutile. Si prega di 
aggiornare il nodo appena possibile (auto-aggiornamento potrebbe essere in 
attesa di input o disabilitato)
+Announcer.announceDisabledTooOldShort=Il nodo non riesce a connettersi alla 
rete perch? la versione di Freenet utilizzata ? obsoleta. Si prega di eseguire 
l'aggiornamento.
 Announcer.announceDisabledTooOldTitle=Annuncio disabilitato (obsoleto)
 Announcer.announceLoading=Il nodo sta caricando il file seednodes per 
annunciarsi al resto della rete. Il completamento dell' operazione potrebbe 
richiedere diversi minuti.
-Announcer.coolingOff=per i prossimi ${time} secondi, il nodo aspetter? che i 
nodi che ha annunciato si connettano; se non ci saranno abbastanza nodi prover? 
con un altro nodo.
+Announcer.coolingOff=per i prossimi ${time} secondi, il nodo aspetter? che i 
nodi che ha annunciato si connettano; se non ci saranno abbastanza nodi prover? 
con un altro nodo.
 Bookmark.noName=nessun nome
 BookmarkEditorToadlet.addBookmark=Aggiungi Segnalibro
 BookmarkEditorToadlet.addCategory=Aggiungi Categoria
@@ -36,11 +36,11 @@
 BookmarkEditorToadlet.editCategoryTitle=Modifica Categoria
 BookmarkEditorToadlet.error=Errore
 BookmarkEditorToadlet.hasAnActivelinkLabel=Il freesite ha un activelink?
-BookmarkEditorToadlet.invalidKey=La chiave Freenet non ? valida.
+BookmarkEditorToadlet.invalidKey=La chiave Freenet non ? valida.
 BookmarkEditorToadlet.invalidKeyTitle=Chiave non valida
 BookmarkEditorToadlet.invalidKeyWithReason=Chiave Freenet non valida.
 BookmarkEditorToadlet.keyLabel=Chiave :
-BookmarkEditorToadlet.moveDown=Gi?
+BookmarkEditorToadlet.moveDown=Gi?
 BookmarkEditorToadlet.moveUp=Su
 BookmarkEditorToadlet.myBookmarksTitle=I Miei Segnalibri
 BookmarkEditorToadlet.nameLabel=Nome :
@@ -50,18 +50,18 @@
 BookmarkEditorToadlet.save=Salva
 BookmarkEditorToadlet.title=Modifica Preferiti
 BookmarkEditorToadlet.urlDecodeError=Errore nella decodifica della URL
-BookmarkItem.bookmarkUpdated=Il sito ${name} ? stato aggiornato all'edizione 
${edition}.
+BookmarkItem.bookmarkUpdated=Il sito ${name} ? stato aggiornato all'edizione 
${edition}.
 BookmarkItem.bookmarkUpdatedShort=Freesite aggiornato: ${name}
 BookmarkItem.bookmarkUpdatedTitle=${name}: link aggiornato
-BookmarkItem.bookmarkUpdatedWithLink=Il Sito ${link}${name}${/link} ? stato 
aggiornato all'edizione ${edition}.
+BookmarkItem.bookmarkUpdatedWithLink=Il Sito ${link}${name}${/link} ? stato 
aggiornato all'edizione ${edition}.
 BookmarkItem.deleteBookmarkUpdateNotification=Elimina notifica
 BookmarkItem.unnamedBookmark=Segnalibro Senza Nome
 BookmarkManager.list=Segnalibri
 BookmarkManager.listLong=Lista dei freesite preferiti
 BookmarkManager.malformedBookmark=Segnalibro malformato
 BooleanOption.parseError=Booleano non riconosciuto: ${val} - prova "vero o 
falso"
-BuildOldAgeUserAlert.tooOld=Il software di questo nodo ? antecedente alla pi? 
vecchia versione (Build #${lastgood}) utilizzabile dai peer aggiornati ai quali 
si cerca di connettersi.  E' necessario aggiornare il nodo al pi? presto 
possibile; non sar? possibile connettersi ai peer etichettati "TROPPO RECENTE" 
finch? il nodo non sar? stato aggiornato (il nodo va tenuto aggiornato o si 
rischia di essere esclusi dalla rete Freenet)
-BuildOldAgeUserAlert.tooOldShort=Il nodo sta utilizzando una versione  di 
Freenet obsoleta al punto da rendere impossibile il collegamento alla rete. Si 
prega di eseguire l'aggiornamento al pi? presto possibile.
+BuildOldAgeUserAlert.tooOld=Il software di questo nodo ? antecedente alla pi? 
vecchia versione (Build #${lastgood}) utilizzabile dai peer aggiornati ai quali 
si cerca di connettersi.  E' necessario aggiornare il nodo al pi? presto 
possibile; non sar? possibile connettersi ai peer etichettati "TROPPO RECENTE" 
finch? il nodo non sar? stato aggiornato (il nodo va tenuto aggiornato o si 
rischia di essere esclusi dalla rete Freenet)
+BuildOldAgeUserAlert.tooOldShort=Il nodo sta utilizzando una versione  di 
Freenet obsoleta al punto da rendere impossibile il collegamento alla rete. Si 
prega di eseguire l'aggiornamento al pi? presto possibile.
 BuildOldAgeUserAlert.tooOldTitle=Versione obsoleta
 CSSTokenizerFilter.deletedDisallowedString=Stringa non permessa eliminata
 CSSTokenizerFilter.deletedUnmatchedChar=Ignorato char non corrispondente:
@@ -70,9 +70,9 @@
 CSSTokenizerFilter.invalidURLContents=Contenuto della url() non valido
 CSSTokenizerFilter.supplementalCharsNotSupported=CARATTERI UCS-4 OLTRE 0xFFFF 
NON SUPPORTATI!
 CSSTokenizerFilter.unknownAtIdentifierLabel=@identifier sconosciuto:
-ClockProblemDetectedUserAlert.shortText=Freenet non pu? connettersi perch? 
l'orologio del computer non ? sincronizzato.
-ClockProblemDetectedUserAlert.text=Freenet ha rilevato che l'orologio di 
sistema (ora e data) non ? regolato correttamente. Il nodo non potr? funzionare 
correttamente finch? non sar? stato riavviato dopo aver regolato l'orologio.
-ClockProblemDetectedUserAlert.title=L'orologio del computer non ? regolato 
correttamente.
+ClockProblemDetectedUserAlert.shortText=Freenet non pu? connettersi perch? 
l'orologio del computer non ? sincronizzato.
+ClockProblemDetectedUserAlert.text=Freenet ha rilevato che l'orologio di 
sistema (ora e data) non ? regolato correttamente. Il nodo non potr? funzionare 
correttamente finch? non sar? stato riavviato dopo aver regolato l'orologio.
+ClockProblemDetectedUserAlert.title=L'orologio del computer non ? regolato 
correttamente.
 ConfigToadlet.appliedFailureExceptions=Le modifiche alla configurazione sono 
state applicate con le seguenti eccezioni:
 ConfigToadlet.appliedFailureTitle=Configurazione Non Applicata!
 ConfigToadlet.appliedSuccess=Le modifiche alla configurazione sono state 
applicate.
@@ -81,18 +81,22 @@
 ConfigToadlet.configNavTitle=Esplora Configurazione
 ConfigToadlet.console=console
 ConfigToadlet.contributeTranslation=Contribuisci alla traduzione
-ConfigToadlet.defaultIs=Il valore predefinito per l'opzione di configurazione 
?: '${default}'.
+ConfigToadlet.defaultIs=Il valore predefinito per l'opzione di configurazione 
?: '${default}'.
 ConfigToadlet.false=falso
 ConfigToadlet.fcp=fcp
 ConfigToadlet.fproxy=fproxy
 ConfigToadlet.fullTitle=Configurazione del nodo Freenet: ${name}
 ConfigToadlet.homepage=Homepage del Nodo
 ConfigToadlet.logger=log
+ConfigToadlet.needRestart=Per attivare dei cambiamenti nella configurazione e' 
necessario il riavvio. Si prega di riavviare il nodo.
+ConfigToadlet.needRestartShort=Per attivare dei cambiamenti nella 
configurazione e' necessario il riavvio. Si prega di riavviare il nodo.
+ConfigToadlet.needRestartTitle=Necessario riavvio del nodo
 ConfigToadlet.node=nodo
 ConfigToadlet.pluginmanager=pluginmanager
 ConfigToadlet.pluginmanager2=pluginmanager2
 ConfigToadlet.possibilitiesTitle=Scegli Azione:
 ConfigToadlet.reset=Annulla
+ConfigToadlet.restartNode=Riavvia Adesso
 ConfigToadlet.returnToNodeConfig=Torna alla configurazione del nodo
 ConfigToadlet.returnToNodeHomepage=Torna alla homepage del nodo
 ConfigToadlet.shortTitle=Configurazione
@@ -108,8 +112,8 @@
 ConfigToadlet.node.scheduler=nodo.schedulatore
 ConfigToadlet.node.testnet=nodo.testnet
 ConfigToadlet.node.updater=nodo.aggiornamento
-ConfigurablePersister.doesNotExistCannotCreate=Il file non esiste e non pu? 
essere creato
-ConfigurablePersister.existsCannotReadWrite=Il file esiste ma non pu? essere 
letto/scritto
+ConfigurablePersister.doesNotExistCannotCreate=Il file non esiste e non pu? 
essere creato
+ConfigurablePersister.existsCannotReadWrite=Il file esiste ma non pu? essere 
letto/scritto
 ConnectionsToadlet.nodeStatus.BACKED OFF=RESPINTO
 ConnectionsToadlet.nodeStatus.BURSTING=BURST
 ConnectionsToadlet.nodeStatus.BUSY=OCCUPATO
@@ -129,8 +133,8 @@
 ConnectivityToadlet.addressTitle=Indirizzo
 ConnectivityToadlet.byIPTitle=Pachetti per ${ip} per indirizzo IP - ${status} 
(lunghezza minima tunnel ${tunnelLength})
 ConnectivityToadlet.byPortTitle=Pacchetti per ${port} per porta - ${status} 
(lunghezza minima tunnel ${tunnelLength})
-ConnectivityToadlet.connectivity=Connettivit? Internet
-ConnectivityToadlet.connectivityTitle=Connettivit?
+ConnectivityToadlet.connectivity=Connettivit? Internet
+ConnectivityToadlet.connectivityTitle=Connettivit?
 ConnectivityToadlet.firstReceiveLeadTime=Da online a prima ricezione
 ConnectivityToadlet.firstSendLeadTime=Da start a prima trasmissione
 ConnectivityToadlet.local=LOCALE
@@ -138,9 +142,9 @@
 ConnectivityToadlet.noreply=NESSUNA RISPOSTA
 ConnectivityToadlet.remote=REMOTO
 ConnectivityToadlet.sentReceivedTitle=Pacchetti ricevuti/trasmessi
-ConnectivityToadlet.summaryTitle=Connettivit?
-ConnectivityToadlet.title=Connettivit? internet di ${nodeName}
-ContentDataFilter.unknownCharset=La pagina che sta per essere visualizzata 
utilizza un formato di caratteri (charset) di tipo sconosciuto. Ci? rende 
impossibile filtrare la pagina, il che potrebbe a sua volta compromettere 
l'anonimato dell'utente.
+ConnectivityToadlet.summaryTitle=Connettivit?
+ConnectivityToadlet.title=Connettivit? internet di ${nodeName}
+ContentDataFilter.unknownCharset=La pagina che sta per essere visualizzata 
utilizza un formato di caratteri (charset) di tipo sconosciuto. Ci? rende 
impossibile filtrare la pagina, il che potrebbe a sua volta compromettere 
l'anonimato dell'utente.
 ContentDataFilter.unknownCharsetTitle=Charset sconosciuto!
 ContentDataFilter.warningUnknownCharsetTitle=Attenzione: charset sconosciuto 
(${charset})
 ContentFilter.applicationPdfReadAdvice=Documento Adobe(R) PDF - MOLTO 
PERICOLOSO!
@@ -150,90 +154,90 @@
 ContentFilter.imageIcoReadAdvice=File icona: probabilmente non pericoloso
 ContentFilter.imageIcoWriteAdvice=File icona - probabilmente non pericoloso 
(ma potrebbe contenere altri dati)
 ContentFilter.imageJpegReadAdvice=Immagine JPEG - probabilmente non pericoloso
-ContentFilter.imageJpegWriteAdvice=Immagine JPEG - probabilmente non 
pericoloso ma pu? contenere dati EXIF
+ContentFilter.imageJpegWriteAdvice=Immagine JPEG - probabilmente non 
pericoloso ma pu? contenere dati EXIF
 ContentFilter.imagePngReadAdvice=Immagine PNG - probabilmente non pericoloso
 ContentFilter.imagePngWriteAdvice=Immagine PNG -  probabilmente non pericoloso 
ma sarebbe opportuno eliminare eventuali commenti e porzioni di testo
-ContentFilter.textCssReadAdvice=CSS (cascading style sheet, di solito ? usato 
in combinazione con HTML) - probabilmente non pericoloso se filtrato, ma il 
filtro non ? del tipo "whitelist" quindi fare attenzione
-ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, solitamente usato 
con HTML) - pu? contenere metadati, controllare manualmente
+ContentFilter.textCssReadAdvice=CSS (cascading style sheet, di solito ? usato 
in combinazione con HTML) - probabilmente non pericoloso se filtrato, ma il 
filtro non ? del tipo "whitelist" quindi fare attenzione
+ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, solitamente usato 
con HTML) - pu? contenere metadati, controllare manualmente
 ContentFilter.textHtmlReadAdvice=HTML - Non pericoloso se filtrato
-ContentFilter.textHtmlWriteAdvice=HTML - pu? contenere metadati di tipo 
pericoloso, ecc; si consiglia di controllare manualmente
-ContentFilter.textPlainReadAdvice=Formato testo semplice (plain text)- non ? 
pericoloso a meno che il browser utilizzato non sia particolarmente "stupido" 
(per esempio Internet Explorer)
+ContentFilter.textHtmlWriteAdvice=HTML - pu? contenere metadati di tipo 
pericoloso, ecc; si consiglia di controllare manualmente
+ContentFilter.textPlainReadAdvice=Formato testo semplice (plain text)- non ? 
pericoloso a meno che il browser utilizzato non sia particolarmente "stupido" 
(per esempio Internet Explorer)
 ContentFilter.textPlainWriteAdvice=Testo semplice (plain text) - non 
pericoloso a meno che l'utente vi includa informazioni compromettenti
 DarknetConnectionsToadlet.activityInserts=Inserzioni: ${totalSenders} totale 
senders, ${CHKhandlers} CHK handlers, ${SSKhandlers} SSK handlers
 DarknetConnectionsToadlet.activityRequests=Richieste: ${totalSenders} totale 
senders, ${CHKhandlers} CHK handlers, ${SSKhandlers} SSK handlers
-DarknetConnectionsToadlet.activityTitle=Attivit? Corrente
+DarknetConnectionsToadlet.activityTitle=Attivit? Corrente
 DarknetConnectionsToadlet.add=Aggiungi
 DarknetConnectionsToadlet.addPeerTitle=Aggiungi un peer
-DarknetConnectionsToadlet.alreadyInReferences=La referenza data ? gi? presente 
in lista.
-DarknetConnectionsToadlet.backedOff=Connesso ma respinto: Il nodo ? connesso a 
questi peer ma la la connessione viene rifiutata e quindi i peer in questione 
non vengono al momento utilizzati per l'instradamento delle richieste
+DarknetConnectionsToadlet.alreadyInReferences=La referenza data ? gi? presente 
in lista.
+DarknetConnectionsToadlet.backedOff=Connesso ma respinto: Il nodo ? connesso a 
questi peer ma la la connessione viene rifiutata e quindi i peer in questione 
non vengono al momento utilizzati per l'instradamento delle richieste
 DarknetConnectionsToadlet.backedOffShort=Respinti
-DarknetConnectionsToadlet.bursting=Non connesso e bursting: per un breve 
periodo, il nodo sta tentando di connettersi a questi peer perch? l'utenete ha 
impostato burstOnly su di essi
+DarknetConnectionsToadlet.bursting=Non connesso e bursting: per un breve 
periodo, il nodo sta tentando di connettersi a questi peer perch? l'utenete ha 
impostato burstOnly su di essi
 DarknetConnectionsToadlet.burstingShort=Bursting
-DarknetConnectionsToadlet.busy=Occupati: Questi peer sono connessi ma ci 
comunicano di essere troppo occupati per poter aggiungere le nostre richieste a 
quelle gi? presenti quindi non vengono temporaneamente utilizzati per 
l'instradamento.
+DarknetConnectionsToadlet.busy=Occupati: Questi peer sono connessi ma ci 
comunicano di essere troppo occupati per poter aggiungere le nostre richieste a 
quelle gi? presenti quindi non vengono temporaneamente utilizzati per 
l'instradamento.
 DarknetConnectionsToadlet.busyShort=Occupati
 DarknetConnectionsToadlet.cancel=Cancella
-DarknetConnectionsToadlet.cantFetchNoderefURL=Non ? stato possibile richiamare 
la referenza di un nodo da ${url}. Riprovare.
-DarknetConnectionsToadlet.cantParseTryAgain=Non ? stato possibile interpretare 
it testo dato come refernza di un nodo: (${error}).
-DarknetConnectionsToadlet.cantParseWrongEnding=Non ? stato possibile 
interpretare le referenza: L'ultimo rigo dovrebbe contenere solo la parola End, 
esso contiene invece: ${end}
-DarknetConnectionsToadlet.clockProblem=L'orologio di sitema e l'orologio del 
nodo differiscono di oltre 24 ore.  Ci? potrebbe causare problemi con 
l'aggiornamento e con i client. La connessione ? stata pertanto disabilitata,
+DarknetConnectionsToadlet.cantFetchNoderefURL=Non ? stato possibile richiamare 
la referenza di un nodo da ${url}. Riprovare.
+DarknetConnectionsToadlet.cantParseTryAgain=Non ? stato possibile interpretare 
it testo dato come refernza di un nodo: (${error}).
+DarknetConnectionsToadlet.cantParseWrongEnding=Non ? stato possibile 
interpretare le referenza: L'ultimo rigo dovrebbe contenere solo la parola End, 
esso contiene invece: ${end}
+DarknetConnectionsToadlet.clockProblem=L'orologio di sitema e l'orologio del 
nodo differiscono di oltre 24 ore.  Ci? potrebbe causare problemi con 
l'aggiornamento e con i client. La connessione ? stata pertanto disabilitata,
 DarknetConnectionsToadlet.clockProblemShort=Problema di sincronizzazione 
orologio
-DarknetConnectionsToadlet.confirmRemoveNode=Conferma rimozione di "${name}" ? 
Rimuovere un nodo che ? stato disconnesso per meno di una settimana non ? 
consigliabile. L'azione pi? appropriata sarebbe di attendere ancora un po', 
considerando che potrebbe trattarsi di un problema temporaneo, e che ci sono 
utenti che non hanno la possibilit? lasciar girare il proprio nodo giorno e 
notte.
+DarknetConnectionsToadlet.confirmRemoveNode=Conferma rimozione di "${name}" ? 
Rimuovere un nodo che ? stato disconnesso per meno di una settimana non ? 
consigliabile. L'azione pi? appropriata sarebbe di attendere ancora un po', 
considerando che potrebbe trattarsi di un problema temporaneo, e che ci sono 
utenti che non hanno la possibilit? lasciar girare il proprio nodo giorno e 
notte.
 DarknetConnectionsToadlet.confirmRemoveNodeTitle=Conferma
 DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=Rimozione Nodo
 DarknetConnectionsToadlet.connError=Connessione fallita (il nodo ha un 'bug'?)
 DarknetConnectionsToadlet.connErrorShort=Errore di Connessione
-DarknetConnectionsToadlet.connected=Connesso: Il nodo ? connesso a questi peer:
+DarknetConnectionsToadlet.connected=Connesso: Il nodo ? connesso a questi peer:
 DarknetConnectionsToadlet.connectedShort=Connessi
 DarknetConnectionsToadlet.darknetFnpPort=Darknet FNP: ${port}/UDP (usata per 
connessioni a peer affidabili. Forwardare se possibile)
 DarknetConnectionsToadlet.disabled=Non connesso e disabilitato: L'utente ha 
configurato il nodo in maniera da non connettersi a questo peer.
 DarknetConnectionsToadlet.disabledShort=Disabilitato
-DarknetConnectionsToadlet.disconnecting=Disconnessione in corso (si sta 
procedendo alla rimozione del nodo; ? necessario informare il nodo in questione 
e ci? potrebbe richiedere un po' di tempo)
+DarknetConnectionsToadlet.disconnecting=Disconnessione in corso (si sta 
procedendo alla rimozione del nodo; ? necessario informare il nodo in questione 
e ci? potrebbe richiedere un po' di tempo)
 DarknetConnectionsToadlet.disconnectingShort=Disconnessione in corso
 DarknetConnectionsToadlet.enterDescription=Inserisci descrizione:
 DarknetConnectionsToadlet.failedToAddNodeInternalError=Impossibile 
interpretare il testo dato comereferenza di un nodo Freenet. Si prega di 
riportare agli sviluppatori quanto segue:
 DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=Aggiunta nuovo 
nodo fallita: Errore interno.
 DarknetConnectionsToadlet.failedToAddNodeTitle=Aggiunta Nodo Fallita
-DarknetConnectionsToadlet.fcpDisabled=FCP non ? abilitato (per applicazioni 
client di Freenet come Frost e Thaw)
+DarknetConnectionsToadlet.fcpDisabled=FCP non ? abilitato (per applicazioni 
client di Freenet come Frost e Thaw)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/tcp (per le applicazioni client 
di Freenet, per esempio Frost e Thaw)
 DarknetConnectionsToadlet.fileReference=Seleziona il file contenente la 
referenza:
-DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp (Comunicazione tra nodi. Di 
solito questa ? l'unica porta che si potrebbe aver bisogno di forwardare)
+DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp (Comunicazione tra nodi. Di 
solito questa ? l'unica porta che si potrebbe aver bisogno di forwardare)
 DarknetConnectionsToadlet.forceRemove=Rimozione Forzata
-DarknetConnectionsToadlet.fproxyDisabled=FProxy non ? abilitato (questa 
interfaccia web)
+DarknetConnectionsToadlet.fproxyDisabled=FProxy non ? abilitato (questa 
interfaccia web)
 DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/tcp (questa interfaccia 
web)
 DarknetConnectionsToadlet.fullTitle=${counts} Amici (peer affidabili) di 
${name}
 DarknetConnectionsToadlet.go=Vai
-DarknetConnectionsToadlet.idleTime=Tempo trascorso da quando il nodo ? 
connesso o da quando lo ? stato per l'ultima volta
+DarknetConnectionsToadlet.idleTime=Tempo trascorso da quando il nodo ? 
connesso o da quando lo ? stato per l'ultima volta
 DarknetConnectionsToadlet.idleTimeTitle=Connesso / Inattivo
-DarknetConnectionsToadlet.invalidSignature=Non ? stato possibile verificare le 
firma elettronica della refernza (${error}).
+DarknetConnectionsToadlet.invalidSignature=Non ? stato possibile verificare le 
firma elettronica della refernza (${error}).
 DarknetConnectionsToadlet.ipAddress=Indirizzo del nodo in formato IP:porta
 DarknetConnectionsToadlet.ipAddressTitle=Indirizzo
-DarknetConnectionsToadlet.listenOnly=Non connesso e solo ascolto: il nodo non 
cercher? di connettersi a questo peer perch? l'utente l'ha impostato su solo 
ascolto (listenOnly)
+DarknetConnectionsToadlet.listenOnly=Non connesso e solo ascolto: il nodo non 
cercher? di connettersi a questo peer perch? l'utente l'ha impostato su solo 
ascolto (listenOnly)
 DarknetConnectionsToadlet.listenOnlyShort=Solo ascolto
-DarknetConnectionsToadlet.listening=Non connesso ma in ascolto: il nodo non 
cercher? spesso di connettersi con questo peer perch? l'utente l'ha impostato 
su burstOnly
+DarknetConnectionsToadlet.listening=Non connesso ma in ascolto: il nodo non 
cercher? spesso di connettersi con questo peer perch? l'utente l'ha impostato 
su burstOnly
 DarknetConnectionsToadlet.listeningShort=Ascolto
 DarknetConnectionsToadlet.myFriends=I Miei Amici (peer affidabili aggiunti da 
me)
 DarknetConnectionsToadlet.myReferenceHeader=${linkref}Referenza del 
Nodo${/linkref} (${linktext}testo${/linktext})
 DarknetConnectionsToadlet.nameClickToMessage=Nome del nodo. Clicca sul nome 
per mandare un messaggio a questo peer:
 DarknetConnectionsToadlet.nameTitle=Nome
-DarknetConnectionsToadlet.neverConnected=Mai Connesso. Questo peer non ? mai 
stato connesso al nostro nodo.
+DarknetConnectionsToadlet.neverConnected=Mai Connesso. Questo peer non ? mai 
stato connesso al nostro nodo.
 DarknetConnectionsToadlet.neverConnectedShort=Mai connesso
-DarknetConnectionsToadlet.noPeersFirstHalf=Freenet non pu? funzionare perch? 
non sono stati ancora aggiunti dei peer ai quali connettersi.
+DarknetConnectionsToadlet.noPeersFirstHalf=Freenet non pu? funzionare perch? 
non sono stati ancora aggiunti dei peer ai quali connettersi.
 DarknetConnectionsToadlet.noPeersSecondHalf=Leggi l'infobox in alto per vedere 
come si fa.
-DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet non pu? funzionare 
perch? non sono ancora stati aggiunti dei peer ai quali collegarsi. Alla pagina 
${link}node homepage${/link}, in alto, si pu? leggere come fare.
-DarknetConnectionsToadlet.noRefOrURL=Non ? stato possibile rilevare una 
referenza nodo o una URL. Si prega di riprovare.
+DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet non pu? funzionare 
perch? non sono ancora stati aggiunti dei peer ai quali collegarsi. Alla pagina 
${link}node homepage${/link}, in alto, si pu? leggere come fare.
+DarknetConnectionsToadlet.noRefOrURL=Non ? stato possibile rilevare una 
referenza nodo o una URL. Si prega di riprovare.
 DarknetConnectionsToadlet.noRequests=Al momento, il nodo non sta elaborando 
alcuna richiesta.
 DarknetConnectionsToadlet.nodeHomepage=homepage del nodo
 DarknetConnectionsToadlet.nodePortsTitle=Porte utilizzate dal Nodo
 DarknetConnectionsToadlet.notConnected=Non connesso: Finora non ci sono state 
connessioni ma il nodo cerca continuamente di connettersi
 DarknetConnectionsToadlet.notConnectedShort=Disconnessi
-DarknetConnectionsToadlet.opennetFnpPort=Opennet FNP: ${port}/UDP (usata per 
connessioni a peer non affidabili, cio? Sconosciuti. Forwardare se possibile)
-DarknetConnectionsToadlet.pasteReference=Incolla la referenza qui (il nodo 
elliminer? automaticamente le parti aggiunte da chat clients, p.es. <toad_>) :
+DarknetConnectionsToadlet.opennetFnpPort=Opennet FNP: ${port}/UDP (usata per 
connessioni a peer non affidabili, cio? Sconosciuti. Forwardare se possibile)
+DarknetConnectionsToadlet.pasteReference=Incolla la referenza qui (il nodo 
elliminer? automaticamente le parti aggiunte da chat clients, p.es. <toad_>) :
 DarknetConnectionsToadlet.privateNote=Un commento privato relativo a questo 
nodo:
 DarknetConnectionsToadlet.privateNoteTitle=Nota Privata
-DarknetConnectionsToadlet.referenceCopyWarning=La referenza del nodo va 
copiata ${bold}SENZA VARIAZIONI${/bold}. Qualsiasi modificazione la render? 
${bold}inutilizzabile${/bold}..
+DarknetConnectionsToadlet.referenceCopyWarning=La referenza del nodo va 
copiata ${bold}SENZA VARIAZIONI${/bold}. Qualsiasi modificazione la render? 
${bold}inutilizzabile${/bold}..
 DarknetConnectionsToadlet.remove=Elimina
 DarknetConnectionsToadlet.removePeers=Elimina peer selezionati
-DarknetConnectionsToadlet.routingDisabled=Non sta instradando traffico: (la 
connessione tra nodo locale e remoto ? attiva ma uno dei due rifiuta di 
instradare traffico)
+DarknetConnectionsToadlet.routingDisabled=Non sta instradando traffico: (la 
connessione tra nodo locale e remoto ? attiva ma uno dei due rifiuta di 
instradare traffico)
 DarknetConnectionsToadlet.routingDisabledShort=Non instrada traffico
 DarknetConnectionsToadlet.seedClients=Nodi per i quali il nodo locale sta 
facendo da seednode.
 DarknetConnectionsToadlet.seedClientsShort=Seeding per
@@ -244,38 +248,38 @@
 DarknetConnectionsToadlet.sendMessageToPeers=Manda messaggio ai peer 
selezionati
 DarknetConnectionsToadlet.separator=-- -- --
 DarknetConnectionsToadlet.statusTitle=Status
-DarknetConnectionsToadlet.tmciDisabled=TMCI non ? abilitato (semplice 
interfaccia a comandi testuali simile a telnet)
+DarknetConnectionsToadlet.tmciDisabled=TMCI non ? abilitato (semplice 
interfaccia a comandi testuali simile a telnet)
 DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/tcp (semplice interfaccia a 
comandi testuali simile a telnet)
 DarknetConnectionsToadlet.tooNew=Connesso ma troppo recente: La versione 
obbligatoria minima di questo peer e' maggiore della versione che stiamo 
utilizzando.
 DarknetConnectionsToadlet.tooNewShort=Troppo recente
-DarknetConnectionsToadlet.tooOld=Connesso ma obsoleto: Questo peer sta usando 
una versione obsoleta di Freenet. Esso non sar? utilizzato per l'instradamento 
delle richieste.
+DarknetConnectionsToadlet.tooOld=Connesso ma obsoleto: Questo peer sta usando 
una versione obsoleta di Freenet. Esso non sar? utilizzato per l'instradamento 
delle richieste.
 DarknetConnectionsToadlet.tooOldShort=Obsoleti
 DarknetConnectionsToadlet.transferringRequests=Richieste trasferimento: invio 
${senders}, ricezione ${receivers}
-DarknetConnectionsToadlet.triedToAddSelf=Non ? possibile aggiungere il proprio 
stesso nodo ad una lista di peer remoti.
-DarknetConnectionsToadlet.unauthorized=L'accesso a questa pagina ? interedetto.
+DarknetConnectionsToadlet.triedToAddSelf=Non ? possibile aggiungere il proprio 
stesso nodo ad una lista di peer remoti.
+DarknetConnectionsToadlet.unauthorized=L'accesso a questa pagina ? interedetto.
 DarknetConnectionsToadlet.unknownAddress=(indirizzo sconosciuto)
 DarknetConnectionsToadlet.updateChangedPrivnotes=Aggiorna commenti
 DarknetConnectionsToadlet.urlReference=Inserire qui la URL della referenza:
 DarknetConnectionsToadlet.versionTitle=Versione
 ExtOldAgeUserAlert.extTooOld=Il file freenet-ext.jar sembra essere corrotto od 
obsoleto: Per l'aggiornamento usare 
http://downloads.freenetproject.org/alpha/freenet-ext.jar
-ExtOldAgeUserAlert.extTooOldShort=Il file freenet-ext.jar ? obsoleto. Si prega 
di aggiornarlo.
+ExtOldAgeUserAlert.extTooOldShort=Il file freenet-ext.jar ? obsoleto. Si prega 
di aggiornarlo.
 ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext obsoleto
 FProxyToadlet.abortToHomepage=Interrompi e ritorna alla homepage di FProxy
 FProxyToadlet.alerts=Messaggi dettagliati sullo stato del nodo
 FProxyToadlet.alertsTitle=Avvertenze
 FProxyToadlet.backToFProxy=${link}Clicca qui${/link} per andare alla homepage 
di FProxy
 FProxyToadlet.backToReferrer=${link}Clicca qui${/link} per tornare alla pagina 
referente.
-FProxyToadlet.cantBindPort=Non ? possibile abbinare FProxy a quella porta!
+FProxyToadlet.cantBindPort=Non ? possibile abbinare FProxy a quella porta!
 FProxyToadlet.config=configura il nodo
 FProxyToadlet.configTitle=Configurazione
 FProxyToadlet.dangerousContentTitle=Contenuto Potenzialmente Pericoloso
-FProxyToadlet.dangerousRSS=Il file richiesto potrebbe essere RSS. Questo tipo 
di file non pu? essere filtrato  da Freenet nel modo giusto, ed inoltre 
potrebbe contenere dei difetti (web-bugs) come immagini in-line ecc, che 
potrebbero esporre l'indirizzo IP del computer in uso ad eventuali 
siti-trappola e pertanto mettere a serio rischio l'anonimato dell'utente. 
Firefox 2.0 e Internet Explorer 7.0 aprono il file come RSS anche se la 
tipologia del contentuto (content type) ? "${type}".
+FProxyToadlet.dangerousRSS=Il file richiesto potrebbe essere RSS. Questo tipo 
di file non pu? essere filtrato  da Freenet nel modo giusto, ed inoltre 
potrebbe contenere dei difetti (web-bugs) come immagini in-line ecc, che 
potrebbero esporre l'indirizzo IP del computer in uso ad eventuali 
siti-trappola e pertanto mettere a serio rischio l'anonimato dell'utente. 
Firefox 2.0 e Internet Explorer 7.0 aprono il file come RSS anche se la 
tipologia del contentuto (content type) ? "${type}".
 FProxyToadlet.dangerousRSSSubtitle=I feed RSS possono costituire un pericolo
 FProxyToadlet.dangerousRSSTitle=Contentuto Potenzialmente Pericoloso (RSS)
 FProxyToadlet.downloadInBackgroundToDisk=Scarica in background e conserva 
nella directory dei download
-FProxyToadlet.errorIsFatal=Questo ? un errore grave (fatal error). Riprovare 
probabilmente non risolver? il problema.
+FProxyToadlet.errorIsFatal=Questo ? un errore grave (fatal error). Riprovare 
probabilmente non risolver? il problema.
 FProxyToadlet.errorWithReason=Errore: ${error}
-FProxyToadlet.expectedKeyButGot=Invece di una chiave Freenet, ? stato ricevuto:
+FProxyToadlet.expectedKeyButGot=Invece di una chiave Freenet, ? stato ricevuto:
 FProxyToadlet.expectedMimeType=MIME type che ci si aspettava: ${mime}
 FProxyToadlet.explanationTitle=Spiegazione
 FProxyToadlet.fetchLargeFileAnywayAndDisplay=Apri comunque e mostra il file 
nel browser
@@ -292,20 +296,20 @@
 FProxyToadlet.invalidKeyTitle=Chiave non valida
 FProxyToadlet.invalidKeyWithReason=Chiave non valida: ${reason}
 FProxyToadlet.largeFile=File di grosse dimensioni
-FProxyToadlet.largeFileExplanationAndOptions=La chiave Freenet richiesta fa 
riferimento a un file di grosse dimensioni.I file cos? grandi di solito non 
possono essere mandati direttamente al browser perch? il nodo avrebbe bisogno 
di troppo tempo per richiamarli. Le seguenti opzioni sono disponibili:
-FProxyToadlet.mayChange=(pu? cambiare)
+FProxyToadlet.largeFileExplanationAndOptions=La chiave Freenet richiesta fa 
riferimento a un file di grosse dimensioni.I file cos? grandi di solito non 
possono essere mandati direttamente al browser perch? il nodo avrebbe bisogno 
di troppo tempo per richiamarli. Le seguenti opzioni sono disponibili:
+FProxyToadlet.mayChange=(pu? cambiare)
 FProxyToadlet.mimeType=MIME type: ${mime}
 FProxyToadlet.notEnoughMetaStrings=Non ci sono abbastanza meta-strings
 FProxyToadlet.notFoundTitle=Non Trovato
-FProxyToadlet.openAsText=${link}Clicca qui${/link} per aprire il file come 
testo 'liscio' (plain text) . Questo non dovrebbe essere pericoloso ma la 
visualizzazione pu? risultare disturbata.
+FProxyToadlet.openAsText=${link}Clicca qui${/link} per aprire il file come 
testo 'liscio' (plain text) . Questo non dovrebbe essere pericoloso ma la 
visualizzazione pu? risultare disturbata.
 FProxyToadlet.openAsThawIndex=${link}Clicca qui${/link} per aprire un file con 
il browser di indici Thaw. (leggere l'avvertenza!)
 FProxyToadlet.openForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (leggi l'avvertenza sopra!).
 FProxyToadlet.openForceDisk=${link}Clicca qui${/link} per scaricare il file su 
disco.
 FProxyToadlet.openPossRSSAsForceDisk=${link}Clicka qui${/link} per scaricare 
il file su disco (${bold}possibile pericolo${/bold} se si sta usando Firefox 
2.0.0.0; il problema dovrebbe essere stato risolto in 2.0.0.1
-FProxyToadlet.openPossRSSAsPlainText=${link}Clicca qui${/link} per aprire il 
file come testo 'liscio' (plain text) (ci? ${bold}pu? rappresentare un 
pericolo${/bold} se si sta usando IE7 o FF2).
-FProxyToadlet.openPossRSSForceDisk=${link}Clicca qui${/link} per cercare di 
costringere il browser a scaricare il file su disco (${bold}Pu? essere 
pericoloso se si sta usando Firefox 2.0.0${/bold} ; il problema dovrebbe essere 
risolto in 2.0.1).
-FProxyToadlet.openRSSAsRSS=${link}Clicca qui${/link} per aprire il file come 
RSS (ci? ${bold}rappresenta un pericolo${/bold} se l'autore del sito ? mal 
intenzionato, perch? il filtraggio di RSS in Freenet non ? ancora stato 
implementato).
-FProxyToadlet.openRSSForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (ci? ${bold}pu? costituire un pericolo${/bold} se si usa IE7 o FF2).
+FProxyToadlet.openPossRSSAsPlainText=${link}Clicca qui${/link} per aprire il 
file come testo 'liscio' (plain text) (ci? ${bold}pu? rappresentare un 
pericolo${/bold} se si sta usando IE7 o FF2).
+FProxyToadlet.openPossRSSForceDisk=${link}Clicca qui${/link} per cercare di 
costringere il browser a scaricare il file su disco (${bold}Pu? essere 
pericoloso se si sta usando Firefox 2.0.0${/bold} ; il problema dovrebbe essere 
risolto in 2.0.1).
+FProxyToadlet.openRSSAsRSS=${link}Clicca qui${/link} per aprire il file come 
RSS (ci? ${bold}rappresenta un pericolo${/bold} se l'autore del sito ? mal 
intenzionato, perch? il filtraggio di RSS in Freenet non ? ancora stato 
implementato).
+FProxyToadlet.openRSSForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (ci? ${bold}pu? costituire un pericolo${/bold} se si usa IE7 o FF2).
 FProxyToadlet.opennet=gestisci connessioni non affidabili
 FProxyToadlet.opennetTitle=Sconosciuti
 FProxyToadlet.options=Opzioni disponibili:
@@ -322,36 +326,36 @@
 FProxyToadlet.statsTitle=Statistiche
 FProxyToadlet.translation=helper per tradurre l'interfaccia del nodo nella tua 
lingua
 FProxyToadlet.translationTitle=Traduzione
-FProxyToadlet.unableToRetrieve=Non ? stato possibile richiamare questo file.
+FProxyToadlet.unableToRetrieve=Non ? stato possibile richiamare questo file.
 FProxyToadlet.unknownMIMEType=MIME type: sconosciuto
 FProxyToadlet.welcome=homepage
 FProxyToadlet.welcomeTitle=Home
 FcpServer.allowedHosts=Host abilitati (Leggere l'avvertenza)
-FcpServer.allowedHostsFullAccess=Host ai quali ? consentito accesso pieno
+FcpServer.allowedHostsFullAccess=Host ai quali ? consentito accesso pieno
 FcpServer.allowedHostsFullAccessLong=Indirizzi IP ai quali e' consentito pieno 
accesso al nodo. I client su questi IP possono riavviare il nodo, 
riconfigurarlo ecc. Attenzione: a *tutti* I client e' consentito di fare I/O 
diretto sul disco
-FcpServer.allowedHostsLong=Indirizzi IP ai quali ? consentito connettersi al 
server FCP. Pu? essere una lista di di IP singoli separati da virgole e 
indirizzi IP in formato CIDR come 192.168.0.0/24. AVVERTENZA! Chiunque abbia 
accesso a FCP potr? caricare su Freenet  qualsiasi file al quale il nodo abbia 
accesso e scaricare su disco qualsiasi file da Freenet (i file esistenti non 
verranno sovrascritti)
+FcpServer.allowedHostsLong=Indirizzi IP ai quali ? consentito connettersi al 
server FCP. Pu? essere una lista di di IP singoli separati da virgole e 
indirizzi IP in formato CIDR come 192.168.0.0/24. AVVERTENZA! Chiunque abbia 
accesso a FCP potr? caricare su Freenet  qualsiasi file al quale il nodo abbia 
accesso e scaricare su disco qualsiasi file da Freenet (i file esistenti non 
verranno sovrascritti)
 FcpServer.assumeDownloadDDAIsAllowed=Presumere che il download DDA sia 
permesso?
-FcpServer.assumeDownloadDDAIsAllowedLong=Presumere che il download DDA sia 
permesso? Se impostato su 'false' bisogner? fare una TestDDARequest prima di 
ogni accesso DDA
+FcpServer.assumeDownloadDDAIsAllowedLong=Presumere che il download DDA sia 
permesso? Se impostato su 'false' bisogner? fare una TestDDARequest prima di 
ogni accesso DDA
 FcpServer.assumeUploadDDAIsAllowed=Presumere che l'upload di DDA sia permesso?
-FcpServer.assumeUploadDDAIsAllowedLong=Presumere che l'upload DDA Sia 
permesso? Se impostato su 'falso', bisogner? fare una TestDDARequest prima di 
ogni accesso DDA.
+FcpServer.assumeUploadDDAIsAllowedLong=Presumere che l'upload DDA Sia 
permesso? Se impostato su 'falso', bisogner? fare una TestDDARequest prima di 
ogni accesso DDA.
 FcpServer.bindTo=Indirizzo IP collegato
 FcpServer.bindToLong=Indirizzo IP collegato al server FCP.
-FcpServer.cannotStartOrStopOnTheFly=Non ? possibile arrestare il server FCP 
"al volo"
-FcpServer.couldNotChangeBindTo=Non ? stato possibile modificare l'indirizzo 
FCP collegato: ${error}.
-FcpServer.downloadsFileCanCreateCannotReadOrWrite=Il file ? stato creato ma 
non ? possibile leggerlo e scriverlo
-FcpServer.downloadsFileDoesNotExistCannotCreate=Il file non esiste e non ? 
possibile crearlo
-FcpServer.downloadsFileExistsCannotReadOrWrite=Il file esiste ma non ? 
possibile leggerlo e scriverlo
+FcpServer.cannotStartOrStopOnTheFly=Non ? possibile arrestare il server FCP 
"al volo"
+FcpServer.couldNotChangeBindTo=Non ? stato possibile modificare l'indirizzo 
FCP collegato: ${error}.
+FcpServer.downloadsFileCanCreateCannotReadOrWrite=Il file ? stato creato ma 
non ? possibile leggerlo e scriverlo
+FcpServer.downloadsFileDoesNotExistCannotCreate=Il file non esiste e non ? 
possibile crearlo
+FcpServer.downloadsFileExistsCannotReadOrWrite=Il file esiste ma non ? 
possibile leggerlo e scriverlo
 FcpServer.downloadsFileIsDirectory=Nome non valido per una lista di download: 
si tratta di una directory
 FcpServer.downloadsFileParentDoesNotExist=La directory superiore non esiste
-FcpServer.downloadsFileUnreadable=Il file esiste ma non ? possibile leggerlo
+FcpServer.downloadsFileUnreadable=Il file esiste ma non ? possibile leggerlo
 FcpServer.enablePersistentDownload=Abilitare download persistenti?
-FcpServer.enablePersistentDownloadLong=Abilita Persistence=forever 
(persistenza illimitata) per le richieste FCP. Abilitando questa opzione si 
permette alle richieste di persistere attraverso il riavvio del nodo: tali 
richieste devono essere scritte sul disco rigido e questo in alcuni casi 
particolari pu? costituire un problema di sicurezza
+FcpServer.enablePersistentDownloadLong=Abilita Persistence=forever 
(persistenza illimitata) per le richieste FCP. Abilitando questa opzione si 
permette alle richieste di persistere attraverso il riavvio del nodo: tali 
richieste devono essere scritte sul disco rigido e questo in alcuni casi 
particolari pu? costituire un problema di sicurezza
 FcpServer.filenameToStorePData=File contenente download persistenti
 FcpServer.filenameToStorePDataLong=File contenente download persistenti.
 FcpServer.intervalBetweenWrites=Intervallo di scrittura dei download 
persistenti su disco
 FcpServer.intervalBetweenWritesLong=Intervallo tra le scritture di download 
persistenti su disco. (millisecondi)
-FcpServer.isEnabled=FCP server ? abilitato?
-FcpServer.isEnabledLong=FCP server ? abilitato?
+FcpServer.isEnabled=FCP server ? abilitato?
+FcpServer.isEnabledLong=FCP server ? abilitato?
 FcpServer.portNumber=Numero della porta FCP
 FcpServer.portNumberLong=Numero della porta FCP.
 FcpServer.ssl=Abilitare ssl?
@@ -361,31 +365,31 @@
 FetchException.longError.11=Troppe componenti di percorso. Prova a eliminarne 
uno
 FetchException.longError.12=Errore interno relativo ai file temporanei: 
potrebbe trattarsi di esaurimento dello spazio libero su disco rigido o di un 
problema relativo a permessi ed autorizzazioni
 FetchException.longError.13=Dati non trovati
-FetchException.longError.14=Percorso non trovato: non ? stato possobile 
trovare un numero di nodi sufficiente ad essere certi che i dati non esistono
-FetchException.longError.15=Un nodo ? stato sovraccaricato o ? uscito fuori 
tempo massimo
+FetchException.longError.14=Percorso non trovato: non ? stato possobile 
trovare un numero di nodi sufficiente ad essere certi che i dati non esistono
+FetchException.longError.15=Un nodo ? stato sovraccaricato o ? uscito fuori 
tempo massimo
 FetchException.longError.16=Troppi redirects - loop?
 FetchException.longError.17=Errore interno, probabilmente un bug
-FetchException.longError.18=Il file ? stato trovato ma ? andato perso durante 
la ricezione
+FetchException.longError.18=Il file ? stato trovato ma ? andato perso durante 
la ricezione
 FetchException.longError.19=Errore splitfile
 FetchException.longError.2=Il nodo non sa cosa fare dello splitfile
 FetchException.longError.20=URI non valida
 FetchException.longError.21=Troppo grande
 FetchException.longError.22=Volume dei metadati troppo grande
 FetchException.longError.23=Troppi blocchi per segmento
-FetchException.longError.24=Sono necessarie pi? metastringhe (componenti di 
percorso) nella URI
+FetchException.longError.24=Sono necessarie pi? metastringhe (componenti di 
percorso) nella URI
 FetchException.longError.25=Annullato
 FetchException.longError.26=Archivio riavviato
 FetchException.longError.27=Redirezione permanente: usare la nuova URI
-FetchException.longError.28=Non ? stato possibile raccogliere dati in quantit? 
sufficiente; dati parziali sono stati richiamati ma il redirect potrebbe 
puntare su localit? non valide
+FetchException.longError.28=Non ? stato possibile raccogliere dati in quantit? 
sufficiente; dati parziali sono stati richiamati ma il redirect potrebbe 
puntare su localit? non valide
 FetchException.longError.29=MIME Type non valido: chiave non presente in lista 
di MIME type permessi fornita dal client.
 FetchException.longError.3=Metadati non utilizzabili
-FetchException.longError.30=La richiesta ? stata terminata da un nodo perch? 
esso aveva da poco ricevuto un'altra richiesta per la stessa chiave e quella 
richiesta non era andata a buon fine.
-FetchException.longError.4=Non ? stato possibile interpretare i metadati.
+FetchException.longError.30=La richiesta ? stata terminata da un nodo perch? 
esso aveva da poco ricevuto un'altra richiesta per la stessa chiave e quella 
richiesta non era andata a buon fine.
+FetchException.longError.4=Non ? stato possibile interpretare i metadati.
 FetchException.longError.5=Fallimento durante l'estrazione di file da un 
archivio
-FetchException.longError.6=Non ? stato possibile decodificare un blocco
+FetchException.longError.6=Non ? stato possibile decodificare un blocco
 FetchException.longError.7=Metadati divisi in troppi livelli
-FetchException.longError.8=La richiesta ? stata riavviata troppe volte a causa 
di cambiamenti negli archivii
-FetchException.longError.9=Troppe redirezioni (troppa ricorsivit?)
+FetchException.longError.8=La richiesta ? stata riavviata troppe volte a causa 
di cambiamenti negli archivii
+FetchException.longError.9=Troppe redirezioni (troppa ricorsivit?)
 FetchException.shortError.1=Recursione archivio troppo profonda
 FetchException.shortError.10=Non in archivio
 FetchException.shortError.11=Troppe componenti nel percorso
@@ -402,14 +406,14 @@
 FetchException.shortError.21=Troppo grande
 FetchException.shortError.22=Volume metadati eccessivo
 FetchException.shortError.23=Troppi blocchi per segmento
-FetchException.shortError.24=Quantit? meta-strings insufficiente
+FetchException.shortError.24=Quantit? meta-strings insufficiente
 FetchException.shortError.25=Annullato da caller
 FetchException.shortError.26=Archivio riavviato
 FetchException.shortError.27=Nuova URI
 FetchException.shortError.28=Non sono stati trovati tutti i dati
 FetchException.shortError.29=Errore: MIME type sbagliato
 FetchException.shortError.3=Metadati sconosciuti
-FetchException.shortError.30=Non ? stato possibile trovare i dati richiesti 
(fallimento recente)
+FetchException.shortError.30=Non ? stato possibile trovare i dati richiesti 
(fallimento recente)
 FetchException.shortError.4=Metadati non validi
 FetchException.shortError.5=Fallimento archivio
 FetchException.shortError.6=Errore decodifica block
@@ -419,7 +423,7 @@
 FileOffer.acceptTransferButton=Accetta Trasferimento
 FileOffer.askUserTitle=Trasferimento file diretto.
 FileOffer.commentLabel=Commenti:
-FileOffer.failedReceiveHeader=Non ? stato possibile completare il 
trasferimento del file ${filename} da ${node}.
+FileOffer.failedReceiveHeader=Non ? stato possibile completare il 
trasferimento del file ${filename} da ${node}.
 FileOffer.failedReceiveShort=Trasferimento di ${filename} da ${node} fallito.
 FileOffer.failedReceiveTitle=Trasferimento fallito
 FileOffer.fileLabel=File:
@@ -429,36 +433,36 @@
 FileOffer.rejectTransferButton=Rifiuta trasferimento
 FileOffer.senderLabel=Mittente:
 FileOffer.sizeLabel=Dimensioni:
-FileOffer.succeededReceiveHeader=Il trasferimento del file ${filename} da 
${node} ? stato completato.
-FileOffer.succeededReceiveShort=${filename} ? stato ricevuto da ${node}.
+FileOffer.succeededReceiveHeader=Il trasferimento del file ${filename} da 
${node} ? stato completato.
+FileOffer.succeededReceiveShort=${filename} ? stato ricevuto da ${node}.
 FileOffer.succeededReceiveTitle=Trasferimento file completato
 FirstTimeWizardToadlet.bandwidthLimit=Limitazione banda
-FirstTimeWizardToadlet.bandwidthLimitLong=Scegliere il tipo di connessione e 
la velocit? dal drop-down menu.
-FirstTimeWizardToadlet.bwlimitHigherSpeed=Velocit? maggiore
-FirstTimeWizardToadlet.bwlimitLowerSpeed=Velocit? minore
-FirstTimeWizardToadlet.chooseNodeName=Il nome del nodo ? obbligatorio!
-FirstTimeWizardToadlet.chooseNodeNameLong=Inserire un nome per il nodo. Il 
nome sar? visibile ai peer darknet, quelli manualmente aggiunti dall'utente, e 
non sar? visibile dai peer opeennet (aggiunti automaticamente) . Si consiglia 
di usare il proprio nickname IRC possibilmente con un'informazione per il 
conctatto in modo da essere reperibili in caso di problemi ("Mario Rossi marior 
at sitodimario.com").
+FirstTimeWizardToadlet.bandwidthLimitLong=Scegliere il tipo di connessione e 
la velocit? dal drop-down menu.
+FirstTimeWizardToadlet.bwlimitHigherSpeed=Velocit? maggiore
+FirstTimeWizardToadlet.bwlimitLowerSpeed=Velocit? minore
+FirstTimeWizardToadlet.chooseNodeName=Il nome del nodo ? obbligatorio!
+FirstTimeWizardToadlet.chooseNodeNameLong=Inserire un nome per il nodo. Il 
nome sar? visibile ai peer darknet, quelli manualmente aggiunti dall'utente, e 
non sar? visibile dai peer opeennet (aggiunti automaticamente) . Si consiglia 
di usare il proprio nickname IRC possibilmente con un'informazione per il 
conctatto in modo da essere reperibili in caso di problemi ("Mario Rossi marior 
at sitodimario.com").
 FirstTimeWizardToadlet.clickContinue=Clicca qui per continuare.
 FirstTimeWizardToadlet.congratz=Benvenuto a bordo!
-FirstTimeWizardToadlet.congratzLong=Congratulazioni, la configurazione di base 
del nodo Freenet ? completa. E' possibile cambiare e modificare ognuno dei 
parametri appena impostati usando la pagina "configurazione" che ? 
raggiungibile attraverso il menu sulla sinistra dell'interfaccia. Vi auguriamo 
una piacevole esperienza con Freenet.
+FirstTimeWizardToadlet.congratzLong=Congratulazioni, la configurazione di base 
del nodo Freenet ? completa. E' possibile cambiare e modificare ognuno dei 
parametri appena impostati usando la pagina "configurazione" che ? 
raggiungibile attraverso il menu sulla sinistra dell'interfaccia. Vi auguriamo 
una piacevole esperienza con Freenet.
 FirstTimeWizardToadlet.connectToStrangers=Connetti a sconosciuti?
-FirstTimeWizardToadlet.connectToStrangersLong=In un mondo ideale, ogni utente 
Freenet si connetterebbe esclusivamente con nodi gestiti da persone fid?te. 
Qesto ? di gran lunga il sistema pi? sicuro, che rende molto difficile per un 
osservatore esterno determinare se un nodo stia o meno girando sul computer 
osservato. D'altra parte, non avendo a disposizione almeno cinque amici, 
parenti o conoscenti fid?ti che gi? usano Freenet, ai quali connettersi, come 
soluzione alternativa ? possibile lasciare che il nodo si connetta 
automaticamente a nodi gestiti da sconosciuti. Questa opzione pu? essere 
disattivata in qualsiasi momento.
+FirstTimeWizardToadlet.connectToStrangersLong=In un mondo ideale, ogni utente 
Freenet si connetterebbe esclusivamente con nodi gestiti da persone fid?te. 
Qesto ? di gran lunga il sistema pi? sicuro, che rende molto difficile per un 
osservatore esterno determinare se un nodo stia o meno girando sul computer 
osservato. D'altra parte, non avendo a disposizione almeno cinque amici, 
parenti o conoscenti fid?ti che gi? usano Freenet, ai quali connettersi, come 
soluzione alternativa ? possibile lasciare che il nodo si connetta 
automaticamente a nodi gestiti da sconosciuti. Questa opzione pu? essere 
disattivata in qualsiasi momento.
 FirstTimeWizardToadlet.continue=Continua
 FirstTimeWizardToadlet.continueEnd=Clicca qui per cominciare ad usare Freenet!
 FirstTimeWizardToadlet.datastoreSize=Dimensioni magazzino dati (datastore)
-FirstTimeWizardToadlet.datastoreSizeLong=Selezionare le dimensione desiderata 
per il file di immagazzinaggio dati (datastore). Il datastore funziona come una 
cache. Immagazzinare dati per il network aumenta il volume di scambio quando i 
file sono molto richiesti. Pi? spazio ci si pu? permettere di dedicare a 
Freenet e meglio ? per la comunit?. Un datastore di grosse dimensioni aumenta 
notevolmente la velocit? del nodo.
+FirstTimeWizardToadlet.datastoreSizeLong=Selezionare le dimensione desiderata 
per il file di immagazzinaggio dati (datastore). Il datastore funziona come una 
cache. Immagazzinare dati per il network aumenta il volume di scambio quando i 
file sono molto richiesti. Pi? spazio ci si pu? permettere di dedicare a 
Freenet e meglio ? per la comunit?. Un datastore di grosse dimensioni aumenta 
notevolmente la velocit? del nodo.
 FirstTimeWizardToadlet.enableOpennet=Connettersi automaticamente a nodi non 
affidabili gestiti da sconosciuti?
 FirstTimeWizardToadlet.fivePercentDisk=(= 5% di spazio libero su disco)
 FirstTimeWizardToadlet.homepageTitle=Configurazione Automatica Freenet
 FirstTimeWizardToadlet.iDoTrust=Possiamo fidarci degli utenti connessi a 
${interface} (${ip}) ?
-FirstTimeWizardToadlet.isNetworkTrusted=La rete locale ? affidabile?
-FirstTimeWizardToadlet.isNetworkTrustedLong=La rete locale ? affidabile? 
Rispondendo di si a questa domanda, tutti i servizii forniti dal nodo Freenet 
saranno pienamente accessibili da chiunque sul network suddetto. E' possibile 
configurare un accesso pi? selettivo attraverso la pagina "configurazione" dopo 
aver completato questo wizard.
+FirstTimeWizardToadlet.isNetworkTrusted=La rete locale ? affidabile?
+FirstTimeWizardToadlet.isNetworkTrustedLong=La rete locale ? affidabile? 
Rispondendo di si a questa domanda, tutti i servizii forniti dal nodo Freenet 
saranno pienamente accessibili da chiunque sul network suddetto. E' possibile 
configurare un accesso pi? selettivo attraverso la pagina "configurazione" dopo 
aver completato questo wizard.
 FirstTimeWizardToadlet.memoryLimit=Utilizzo memoria
-FirstTimeWizardToadlet.memoryLimitLong=Specifica il valore massimo della 
memoria utilizzabile da Freenet. Il nodo ha bisogno di pi? memoria se ci sono 
molti file in coda per il download/upload. Si raccomanda di non impostare 
questa opzione per un valore inferiore a 128MB tranne nel caso in cui la 
memoria totale a disposizione sia veramente poca. Se il computer ha 1GB di 
memoria RAM o pi?, si consiglia di usare almeno 256MB. Il cambiamento avr? 
effetto dopo aver riavviato Freenet.
-FirstTimeWizardToadlet.noNetworkIF=Non ? stata trovata nessuna interfaccia di 
rete addizionale
-FirstTimeWizardToadlet.noNetworkIFLong=Freenet non ha trovato altre interfacce 
di rete, quindi dar? per scontato che l'utente si connetter? dal computer 
locale e solo da quello.
-FirstTimeWizardToadlet.opennetNo=Si, ho almeno 5 amici che usano Freenet e 
aggiunger? i loro dati alla pagina degli Amici.
-FirstTimeWizardToadlet.opennetWarning=In Paesi dove networking anonimo ? 
illegale e/o se usa Freenet per accedere a materiale che potrebbe mettere nei 
guai chi ne fosse trovato in possesso, un serio pericolo pu? risultare dal 
configurare il nodo in modo da connettersi automaticamente a nodi gestiti da 
sconosciuti, facilitando il il compito ad un avversario determinato. Freenet ? 
ancora in fase sperimentale, gli autori non sono in grado di garatire sicurezza 
assoluta.
+FirstTimeWizardToadlet.memoryLimitLong=Specifica il valore massimo della 
memoria utilizzabile da Freenet. Il nodo ha bisogno di pi? memoria se ci sono 
molti file in coda per il download/upload. Si raccomanda di non impostare 
questa opzione per un valore inferiore a 128MB tranne nel caso in cui la 
memoria totale a disposizione sia veramente poca. Se il computer ha 1GB di 
memoria RAM o pi?, si consiglia di usare almeno 256MB. Il cambiamento avr? 
effetto dopo aver riavviato Freenet.
+FirstTimeWizardToadlet.noNetworkIF=Non ? stata trovata nessuna interfaccia di 
rete addizionale
+FirstTimeWizardToadlet.noNetworkIFLong=Freenet non ha trovato altre interfacce 
di rete, quindi dar? per scontato che l'utente si connetter? dal computer 
locale e solo da quello.
+FirstTimeWizardToadlet.opennetNo=Si, ho almeno 5 amici che usano Freenet e 
aggiunger? i loro dati alla pagina degli Amici.
+FirstTimeWizardToadlet.opennetWarning=In Paesi dove networking anonimo ? 
illegale e/o se usa Freenet per accedere a materiale che potrebbe mettere nei 
guai chi ne fosse trovato in possesso, un serio pericolo pu? risultare dal 
configurare il nodo in modo da connettersi automaticamente a nodi gestiti da 
sconosciuti, facilitando il il compito ad un avversario determinato. Freenet ? 
ancora in fase sperimentale, gli autori non sono in grado di garatire sicurezza 
assoluta.
 FirstTimeWizardToadlet.opennetYes=No, voglio che il nodo trovi automaticamente 
degli sconosciuti ai quali connettersi.
 FirstTimeWizardToadlet.selectLanguage=Lingua
 FirstTimeWizardToadlet.selectLanguageLong=Selezionare una lingua dalla lista 
qui sotto:
@@ -468,93 +472,93 @@
 FirstTimeWizardToadlet.step3Title=Configurazione automatica di Freenet - 
Limiti ampiezza di banda
 FirstTimeWizardToadlet.step4Title=Freenet first time wizard! - Dimensioni 
magazzino dati (datastore)
 FirstTimeWizardToadlet.step5Title=Configurazione Automatica Freenet - 
Configurazione rete
-FirstTimeWizardToadlet.step6Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ? ora configurato.
-FirstTimeWizardToadlet.step7Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ? ora configurato.
+FirstTimeWizardToadlet.step6Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ? ora configurato.
+FirstTimeWizardToadlet.step7Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ? ora configurato.
 FirstTimeWizardToadlet.tenPercentDisk=(= 10% di spazio libero su disco)
 FirstTimeWizardToadlet.warningTitle=Avvertenza!
-FirstTimeWizardToadlet.welcomeInfoboxContent1=Benvenuti nella Configurazione 
Automatica Freenet, che vi permetter? di configurare Freenet e cominciare ad 
usarlo velocemente e facilmente.
+FirstTimeWizardToadlet.welcomeInfoboxContent1=Benvenuti nella Configurazione 
Automatica Freenet, che vi permetter? di configurare Freenet e cominciare ad 
usarlo velocemente e facilmente.
 FirstTimeWizardToadlet.welcomeInfoboxTitle=Benevenuti in Configurazione 
Automatica Freenet
 FirstTimeWizardToadlet.memory.128M=128Mb - Il minimo indispensabile
 FirstTimeWizardToadlet.memory.192M=192Mb - Default ragionevole.
 FirstTimeWizardToadlet.memory.256M=256Mb - Per computer con almeno 1GB di RAM
 FirstTimeWizardToadlet.memory.512M=512Mb - per computer con molta memoria RAM
-FirstTimeWizardToadlet.memory.64M=64MB - Usare solo in caso di estrema 
necessit?
+FirstTimeWizardToadlet.memory.64M=64MB - Usare solo in caso di estrema 
necessit?
 FproxyToadlet.dangerousRSSTitle=Contenuto potenzialmente pericoloso (RSS)
 GIFFilter.invalidHeader=Il file non contiene un header GIF valido.
 GIFFilter.invalidHeaderTitle=Header non valido
-GIFFilter.notGif=Il file che si sta cercando di richiamare non ? una GIF. 
Potrebbe trattarsi di un file in un altro formato, ed il browser potrebbe fare 
qualcosa di pericoloso a cause della confusione generata dalla mancata 
corrispondenza; il file ? stato pertanto bloccato.
-GIFFilter.tooShort=Il file ? troppo piccolo per essere una GIF.
+GIFFilter.notGif=Il file che si sta cercando di richiamare non ? una GIF. 
Potrebbe trattarsi di un file in un altro formato, ed il browser potrebbe fare 
qualcosa di pericoloso a cause della confusione generata dalla mancata 
corrispondenza; il file ? stato pertanto bloccato.
+GIFFilter.tooShort=Il file ? troppo piccolo per essere una GIF.
 GIFFilter.tooShortTitle=Troppo corto
-GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=Non ? stato 
possibile interpretare come URI Freenet assoluta.
-GenericReadFilterCallback.couldNotParseFormURIWithError=Il filtro non ? 
riuscito ad interpretare ${error} dalla URI.
-GenericReadFilterCallback.couldNotParseRelativeFreenetURI=Non ? stato 
possibile interpretare come Freenet URI relativa.
+GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=Non ? stato 
possibile interpretare come URI Freenet assoluta.
+GenericReadFilterCallback.couldNotParseFormURIWithError=Il filtro non ? 
riuscito ad interpretare ${error} dalla URI.
+GenericReadFilterCallback.couldNotParseRelativeFreenetURI=Non ? stato 
possibile interpretare come Freenet URI relativa.
 GenericReadFilterCallback.couldNotParseURIWithError=Il filtro ha fallito 
nell'analisi della URI: ${error}
 GenericReadFilterCallback.invalidFormURI=URI form non valida: punta a risorsa 
esterna
 GenericReadFilterCallback.invalidFormURIAttemptToEscape=Tentativo di evasione 
dalla struttura delle directory
 GenericReadFilterCallback.malformedAbsoluteURL=URL malformata (assoluto): 
${error}
 GenericReadFilterCallback.malformedRelativeURL=URL malformata (relativa): 
${error}
-GenericReadFilterCallback.protocolNotEscaped=Non ? un protocollo fuggitivo: 
${protocol}
-HTMLFilter.couldNotParseStyle=Non ? stato possibile abbinare lo stile 
dell'input
+GenericReadFilterCallback.protocolNotEscaped=Non ? un protocollo fuggitivo: 
${protocol}
+HTMLFilter.couldNotParseStyle=Non ? stato possibile abbinare lo stile 
dell'input
 HTMLFilter.deletedUnknownStyle=stile sconosciuto eliminato
-HTMLFilter.failedToParseLabel=Il filtro HTML non ? riuscito a interpretare la 
pagina
+HTMLFilter.failedToParseLabel=Il filtro HTML non ? riuscito a interpretare la 
pagina
 HTMLFilter.tooManyNestedStyleOrScriptTags=Troppi tag 'style' annidati e/o 
troppi tag di scripting: analisi ambigua o non valida
-HTMLFilter.tooManyNestedStyleOrScriptTagsLong=Troppi tag </style> annidati - 
analisi ambigua o non valida. Non ? possibile filtrare in modo affidabile 
quindi i tag interni sono stai rimossi: questo pu? causare al browser qualche 
inconveniente nella visuallizzazione
+HTMLFilter.tooManyNestedStyleOrScriptTagsLong=Troppi tag </style> annidati - 
analisi ambigua o non valida. Non ? possibile filtrare in modo affidabile 
quindi i tag interni sono stai rimossi: questo pu? causare al browser qualche 
inconveniente nella visuallizzazione
 HTMLFilter.unknownTag=tag sconosciuto ${tag}
 IPDetectorPluginManager.connectionProblems=Problemi di connessione:
 IPDetectorPluginManager.direct=Il computer sembra essere direttamente connesso 
a Internet, dovrebbe essere quindi possibile connettersi con qualunque nodo 
Freenet.
 IPDetectorPluginManager.directTitle=Rilevata connessione diretta a Internet
-IPDetectorPluginManager.forwardPort=Il tuo nodo sembra essere dietro qualche 
tipo di NAT (vedi la pagina connettivit? per dettagli). Se possibile, dovresti 
forwardare le porte UDP (not TCP) ${port} per migliorare la connettivit?. E' 
possibile comunque che tu abbia gi? provveduto; Serve del tempo a Freenet per 
rilevare il port forward. Leggi ${link}qui${/link} per ulteriori informazioni.
-IPDetectorPluginManager.forwardPortMaybeForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit?. E' possibile comunque che ci? 
sia gi? stato fatto: occorre un po' di tempo perch? Freenet rilevi il port 
forward. Clicca ${link}qui${/link} per maggiori informazioni.
-IPDetectorPluginManager.forwardPortNotForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit?. Sembra che ci? non sia stato 
fatto, anche occorre un po' di tempo perch? Freenet rilevi il port forward. 
Clicca ${link}qui${/link} per maggiori informazioni
+IPDetectorPluginManager.forwardPort=Il tuo nodo sembra essere dietro qualche 
tipo di NAT (vedi la pagina connettivit? per dettagli). Se possibile, dovresti 
forwardare le porte UDP (not TCP) ${port} per migliorare la connettivit?. E' 
possibile comunque che tu abbia gi? provveduto; Serve del tempo a Freenet per 
rilevare il port forward. Leggi ${link}qui${/link} per ulteriori informazioni.
+IPDetectorPluginManager.forwardPortMaybeForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit?. E' possibile comunque che ci? 
sia gi? stato fatto: occorre un po' di tempo perch? Freenet rilevi il port 
forward. Clicca ${link}qui${/link} per maggiori informazioni.
+IPDetectorPluginManager.forwardPortNotForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit?. Sembra che ci? non sia stato 
fatto, anche occorre un po' di tempo perch? Freenet rilevi il port forward. 
Clicca ${link}qui${/link} per maggiori informazioni
 IPDetectorPluginManager.forwardPortShort=Per favore, forwardare la porta UDP 
${port}.
-IPDetectorPluginManager.forwardPortShortMaybeForwarded=Si prega di configurare 
il forward della porta ${port} UDP (questo potrebbe essere gi? stato fatto, ma 
non ancora rilevato)
+IPDetectorPluginManager.forwardPortShortMaybeForwarded=Si prega di configurare 
il forward della porta ${port} UDP (questo potrebbe essere gi? stato fatto, ma 
non ancora rilevato)
 IPDetectorPluginManager.forwardPortShortNotForwarded=Si prega di configurare 
il forward per la porta ${port} UDP .
-IPDetectorPluginManager.forwardTwoPorts=Il tuo nodo sembra essere dietro 
quanlche tipo di NAT (vedi la pagina connettivit? per dettagli). Se possibile, 
dovresti eseguire il forward UDP (non TCP) delle porte ${port1} e ${port2} per 
migliorare la connettivit?. E' possibile comunque che tu abbia gi? provveduto; 
serve del tempo a Freenet per determinare l'avvenuto forward. Leggi 
${link}qui${/link} per ulteriori informazioni.
-IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=Sembra che il nodo si 
trovi dietro una NAt di qualche tipo (vedi pagina connettivit? per i 
dettaglil). Se possibile, bigognerebbe configurare il forward per la porta 
${port} UDP (non TCP) allo scopo di migliorare la connettivit?. E' possibile 
comunque che ci? sia gi? stato fatto: occorre un po' di tempo perch? Freenet 
rilevi il port forward. Clicca ${link}qui${/link} per maggiori informazioni
-IPDetectorPluginManager.forwardTwoPortsNotForwarded=Pare che il nodo sia 
dietro una  NAT (controllare la pagina connettivit? per i dettagli). PSe 
possibile si dovrebbe configurare il forward per le porte ${port1} e ${port2} 
UDP (non TCP), allo scopo di migliorare la connettivit?. Sembra che il forward 
delle porte non sia attivo, anche se Freenet non pu? determinarlo per certo. 
Controllare ${link}qui${/link} per ulteriori informazioni.
+IPDetectorPluginManager.forwardTwoPorts=Il tuo nodo sembra essere dietro 
quanlche tipo di NAT (vedi la pagina connettivit? per dettagli). Se possibile, 
dovresti eseguire il forward UDP (non TCP) delle porte ${port1} e ${port2} per 
migliorare la connettivit?. E' possibile comunque che tu abbia gi? provveduto; 
serve del tempo a Freenet per determinare l'avvenuto forward. Leggi 
${link}qui${/link} per ulteriori informazioni.
+IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=Sembra che il nodo si 
trovi dietro una NAt di qualche tipo (vedi pagina connettivit? per i 
dettaglil). Se possibile, bigognerebbe configurare il forward per la porta 
${port} UDP (non TCP) allo scopo di migliorare la connettivit?. E' possibile 
comunque che ci? sia gi? stato fatto: occorre un po' di tempo perch? Freenet 
rilevi il port forward. Clicca ${link}qui${/link} per maggiori informazioni
+IPDetectorPluginManager.forwardTwoPortsNotForwarded=Pare che il nodo sia 
dietro una  NAT (controllare la pagina connettivit? per i dettagli). PSe 
possibile si dovrebbe configurare il forward per le porte ${port1} e ${port2} 
UDP (non TCP), allo scopo di migliorare la connettivit?. Sembra che il forward 
delle porte non sia attivo, anche se Freenet non pu? determinarlo per certo. 
Controllare ${link}qui${/link} per ulteriori informazioni.
 IPDetectorPluginManager.forwardTwoPortsShort=Per favore, forwardare le porte 
UDP ${port1} e ${port2}.
-IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=Configurare il 
forward  per porte ${port1} e ${port2} UDP (potrebbe essere gi? stato fatto).
+IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=Configurare il 
forward  per porte ${port1} e ${port2} UDP (potrebbe essere gi? stato fatto).
 IPDetectorPluginManager.forwardTwoPortsShortNotForwarded=Si prega di 
configurare il forward per le porte ${port1} e ${port2} UDP.
 IPDetectorPluginManager.fullCone=La connessione a Internet sembra avvenire 
attraverso una "full cone" NAT. Il nodo dovrebbe riuscire connettersi con 
qualunque altro nodo Freenet.
 IPDetectorPluginManager.fullConeTitle=Rilevata full cone NAT
-IPDetectorPluginManager.maybeAlreadyForwarded=Potrebbe essere gi? stato fatto 
(? difficile per Freenet determinarlo).
-IPDetectorPluginManager.noConnectivity=La connessione a Internet non sembra 
essere provvista di supporto UDP. A meno che non si tratti di un rilevamento 
erroneo, non ? probabile che Freenet possa funzionare al momento.
-IPDetectorPluginManager.noConnectivityTitle=Mancanza di connettivit? UDP
-IPDetectorPluginManager.noConnectivityshort=Gravi problemi di connessione: 
Nessuna connettivit? UDP, Freenet non pu? funzionare!
+IPDetectorPluginManager.maybeAlreadyForwarded=Potrebbe essere gi? stato fatto 
(? difficile per Freenet determinarlo).
+IPDetectorPluginManager.noConnectivity=La connessione a Internet non sembra 
essere provvista di supporto UDP. A meno che non si tratti di un rilevamento 
erroneo, non ? probabile che Freenet possa funzionare al momento.
+IPDetectorPluginManager.noConnectivityTitle=Mancanza di connettivit? UDP
+IPDetectorPluginManager.noConnectivityshort=Gravi problemi di connessione: 
Nessuna connettivit? UDP, Freenet non pu? funzionare!
 
IPDetectorPluginManager.portForwardHelpURL=http://wiki.freenetproject.org/FirewallAndRouterIssues
-IPDetectorPluginManager.portRestricted=La connessione a Internet sembra 
avvenire attraverso una NAT a porte ristrette (router). Il nodo potr? 
connettersi a quasi tutti gli altri nodi ma non a quelli dietro NAT simmetrica.
+IPDetectorPluginManager.portRestricted=La connessione a Internet sembra 
avvenire attraverso una NAT a porte ristrette (router). Il nodo potr? 
connettersi a quasi tutti gli altri nodi ma non a quelli dietro NAT simmetrica.
 IPDetectorPluginManager.portRestrictedTitle=Port restricted cone NAT rilevata
 IPDetectorPluginManager.restricted=La connessione a Internet sembra avvenire 
attraverso una "restricted cone" NAT (router). Dovrebbe essere comunque 
possibile connettersi alla maggior parte dei nodi Freenet.
 IPDetectorPluginManager.restrictedTitle=E' stata rilevata una restricted cone 
NAT
 IPDetectorPluginManager.seriousConnectionProblems=Gravi problemi di 
connessione:
 IPDetectorPluginManager.suggestForwardPort=Potrebbe essere necessario 
configurare  manualmente il 'port forwarding'  per la porta UDP numero ${port}. 
Vedi: http://wiki.freenetproject.org/FirewallAndRouterIssues (disponibile solo 
in inglese, per ora).
-IPDetectorPluginManager.suggestForwardPortWithLink=Potrebbe essere necessario 
${link}configurare il port forwarding${/link} (porta UDP numero ${port}) 
manualmente (oppure ci? ? gi? stato fatto: Freenet pu? avere delle difficolt? 
in questo tipo di rilevazione).
+IPDetectorPluginManager.suggestForwardPortWithLink=Potrebbe essere necessario 
${link}configurare il port forwarding${/link} (porta UDP numero ${port}) 
manualmente (oppure ci? ? gi? stato fatto: Freenet pu? avere delle difficolt? 
in questo tipo di rilevazione).
 IPDetectorPluginManager.suggestForwardTwoPorts=Sarebbe opportuno configurare 
manualmente il port forward sul router per le porte ${port1} e ${port2} (UDP). 
vedi http://wiki.freenetproject.org/FirewallAndRouterIssues (disponibile solo 
in inglese, per ora).
-IPDetectorPluginManager.suggestForwardTwoPortsWithLink=Potrebbe essere 
necessario configurare manualmente ${link}il forward delle porte${/link} Per 
porte nummero ${port1} e ${port2}, UDP. (questo messaggio pu? in alcuni casi 
continuare ad apparire per un po' di tempo dopo aver configurato il forward)
-IPDetectorPluginManager.symmetric=Dai rilevamenti appare che il nodo potrebbe 
trovarsi dietro una NAT simmetrica o un firewall. Probabilmente, sar? possibile 
connettersi ad utenti connessi direttamente a internet o dietro restricted cone 
NAT
-IPDetectorPluginManager.symmetricPS=Il nodo si trova dietro una NAT 
simmetrica. Queta ? una situazione particolarmente  particolarmente 
problematica: ? necessario configurare il forward delle porte. In caso 
contrario potrebbe risultare impossibile connettersi alla maggioranza dei nodi.
+IPDetectorPluginManager.suggestForwardTwoPortsWithLink=Potrebbe essere 
necessario configurare manualmente ${link}il forward delle porte${/link} Per 
porte nummero ${port1} e ${port2}, UDP. (questo messaggio pu? in alcuni casi 
continuare ad apparire per un po' di tempo dopo aver configurato il forward)
+IPDetectorPluginManager.symmetric=Dai rilevamenti appare che il nodo potrebbe 
trovarsi dietro una NAT simmetrica o un firewall. Probabilmente, sar? possibile 
connettersi ad utenti connessi direttamente a internet o dietro restricted cone 
NAT
+IPDetectorPluginManager.symmetricPS=Il nodo si trova dietro una NAT 
simmetrica. Queta ? una situazione particolarmente  particolarmente 
problematica: ? necessario configurare il forward delle porte. In caso 
contrario potrebbe risultare impossibile connettersi alla maggioranza dei nodi.
 IPDetectorPluginManager.symmetricTitle=Rilevato firewall simmetrico
-IPUndetectedUserAlert.detecting=Freenet sta cercando in questo momento di 
rilevare l'indirizzo IP esterno. Il protrarsi della durata di questa operazione 
oltre il limite di pochi minuti ? indicativo di problemi.
+IPUndetectedUserAlert.detecting=Freenet sta cercando in questo momento di 
rilevare l'indirizzo IP esterno. Il protrarsi della durata di questa operazione 
oltre il limite di pochi minuti ? indicativo di problemi.
 IPUndetectedUserAlert.detectingShort=Indirizzo IP esterno in corso di 
rilevamento.
-IPUndetectedUserAlert.detectingWithConfigLink=Freenet sta rilevando 
l'indirizzo IP esterno. Se l'operazione dura pi? di qualche minuto si pu? 
presumere che qualcosa non stia andando come dovrebbe e si pu? provare ad usare 
il Suggerimento Temporaneo per l'Indirizzo IP ${link}parametro di 
configurazione${/link}.
+IPUndetectedUserAlert.detectingWithConfigLink=Freenet sta rilevando 
l'indirizzo IP esterno. Se l'operazione dura pi? di qualche minuto si pu? 
presumere che qualcosa non stia andando come dovrebbe e si pu? provare ad usare 
il Suggerimento Temporaneo per l'Indirizzo IP ${link}parametro di 
configurazione${/link}.
 IPUndetectedUserAlert.suggestForwardPort=Sarebbe opportuno configurare il port 
forward sul router per le porte ${port1} e ${port2} (UDP) in modo da facilitare 
le connessioni.
 IPUndetectedUserAlert.suggestForwardTwoPorts=Sarebbe opportuno configurare il 
port forward sul router per le porte ${port1} e ${port2} (UDP) in modo da 
facilitare le connessioni.
-IPUndetectedUserAlert.unknownAddress=Non ? stato possibile rilevare 
l'indirizzo IP esterno (o l'indirizzo IP del NAT box o del firewall). Si pu? 
comunque scambiare refs con altri utenti, ma sar? possibile connettersi 
solamente a nodi che non si trovino a loro volta dietro NAT o firewall. Non 
appaena ci si sar? connessi in questo modo ad almeno un altro utente, sar? 
possibile determinare l'indirizzo IP esterno. Si pu? suggerire al nodo 
l'indirizzo IP esterno usando 'Suggerimento Temporaneo per l'Indirizzo IP' 
${link}parametro di configurazione${/link}
-IPUndetectedUserAlert.unknownAddressShort=Non ? stato possibile rilevare 
l'indirizzo IP. Potrebbero verificarsi problemi di connessione.
+IPUndetectedUserAlert.unknownAddress=Non ? stato possibile rilevare 
l'indirizzo IP esterno (o l'indirizzo IP del NAT box o del firewall). Si pu? 
comunque scambiare refs con altri utenti, ma sar? possibile connettersi 
solamente a nodi che non si trovino a loro volta dietro NAT o firewall. Non 
appaena ci si sar? connessi in questo modo ad almeno un altro utente, sar? 
possibile determinare l'indirizzo IP esterno. Si pu? suggerire al nodo 
l'indirizzo IP esterno usando 'Suggerimento Temporaneo per l'Indirizzo IP' 
${link}parametro di configurazione${/link}
+IPUndetectedUserAlert.unknownAddressShort=Non ? stato possibile rilevare 
l'indirizzo IP. Potrebbero verificarsi problemi di connessione.
 IPUndetectedUserAlert.unknownAddressTitle=Indirizzo esterno sconosciuto
-IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet non ha potuto 
rilevare l'indirizzo IP esterno (o l'indirizzo IP del NAT box o firewall). E' 
comunque possibile scambiare referenze con altri utenti, ma la connessione 
avverr? soltanto se l'altra parte non ? a sua volta dietro NAT o firewall. 
Appena connesso ad almeno un utente in questo modo, Freenet riuscit? a 
determinare l'indirizzo IP esterno.E' possibile suggerire al nodo l'IP esterno 
usando il campo 'suggerimento provvisorio per l'indirizzo IP'  ${link}parametro 
di configurazione${/link}. Sarebbe inlotre auspicabile configurare il forward 
UDP per la porta ${port} sul router, in modo da rendere pi? facili le 
connessioni
-InsertException.longError.1=Caller ha fornito una URI che non ? possibile 
utilizzare"
+IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet non ha potuto 
rilevare l'indirizzo IP esterno (o l'indirizzo IP del NAT box o firewall). E' 
comunque possibile scambiare referenze con altri utenti, ma la connessione 
avverr? soltanto se l'altra parte non ? a sua volta dietro NAT o firewall. 
Appena connesso ad almeno un utente in questo modo, Freenet riuscit? a 
determinare l'indirizzo IP esterno.E' possibile suggerire al nodo l'IP esterno 
usando il campo 'suggerimento provvisorio per l'indirizzo IP'  ${link}parametro 
di configurazione${/link}. Sarebbe inlotre auspicabile configurare il forward 
UDP per la porta ${port} sul router, in modo da rendere pi? facili le 
connessioni
+InsertException.longError.1=Caller ha fornito una URI che non ? possibile 
utilizzare"
 InsertException.longError.10=Annullato dall'utente
 InsertException.longError.11=Meta string (probabilmente '/') usata nella URI
 InsertException.longError.12=Errore di formattazione nel blob binario
 InsertException.longError.2=Errore bucket interno: potrebbe trattarsi di 
mancanza di spazio sufficiente su disco rigido o di mancanza di autorizzazione.
 InsertException.longError.3=Errore interno
-InsertException.longError.4=Un nodo 'a valle' (downstream) ? andato in time 
out o ? stato gravemente sovraccaricato
-InsertException.longError.5=Non ? stato possibile propagare questa inserzione 
su un numero sufficiente di nodi (questo e' normale su network di piccole 
dimensioni: si pu? provare a richiamare il file comunque)
+InsertException.longError.4=Un nodo 'a valle' (downstream) ? andato in time 
out o ? stato gravemente sovraccaricato
+InsertException.longError.5=Non ? stato possibile propagare questa inserzione 
su un numero sufficiente di nodi (questo e' normale su network di piccole 
dimensioni: si pu? provare a richiamare il file comunque)
 InsertException.longError.6=Errori fatali in un'inserzione di splitfiles
-InsertException.longError.7=Non ? stato possibile inserire splitfile: numero 
di tentativi esaurito (errori nonfatali)
-InsertException.longError.8=Non ? stato possibile far partire l'inserzione dal 
nodo locale.
-InsertException.longError.9=L' inserzione ? in conflitto con dati 
pre-esistenti e differenti alla stessa chiave
+InsertException.longError.7=Non ? stato possibile inserire splitfile: numero 
di tentativi esaurito (errori nonfatali)
+InsertException.longError.8=Non ? stato possibile far partire l'inserzione dal 
nodo locale.
+InsertException.longError.9=L' inserzione ? in conflitto con dati 
pre-esistenti e differenti alla stessa chiave
 InsertException.shortError.1=URI non valida
 InsertException.shortError.10=Annullato
 InsertException.shortError.11=Meta string usata nella chiave
@@ -565,39 +569,39 @@
 InsertException.shortError.5=Percorso non trovato
 InsertException.shortError.6=Alcuni block sono falliti in modo fatale
 InsertException.shortError.7=Alcuni block hanno esaurito il numero di 
tentativi a disposizione
-InsertException.shortError.8=Non ? stato possibile inoltrare la richiesta
+InsertException.shortError.8=Non ? stato possibile inoltrare la richiesta
 InsertException.shortError.9=Conflitto con dati esistenti
-IntOption.parseError=Il valore specificato non pu? essere interpretato come 
32-bit integer : ${val}
-InvalidAddressOverrideUserAlert.unknownAddress=Freenet ha rilevato che il 
valore attualmente in uso per ipAddessOverride non ? valido in quanto non 
conforme alla sintassi appropriata per un hostname n? per un indirizzo IPv4 o 
IPv6 (in accordo con l'implementazione corrente della funzione che controlla la 
sintassi per indirizzi IPv6)
+IntOption.parseError=Il valore specificato non pu? essere interpretato come 
32-bit integer : ${val}
+InvalidAddressOverrideUserAlert.unknownAddress=Freenet ha rilevato che il 
valore attualmente in uso per ipAddessOverride non ? valido in quanto non 
conforme alla sintassi appropriata per un hostname n? per un indirizzo IPv4 o 
IPv6 (in accordo con l'implementazione corrente della funzione che controlla la 
sintassi per indirizzi IPv6)
 InvalidAddressOverrideUserAlert.unknownAddressShort=L' indirizzo IP impostato 
manualmente (ipAddressOverride) non funziona. si prega di correggerlo.
 InvalidAddressOverrideUserAlert.unknownAddressTitle=Valore Override Indirizzo 
non Valido
-InvalidAddressOverrideUserAlert.unknownAddressWithConfigLink=Freenet ha 
rilevato che il valore attualmente in uso per ipAddessOverride non ? valido in 
quanto non conforme alla sintassi appropriata per un hostname n? per un 
indirizzo IPv4 o IPv6 (in accordo con l'implementazione corrente della funzione 
che controlla la sintassi per indirizzi IPv6) E' possibile correggere l' 
Override indirizzo IP ${link}configuration parameter${/link}.
-JPEGFilter.notJpeg=Le dimensioni del file che si sta cercando di richiamare 
sono troppo ridotte perch? possa trattarsi di un'immagine JPEG. Potrebbe essere 
un file in un altro formato e il browser potrebbe fare qualcosa di sbagliato a 
causa della mancata corrispondenza; il file ? stato pertanto bloccato.
+InvalidAddressOverrideUserAlert.unknownAddressWithConfigLink=Freenet ha 
rilevato che il valore attualmente in uso per ipAddessOverride non ? valido in 
quanto non conforme alla sintassi appropriata per un hostname n? per un 
indirizzo IPv4 o IPv6 (in accordo con l'implementazione corrente della funzione 
che controlla la sintassi per indirizzi IPv6) E' possibile correggere l' 
Override indirizzo IP ${link}configuration parameter${/link}.
+JPEGFilter.notJpeg=Le dimensioni del file che si sta cercando di richiamare 
sono troppo ridotte perch? possa trattarsi di un'immagine JPEG. Potrebbe essere 
un file in un altro formato e il browser potrebbe fare qualcosa di sbagliato a 
causa della mancata corrispondenza; il file ? stato pertanto bloccato.
 JPEGFilter.tooShort=File troppo piccolo per un JPEG.
 JPEGFilter.tooShortTitle=Troppo corto
-KnownUnsafeContentTypeException.dangerousInlines=Contenuto di questo tipo pu? 
includere immagini o video che vengono caricati direttamente da internet, 
esponendo l'indirizzo IP dell'utente e quindi compromettendone gravemente 
l'anonimato.
+KnownUnsafeContentTypeException.dangerousInlines=Contenuto di questo tipo pu? 
includere immagini o video che vengono caricati direttamente da internet, 
esponendo l'indirizzo IP dell'utente e quindi compromettendone gravemente 
l'anonimato.
 KnownUnsafeContentTypeException.dangerousInlinesLabel=Collegamenti esterni 
pericolosi:
-KnownUnsafeContentTypeException.dangerousLinks=Contenuto di questo tipo pu? 
includere dei link a pagine pubblicate al di fuori di Freenet. Cliccando su 
tali link (e possono essere camuffati) si espone il proprio indirizzo IP, 
compromettendo l'anonimato.
+KnownUnsafeContentTypeException.dangerousLinks=Contenuto di questo tipo pu? 
includere dei link a pagine pubblicate al di fuori di Freenet. Cliccando su 
tali link (e possono essere camuffati) si espone il proprio indirizzo IP, 
compromettendo l'anonimato.
 KnownUnsafeContentTypeException.dangerousLinksLabel=Link pericolosi:
-KnownUnsafeContentTypeException.dangerousMetadata=Contenuto di questo tipo pu? 
includere metadati, i quali possono essere visualizzati da alcuni browser o con 
l'aiuto di altri programmi: i metadati possono contenere link o immagini 
caricate direttamente da internet, che possono compromettere l'anonimato.
+KnownUnsafeContentTypeException.dangerousMetadata=Contenuto di questo tipo pu? 
includere metadati, i quali possono essere visualizzati da alcuni browser o con 
l'aiuto di altri programmi: i metadati possono contenere link o immagini 
caricate direttamente da internet, che possono compromettere l'anonimato.
 KnownUnsafeContentTypeException.dangerousMetadataLabel=Metadati pericolosi:
-KnownUnsafeContentTypeException.dangerousScripts=Contenuto di questo tipo pu? 
includere script pericolosi che quando eseguiti possono compromettere 
l'anonimato dell'utente connettendosi direttamente al web o compromettere la 
sicurezza in altro modo.
+KnownUnsafeContentTypeException.dangerousScripts=Contenuto di questo tipo pu? 
includere script pericolosi che quando eseguiti possono compromettere 
l'anonimato dell'utente connettendosi direttamente al web o compromettere la 
sicurezza in altro modo.
 KnownUnsafeContentTypeException.dangerousScriptsLabel=Scripting pericoloso:
 KnownUnsafeContentTypeException.knownUnsafe=Questo e' un MIME type 
potenzialmente pericoloso. Se il nodo lo lascia passare, il browser potrebbe 
fare qualcosa capace di compromettere l'anonimato dell'utente, esponendone 
l'indirizzo IP in relazione a questa pagina. In particolare:
-KnownUnsafeContentTypeException.noFilter=Non ? disponibile alcun filtro per 
questo tipo di dati; ? necessario quindi prendere tutte le possibili 
precauzioni.
+KnownUnsafeContentTypeException.noFilter=Non ? disponibile alcun filtro per 
questo tipo di dati; ? necessario quindi prendere tutte le possibili 
precauzioni.
 KnownUnsafeContentTypeException.title=Conosciuto come pericoloso: Tipo ${type}
 LocalFileInsertToadlet.checkPathExist=Accerta l'esistenza del percorso 
specificato.
 LocalFileInsertToadlet.checkPathIsDir=Controlla che il percorso specificato 
sia una directory
 LocalFileInsertToadlet.checkPathReadable=Controlla che il percorso specificato 
sia leggibile dall'utente che sta utilizzando il nodo.
-LocalFileInsertToadlet.dirAccessDenied=L'accesso a questa directory ? 
interdetto
-LocalFileInsertToadlet.dirCannotBeRead=Non ? stato possibile leggere dalla 
directory "${path}".
+LocalFileInsertToadlet.dirAccessDenied=L'accesso a questa directory ? 
interdetto
+LocalFileInsertToadlet.dirCannotBeRead=Non ? stato possibile leggere dalla 
directory "${path}".
 LocalFileInsertToadlet.fileHeader=File
 LocalFileInsertToadlet.insert=Inserisci
 LocalFileInsertToadlet.listing=Elenco directory ${path}
 LocalFileInsertToadlet.listingTitle=Listing di ${path}
 LocalFileInsertToadlet.sizeHeader=Dimensioni
-LogConfigHandler.detaildPriorityThreshold=Soglie di priorit? dettagliate
-LogConfigHandler.detaildPriorityThresholdLong=Soglie di priorit? dettagliate. 
Esempio: freenet:normal,freenet.node:minor
+LogConfigHandler.detaildPriorityThreshold=Soglie di priorit? dettagliate
+LogConfigHandler.detaildPriorityThresholdLong=Soglie di priorit? dettagliate. 
Esempio: freenet:normal,freenet.node:minor
 LogConfigHandler.dirName=Directory dei log
 LogConfigHandler.dirNameLong=Directory contenente i log files
 LogConfigHandler.enabled=Abilita Log
@@ -608,28 +612,28 @@
 LogConfigHandler.maxCachedLinesLong=Numero massimo di righe nella RAM cache
 LogConfigHandler.maxZippedLogsSize=Spazio massimo per vecchi log
 LogConfigHandler.maxZippedLogsSizeLong=Spazio massimo su disco utilizzabile da 
vecchi log.
-LogConfigHandler.minLoggingPriority=Priorit? minima dei messaggi da iscrivere 
nei log.
-LogConfigHandler.minLoggingPriorityLong=Minima priorit? dei messaggi che 
vengono iscritti nel log file. Le opzioni sono: minor, normal, error, 
nell'ordine dalla meno alla pi? verbosa.
+LogConfigHandler.minLoggingPriority=Priorit? minima dei messaggi da iscrivere 
nei log.
+LogConfigHandler.minLoggingPriorityLong=Minima priorit? dei messaggi che 
vengono iscritti nel log file. Le opzioni sono: minor, normal, error, 
nell'ordine dalla meno alla pi? verbosa.
 LogConfigHandler.rotationInterval=Intervallo di rotazione dei log
 LogConfigHandler.rotationIntervalLong=Intervallo di rotazione dei log - 
Periodo di tempo allo scadere del quale i log vengono ruotati. Gli ultimi due 
log files vengono conservati (current.log e prev.log) insieme a diversi log 
file compressi fino al massimo impostato in maxZippedLogsSize
-LoggerHook.unrecognizedPriority=Nome di priorit? non riconosciuto: ${name}.
-LongOption.parseError=Il valore specificato non pu? essere interpretato come 
64-bit integer : ${val}
-MeaningfulNodeNameUserAlert.noNodeNick=Non ? stato possibile trovare il 
nickname da utilizzare. Usare qui un indirizzo e-mail o un nickname IRC ? 
generalmente una buona idea in quanto consente ai peer di identificare il nodo. 
(nota che soltanto i peer darknet elencati alla pagina Amici potranno vedere il 
nome del nodo, che resta invece invisibile ai peer Opennet)
+LoggerHook.unrecognizedPriority=Nome di priorit? non riconosciuto: ${name}.
+LongOption.parseError=Il valore specificato non pu? essere interpretato come 
64-bit integer : ${val}
+MeaningfulNodeNameUserAlert.noNodeNick=Non ? stato possibile trovare il 
nickname da utilizzare. Usare qui un indirizzo e-mail o un nickname IRC ? 
generalmente una buona idea in quanto consente ai peer di identificare il nodo. 
(nota che soltanto i peer darknet elencati alla pagina Amici potranno vedere il 
nome del nodo, che resta invece invisibile ai peer Opennet)
 MeaningfulNodeNameUserAlert.noNodeNickShort=Nome nodo non definito.
 MeaningfulNodeNameUserAlert.noNodeNickTitle=Nome nodo non definito.
 N2NTMToadlet.composingMessageLabel=Messaggio N2NTM  da inviare ai seguenti 
nodi:
 N2NTMToadlet.delayed=Il nodo interressato sta temporaneamente respingendo 
richieste; il messaggio potrebbe giungere in lieve ritardo.
 N2NTMToadlet.delayedTitle=Differito
-N2NTMToadlet.failed=Il peer interessato non ? connesso in questo momento: non 
? stato possibile inviare il messaggio
+N2NTMToadlet.failed=Il peer interessato non ? connesso in questo momento: non 
? stato possibile inviare il messaggio
 N2NTMToadlet.failedTitle=Fallito
 N2NTMToadlet.friends=Amici
 N2NTMToadlet.homepage=Homepage
 N2NTMToadlet.noSuchFileOrCannotRead=Trasferimento fallito:File inesistente o 
illegibile.
 N2NTMToadlet.peerName=Nome del Peer
 N2NTMToadlet.peerNotFoundTitle=Peer non trovato
-N2NTMToadlet.peerNotFoundWithHash=Non ? stato possibile trovare il peer con 
hash code \u201c${hash}\u201d
+N2NTMToadlet.peerNotFoundWithHash=Non ? stato possibile trovare il peer con 
hash code \u201c${hash}\u201d
 N2NTMToadlet.processingSend=Invio messaggio in corso
-N2NTMToadlet.queued=In attesa: Il peer interessato non ? connesso in questo 
momento. Il messaggio ? stato posto in attesa e verr? spedito al pi? presto 
possibile
+N2NTMToadlet.queued=In attesa: Il peer interessato non ? connesso in questo 
momento. Il messaggio ? stato posto in attesa e verr? spedito al pi? presto 
possibile
 N2NTMToadlet.queuedTitle=Aggiunto alla Coda
 N2NTMToadlet.returnToFriends=Torna alla lista degli Amici
 N2NTMToadlet.returnToNodeHomepage=Torna alla homepage del nodo
@@ -640,30 +644,30 @@
 N2NTMToadlet.sentTitle=Inviato
 N2NTMToadlet.tooLong=I messaggi N2NTM possono contenere fino a un massimo di 
1024 caratteri
 N2NTMToadlet.tooLongTitle=Troppo Lungo
-N2NTMToadlet.unauthorized=L'accesso a questa pagina ? interdetto
+N2NTMToadlet.unauthorized=L'accesso a questa pagina ? interdetto
 N2NTMUserAlert.delete=Elimina
 N2NTMUserAlert.header=Da: ${from} (scritto ${composed} | inviato ${sent} | 
ricevuto ${received})
 N2NTMUserAlert.headerShort=Messaggio da ${from}
 N2NTMUserAlert.reply=Rispondi
 N2NTMUserAlert.title=Messaggio di testo da nodo a nodo (N2NTM) ${number} da: 
${peername} (${peer})
-Node.acceptSeedConnections=Selezionando "vero" il nodo accetter? connessioni 
da nodi che intendono usare la modalit? insicura (opennet) e li aiuter? a 
connettersi alla rete Freenet. Ci? rende possibile la connessione a qualsiasi 
nodo in possesso della referenza ma limitata dall'annuncio: le richieste di 
connessione sono indirizzate solo ai nodi aggiunti tramite annuncio. Il nodo 
locale potrebbe essere incluso a meno che non abbia gi? molti peer opennet 
(visibili alla pagina "Sconosciuti")
+Node.acceptSeedConnections=Selezionando "vero" il nodo accetter? connessioni 
da nodi che intendono usare la modalit? insicura (opennet) e li aiuter? a 
connettersi alla rete Freenet. Ci? rende possibile la connessione a qualsiasi 
nodo in possesso della referenza ma limitata dall'annuncio: le richieste di 
connessione sono indirizzate solo ai nodi aggiunti tramite annuncio. Il nodo 
locale potrebbe essere incluso a meno che non abbia gi? molti peer opennet 
(visibili alla pagina "Sconosciuti")
 Node.acceptSeedConnectionsShort=Abilita seednode
 Node.alwaysAllowLocalAddresses=Permettere sempre la connessione a nodi via 
indirizzi locali?
-Node.alwaysAllowLocalAddressesLong=Se impostato su "vero" il nodo cercher? di 
connettersi ad altri nodi usando il loro indirizzo locale (localhost, LAN) 
oltre al loro indirizzo IP pubblico. Se questa opzione non e' impostata, si pu? 
comunque abilitarla separatamente per singoli peer darknet (ma non per i peer 
opennet). Impostare questa opzione se ci si vuole connettere ad altri nodi 
sulla stessa rete locale (LAN) o che girano sullo stesso computer, e non far 
caso alle referenze "bogus" ("scr?use") che possono far mandare al nodo 
pacchetti UDP alle macchine sulla rete locale.
+Node.alwaysAllowLocalAddressesLong=Se impostato su "vero" il nodo cercher? di 
connettersi ad altri nodi usando il loro indirizzo locale (localhost, LAN) 
oltre al loro indirizzo IP pubblico. Se questa opzione non e' impostata, si pu? 
comunque abilitarla separatamente per singoli peer darknet (ma non per i peer 
opennet). Impostare questa opzione se ci si vuole connettere ad altri nodi 
sulla stessa rete locale (LAN) o che girano sullo stesso computer, e non far 
caso alle referenze "bogus" ("scr?use") che possono far mandare al nodo 
pacchetti UDP alle macchine sulla rete locale.
 Node.assumeNATed=Presumere che la porta non sia forwardata.
-Node.assumeNATedLong=Dare per scontato che la porta sia dietro NAT e non 
forwardata? In questo caso il nodo mander? handshake ogni 10-30 secondi.
+Node.assumeNATedLong=Dare per scontato che la porta sia dietro NAT e non 
forwardata? In questo caso il nodo mander? handshake ogni 10-30 secondi.
 Node.bandwidthLimitMustBePositiveOrMinusOne=Il valore dell'ampiezza di banda 
deve essere positivo o -1
 Node.bindTo=Indirizzo IP
 Node.bindToLong=Indirizzo IP
-Node.buggyJVM=La JVM attualmente in uso (${version}) ? una versione 
notoriamente afflitta da 'bug' che pu? produrre OutOfMemoryError anche con 
molta memoria ancora a disposizione. Si raccomanda di aggiornare Java. La 
versione consigliata ? Sun Java 1.6, ma ? possibile usare anche 1.4.2 o 1.5.
-Node.buggyJVMShort=Freenet sta attualmente utilizzando Java versione 
${version}, che ? notoriamente afflitta da p'bug' pericolosi. Si prega di 
aggiornare Java al pi? presto possibile.
+Node.buggyJVM=La JVM attualmente in uso (${version}) ? una versione 
notoriamente afflitta da 'bug' che pu? produrre OutOfMemoryError anche con 
molta memoria ancora a disposizione. Si raccomanda di aggiornare Java. La 
versione consigliata ? Sun Java 1.6, ma ? possibile usare anche 1.4.2 o 1.5.
+Node.buggyJVMShort=Freenet sta attualmente utilizzando Java versione 
${version}, che ? notoriamente afflitta da p'bug' pericolosi. Si prega di 
aggiornare Java al pi? presto possibile.
 Node.buggyJVMTitle=Avvertennza JVM soggetta a 'bug'
-Node.buggyJVMWithLink=La JVM in uso (${version}) ? notoriamente 
${link}difettosa${/link}. Pu? produrre errori tipo OutOfMemoryError anche con 
molta memoria ancora disponibile. Sarebbe auspicabile aggiornare almeno a Sun 
Java 1.4.2_13, 1.5.0_10 o 1.6 (quest'ultima ? la versione consigliata).
+Node.buggyJVMWithLink=La JVM in uso (${version}) ? notoriamente 
${link}difettosa${/link}. Pu? produrre errori tipo OutOfMemoryError anche con 
molta memoria ancora disponibile. Sarebbe auspicabile aggiornare almeno a Sun 
Java 1.4.2_13, 1.5.0_10 o 1.6 (quest'ultima ? la versione consigliata).
 Node.bwlimitMustBePositive=Il limite dell'ampiezza di banda deve essere 
positivo
 Node.databaseMemory=Memoria massima utilizzabile dal datastore
 Node.databaseMemoryLong=Uso massimo della memoria del database contenente 
indici del magazzino dati (datastore). 0 significa nessun limite (non supera 
comunque il 30% circa della memoria massima)
 Node.deadlockTitle=Deadlocking probabilmente dovuto ad una combinazione di JVM 
e kernel che da luogo a "bug".
-Node.deadlockWarning=ATTENZIONE: E' stato rilevato l'uso di Sun JVM con NPTL. 
Ci? pu? produrre il "congelamento" del nodo a causa della JVM che perde un 
lock. Per ovviare a tale inconveniente ? necessatio disabilitare NPTL 
impostando la variabile ambientale LD_ASSUME_KERNEL=2.4.1. Le versioni pi? 
recenti di Freenet installer dovrebbero gi? esserne provviste; reinstallare, o 
modificare il file run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh).
 Su alcuni sistemi pu? essere necessario installare le pthreads libraries 
perch? questo funzioni. Nota che il nodo cercherebbe di riavviarsi 
automaticamente se un tale deadlock occorresse, ma questa funzione non ? ancora 
pienamente affidabile, e richiede tempo.
+Node.deadlockWarning=ATTENZIONE: E' stato rilevato l'uso di Sun JVM con NPTL. 
Ci? pu? produrre il "congelamento" del nodo a causa della JVM che perde un 
lock. Per ovviare a tale inconveniente ? necessatio disabilitare NPTL 
impostando la variabile ambientale LD_ASSUME_KERNEL=2.4.1. Le versioni pi? 
recenti di Freenet installer dovrebbero gi? esserne provviste; reinstallare, o 
modificare il file run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh).
 Su alcuni sistemi pu? essere necessario installare le pthreads libraries 
perch? questo funzioni. Nota che il nodo cercherebbe di riavviarsi 
automaticamente se un tale deadlock occorresse, ma questa funzione non ? ancora 
pienamente affidabile, e richiede tempo.
 Node.disableHangCheckers=Disabilita tutti gli hang checker
 Node.disableHangCheckersLong=Disabilita tutte le funzioni hang 
checkers/watchdog. Impostare per fare il profiling di Fred.
 Node.disablePHTLS=Disabilita HTL probabilistico
@@ -682,17 +686,17 @@
 Node.enableSwappingLong=Abilita scambio di locazione? (NON DISABILITARE! Utile 
solo in alcune simulazioni).
 Node.enableULPRDataPropagation=Abilita propagazione dati ULPR?
 Node.enableULPRDataPropagationLong=Abilita propagazione rapida di chiavi 
richieste recentemente ai nodi che le hanno richieste quando i dati sono stati 
finalmente trovati? (Richieste Persistenti Ultra-Leggere)
-Node.errorApplyingConfig=Si ? verificato un errore durante l'applicazione 
della nuova configurazione : ${error}
+Node.errorApplyingConfig=Si ? verificato un errore durante l'applicazione 
della nuova configurazione : ${error}
 Node.extraPeerDir=Directory dei dati extra peer
 Node.extraPeerDirLong=Directory dove conservare dati extra
 Node.forceBigShrink=Esegui immediatamente grosse riduzioni di dimensione dello 
store
-Node.forceBigShrinkLong=Determina se eseguire immediatamente le riduzioni di 
dimensione in misura superiore al 10% del magazzino (store), piuttosto che 
aspettare il prossimo riavvio del nodo. Le riduzioni on-line non preservano i 
dati utilizzati per ultimi quindi l'uso di questa opzione non ? raccomandato; 
da usarsi solo nel caso in cui sia desiderabile un risultato immediato.
+Node.forceBigShrinkLong=Determina se eseguire immediatamente le riduzioni di 
dimensione in misura superiore al 10% del magazzino (store), piuttosto che 
aspettare il prossimo riavvio del nodo. Le riduzioni on-line non preservano i 
dati utilizzati per ultimi quindi l'uso di questa opzione non ? raccomandato; 
da usarsi solo nel caso in cui sia desiderabile un risultato immediato.
 Node.inBWLimit=Limite ampiezza di banda in entrata (bytes per secondo)
 Node.inBWLimitLong=Limite dell'ampiezza di banda in entrata (bytes/sec); il 
nodo cerca di non eccedere tale limite; -1 siglifica quattro volte il limite 
impostato per l'ampiezza di banda in uscita (outputBandwidthLimit)
 Node.invalidStoreSize=Il datastore (magazzino dati) deve essere di dimensioni 
uguali o superiori a 32MB
-Node.java14ShortText=Tra breve non sara pi? possibile operare un nodo Freenet 
su Java 1.4. Si prega di aggiornare a 1.5 o 1.6
+Node.java14ShortText=Tra breve non sara pi? possibile operare un nodo Freenet 
su Java 1.4. Si prega di aggiornare a 1.5 o 1.6
 Node.java14Text=Freenet sta girando su una versione 1.4 di Java. Si prega di 
aggiornare almeno a Java 1.5. Gli aggiornamenti automatici di Freenet sono 
stati temporaneamente disabilitati in quanto versioni future potrebbero non non 
girare del tutto.
-Node.java14Title=Freenet non ? pi? compatibile con Java 1.4
+Node.java14Title=Freenet non ? pi? compatibile con Java 1.4
 Node.l10nLanguage=Lingua dell' interfaccia grafica
 Node.l10nLanguageLong=Cambia la lingua in cui messaggi sono visualizzati. 
Alcune frasi e messaggi saranno visibili in versione tradotta solo dopo il 
prossimo riavvio del nodo.
 Node.maxHTL=HTL massimo
@@ -706,70 +710,80 @@
 Node.nodeName=Nome del nodo
 Node.nodeNameLong=Nome del nodo. E' visibile solo agli Amici (darknet peer), 
mentre gli Sconosciuti (opennet peer) non potranno vederlo.
 Node.notUsingSunVM=E' stata rilevata una JVM ${vendor} ${version} che potrebbe 
influire sul corretto funzionamento del nodo. Se possibile, installare Sun java 
disponibile presso http://www.java.com/getjava
-Node.notUsingSunVMShort=Freenet sta attualmente utilizzando JVM (Java Virtual 
Machine) diversa da Sun, che ? quella raccomandata. Si prega di scaricare ed 
installare la versione corrente di Sun Java JRE (Java Runtime Environment)
+Node.notUsingSunVMShort=Freenet sta attualmente utilizzando JVM (Java Virtual 
Machine) diversa da Sun, che ? quella raccomandata. Si prega di scaricare ed 
installare la versione corrente di Sun Java JRE (Java Runtime Environment)
 Node.notUsingSunVMTitle=Il nodo non sta usando una JVM della Sun
-Node.notUsingWrapper=Il nodo sta girando senza il wrapper. Ci? ? generalmente 
sconsigliabile. Il nodo non potr? riavviare s? stesso e quindi l'aggiornamento 
automatico non potr? funzionare. Inoltre, se la JVM se ne dovesse andare nel 
"limbo" non sar? possibile riavviare automaticamente nemmeno qiuella. Non 
verranno generati stack dump in alcuni posti e quindi debugging sar? pi? 
difficile.
-Node.notUsingWrapperShort=Freenet sta girando senza wrapper. Questo non ? 
raccomandato.
+Node.notUsingWrapper=Il nodo sta girando senza il wrapper. Ci? ? generalmente 
sconsigliabile. Il nodo non potr? riavviare s? stesso e quindi l'aggiornamento 
automatico non potr? funzionare. Inoltre, se la JVM se ne dovesse andare nel 
"limbo" non sar? possibile riavviare automaticamente nemmeno qiuella. Non 
verranno generati stack dump in alcuni posti e quindi debugging sar? pi? 
difficile.
+Node.notUsingWrapperShort=Freenet sta girando senza wrapper. Questo non ? 
raccomandato.
 Node.notUsingWrapperTitle=Il nodo non sta usando il wrapper!
 Node.oneConnectionPerIP=Limita ad una connessione per indirizzo?
-Node.oneConnectionPerIPLong=Non permettere pi? di una connessione per 
indirizzo? Ci? rende leggermente pi? difficile un attacco eseguito 
connettendosi al nodo pi? volte con diverse identit? in modo da dominarne il 
routing (instradamento) e rendere pi? facile raccogliere dati con lo 
"harvesting" (lett: "il raccolto", in agricoltura). Questa opzione impedisce 
che un peer sia connesso al nodo sia su darknet che su opennet.
-Node.opennetEnabled=Abilita Modalit? Insicura (connette automaticamente a nodi 
gestiti da Sconosciuti)
-Node.opennetEnabledLong=Abilita Modalit? Insicura? (detta anche Opennet) 
Abilitando questa opzione il nodo scambier? automaticamente referenze on altri 
nodi. Ci? rende facilmente osservabile dall'esterno il fatto che su questo 
computer sta girando un nodo Freenet, facilitando attacchi di diversi tipi. 
Avendone la possibilit?, l'opzione migiore ? quella di connettersi soltanto ad 
utenti conosciuti ed addifabili (Darknet peer, vedi pagina Amici)
+Node.oneConnectionPerIPLong=Non permettere pi? di una connessione per 
indirizzo? Ci? rende leggermente pi? difficile un attacco eseguito 
connettendosi al nodo pi? volte con diverse identit? in modo da dominarne il 
routing (instradamento) e rendere pi? facile raccogliere dati con lo 
"harvesting" (lett: "il raccolto", in agricoltura). Questa opzione impedisce 
che un peer sia connesso al nodo sia su darknet che su opennet.
+Node.opennetEnabled=Abilita Modalit? Insicura (connette automaticamente a nodi 
gestiti da Sconosciuti)
+Node.opennetEnabledLong=Abilita Modalit? Insicura? (detta anche Opennet) 
Abilitando questa opzione il nodo scambier? automaticamente referenze on altri 
nodi. Ci? rende facilmente osservabile dall'esterno il fatto che su questo 
computer sta girando un nodo Freenet, facilitando attacchi di diversi tipi. 
Avendone la possibilit?, l'opzione migiore ? quella di connettersi soltanto ad 
utenti conosciuti ed addifabili (Darknet peer, vedi pagina Amici)
 Node.outBWLimit=Limite dell'ampiezza di banda in uscita (bytes per secondo)
 Node.outBWLimitLong=Limite "duro" dell' ampiezza di banda in uscita 
(bytes/sec); di solito il nodo non eccede questo limite
 Node.passOpennetPeersThroughDarknet=Trasmetti referenze opennet attraverso 
darknet peer
-Node.passOpennetPeersThroughDarknetLong=Se impostata su "vero" referenze 
opennet verranno trasmesse attraverso peer darknet (ma MAI la referenza del 
nodo locale). In questo modo un nodo (nodo locale, o i suoi peer) pu? ottenere 
peer opennet dai suoi peer darknet. Questo ? utile perch? permette di 
riconnettersi in caso di perdita dei peer, per esempio dopo una lunga 
disconnessione, ma rende l'analisi del traffico leggermente pi? facile, quindi 
chi ? paranoico dovrebbe disabilitare questa opzione.
+Node.passOpennetPeersThroughDarknetLong=Se impostata su "vero" referenze 
opennet verranno trasmesse attraverso peer darknet (ma MAI la referenza del 
nodo locale). In questo modo un nodo (nodo locale, o i suoi peer) pu? ottenere 
peer opennet dai suoi peer darknet. Questo ? utile perch? permette di 
riconnettersi in caso di perdita dei peer, per esempio dopo una lunga 
disconnessione, ma rende l'analisi del traffico leggermente pi? facile, quindi 
chi ? paranoico dovrebbe disabilitare questa opzione.
 Node.port=Numero della porta FNP (UDP)
 Node.portLong=Porta UDP per le comunicazioni da nodo a nodo (Freenet Node 
Protocol)
 Node.publishOurPeersLocation=Trasmettere ai peer la locazione dei nostri peer?
-Node.publishOurPeersLocationLong=Trasmettere ai peer la locazione dei nostri 
peer? Ci? facilita il routing ma fornisce informazioni ad un potenziale 
avversario.
+Node.publishOurPeersLocationLong=Trasmettere ai peer la locazione dei nostri 
peer? Ci? facilita il routing ma fornisce informazioni ad un potenziale 
avversario.
 Node.routeAccordingToOurPeersLocation=Tenere conto nel routing della locazione 
dei peer dei nostri peer?
-Node.routeAccordingToOurPeersLocationLong=Usare per il routing la locazione 
dei peer dei nostri peer? Ci? facilita il routing ma potrebbe essere utile ad 
un potenziale avversario.
+Node.routeAccordingToOurPeersLocationLong=Usare per il routing la locazione 
dei peer dei nostri peer? Ci? facilita il routing ma potrebbe essere utile ad 
un potenziale avversario.
 Node.storeDirectory=Directory magazzino dati (store)
 Node.storeDirectoryLong=Directory contenente gli store file
-Node.storeMaxMemTooHigh=Impostare un valore superiore ad 80% della memoria RAM 
da destinare a BDB ? generalmente una pessima idea.
+Node.storeMaxMemTooHigh=Impostare un valore superiore ad 80% della memoria RAM 
da destinare a BDB ? generalmente una pessima idea.
 Node.storeSize=Dimensioni in bytes del magazzino dati (store)
 Node.storeSizeLong=Dimensioni del magazzino (store) in bytes
 Node.storeType=Tipo di magazzino dati (store). NON TOCCARE!!
-Node.storeTypeLong=Tipo di datastore. Attualmente pu? essere un indice bdb 
(usa un BerkeleyDBFreenetStore per l'indice, e mette i dati in dei file su 
disco), o ram (indice e dati in RAM). L'uso di ram ? riservato a persone 
competenti, e solo se c'e' memoria sufficiente a disposizione per tutti i dati 
(NOTA: in questo caso i dati NON verranno salvati all'arresto del nodo)
+Node.storeTypeLong=Tipo di datastore. Attualmente pu? essere un indice bdb 
(usa un BerkeleyDBFreenetStore per l'indice, e mette i dati in dei file su 
disco), o ram (indice e dati in RAM). L'uso di ram ? riservato a persone 
competenti, e solo se c'e' memoria sufficiente a disposizione per tutti i dati 
(NOTA: in questo caso i dati NON verranno salvati all'arresto del nodo)
 Node.swapRInterval=Intervallo tra le richieste di scambio (swap) in 
millisecondi
 Node.swapRIntervalLong=Intervallo tra richieste di scambio (swap) in 
millisecondi. Non toccare!
 Node.throttleLocalTraffic=Limitazione di banda su traffico locale
-Node.throttleLocalTrafficLong=Abilita limitazione di banda su traffico locale? 
Abilitando questa opzione,  la limitazione di banda avr? effetto anche sulla 
rete locale (LAN) e su localhost.
+Node.throttleLocalTrafficLong=Abilita limitazione di banda su traffico locale? 
Abilitando questa opzione,  la limitazione di banda avr? effetto anche sulla 
rete locale (LAN) e su localhost.
 Node.tooSmallMTU=MTU insufficiente
-Node.tooSmallMTULong=L' MTU della connessione sembra essere ${mtu} bytes. 
Freenet non pu? funzionare bene con un MTU minore di ${minMTU} bytes: le 
connessioni saranno inaffidabili e forse rallentate. Se possibile, si dovrebbe 
provvedere a risolvere il problema.
+Node.tooSmallMTULong=L' MTU della connessione sembra essere ${mtu} bytes. 
Freenet non pu? funzionare bene con un MTU minore di ${minMTU} bytes: le 
connessioni saranno inaffidabili e forse rallentate. Se possibile, si dovrebbe 
provvedere a risolvere il problema.
 Node.tooSmallMTUShort=Problema di connessione: MTU di connessione troppo basso 
per consentire a Freenet di funzionare correttamente. Potranno verificarsi dei 
problemi.
 Node.withAnnouncement=Permettere l'inserimento nella rete usando seednodes?
-Node.withAnnouncementLong=Permettere che il nodo si auto-inserisca nella rete 
Freenet usando seednodes? Questa opzione ? abilitata di default per motivi 
tecnici ma ? intrinsecamente insicura
-NodeClientCore.couldNotFindOrCreateDir=Non ? stato possibile trovare o creare 
la directory
-NodeClientCore.downloadAllowedDirs=Directory dove il download ? consentito
-NodeClientCore.downloadAllowedDirsLong=Si pu? usare una lista di directory 
dove dove il download e' permesso, separate da 'punto e virgola' (;). 
"downloads" significa downloadsDir, vuoto (nessuna directory specificata) 
significa che il download su disco non e' permesso, "all" significa download 
permessi in tutte le directory AVVERTENZA; Se impostato su "all" ("tutte"), 
ogni utente potr? scaricare files  in qualsiasi directory.
+Node.withAnnouncementLong=Permettere che il nodo si auto-inserisca nella rete 
Freenet usando seednodes? Questa opzione ? abilitata di default per motivi 
tecnici ma ? intrinsecamente insicura
+NodeClientCore.couldNotFindOrCreateDir=Non ? stato possibile trovare o creare 
la directory
+NodeClientCore.downloadAllowedDirs=Directory dove il download ? consentito
+NodeClientCore.downloadAllowedDirsLong=Si pu? usare una lista di directory 
dove dove il download e' permesso, separate da 'punto e virgola' (;). 
"downloads" significa downloadsDir, vuoto (nessuna directory specificata) 
significa che il download su disco non e' permesso, "all" significa download 
permessi in tutte le directory AVVERTENZA; Se impostato su "all" ("tutte"), 
ogni utente potr? scaricare files  in qualsiasi directory.
 NodeClientCore.downloadDir=Directory predefinita per i download
 NodeClientCore.downloadDirLong=Directory predefinita dove salvare i file 
scaricati
+NodeClientCore.encryptPersistentTempBuckets=Codifica i bucket di dati 
temporanei persistenti? NON MODIFICARE!
+NodeClientCore.encryptPersistentTempBucketsLong=Codifica i bucket di dati 
temporanei? In alcuni casi (p.es. se si usa HDD e swap encryption)potrebbe non 
essere necessario codificare (encrypting) i bucket di dati temporanei. IN CASO 
DI DUBBIO NON MODIFICARE
+NodeClientCore.encryptTempBuckets=Codifica buckets di dati temporanei? NON 
MODIFICARE!
+NodeClientCore.encryptTempBucketsLong=Codifica i bucket di dati temporanei? In 
alcuni casi (p.es. se si usa HDD e swap encryption)potrebbe non essere 
necessario codificare (encrypting) i bucket di dati temporanei. IN CASO DI 
DUBBIO NON MODIFICARE
 NodeClientCore.fileForClientStats=File contenente statistiche del client
 NodeClientCore.fileForClientStatsLong=File dove conservare le statistiche 
relative al client throttling (utilizzato per stabilire l'intervallo tra le 
richieste)
-NodeClientCore.lazyResume=Caricare completamente le richieste persistenti dopo 
aver completato l'avvio del nodo? (Fa maggiore uso di memoria ma avvia il nodo 
pi? velocemente)
-NodeClientCore.lazyResumeLong=Le richieste persistenti possono essere caricate 
durante l'avvio del nodo, oppure si possono scrivere i dati in memoria e 
caricarli completamente solo dopo che il processo di avvio ? terminato. Ci? 
riduce tempo di avviamento ma fa maggior uso di memoria.
+NodeClientCore.lazyResume=Caricare completamente le richieste persistenti dopo 
aver completato l'avvio del nodo? (Fa maggiore uso di memoria ma avvia il nodo 
pi? velocemente)
+NodeClientCore.lazyResumeLong=Le richieste persistenti possono essere caricate 
durante l'avvio del nodo, oppure si possono scrivere i dati in memoria e 
caricarli completamente solo dopo che il processo di avvio ? terminato. Ci? 
riduce tempo di avviamento ma fa maggior uso di memoria.
+NodeClientCore.maxArchiveSize=Dimensione massima di ogni archivio
+NodeClientCore.maxArchiveSizeLong=Dimensione massima di ogni archivio
+NodeClientCore.maxRAMBucketSize=Dimensione massima di un RAMbucket
+NodeClientCore.maxRAMBucketSizeLong=Dimensione massima di un RAMBucket (i 
bucket di dimensioni maggiori verranno immagazzinati sul disco rigido come file)
 NodeClientCore.maxUSKFetchers=Numero massimo di USK fetchers ammessi
 NodeClientCore.maxUSKFetchersLong=Numero massimo di USK fetchers ammessi
 NodeClientCore.maxUSKFetchersMustBeGreaterThanZero=Deve essere maggiore di zero
-NodeClientCore.movingTempDirOnTheFlyNotSupported=Non ? possible cambiare la 
directory dei file temporanei mentre il nodo ? in funzione
+NodeClientCore.movingTempDirOnTheFlyNotSupported=Non ? possible cambiare la 
directory dei file temporanei mentre il nodo ? in funzione
 NodeClientCore.persistentTempDir=Directory dei file temporanei persistenti
 NodeClientCore.persistentTempDirLong=Nome della directory dei file temporanei 
persistenti
-NodeClientCore.startingUp=Si prega di concedere a Freenet alcuni minuti per 
completare il processo di avviamento. Nel frattempo alcune funzioni non saranno 
disponibili e il nodo potr? risultare pi? lento del normale.
-NodeClientCore.startingUpShort=L'avviamento di Freenet ? ancora in corso: 
alcune funzioni potrebbero non essere ancora disponibili e il nodo potrebbe 
operare ad una velocit? inferiore al normale.
+NodeClientCore.ramBucketPoolSize=Quantit? di RAM da dedicare ai bucket di dati 
temporanei
+NodeClientCore.ramBucketPoolSizeLong=Ammontare di memoria RAM da dedicare ai 
bucket di dati temporanei che sarebbero altrimenti immagazzinati su disco 
rigido. In cambio di pi? uso di memoria si ottiene pi? I/O.
+NodeClientCore.startingUp=Si prega di concedere a Freenet alcuni minuti per 
completare il processo di avviamento. Nel frattempo alcune funzioni non saranno 
disponibili e il nodo potr? risultare pi? lento del normale.
+NodeClientCore.startingUpShort=L'avviamento di Freenet ? ancora in corso: 
alcune funzioni potrebbero non essere ancora disponibili e il nodo potrebbe 
operare ad una velocit? inferiore al normale.
 NodeClientCore.startingUpTitle=Avviamento di Freenet in corso
 NodeClientCore.tempDir=Directory file temporanei
 NodeClientCore.tempDirLong=Nome della directory dei file temporanei
 NodeClientCore.uploadAllowedDirs=Directory dalle quali l'upload e' consentito
-NodeClientCore.uploadAllowedDirsLong=Si pu? usare una lista di directory dove 
l'upload e' consentito, separate da 'punto e virgola' (;). Vuoto (nessuna 
directory specificata) significa che l'upload non e' permesso, "all" significa 
upload permesso da tutte le directory AVVERTENZA; Se impostato su "all" 
("tutte"), ogni utente potr? inserire qualunque file da qualsiasi directory.
+NodeClientCore.uploadAllowedDirsLong=Si pu? usare una lista di directory dove 
l'upload e' consentito, separate da 'punto e virgola' (;). Vuoto (nessuna 
directory specificata) significa che l'upload non e' permesso, "all" significa 
upload permesso da tutte le directory AVVERTENZA; Se impostato su "all" 
("tutte"), ogni utente potr? inserire qualunque file da qualsiasi directory.
 NodeIPDectector.inclLocalAddress=Includi indirizzi locali nella referenza del 
nodo
-NodeIPDectector.inclLocalAddressLong=Specifica se includere l'indirizzo locale 
(LAN e localhost) nella referenza del nodo. Ci? non ? necessario a meno che 
entrambi i nodi che si vogliono collegare abbiano impostato 
allowLocalAddresses=true per le rispettive referenze (per impostare questa 
opzione, abilitare la modalit? avanzata e usare le opzioni disponibili alla 
pagina Amici).
+NodeIPDectector.inclLocalAddressLong=Specifica se includere l'indirizzo locale 
(LAN e localhost) nella referenza del nodo. Ci? non ? necessario a meno che 
entrambi i nodi che si vogliono collegare abbiano impostato 
allowLocalAddresses=true per le rispettive referenze (per impostare questa 
opzione, abilitare la modalit? avanzata e usare le opzioni disponibili alla 
pagina Amici).
 NodeIPDectector.ipOverride=Impostazione manuale indirizzo IP
-NodeIPDectector.ipOverrideLong=Impostazione manuale dell'indirizzo IP (di 
solito non ? necessario) - Utilizzare questa opzione se si ha un indirizzo IP 
statico o un domain name  (es. dyndns), e ci si trova dietro un firewall.
+NodeIPDectector.ipOverrideLong=Impostazione manuale dell'indirizzo IP (di 
solito non ? necessario) - Utilizzare questa opzione se si ha un indirizzo IP 
statico o un domain name  (es. dyndns), e ci si trova dietro un firewall.
 NodeIPDectector.tempAddressHint=Suggerimento temporaneo indirizzo IP
 NodeIPDectector.tempAddressHintLong=Suggerisce temporaneamente l'indirizzo IP; 
viene eliminato dopo l'uso
-NodeIPDetector.maybeSymmetric=Sembra che il nodo sia dietro una NAT 
simmetrica. Potrebbe trattarsi di problemi di connessione: se ci si trova 
dietro una NAT simmetrica ci si potr? probabilmente connettere soltanto con i 
nodi che sono raggiungibili da interenet.
+NodeIPDetector.maybeSymmetric=Sembra che il nodo sia dietro una NAT 
simmetrica. Potrebbe trattarsi di problemi di connessione: se ci si trova 
dietro una NAT simmetrica ci si potr? probabilmente connettere soltanto con i 
nodi che sono raggiungibili da interenet.
 NodeIPDetector.maybeSymmetricShort=Problema di connessione: il nodo potrebbe 
trovarsi dietro una NAT simmetrica.
 NodeIPDetector.maybeSymmetricTitle=Problemi di connessione
 NodeIPDetector.unknownHostErrorInIPOverride=Host sconosciuto: ${error}
@@ -779,8 +793,8 @@
 NodeStat.freeHeapBytesThresholdLong=Il nodo respinge richieste per mantenere 
la quota di free heap bytes impostata
 NodeStat.freeHeapPercentThreshold=Soglia percentuale free heap
 NodeStat.freeHeapPercentThresholdLong=Respingendo nuove richieste, il nodo 
mantiene la  percentuale di di free heap (in rapporto a max heap bytes ammessi) 
 al di sopra della soglia
-NodeStat.ignoreLocalVsRemoteBandwidthLiability=Gestisi richieste locali allo 
come quelle remote per limitazioni della disponibilit? di banda
-NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=Abilitando questa opzione 
si riduce notevolmente la banda utilizzata e si aumenta leggermente la 
sicurezza nei confronti di attacchi di timing. Generalmente non c'? di che 
preoccuparsi per questo tipo di attacchi in quanto gli attacchi di correlazione 
sono pi? facili da eseguire.
+NodeStat.ignoreLocalVsRemoteBandwidthLiability=Gestisi richieste locali allo 
come quelle remote per limitazioni della disponibilit? di banda
+NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=Abilitando questa opzione 
si riduce notevolmente la banda utilizzata e si aumenta leggermente la 
sicurezza nei confronti di attacchi di timing. Generalmente non c'? di che 
preoccuparsi per questo tipo di attacchi in quanto gli attacchi di correlazione 
sono pi? facili da eseguire.
 NodeStat.memCheck=Abilita Verifica di Memoria
 NodeStat.memCheckLong=Abilita verifica della memoria (scrive un messaggio nel 
log file. La verifica della memoria deve essere abilitata perche' 
aggressiveGCModificator abbia effetto)
 NodeStat.statsPersister=File contenente le statistiche del nodo
@@ -788,8 +802,8 @@
 NodeStat.threadLimit=Limite thread
 NodeStat.threadLimitLong=Il nodo respinge richieste per limitare l'uso di 
thread al valore specificato.
 NodeStats.mustBePercentValueNotFull=Questo valore deve essere espresso in 
precentuale, compresa tra 0 e 99.
-NodeStats.valueTooLow=Valore troppo basso per questa impostazione: ? 
necessario aumentarlo.
-NodeUpdateManager.enabled=Verifica disponibilit? e scarica nuove versioni
+NodeStats.valueTooLow=Valore troppo basso per questa impostazione: ? 
necessario aumentarlo.
+NodeUpdateManager.enabled=Verifica disponibilit? e scarica nuove versioni
 NodeUpdateManager.enabledLong=Verifica e scarica automaticamente nuove 
versioni di Freenet. Se impostatos su 'vero', le nuove versioni verranno 
scaricate ma non necessariamente installate. L'impostazione torna sempre su 
'falso' se il nodo non gira all'interno del wrapper.
 NodeUpdateManager.extURI=Dove cercare versioni aggiornate di freenet-ext.jar?
 NodeUpdateManager.extURILong=Dove cercare aggiornamenti per freenet-ext.jar?
@@ -798,7 +812,7 @@
 NodeUpdateManager.invalidExtURI=Ext URI non valida: ${error}
 NodeUpdateManager.invalidRevocationURI=URI di revoca non valida: ${error}
 NodeUpdateManager.invalidUpdateURI=URI di aggiornamento non valida: ${error}
-NodeUpdateManager.noUpdateWithoutWrapper=Non ? stato possibile completare 
l'aggiornamento perch? il nodo non sta girando nel wrapper
+NodeUpdateManager.noUpdateWithoutWrapper=Non ? stato possibile completare 
l'aggiornamento perch? il nodo non sta girando nel wrapper
 NodeUpdateManager.revocationURI=Dove cercare la chiave di revoca?
 NodeUpdateManager.revocationURILong=URI per la chiave di revoca. Se viene 
trovata il nodo ne mostra il contenuto e disabilita l'aggiornamento automatico.
 NodeUpdateManager.updateCatastropheTitle=Fallimento Catastrofico dell' 
Aggiornamento!
@@ -807,32 +821,32 @@
 NodeUpdateManager.updateFailedTitle=Aggiornamento Fallito!
 NodeUpdateManager.updateURI=Dove cercare aggiornamenti?
 NodeUpdateManager.updateURILong=Dove cercare aggiornamenti?
-NotEnoughNiceLevelsUserAlert.content=Il nodo ha rilevato di stare operando ad 
un Nice level alto. In mancanza di un numero sufficiente di livelli di nice, il 
nodo non potr? operare a pieno regime. Si prega di ridurre il livello di nice. 
(cercare PRIORITY nel file run.sh e ridurne il valore). Attualmente il nodo ha 
${available} livelli a disposizione mentre avrebbe bisogno di ${required} 
livelli.
+NotEnoughNiceLevelsUserAlert.content=Il nodo ha rilevato di stare operando ad 
un Nice level alto. In mancanza di un numero sufficiente di livelli di nice, il 
nodo non potr? operare a pieno regime. Si prega di ridurre il livello di nice. 
(cercare PRIORITY nel file run.sh e ridurne il valore). Attualmente il nodo ha 
${available} livelli a disposizione mentre avrebbe bisogno di ${required} 
livelli.
 NotEnoughNiceLevelsUserAlert.short=Non ci sono abbastanza Nice level 
disponibili. si prega di assegnare a Freenet un Nice level inferiore.
 NotEnoughNiceLevelsUserAlert.title=Numero di Nice level insufficiente!
-OpennetConnectionsToadlet.fullTitle=${counts} Sconosciuti (Peer non fid?ti) 
del nodo: ${name}
-OpennetConnectionsToadlet.peersListTitle=Peer Opennet (peer non fid?ti 
aggiunti automaticamente dal nodo)
-OpennetConnectionsToadlet.successTime=L'ultima volta che si ? riusciti a 
richiamare una CHK dal nodo.
+OpennetConnectionsToadlet.fullTitle=${counts} Sconosciuti (Peer non fid?ti) 
del nodo: ${name}
+OpennetConnectionsToadlet.peersListTitle=Peer Opennet (peer non fid?ti 
aggiunti automaticamente dal nodo)
+OpennetConnectionsToadlet.successTime=L'ultima volta che si ? riusciti a 
richiamare una CHK dal nodo.
 OpennetConnectionsToadlet.successTimeTitle=Ultimo successo
-OpennetUserAlert.warning=Il nodo sta funzionando in modo "promiscuo". Ci? 
significa che il nodo si connetter? con nodi operati da sconosiuti, e quindi 
chiunque potr? facilmente determinare che l'utente Tal dei Tali sta usando 
Freenet. Molti attacchi vengono facilitati da questa modalit?, bloccare il nodo 
(per esempio con un firewall nazionale) diventa molto pi? facile, ed intoltre 
l'utente non ha controllo su chi si connette al suo nodo. Si raccomanda 
vivamente di procurarsi qualche connessione ad Amici (nodi operati da persone 
conosciute); il modo promiscuo va considerato una misura temporanea da 
utilizzarsi temporaneamente, in attesa di connessioni ad amici. Connettendosi 
esclusivamente a nodi gestiti da persone conosciute, pur non essendo impossibli 
degli attacchi da parte loro, risulter? comunque meno probabile l'esposizione 
ad agenzie governative (tipo servizi segreti o che so io) o altri "cattivi". 
Nota che aggiungere un peer alla sezione Amici non cambia molto la situazione, 
a meno che tale nodo non sia gestito da qualcuno di consciuto e di cui ci si 
fida (per ragioni sia di routing [instradamento] che di sicurezza)!
-OpennetUserAlert.warningShort=Modalit? insicura abilitata.
-OpennetUserAlert.warningTitle=Avvertenza: Modo Promiscuo Attivato: Il nodo si 
connetter? a degli sconosciuti
-PNGFilter.invalidHeader=Il file che si sta cercando di richiamare non e' un 
PNG: esso non include un header PNG valido. Potrebbe trattarsi di un file in 
altro formato e il browser potrebbe fare qualcosa di pericoloso a causa della 
confusione creata dalla mancata corrispondenza; il file ? stato pertanto 
bloccato.
+OpennetUserAlert.warning=Il nodo sta funzionando in modo "promiscuo". Ci? 
significa che il nodo si connetter? con nodi operati da sconosiuti, e quindi 
chiunque potr? facilmente determinare che l'utente Tal dei Tali sta usando 
Freenet. Molti attacchi vengono facilitati da questa modalit?, bloccare il nodo 
(per esempio con un firewall nazionale) diventa molto pi? facile, ed intoltre 
l'utente non ha controllo su chi si connette al suo nodo. Si raccomanda 
vivamente di procurarsi qualche connessione ad Amici (nodi operati da persone 
conosciute); il modo promiscuo va considerato una misura temporanea da 
utilizzarsi temporaneamente, in attesa di connessioni ad amici. Connettendosi 
esclusivamente a nodi gestiti da persone conosciute, pur non essendo impossibli 
degli attacchi da parte loro, risulter? comunque meno probabile l'esposizione 
ad agenzie governative (tipo servizi segreti o che so io) o altri "cattivi". 
Nota che aggiungere un peer alla sezione Amici non cambia molto la situazione, 
a meno che tale nodo non sia gestito da qualcuno di consciuto e di cui ci si 
fida (per ragioni sia di routing [instradamento] che di sicurezza)!
+OpennetUserAlert.warningShort=Modalit? insicura abilitata.
+OpennetUserAlert.warningTitle=Avvertenza: Modo Promiscuo Attivato: Il nodo si 
connetter? a degli sconosciuti
+PNGFilter.invalidHeader=Il file che si sta cercando di richiamare non e' un 
PNG: esso non include un header PNG valido. Potrebbe trattarsi di un file in 
altro formato e il browser potrebbe fare qualcosa di pericoloso a causa della 
confusione creata dalla mancata corrispondenza; il file ? stato pertanto 
bloccato.
 PNGFilter.invalidHeaderTitle=Header PNG non valido
 PageMaker.modeAdvanced=Interfaccia avanzata
-PageMaker.modeAdvancedTooltip=Un'interfaccia pi? complessa, utile soltanto 
agli utenti esperti
+PageMaker.modeAdvancedTooltip=Un'interfaccia pi? complessa, utile soltanto 
agli utenti esperti
 PageMaker.modeSimple=Interfaccia semplice
-PageMaker.modeSimpleTooltip=Un'interfaccia semplice che pu? essere usata da 
ogni utente
-PeerManagerUserAlert.clockProblem=${count} peer non riescono a connettersi 
perch? il loro orologio di sistema differisce di oltre 24 ore da quello locale. 
Si prega di verificare che l'orologio di sistema del computer sia regolato 
sull'ora esatta. Regolazioni inaccurate dell'orologio causano molti problemi 
nel funzionamento dei meccanismi tra nodo e client.
+PageMaker.modeSimpleTooltip=Un'interfaccia semplice che pu? essere usata da 
ogni utente
+PeerManagerUserAlert.clockProblem=${count} peer non riescono a connettersi 
perch? il loro orologio di sistema differisce di oltre 24 ore da quello locale. 
Si prega di verificare che l'orologio di sistema del computer sia regolato 
sull'ora esatta. Regolazioni inaccurate dell'orologio causano molti problemi 
nel funzionamento dei meccanismi tra nodo e client.
 PeerManagerUserAlert.clockProblemTitle=Problema di sincronizzazione.
 PeerManagerUserAlert.connError=${count} peer non riescono a connettersi per 
motivi sconosciuti, forse per causa di 'bug' nel nodo o di una referenza di un 
nodo che e' corrotta.
 PeerManagerUserAlert.connErrorTitle=Alcuni peer non riescono a connettersi
-PeerManagerUserAlert.noConns=Non ? stato finora possibile connettersi ad alcun 
nodo. Forse qualcuno dei peer si connettera entro breve. in caso contrario sar? 
necessario aggiungere altri peer; c'e' bisogno di almeno tre peer connessi in 
ogni momento, meglio 5-10.
+PeerManagerUserAlert.noConns=Non ? stato finora possibile connettersi ad alcun 
nodo. Forse qualcuno dei peer si connettera entro breve. in caso contrario sar? 
necessario aggiungere altri peer; c'e' bisogno di almeno tre peer connessi in 
ogni momento, meglio 5-10.
 PeerManagerUserAlert.noConnsTitle=Nessuna connessione aperta
-PeerManagerUserAlert.noPeersDarknet=Questo nodo non ha peers ai quale 
connettersi e non pu? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Ci si pu? connettere a irc.freenode.net canale 
#freenet-refs e chiedere chi vuole connettersi, ma ? bene tenere presente che 
si ? vulnerabili ad attacchi da parte dei peer (Speciamente in queste prime 
versioni alfa di Freenet 0.7...) VERIFICARE CHE L'ATRA PARTE AGGIUNGA LA 
REFERENZA ALLA SUA LISTA: LE CONNESSIONI "A SENSO UNICO" NON FUNZIONANO!
-PeerManagerUserAlert.noPeersTestnet=Questo nodo non ha peer ai quale 
connettersi e non pu? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Trattandosi di un nodo testnet, ci si pu? connettere 
a irc.freenode.net canale #freenet-refs e chiedere chi vuole connettersi.
+PeerManagerUserAlert.noPeersDarknet=Questo nodo non ha peers ai quale 
connettersi e non pu? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Ci si pu? connettere a irc.freenode.net canale 
#freenet-refs e chiedere chi vuole connettersi, ma ? bene tenere presente che 
si ? vulnerabili ad attacchi da parte dei peer (Speciamente in queste prime 
versioni alfa di Freenet 0.7...) VERIFICARE CHE L'ATRA PARTE AGGIUNGA LA 
REFERENZA ALLA SUA LISTA: LE CONNESSIONI "A SENSO UNICO" NON FUNZIONANO!
+PeerManagerUserAlert.noPeersTestnet=Questo nodo non ha peer ai quale 
connettersi e non pu? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Trattandosi di un nodo testnet, ci si pu? connettere 
a irc.freenode.net canale #freenet-refs e chiedere chi vuole connettersi.
 PeerManagerUserAlert.noPeersTitle=Nessun peer trovato
-PeerManagerUserAlert.oneConn=Questo nodo ha una sola connessione. Il 
rendimento ne risentir? in modo notevole, e l'utente non disporr? di anonimato 
e "negabilit? plausibile" se quell' unico nodo al quale si ? conessi dovesse 
essere operato da un avversario. Il nodo risulter? attaccato al network come 
una "foglia all' albero" e non contribuir? alla salute generale del network 
stesso. Per un corretto funzionamento del nodo ? necessario che almeno tre peer 
e (idealmente 5-10) siano connessi in qualsiasi momento.
+PeerManagerUserAlert.oneConn=Questo nodo ha una sola connessione. Il 
rendimento ne risentir? in modo notevole, e l'utente non disporr? di anonimato 
e "negabilit? plausibile" se quell' unico nodo al quale si ? conessi dovesse 
essere operato da un avversario. Il nodo risulter? attaccato al network come 
una "foglia all' albero" e non contribuir? alla salute generale del network 
stesso. Per un corretto funzionamento del nodo ? necessario che almeno tre peer 
e (idealmente 5-10) siano connessi in qualsiasi momento.
 PeerManagerUserAlert.onlyFewConnsTitle=Soltanto ${count} connessione/i aperta/e
 PeerManagerUserAlert.tooHighBwlimitDelayTime=Questo nodo deve aspettare troppo 
a lungo la banda disponibile (${delay}ms > ${max}ms). Aumentare l'ampiezza di 
banda in uscita e/o rimuovere alcuni peer migliorerebbe la situazione.
 PeerManagerUserAlert.tooHighBwlimitDelayTimeTitle=bwlimitDelayTime troppo alto
@@ -840,51 +854,51 @@
 PeerManagerUserAlert.tooHighPingTimeTitle=nodeAveragePingTime troppo alto
 PeerManagerUserAlert.tooManyConns=Questo nodo ha troppe connessioni (${count} 
> ${max}). Aggiungere troppi peer non produce un topologia mondo-piccolo, 
danneggia l'instradamento, e rischia di produrre punti di fallimento singoli.
 PeerManagerUserAlert.tooManyConnsTitle=Troppe connessioni aperte
-PeerManagerUserAlert.tooManyDisconnected=Questo nodo ha troppi peer 
disconnessi (${count} > ${max}). Questo pu? avere un leggero impatto sul 
rendimento perch? anche i peer disconnessi usano una piccola quantit? di banda 
e CPU. Potrebbe essere necessario "ripulire" la lista dei peer. Nota che almeno 
in teoria, bisognerebbe connettersi esclusivamente ad utenti che si conosce. 
Anche in caso contrario, aggiungere troppi nodi automaticamente produce un 
risultato negativo in quanto la topologia risultante non ? ottimale.
+PeerManagerUserAlert.tooManyDisconnected=Questo nodo ha troppi peer 
disconnessi (${count} > ${max}). Questo pu? avere un leggero impatto sul 
rendimento perch? anche i peer disconnessi usano una piccola quantit? di banda 
e CPU. Potrebbe essere necessario "ripulire" la lista dei peer. Nota che almeno 
in teoria, bisognerebbe connettersi esclusivamente ad utenti che si conosce. 
Anche in caso contrario, aggiungere troppi nodi automaticamente produce un 
risultato negativo in quanto la topologia risultante non ? ottimale.
 PeerManagerUserAlert.tooManyDisconnectedTitle=Troppi peer disconnessi
-PeerManagerUserAlert.tooManyNeverConnected=Ben ${count} tra i peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola: . Non bisognerebbe 
aggiungere peer a meno che la propria referenza venga aggiunta a sua volta. In 
caso contrario sar? impossibile connettersi.
+PeerManagerUserAlert.tooManyNeverConnected=Ben ${count} tra i peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola: . Non bisognerebbe 
aggiungere peer a meno che la propria referenza venga aggiunta a sua volta. In 
caso contrario sar? impossibile connettersi.
 PeerManagerUserAlert.tooManyNeverConnectedTitle=Molti peers non sono ancora 
stati connessi nemmeno una volta
-PeerManagerUserAlert.tooManyNeverConnectedWithLink=${count} peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola. Non bisognerebbe 
aggiungere nuovi peers a meno che essi non aggiungano a loro volta ${link}your 
reference${/link}. Se ci? non avviene non sar? possibile stabilire una 
connessione.
-PeerManagerUserAlert.tooManyPeers=Il nodo ha troppi peer (${count} > ${max}). 
Non si raccomanda di far girare "ubernodes" con l'aggiunta automatica di peer; 
questo non produce una topologia mondo-piccolo. Ci? influisce negativamente sul 
rendimento perch? anche i peer disconnessi usano un po' di banda e di CPU. 
Potrebbe essere necessario "ripulire" la lista dei peer.
+PeerManagerUserAlert.tooManyNeverConnectedWithLink=${count} peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola. Non bisognerebbe 
aggiungere nuovi peers a meno che essi non aggiungano a loro volta ${link}your 
reference${/link}. Se ci? non avviene non sar? possibile stabilire una 
connessione.
+PeerManagerUserAlert.tooManyPeers=Il nodo ha troppi peer (${count} > ${max}). 
Non si raccomanda di far girare "ubernodes" con l'aggiunta automatica di peer; 
questo non produce una topologia mondo-piccolo. Ci? influisce negativamente sul 
rendimento perch? anche i peer disconnessi usano un po' di banda e di CPU. 
Potrebbe essere necessario "ripulire" la lista dei peer.
 PeerManagerUserAlert.tooManyPeersTitle=Troppi peer
-PeerManagerUserAlert.tooOldNeverConnectedPeers=Uno o pi? peer non si sono mai 
connessi nelle due settimane trascorse da quando sono stati aggiunti.  E' da 
prendere in considerazione l'idea di rimuoverli in quanto essi stanno 
marginalmente compromettendo il rendimento (pacchetti sprecati cencando di 
comunicare con nodi che non ci sono).
+PeerManagerUserAlert.tooOldNeverConnectedPeers=Uno o pi? peer non si sono mai 
connessi nelle due settimane trascorse da quando sono stati aggiunti.  E' da 
prendere in considerazione l'idea di rimuoverli in quanto essi stanno 
marginalmente compromettendo il rendimento (pacchetti sprecati cencando di 
comunicare con nodi che non ci sono).
 PeerManagerUserAlert.tooOldNeverConnectedPeersTitle=Peer mai connesso/i 
obsoleto/i
-PeerManagerUserAlert.twoConns=Il nodo ha solo due connessioni. Rendimento e 
sicurezza risulteranno di qualit? inferiore, e non sara possibile provvedere 
instradamento (routing) per altri nodi. Il nodo ? collegato al network come un 
"anello di catena" e non contribuisce (molto) alla salute generale del network 
stesso. Per un corretto funzionamento del nodo, ? necessario che almeno tre 
peers (e idealmente 5-10) siano connessi in ogni momento.
+PeerManagerUserAlert.twoConns=Il nodo ha solo due connessioni. Rendimento e 
sicurezza risulteranno di qualit? inferiore, e non sara possibile provvedere 
instradamento (routing) per altri nodi. Il nodo ? collegato al network come un 
"anello di catena" e non contribuisce (molto) alla salute generale del network 
stesso. Per un corretto funzionamento del nodo, ? necessario che almeno tre 
peers (e idealmente 5-10) siano connessi in ogni momento.
 PeersSayKeyBlownAlert.connectedSayBlownLabel=I seguenti nodi hanno rilevato un 
problema con la chiave  (si cerca attualmente di ottenere il certificato di 
revoca da loro):
-PeersSayKeyBlownAlert.disconnectedSayBlownLabel=I seguenti nodi si sono 
disconnessi dopo aver comunicato che la chiave ? saltata, quindi non ? stato 
possibile richiamare il certificato di revoca:
-PeersSayKeyBlownAlert.failedFetch=Non ? stato possibile scaricare il 
certificato di revoca. Le possibili cause di tale evento includono la 
possibilit? di un attacco sul nodo locale volto a fargli scaricare ed 
installare un aggiornamento nonostante la chiave sia saltata, o la possibilit? 
che dei nodi stiano "mentendo" circa la chiave di revoca. Si prega di 
contattare gli sviluppatori di Freenet per cercare di mettere ordine in questo 
casino.
-PeersSayKeyBlownAlert.failedTransferSayBlownLabel=Questi nodi hanno comunicato 
che la chiave di revoca ? saltata ma poi non hanno completato il trasferimento 
del certificato di revoca:
-PeersSayKeyBlownAlert.fetching=Il nodo sta scaricando il certificato di revoca 
contentnte spiegazioni pi? dettagliate.
-PeersSayKeyBlownAlert.intro=Uno o pi? peers ci comunicano che la chiave di 
revoca per l'aggiornamento automatico ? saltata. Questo significa che qualcuno 
potrebbe essere venuto a conoscenza della chiave privata del sistema di 
autoaggiornamento, cosa che potrebbe far eseguire al nodo il codice che 
l'attaccante volesse fargli eseguire (se l'aggiornamento venisse eseguito): per 
prevenire tale eventualit?, il sistema di autoaggiornamento ? stato 
disabilitato. E' anche possibile che dei peers stiano deliberatamente mentendo 
a proposito della chiave di revoca.
-PeersSayKeyBlownAlert.short=Alcuni peer avvertono che la chiave di auto 
aggiornamento ? saltata!
-PeersSayKeyBlownAlert.titleWithCount=La chiave di Auto-aggiornamento ? 
saltata! L' evento ? stato confermato da ${count} peer!
+PeersSayKeyBlownAlert.disconnectedSayBlownLabel=I seguenti nodi si sono 
disconnessi dopo aver comunicato che la chiave ? saltata, quindi non ? stato 
possibile richiamare il certificato di revoca:
+PeersSayKeyBlownAlert.failedFetch=Non ? stato possibile scaricare il 
certificato di revoca. Le possibili cause di tale evento includono la 
possibilit? di un attacco sul nodo locale volto a fargli scaricare ed 
installare un aggiornamento nonostante la chiave sia saltata, o la possibilit? 
che dei nodi stiano "mentendo" circa la chiave di revoca. Si prega di 
contattare gli sviluppatori di Freenet per cercare di mettere ordine in questo 
casino.
+PeersSayKeyBlownAlert.failedTransferSayBlownLabel=Questi nodi hanno comunicato 
che la chiave di revoca ? saltata ma poi non hanno completato il trasferimento 
del certificato di revoca:
+PeersSayKeyBlownAlert.fetching=Il nodo sta scaricando il certificato di revoca 
contentnte spiegazioni pi? dettagliate.
+PeersSayKeyBlownAlert.intro=Uno o pi? peers ci comunicano che la chiave di 
revoca per l'aggiornamento automatico ? saltata. Questo significa che qualcuno 
potrebbe essere venuto a conoscenza della chiave privata del sistema di 
autoaggiornamento, cosa che potrebbe far eseguire al nodo il codice che 
l'attaccante volesse fargli eseguire (se l'aggiornamento venisse eseguito): per 
prevenire tale eventualit?, il sistema di autoaggiornamento ? stato 
disabilitato. E' anche possibile che dei peers stiano deliberatamente mentendo 
a proposito della chiave di revoca.
+PeersSayKeyBlownAlert.short=Alcuni peer avvertono che la chiave di auto 
aggiornamento ? saltata!
+PeersSayKeyBlownAlert.titleWithCount=La chiave di Auto-aggiornamento ? 
saltata! L' evento ? stato confermato da ${count} peer!
 PluginConfig.configFile=File di configurazione dei plugin
 PluginConfig.configFileLong=Percorso/Nome del file che contiene la 
configurazione del plugin
 PluginConfig.installDir=Directory di installazione dei plugin
 PluginConfig.installDirLong=Directory dove installare i plugin
-PluginManager.cannotSetOnceLoaded=Una volta caricata, non ? pi? possibile 
impostare la lista dei plugin
+PluginManager.cannotSetOnceLoaded=Una volta caricata, non ? pi? possibile 
impostare la lista dei plugin
 PluginManager.loadedOnStartup=Plugin da caricare all'avvio
 PluginManager.loadedOnStartupLong=Classpath, nome e locazione dei plugin da 
caricare all'avvio
 PluginManager.loadedPlugins=Plugin da caricare all'avvio
 PluginManager.loadedPluginsLong=Lista dei plugin da caricare all'avvio del nodo
-PluginManager.pluginLoadingFailed=Non ? stato possibile caricare il plugin 
specificato ${name}.
+PluginManager.pluginLoadingFailed=Non ? stato possibile caricare il plugin 
specificato ${name}.
 PluginManager.pluginLoadingFailedShort=Impossibile caricare il plugin ${name}!
-PluginManager.pluginLoadingFailedTitle=Non ? stato possibile caricare il plugin
-PluginManager.pluginLoadingFailedWithMessage=Non ? stato possibile caricare il 
plugin specificato ${name}: ${message}
-PluginManager.pluginReqNewerJVM=Per usare il plugin ${name} ? necessario 
installare una JVM pi? recente di quella attualmente in uso. Installare Sun 
Java 1.5 o superiore, o rimuovere il plugin.
-PluginManager.pluginReqNewerJVMTitle=Il plugin ${name} richiede l'uso di una 
JVM pi? aggiornata
+PluginManager.pluginLoadingFailedTitle=Non ? stato possibile caricare il plugin
+PluginManager.pluginLoadingFailedWithMessage=Non ? stato possibile caricare il 
plugin specificato ${name}: ${message}
+PluginManager.pluginReqNewerJVM=Per usare il plugin ${name} ? necessario 
installare una JVM pi? recente di quella attualmente in uso. Installare Sun 
Java 1.5 o superiore, o rimuovere il plugin.
+PluginManager.pluginReqNewerJVMTitle=Il plugin ${name} richiede l'uso di una 
JVM pi? aggiornata
 PluginToadlet.addPluginTitle=Aggiungi plugin
 PluginToadlet.failedToLoadPlugin=Caricamento plugin fallito.
-PluginToadlet.failedToLoadPluginCheckClass=Non ? stato possibile caricare il 
plugin richiesto. Verificare il nome del plugin, class, e URL se se ne ? usata 
una.
+PluginToadlet.failedToLoadPluginCheckClass=Non ? stato possibile caricare il 
plugin richiesto. Verificare il nome del plugin, class, e URL se se ne ? usata 
una.
 PluginToadlet.failedToLoadPluginTitle=Caricamento plugin fallito
 PluginToadlet.internalNameTitle=Nome Interno
 PluginToadlet.loadPluginCommand=Carica Plugin
-PluginToadlet.noWebInterface=Questo plugin non ha interfaccia web e pertanto 
non c'? nulla da mostrare
+PluginToadlet.noWebInterface=Questo plugin non ha interfaccia web e pertanto 
non c'? nulla da mostrare
 PluginToadlet.noWebInterfaceTitle=Plugin non provvisto di interfaccia web
 PluginToadlet.pluginList=Lista plugin
 PluginToadlet.pluginListTitle=Lista Plugin
 PluginToadlet.pluginNameTitle=Nome Plugin
-PluginToadlet.pluginNotFound=Non ? stato possibile trovare il plugin richiesto
+PluginToadlet.pluginNotFound=Non ? stato possibile trovare il plugin richiesto
 PluginToadlet.pluginNotFoundTitle=Plugin non trovato
 PluginToadlet.returnToPluginsWithLinks=${link}return${/link} alla lista di 
plugins.
 PluginToadlet.unsupportedMethod=Metodo non supportato
@@ -895,37 +909,37 @@
 PproxyToadlet.cancel=Cancella
 PproxyToadlet.changeReloadOnStartup=Cambia
 PproxyToadlet.classNameTitle=Class Name
-PproxyToadlet.downloadNotAllowedFromRemoteServer=Donload dei plugins ? ammesso 
solo dal server di Freenet.
+PproxyToadlet.downloadNotAllowedFromRemoteServer=Donload dei plugins ? ammesso 
solo dal server di Freenet.
 PproxyToadlet.fileonly=accetta solo file locali
 PproxyToadlet.internalIDTitle=ID interna
 PproxyToadlet.loadFreenetPlugin=Carica un Plugin non ufficiale da freenet
-PproxyToadlet.loadFreenetPluginText=Inserire la URI del plugin che si vuole 
caricare. I plugin disponibili si Freenet non godono di alcun supporto 
ufficiale e non vengono controllati dagli sviluppatori di Freenet. Non ? quindi 
possibile quindi garantire la privacy e la sicurezza di chi decidesse di 
utilizzarli.
+PproxyToadlet.loadFreenetPluginText=Inserire la URI del plugin che si vuole 
caricare. I plugin disponibili si Freenet non godono di alcun supporto 
ufficiale e non vengono controllati dagli sviluppatori di Freenet. Non ? quindi 
possibile quindi garantire la privacy e la sicurezza di chi decidesse di 
utilizzarli.
 PproxyToadlet.loadFreenetURLLabel=Chiave del plugin
 PproxyToadlet.loadOfficialPlugin=Aggiungi un Plugin Ufficiale
 PproxyToadlet.loadOfficialPluginLabel=Carica Plugin Ufficiale
-PproxyToadlet.loadOfficialPluginText=Plugin ufficialy disponibili per download 
dai server del Progetto Freenet. I programmatori di Freenet hanno esaminato i 
plugin ufficiali e trovato che essi appaiono esenti da difetti che possano 
compromettere la privacy; non ? tuttavia possibile garantire con il 100% di 
sicurezza che ci? corrisponda a realt?.
-PproxyToadlet.loadOfficialPluginWarning=AVVERTENZA: Caricando un plugin 
ufficiale lo si scarica da internet (non da Freenet). Se ci? pu? effettivamente 
rappresentare un un problema, si consiglia di non caricare plugins.
+PproxyToadlet.loadOfficialPluginText=Plugin ufficialy disponibili per download 
dai server del Progetto Freenet. I programmatori di Freenet hanno esaminato i 
plugin ufficiali e trovato che essi appaiono esenti da difetti che possano 
compromettere la privacy; non ? tuttavia possibile garantire con il 100% di 
sicurezza che ci? corrisponda a realt?.
+PproxyToadlet.loadOfficialPluginWarning=AVVERTENZA: Caricando un plugin 
ufficiale lo si scarica da internet, (NON da Freenet). Se ci? dovesse 
rappresentare un problema, si consiglia di non caricare plugin.
 PproxyToadlet.loadOtherPlugin=Aggiungi Plugin Non Ufficiale
-PproxyToadlet.loadOtherPluginText=Inserire qui la URL del plugin che si vuole 
caricare. ATTENZIONE! I Plugin non ufficiali non ricevono alcuna assistenza e 
non vengono controllati dai programmatory di Freenet, pertanto chi volesse 
utilizzarli lo far? A PROPRIO RISCHIO.
+PproxyToadlet.loadOtherPluginText=Inserire qui la URL del plugin che si vuole 
caricare. ATTENZIONE! I Plugin non ufficiali non ricevono alcuna assistenza e 
non vengono controllati dai programmatory di Freenet, pertanto chi volesse 
utilizzarli lo far? A PROPRIO RISCHIO.
 PproxyToadlet.loadOtherURLLabel=URL del plugin
 PproxyToadlet.loadPluginLabel=Carica Plugin:
 PproxyToadlet.noPlugins=Nessun plugin caricato
 PproxyToadlet.noVersion=N/A
-PproxyToadlet.pluginDirectoryNotCreated=Non ? stato possibile creare una 
directory per i plugin.
-PproxyToadlet.pluginNotDownloaded=Non ? stato possibile scaricare il plugin
-PproxyToadlet.pluginNotFoundReload=Non ? stato possibile localizzare il plugin 
specificato per poterlo ricaricare.
+PproxyToadlet.pluginDirectoryNotCreated=Non ? stato possibile creare una 
directory per i plugin.
+PproxyToadlet.pluginNotDownloaded=Non ? stato possibile scaricare il plugin
+PproxyToadlet.pluginNotFoundReload=Non ? stato possibile localizzare il plugin 
specificato per poterlo ricaricare.
 PproxyToadlet.pluginNotFoundReloadTitle=Plugin non trovato (ricaricamento in 
corso)
 PproxyToadlet.pluginStopping=Disconnessione plugin in corso
 PproxyToadlet.pluginUnloaded=Plugin terminato
-PproxyToadlet.pluginUnloadedWithName=Il plugin ${name} ? stato terminato.
+PproxyToadlet.pluginUnloadedWithName=Il plugin ${name} ? stato terminato.
 PproxyToadlet.plugins=Plugin
 PproxyToadlet.pluginsWithNodeName=Plugin di ${name}
 PproxyToadlet.refreshOnStartup=Ricarica da server all'avvio
 PproxyToadlet.reload=Ricarica
-PproxyToadlet.reloadExplanation=Ricaricare un plugin ? come scaricarlo e 
ricaricarlo.
+PproxyToadlet.reloadExplanation=Ricaricare un plugin ? come scaricarlo e 
ricaricarlo.
 PproxyToadlet.reloadOnStartupShort=Ricarica all'avvio
 PproxyToadlet.reloadPluginTitle=Ricarica Plugin
-PproxyToadlet.reloadPurgeWarning=Rimuovi il plugin dalla cache prima di 
ricaricarlo. Se il plugin era stato scaricato da internet, sar? scaricato 
nuovamente.
+PproxyToadlet.reloadPurgeWarning=Rimuovi il plugin dalla cache prima di 
ricaricarlo. Se il plugin era stato scaricato da internet, sar? scaricato 
nuovamente.
 PproxyToadlet.reloadWarning=Attenzione: alcuni plugin non reagiscono in modo 
ottimale a un reload.
 PproxyToadlet.returnToPluginPage=Torna alla pagina dei plugin
 PproxyToadlet.startedAtTitle=Avviato:
@@ -933,7 +947,7 @@
 PproxyToadlet.startingPluginStatus=Stato attuale
 PproxyToadlet.startingPluginTime=tempo trascorso
 PproxyToadlet.startingPluginsTitle=Avvio plugins in corso
-PproxyToadlet.unauthorized=L'accesso a questa pagina non ? autorizzato.
+PproxyToadlet.unauthorized=L'accesso a questa pagina non ? autorizzato.
 PproxyToadlet.unauthorizedTitle=Accesso Non Autorizzato
 PproxyToadlet.unload=Termina
 PproxyToadlet.unloadPluginTitle=Termina plugin?
@@ -957,39 +971,39 @@
 QueueToadlet.download=Scarica
 QueueToadlet.downloadFiles=Download multipli
 QueueToadlet.downloadFilesInstructions=E' possibile incollare una serie di 
chiavi da scaricare nello spazio sottostante (una per rigo)
-QueueToadlet.downloadSucceeded=Il file ${origlink}${filename}${/origlink} ? 
stato scaricato. ${link}Click qui${/link} per aprile il file (${size}).
+QueueToadlet.downloadSucceeded=Il file ${origlink}${filename}${/origlink} ? 
stato scaricato. ${link}Click qui${/link} per aprile il file (${size}).
 QueueToadlet.downloadSucceededTitle=Download completato: ${filename}
 QueueToadlet.emergency=urgenza estrema
-QueueToadlet.enqueuedFailure=Non ? stato possibile agguingere alla coda le 
${number} chiavi qui elencate:
+QueueToadlet.enqueuedFailure=Non ? stato possibile agguingere alla coda le 
${number} chiavi qui elencate:
 QueueToadlet.enqueuedSuccessfully=Le ${number} chiavi elencate di seguito sono 
state aggiunte alla coda con successo:
 QueueToadlet.errorAccessDenied=Errore: Accesso Negato
 QueueToadlet.errorAccessDeniedFile=L'attuale configurazione del nodo non 
consente l'upload del file "${file}".
-QueueToadlet.errorDToDisk=Non ? stato possibile scaricare su disco
+QueueToadlet.errorDToDisk=Non ? stato possibile scaricare su disco
 QueueToadlet.errorDToDiskConfig=L'attuale configurazione del nodo non consente 
di scaricare file nella directory dei download
 QueueToadlet.errorDownloadNotCompleted=Download Non Completato
-QueueToadlet.errorDownloadNotFound=Non ? stato possibile localizzare il 
download richiesto
-QueueToadlet.errorDownloadNotFoundExplanation=Non ? stato possibile trovare il 
download specificato. Potrebbe essere stato eliminato in precedenza.
+QueueToadlet.errorDownloadNotFound=Non ? stato possibile localizzare il 
download richiesto
+QueueToadlet.errorDownloadNotFoundExplanation=Non ? stato possibile trovare il 
download specificato. Potrebbe essere stato eliminato in precedenza.
 QueueToadlet.errorInvalidURI=URI non valida
-QueueToadlet.errorInvalidURIToD=La URI non ? valida e pertanto non pu? essere 
scaricata.
-QueueToadlet.errorInvalidURIToU=Non ? stata specificata alcuna URI valida dove 
inserire il file
+QueueToadlet.errorInvalidURIToD=La URI non ? valida e pertanto non pu? essere 
scaricata.
+QueueToadlet.errorInvalidURIToU=Non ? stata specificata alcuna URI valida dove 
inserire il file
 QueueToadlet.errorNoFileOrCannotRead=File inesistente o illegibile
 QueueToadlet.errorNoFileSelected=Nessun file selezionato
 QueueToadlet.errorNoFileSelectedU=Non e' stato selezionato alcun file per 
l'upload
-QueueToadlet.errorNoKey=Non ? stata specificata alcuna chiave per il download
-QueueToadlet.errorNoKeyToD=Non ? stata specificata una chiave per il download
+QueueToadlet.errorNoKey=Non ? stata specificata alcuna chiave per il download
+QueueToadlet.errorNoKeyToD=Non ? stata specificata una chiave per il download
 QueueToadlet.failedD=Download falliti
 QueueToadlet.failedDU=Upload di directory falliti
-QueueToadlet.failedToRemove=Non ? stato possibile rimuovere ${id}: ${message}
-QueueToadlet.failedToRemoveId=Non ? stato possibile eliminare: ${id}
-QueueToadlet.failedToRemoveRequest=Non ? stato possibile eliminare la richiesta
-QueueToadlet.failedToRestart=Non ? stato possibile riavviare: ${id}
+QueueToadlet.failedToRemove=Non ? stato possibile rimuovere ${id}: ${message}
+QueueToadlet.failedToRemoveId=Non ? stato possibile eliminare: ${id}
+QueueToadlet.failedToRemoveRequest=Non ? stato possibile eliminare la richiesta
+QueueToadlet.failedToRestart=Non ? stato possibile riavviare: ${id}
 QueueToadlet.failedToRestartRequest=Non e' stato possibile riavviare la 
richiesta
 QueueToadlet.failedU=Upload falliti
 QueueToadlet.fcpIsMissing=Server FCP non trovato
 QueueToadlet.fileName=File
 QueueToadlet.files=File
 QueueToadlet.follow=Segui Redirect
-QueueToadlet.globalQueueIsEmpty=La coda globale ? vuota
+QueueToadlet.globalQueueIsEmpty=La coda globale ? vuota
 QueueToadlet.high=alta
 QueueToadlet.identifier=Identificazione
 QueueToadlet.insertAs=Inserisci come:
@@ -1000,22 +1014,22 @@
 QueueToadlet.insertFileLabel=File
 QueueToadlet.insertFileResetForm=Annulla
 QueueToadlet.key=Chiave
-QueueToadlet.legend=Significato dei colori: Priorit?...
+QueueToadlet.legend=Significato dei colori: Priorit?...
 QueueToadlet.low=bassa
 QueueToadlet.medium=media
 QueueToadlet.mimeType=MIME type
 QueueToadlet.noTaskOnGlobalQueue=Nessuna operazione in attesa nella coda 
globale in questo momento.
 QueueToadlet.none=nessuna
 QueueToadlet.notLoadedYet=Il nodo sta ancora caricando la lista delle 
richieste persistenti. Si prega di pazientare.
-QueueToadlet.notLoadedYetTitle=La Coda non ? stata ancora caricata.
+QueueToadlet.notLoadedYetTitle=La Coda non ? stata ancora caricata.
 QueueToadlet.panicButton=Bottone Emergenza
 QueueToadlet.panicButtonConfirmation=Elimina tutte le richieste senza chiedere 
conferma
 QueueToadlet.persistence=Persistenza
 QueueToadlet.persistenceForever=illimitata
 QueueToadlet.persistenceNone=nessuna
 QueueToadlet.persistenceReboot=reboot
-QueueToadlet.pleaseEnableFCP=Per accedere a questa pagina ? necessario 
abilitare il server FCP
-QueueToadlet.priority=Priorit?
+QueueToadlet.pleaseEnableFCP=Per accedere a questa pagina ? necessario 
abilitare il server FCP
+QueueToadlet.priority=Priorit?
 QueueToadlet.priority0=emergenza
 QueueToadlet.priority1=molto alta
 QueueToadlet.priority2=alta
@@ -1025,7 +1039,7 @@
 QueueToadlet.priority6=campa cavallo
 QueueToadlet.progress=Completato
 QueueToadlet.progressbarAccurate=Questo valore e' accurato
-QueueToadlet.progressbarNotAccurate=I valori possono essere imprecisi perch? 
il processo di download del file non e' stato finalizzato
+QueueToadlet.progressbarNotAccurate=I valori possono essere imprecisi perch? 
il processo di download del file non e' stato finalizzato
 QueueToadlet.reason=Motivo
 QueueToadlet.remove=Elimina
 QueueToadlet.requestNavigation=Esplora Richieste
@@ -1037,25 +1051,25 @@
 QueueToadlet.title=Coda globale del nodo: ${nodeName}
 QueueToadlet.totalSize=Dimensioni Totali
 QueueToadlet.unknown=Non Disp.
-QueueToadlet.uploadProgressbarNotAccurate=Il valore di questo indicatore di 
progresso pu? essere falsato quando l'upload codifica ulteriori blocchi.
-QueueToadlet.uploadSucceeded=Il file ${filename} (size ${size}) ? stato 
correttamente caricato su Freenet. ${link}Click qui${/link} per aprire il file.
+QueueToadlet.uploadProgressbarNotAccurate=Il valore di questo indicatore di 
progresso pu? essere falsato quando l'upload codifica ulteriori blocchi.
+QueueToadlet.uploadSucceeded=Il file ${filename} (size ${size}) ? stato 
correttamente caricato su Freenet. ${link}Click qui${/link} per aprire il file.
 QueueToadlet.uploadSucceededTitle=Inserzione completata: ${filename}
 QueueToadlet.veryhigh=molto alta
 QueueToadlet.verylow=bassissima
 QueueToadlet.warningUnsafeContent=Contenuto Potenzialmente Pericoloso
-QueueToadlet.warningUnsafeContentExplanation=Il file richiesto ? di un tipo 
non ancora supportato dal filtro contenuti di Freenet e pertanto non sar? 
possibile filtrarlo. Ci? significa che aprire tale file potrebbe compromettere 
l'anonimato dell'utente
+QueueToadlet.warningUnsafeContentExplanation=Il file richiesto ? di un tipo 
non ancora supportato dal filtro contenuti di Freenet e pertanto non sar? 
possibile filtrarlo. Ci? significa che aprire tale file potrebbe compromettere 
l'anonimato dell'utente
 QueueToadlet.willneverfinish=campa cavallo
 QueueToadlet.wipD=Download in corso (${size})
 QueueToadlet.wipDU=Upload directory in corso (${size})
 QueueToadlet.wipU=Upload in corso: (${size})
-RequestStarterGroup.scheduler=Policy di priorit? dello schedulatore
-RequestStarterGroup.schedulerCHKInserts=Policy di priorit? dello scheduler 
(inserzioni CHK)
-RequestStarterGroup.schedulerCHKRequests=Policy di priorit? dello scheduler 
(richieste CHK)
-RequestStarterGroup.schedulerLong=Imposta lo schema delle policy di priorit? 
usate dallo schedulatore.
-RequestStarterGroup.schedulerSSKInserts=Policy di priorit? dello scheduler 
(inserzioni SSK)
-RequestStarterGroup.schedulerSSKRequests=Policy di priorit? dello scheduler 
(richieste SSK)
-RevocationKeyFoundUserAlert.text=E' stata rilevata la presenza sul network 
della chiave di revoca dell' aggiornamento automatico. Questo significa che il 
nostro sistema di aggiornamento automatico ? stato probabilmente COMPROMESSO. 
L'aggiornamento automatico ? stato conseguentemente disabilitato onde prevenire 
l'intallazione automatica di "robaccia". Si raccomanda di controllare la 
disponibilit? di nuovi aggiornamenti al sito del progetto. Controllare che il 
sito non sia stato falsificato!. Il messaggio di revoca ? il seguente: 
${message}.
-RevocationKeyFoundUserAlert.title=La chiave privata del progetto ? stata 
compromessa!
+RequestStarterGroup.scheduler=Policy di priorit? dello schedulatore
+RequestStarterGroup.schedulerCHKInserts=Policy di priorit? dello scheduler 
(inserzioni CHK)
+RequestStarterGroup.schedulerCHKRequests=Policy di priorit? dello scheduler 
(richieste CHK)
+RequestStarterGroup.schedulerLong=Imposta lo schema delle policy di priorit? 
usate dallo schedulatore.
+RequestStarterGroup.schedulerSSKInserts=Policy di priorit? dello scheduler 
(inserzioni SSK)
+RequestStarterGroup.schedulerSSKRequests=Policy di priorit? dello scheduler 
(richieste SSK)
+RevocationKeyFoundUserAlert.text=E' stata rilevata la presenza sul network 
della chiave di revoca dell' aggiornamento automatico. Questo significa che il 
nostro sistema di aggiornamento automatico ? stato probabilmente COMPROMESSO. 
L'aggiornamento automatico ? stato conseguentemente disabilitato onde prevenire 
l'intallazione automatica di "robaccia". Si raccomanda di controllare la 
disponibilit? di nuovi aggiornamenti al sito del progetto. Controllare che il 
sito non sia stato falsificato!. Il messaggio di revoca ? il seguente: 
${message}.
+RevocationKeyFoundUserAlert.title=La chiave privata del progetto ? stata 
compromessa!
 SSL.enable=Attiva supporto SSL?
 SSL.enableLong=Attiva supporto SSL?
 SSL.keyPass=Password di private key access
@@ -1066,41 +1080,43 @@
 SSL.keyStorePassLong=Password per l'accesso di key store file
 SSL.version=Versione di SSL
 SSL.versionLong=Versione di SSL, SSLv3 o TLSv1 (default SSLv3)
-ShortOption.parseError=Il valore specificato non pu? essere interpretato come 
16-bit integer : ${val}
-SimpleToadletServer.advancedMode=Abilita modalit? avanzata
+ShortOption.parseError=Il valore specificato non pu? essere interpretato come 
16-bit integer : ${val}
+SimpleToadletServer.advancedMode=Abilita modalit? avanzata
 SimpleToadletServer.advancedModeLong=Mostra informazioni cho possono 
interessare solo utenti avanzati o sviluppatori. Nella maggioranza dei casi 
dovrebbe essere impostata su 'falso'
-SimpleToadletServer.allowedFullAccess=Host ai quali ? consentito pieno accesso 
a FProxy (leggere l'avvertenza)
-SimpleToadletServer.allowedFullAccessLong=Host ai quali ? consentito accesso 
pieno al nodo (cambiare impostazioni di configurazione, riavviare, ecc). 
AVVERTENZA: Usare cautela nel decidere a chi consentire accesso pieno!
+SimpleToadletServer.allowedFullAccess=Host ai quali ? consentito pieno accesso 
a FProxy (leggere l'avvertenza)
+SimpleToadletServer.allowedFullAccessLong=Host ai quali ? consentito accesso 
pieno al nodo (cambiare impostazioni di configurazione, riavviare, ecc). 
AVVERTENZA: Usare cautela nel decidere a chi consentire accesso pieno!
 SimpleToadletServer.allowedHosts=Nomi host o indirizzi IP ai quali e' 
consentito connettersi a FProxy
-SimpleToadletServer.allowedHostsLong=Pu? essere una lista di IP separati da 
virgole e IP in formato CIDR come 192.168.0.0/24. Tutti possono accedere al 
disco rigido nei limiti definiti dalle altre opzioni di configurazione.
+SimpleToadletServer.allowedHostsLong=Pu? essere una lista di IP separati da 
virgole e IP in formato CIDR come 192.168.0.0/24. Tutti possono accedere al 
disco rigido nei limiti definiti dalle altre opzioni di configurazione.
 SimpleToadletServer.bindTo=Indirizzo IP collegato
 SimpleToadletServer.bindToLong=Indirizzo IP collegato
-SimpleToadletServer.cannotChangePortOnTheFly=Non ? possibile cambiare il 
numero della porta FProxy "al volo"
-SimpleToadletServer.couldNotChangeBindTo=Non ? stato possibile cambiare 
l'indirizzo abbinato a FProxy: ${error}.
+SimpleToadletServer.cannotChangePortOnTheFly=Non ? possibile cambiare il 
numero della porta FProxy "al volo"
+SimpleToadletServer.couldNotChangeBindTo=Non ? stato possibile cambiare 
l'indirizzo abbinato a FProxy: ${error}.
 SimpleToadletServer.cssName=Nome del CSS
 SimpleToadletServer.cssNameLong=Nome del CSS utilizzato da FProxy
 SimpleToadletServer.cssOverride=Usa un CSS personalizzato al posto di quello 
regolare (ATTENZIONE!)
-SimpleToadletServer.cssOverrideCantRead=Non ? stato possibile leggere il file 
di sovrascrittura CSS fornito: ${filename}
+SimpleToadletServer.cssOverrideCantRead=Non ? stato possibile leggere il file 
di sovrascrittura CSS fornito: ${filename}
 SimpleToadletServer.cssOverrideLong=Questa impostazione permette di utilizzare 
un CSS personalizzato invece di quello normalmente usato. AVVERTENZA: i CSS 
possono essere pericolosi, e *non* vengono filtrati: utilizzare a proprio 
rischio. Per includerli nella distribuzione principale e-mail devl at 
freenetroject.org
-SimpleToadletServer.cssOverrideNotInUploads=Non ? possibile usare questa 
impostazione: "${filename} non ? una directory dalla quale sono permessi gli 
upload.
+SimpleToadletServer.cssOverrideNotInUploads=Non ? possibile usare questa 
impostazione: "${filename} non ? una directory dalla quale sono permessi gli 
upload.
 SimpleToadletServer.doRobots=Usare robots.txt per escludere i robot?
 SimpleToadletServer.doRobotsLong=Pubblica un file /robots.txt allo scopo di 
tenere lontano Google, spiders, Wget, etc.
 SimpleToadletServer.enableInlinePrefetch=Abilita pre-ricezione (prefetching) 
di immagini inlinea (inline)?
 SimpleToadletServer.enableInlinePrefetchLong=Questo potrebbe essere utile se 
il browser utilizza un numero ridotto di connessioni per comunicare con il 
nodo. D'altra parte potrebbe non esserlo.
 SimpleToadletServer.enableJS=Permetti a FProxy di usare Javascript
-SimpleToadletServer.enableJSLong=Determina se FProxy pu? o meno fare uso di 
Javascript. Questa impostazione di solito va tenuta su 'falso'. Nota che i 
freesite non fanno uso di javascript nemmeno se qui abilitata.
+SimpleToadletServer.enableJSLong=Determina se FProxy pu? o meno fare uso di 
Javascript. Questa impostazione di solito va tenuta su 'falso'. Nota che i 
freesite non fanno uso di javascript nemmeno se qui abilitata.
 SimpleToadletServer.enablePersistentConnections=Abilita connessioni 
persistenti HTTP? (Leggere la descrizione)
 SimpleToadletServer.enablePersistentConnectionsLong=Non abilitare questa 
opzione tranne nel caso in cui il browser sia configurato per usare molte 
connessioni anche se sono persistenti.
 SimpleToadletServer.enabled=Abilita FProxy
 SimpleToadletServer.enabledLong=Abilita FProxy e relativi servizi HTTP
-SimpleToadletServer.illegalCSSName=Il nome CSS non pu? contenere i catarreri 
"barra" (/ slash) e "due punti" ( : colon)
+SimpleToadletServer.illegalCSSName=Il nome CSS non pu? contenere i catarreri 
"barra" (/ slash) e "due punti" ( : colon)
 SimpleToadletServer.panicButton=Mostra bottone Emergenza
 SimpleToadletServer.panicButtonLong=Mostra il bottone Emergenza nella pagina 
della Coda. Se usato, Il bottone Emergenza rimuove tutte le richieste che non 
hanno ricevuto conferma.
+SimpleToadletServer.passthroughMaxSize=Dimensione massima per pass-through 
trasparente in fproxy
+SimpleToadletServer.passthroughMaxSizeLong=Dimensione massima file per 
pass-through trasparente in fproxy
 SimpleToadletServer.port=Numero della porta FProxy
 SimpleToadletServer.portLong=Numero della porta FProxy
 SimpleToadletServer.ssl=Abilitare ssl?
 SimpleToadletServer.sslLong=Abilitare ssl?
-StartupToadlet.entropyErrorContent=Non c'? abbastanza entropia disponibile nel 
sistema... Freenet non si avvier? finch? non ne avr? racimolata abbastanza.
+StartupToadlet.entropyErrorContent=Non c'? abbastanza entropia disponibile nel 
sistema... Freenet non si avvier? finch? non ne avr? racimolata abbastanza.
 StartupToadlet.entropyErrorTitle=Entropia insufficiente!
 StartupToadlet.isStartingUp=Avviamento del nodo Freenet in corso, si prega di 
attendere.
 StartupToadlet.title=Avvio di Freenet in corso
@@ -1137,17 +1153,17 @@
 StatisticsToadlet.outputRate=Output: ${rate} al secondo (di ${max} al secondo)
 StatisticsToadlet.payloadOutput=Output Carico Utile: ${total} (${rate}/second) 
(${percent}%)
 StatisticsToadlet.peerStatsTitle=Statistiche peer
-StatisticsToadlet.priority=Priorit?
+StatisticsToadlet.priority=Priorit?
 StatisticsToadlet.requestOutput=Output richieste (carico utile escluso): CHK 
${chk} SSK ${ssk}.
 StatisticsToadlet.resendBytes=Bytes rispediti: ${total}
-StatisticsToadlet.routingDisabled=Indirizzamento traffico sospeso (il nodo ? 
attualmente connesso ma una delle due parti non accetta indirizzamento di 
traffico)
+StatisticsToadlet.routingDisabled=Indirizzamento traffico sospeso (il nodo ? 
attualmente connesso ma una delle due parti non accetta indirizzamento di 
traffico)
 StatisticsToadlet.routingDisabledShort=Indirizzamento Traffico Sospeso
 StatisticsToadlet.running=In funzione
 StatisticsToadlet.statisticGatheringTitle=Raccolta Statistiche
 StatisticsToadlet.swapOutput=Output Scambio: ${total}.
 StatisticsToadlet.threadDumpButton=Genera Thread Dump
 StatisticsToadlet.threads=Threads correnti: ${running}/${max}
-StatisticsToadlet.threadsByPriority=Thread in ordine di prorit?
+StatisticsToadlet.threadsByPriority=Thread in ordine di prorit?
 StatisticsToadlet.totalInput=Input Totale: ${total} (${rate}/second)
 StatisticsToadlet.totalOutput=Output Totale: ${total} (${rate}/second)
 StatisticsToadlet.totalOverhead=Totale overhead di non-richieste: ${rate}/sec 
(${percent}%).
@@ -1159,13 +1175,13 @@
 StatisticsToadlet.waiting=In attesa
 SymlinkerToadlet.symlinks=Link simbolici in ToadletServer
 SymlinkerToadlet.symlinksLong=Lista di "alias#target" che va a formare un 
gruppo di link simbolici
-TestnetHandler.cannotEnableDisableOnTheFly=Non ? possibile abilitare o 
disabilitare la modalit? testnet "al volo";  ? necessario riavviare il nodo ed 
ottenere nuove connessioni.
-TestnetHandler.enable=Abilita modalit? testnet (PERICOLO)
-TestnetHandler.enableLong=Abilita la modalit? testnet (PERICOLO). La modalit? 
testnet elimina l'anonimato per poter permettere agli sviluppatori di fare il 
debugging del nodo
+TestnetHandler.cannotEnableDisableOnTheFly=Non ? possibile abilitare o 
disabilitare la modalit? testnet "al volo";  ? necessario riavviare il nodo ed 
ottenere nuove connessioni.
+TestnetHandler.enable=Abilita modalit? testnet (PERICOLO)
+TestnetHandler.enableLong=Abilita la modalit? testnet (PERICOLO). La modalit? 
testnet elimina l'anonimato per poter permettere agli sviluppatori di fare il 
debugging del nodo
 TestnetHandler.port=Porta testnet
 TestnetHandler.portLong=Numero della porta testnet (-1 = listenPort+1000)
 TextModeClientInterfaceServer.allowedHosts=Host consentiti
-TextModeClientInterfaceServer.allowedHostsLong=Nomi host o indirizzi IP ai 
quali ? consentito connettersi a TMCI. Pu? essere una lista di nomi host e 
indirizzi IP separati da virgole, o anche IP in formato CIDR come 192.168.0.0/24
+TextModeClientInterfaceServer.allowedHostsLong=Nomi host o indirizzi IP ai 
quali ? consentito connettersi a TMCI. Pu? essere una lista di nomi host e 
indirizzi IP separati da virgole, o anche IP in formato CIDR come 192.168.0.0/24
 TextModeClientInterfaceServer.bindTo=Indirizzo IP collegato
 TextModeClientInterfaceServer.bindToLong=Indirizzo IP collegato
 TextModeClientInterfaceServer.enableInputOutput=Abilita stdout/stdin
@@ -1177,7 +1193,7 @@
 TextModeClientInterfaceServer.telnetPortNumber=Porta telnet
 TextModeClientInterfaceServer.telnetPortNumberLong=Porta TCP utlizzata dal 
server TMCI
 TimeSkewDetectedUserAlert.shortText=Il nodo ha rilevato una discrepanza 
temporale. Freenet potrebbe bloccarsi in strani modi!
-TimeSkewDetectedUserAlert.text=Una discrepanza temporale ? stata rilevata dal 
nodo. Questo ? un inconveniente grave; il nodo non potr? funzionare 
correttamente finch? non vi si sar? ovviato. Tra le cause pi? comuni, la 
modalit? powersafe mal configurata, cattiva sincronizzazione tra i client in 
rete, problemi di hardware.
+TimeSkewDetectedUserAlert.text=Una discrepanza temporale ? stata rilevata dal 
nodo. Questo ? un inconveniente grave; il nodo non potr? funzionare 
correttamente finch? non vi si sar? ovviato. Tra le cause pi? comuni, la 
modalit? powersafe mal configurata, cattiva sincronizzazione tra i client in 
rete, problemi di hardware.
 TimeSkewDetectedUserAlert.title=Discrepanza temporale rilevata!
 Toadlet.cancel=Cancella
 Toadlet.clickHere=Clicca qui
@@ -1195,9 +1211,9 @@
 Toadlet.returnToPrevPage=Torna alla pagina precedente
 Toadlet.returnToQueuepage=Torna alla pagina della coda
 Toadlet.tempRedirectWithReason=Redirect temporaneo: ${reason}
-Toadlet.unauthorized=L'accesso a questa pagina ? interdetto.
+Toadlet.unauthorized=L'accesso a questa pagina ? interdetto.
 Toadlet.unauthorizedTitle=Non Autorizzato
-Toadlet.yes=S?
+Toadlet.yes=S?
 ToadletContextImpl.cannotParseContentLength=errore nell' analisi 
contenuto-lunghezza: ${error}
 ToadletContextImpl.cannotParseContentLengthWithError=Impossibile interpretare 
contenuto-lunghezza: ${error}
 ToadletContextImpl.headersLineTooLong=Rigo troppo lungo dalla ricostruzione di 
headers
@@ -1219,23 +1235,23 @@
 TranslationToadlet.reEdit=Ri-modifica la traduzione
 TranslationToadlet.remove=Elimina
 TranslationToadlet.removeOverrideTitle=Elimina una chiave di traduzione
-TranslationToadlet.removeOverrideWarningTitle=Attenzione: la chiave di 
traduzione verr? eliminata!
+TranslationToadlet.removeOverrideWarningTitle=Attenzione: la chiave di 
traduzione verr? eliminata!
 TranslationToadlet.returnToTranslations=Torna alla pagina della traduzione
-TranslationToadlet.showEverything=Mostra tutto, incluse stringhe gi? tradotte
+TranslationToadlet.showEverything=Mostra tutto, incluse stringhe gi? tradotte
 TranslationToadlet.translationKeyLabel=Chiave di traduzione
 TranslationToadlet.translationUpdateTitle=Aggiornamento traduzione
 TranslationToadlet.translationUpdatedTitle=Traduzione aggiornata!
 TranslationToadlet.updateTranslationCommand=Aggiorna traduzione
-UnknownContentTypeException.explanation=Il nodo non ha informazioni su questo 
MIME type. Ci? potrebbe comportare una reazione pericolosa da parte del browser 
in risposta al download di questo file. Per esempio, molti formati possono 
contenere immagini o video inclusi (embedded) che vengono scaricati dal web: 
ci? espone l'utente al rischio di rivelare il proprio indirizzo IP ad un 
eventuale avversario (per esempio un avversario che gestisca il il sito web dal 
quale le immagini o video ecc. vengono scaricati, o uno che abbia in qualche 
modo ottenuto accesso ai log del sito stesso). Hyperlinks e scripting sono 
entrambi ugualmente pericolosi, per lo stesso motivo, ed anche per alcuni altri.
+UnknownContentTypeException.explanation=Il nodo non ha informazioni su questo 
MIME type. Ci? potrebbe comportare una reazione pericolosa da parte del browser 
in risposta al download di questo file. Per esempio, molti formati possono 
contenere immagini o video inclusi (embedded) che vengono scaricati dal web: 
ci? espone l'utente al rischio di rivelare il proprio indirizzo IP ad un 
eventuale avversario (per esempio un avversario che gestisca il il sito web dal 
quale le immagini o video ecc. vengono scaricati, o uno che abbia in qualche 
modo ottenuto accesso ai log del sito stesso). Hyperlinks e scripting sono 
entrambi ugualmente pericolosi, per lo stesso motivo, ed anche per alcuni altri.
 UnknownContentTypeException.title=Tipo di contenuto (content type) sconosciuto 
e pertanto potenzialmente pericoloso: ${type}
 UpdateDeployContext.cannotUpdateNoExtJar=Freenet-ext.jar non trovata in 
wrapper.conf: (freenet.jar trovata: ${mainFilename})
-UpdateDeployContext.cannotUpdateNoJars=Non ? stato possibile trovare i file 
jar di Freenet in wrapper.conf
-UpdateDeployContext.cannotUpdateNoMainJar=Non ? stato possibile trovare 
freenet.jar in wrapper.conf (freenet-ext.jar non trovata: ${extFilename})
+UpdateDeployContext.cannotUpdateNoJars=Non ? stato possibile trovare i file 
jar di Freenet in wrapper.conf
+UpdateDeployContext.cannotUpdateNoMainJar=Non ? stato possibile trovare 
freenet.jar in wrapper.conf (freenet-ext.jar non trovata: ${extFilename})
 UpdateDeployContext.updateCatastrophe=ERRORE CATASTROFICO: Eliminato ${old} ma 
impossibile rinominare ${new} in ${old} quindi IL NODO NON SI AVVIERA'! La 
soluzione consiste nel rinominare ${new}  in ${old} manualmente
-UpdateDeployContext.updateFailedCannotDeleteOldConfig=Non ? stato possibile 
eliminare ${old} quindi non ? possibile sovrascrivere. Aggiornamento fallito.
-UpdateDeployContext.updateFailedNonStandardConfig=Non ? stato possibile 
completare l'aggiornamento a causa della configurazione non-standard: written 
main=${main} ext=${ext} - Questo non dovrebbe accadere! Si prega di riportare 
l'accaduto agli sviluppatori includendo il file wrapper.conf
+UpdateDeployContext.updateFailedCannotDeleteOldConfig=Non ? stato possibile 
eliminare ${old} quindi non ? possibile sovrascrivere. Aggiornamento fallito.
+UpdateDeployContext.updateFailedNonStandardConfig=Non ? stato possibile 
completare l'aggiornamento a causa della configurazione non-standard: written 
main=${main} ext=${ext} - Questo non dovrebbe accadere! Si prega di riportare 
l'accaduto agli sviluppatori includendo il file wrapper.conf
 UpdatedVersionAvailableUserAlert.alsoDownloadedNewExtJar=Il nodo ha anche 
scaricato una nuova versione della extra jar di Freenet, versione ${version}
-UpdatedVersionAvailableUserAlert.armed=Il nodo verr? riavviato automaticamente 
dopo aver completato il download e verificato la nuova versione di Freenet.
+UpdatedVersionAvailableUserAlert.armed=Il nodo verr? riavviato automaticamente 
dopo aver completato il download e verificato la nuova versione di Freenet.
 UpdatedVersionAvailableUserAlert.clickToUpdateASAP=Clicca qui sotto per 
aggiornare il nodo dopo la verifica dell'aggiornamento.
 UpdatedVersionAvailableUserAlert.clickToUpdateNow=Clicca qui sotto per 
aggiornare il nodo immediatamente.
 UpdatedVersionAvailableUserAlert.downloadedNewExtJar=Il nodo ha scaricato una 
nuova versione della extra jar di Freenet, versione ${version}.
@@ -1245,12 +1261,12 @@
 UpdatedVersionAvailableUserAlert.fetchingNewNode=Il nodo sta scaricando una 
versione aggiornata di Freenet (versione nodo ${nodeVersion}).
 UpdatedVersionAvailableUserAlert.finalCheck=Il nodo sta eseguendo un controllo 
finale per verificare la sicurezza dell'aggiornamento (${count} of ${max}).
 UpdatedVersionAvailableUserAlert.notLatest=Sembra che il nodo non stia usando 
una versione aggiornata del software.
-UpdatedVersionAvailableUserAlert.shortArmed=In nodo sta scaricando una nuova 
versione di Freenet e si riavvier? una volta terminato il download.
-UpdatedVersionAvailableUserAlert.shortNotReadyNotArmed=Il nodo sta scaricando 
una nuova versione di Freenet, ma per poterla utilizzare ? necessaria la 
conferma da parte dell'utente.
-UpdatedVersionAvailableUserAlert.shortReadyNotArmed=Il nodo ha scaricato una 
nuova versione di Freenet ma potr? usarla solo dopo la conferma da parte dell' 
utente.
+UpdatedVersionAvailableUserAlert.shortArmed=In nodo sta scaricando una nuova 
versione di Freenet e si riavvier? una volta terminato il download.
+UpdatedVersionAvailableUserAlert.shortNotReadyNotArmed=Il nodo sta scaricando 
una nuova versione di Freenet, ma per poterla utilizzare ? necessaria la 
conferma da parte dell'utente.
+UpdatedVersionAvailableUserAlert.shortReadyNotArmed=Il nodo ha scaricato una 
nuova versione di Freenet ma potr? usarla solo dopo la conferma da parte dell' 
utente.
 UpdatedVersionAvailableUserAlert.title=E' disponibile una nuova versione 
stabile di Freenet
-UpdatedVersionAvailableUserAlert.updateASAPButton=Si prega di aggiornare al 
pi? presto possibile
-UpdatedVersionAvailableUserAlert.updateASAPQuestion=Riavviare il nodo dopo che 
l'aggiornamento ? stato completato?
+UpdatedVersionAvailableUserAlert.updateASAPButton=Si prega di aggiornare al 
pi? presto possibile
+UpdatedVersionAvailableUserAlert.updateASAPQuestion=Riavviare il nodo dopo che 
l'aggiornamento ? stato completato?
 UpdatedVersionAvailableUserAlert.updateNowButton=Aggiorna Adesso!
 UserAlert.apply=Conferma
 UserAlert.hide=Nascondi
@@ -1266,7 +1282,7 @@
 UserAlertManager.totalLabel=Totale:
 UserAlertManager.warningCountLabel=Avvertenze:
 UserAlertsToadlet.titleWithName=Avvertenze per ${name}
-WelcomeToadlet.activityTitle=Attivit? in corso
+WelcomeToadlet.activityTitle=Attivit? in corso
 WelcomeToadlet.alertsSummary=Sommario avvertenze
 WelcomeToadlet.arkFetchCount=ARK Fetchers: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=Conferma Aggiunta Sgnalibro
@@ -1283,20 +1299,20 @@
 WelcomeToadlet.extVersionWithRecommended=Freenet-ext Build #${build} (si 
raccomanda ${recbuild}) r${rev}
 WelcomeToadlet.fetch=Richiama
 WelcomeToadlet.fetchKeyLabel=Richiama una chiave
-WelcomeToadlet.finInsertSuccessWithKey=Il messaggio ? stato inserito in ${key}.
+WelcomeToadlet.finInsertSuccessWithKey=Il messaggio ? stato inserito in ${key}.
 WelcomeToadlet.finInsertedTitle=Inserzione
 WelcomeToadlet.finTitle=Inserzione Nota  Istantanea di Frost
 WelcomeToadlet.fromHeader=Da
 WelcomeToadlet.goToExternalLink=Vai al link specificato
 WelcomeToadlet.homepageFullTitleWithName=Homepage FProxy di ${name}
-WelcomeToadlet.ieWarning=E' stato rilevato l'uso di Microsoft Internet 
Explorer. Ci? potrebbe costituire un pericolo per l'anonimato dell'utente.
+WelcomeToadlet.ieWarning=E' stato rilevato l'uso di Microsoft Internet 
Explorer. Ci? potrebbe costituire un pericolo per l'anonimato dell'utente.
 WelcomeToadlet.ieWarningTitle=Rischio Sicurezza!
 WelcomeToadlet.insertCount=Inserzioni: ${total}
 WelcomeToadlet.insertFailedTitle=Inserzione fallita
-WelcomeToadlet.insertFailedWithMessage=L'inserzione ? fallita con il 
messaggio: ${message}
+WelcomeToadlet.insertFailedWithMessage=L'inserzione ? fallita con il 
messaggio: ${message}
 WelcomeToadlet.insertSucceededTitle=Inserzione Completata
 WelcomeToadlet.insertedTitle=Inserzione
-WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=La chiave 
${link}${name}${/link} ? stata inserita.
+WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=La chiave 
${link}${name}${/link} ? stata inserita.
 WelcomeToadlet.keyRequestLabel=Chiave:
 WelcomeToadlet.messageHeader=Messaggio
 WelcomeToadlet.nodeUpdateConfirm=Conferma: aggiornare il nodo Freenet?
@@ -1309,7 +1325,7 @@
 WelcomeToadlet.restartConfirm=Conferma: Riavvia nodo Freenet?
 WelcomeToadlet.restartConfirmTitle=Riavvia Nodo
 WelcomeToadlet.restartNode=Riavvia nodo
-WelcomeToadlet.restarting=Si prega di attendere durante il riavvio del nodo. 
Questa schermata  si aggiorner? automaticamente, fino a mostrare la pagina 
iniziale fi Freenet. Grazie di aver scelto Freenet.
+WelcomeToadlet.restarting=Si prega di attendere durante il riavvio del nodo. 
Questa schermata  si aggiorner? automaticamente, fino a mostrare la pagina 
iniziale fi Freenet. Grazie di aver scelto Freenet.
 WelcomeToadlet.restartingTitle=Riavvio del nodo Freenet in corso.
 WelcomeToadlet.shutdown=Arresta
 WelcomeToadlet.shutdownConfirm=Conferma: Arresta nodo Freenet?
@@ -1320,24 +1336,24 @@
 WelcomeToadlet.startIndexHeader=Indice dal quale iniziare
 WelcomeToadlet.subjectHeader=Oggetto
 WelcomeToadlet.targetBoardHeader=Target Board
-WelcomeToadlet.testnetWarning=gira in modalit? testnet. DISTRUGGE l'anonimato!
-WelcomeToadlet.testnetWarningTitle=Modalit? Testnet
+WelcomeToadlet.testnetWarning=gira in modalit? testnet. DISTRUGGE l'anonimato!
+WelcomeToadlet.testnetWarningTitle=Modalit? Testnet
 WelcomeToadlet.thanks=Grazie di aver scelto Freenet.
-WelcomeToadlet.threadDumpNotUsingWrapper=Non ? possibile generare un thread 
dump se il nodo non sta girando nel wrapper
+WelcomeToadlet.threadDumpNotUsingWrapper=Non ? possibile generare un thread 
dump se il nodo non sta girando nel wrapper
 WelcomeToadlet.threadDumpSubTitle=Generazione di Thread Dump
 WelcomeToadlet.threadDumpTitle=Genera Thread Dump
-WelcomeToadlet.threadDumpWithFilename=E' stato generato un thread dump, esso ? 
disponibile in ${filename}.
+WelcomeToadlet.threadDumpWithFilename=E' stato generato un thread dump, esso ? 
disponibile in ${filename}.
 WelcomeToadlet.transferringRequestCount=Richieste in corso di trasferimento: 
${total}
 WelcomeToadlet.update=Aggiorna
-WelcomeToadlet.updating=Il nodo Freenet ? stato aggiornato e sar? ora 
riavviato automaticamente. Il processo di riavvio pu? durare fino a dieci 
minuti perch? il nodo prima di aggiornare deve controllare se sia presente una 
chiave di revoca.
+WelcomeToadlet.updating=Il nodo Freenet ? stato aggiornato e sar? ora 
riavviato automaticamente. Il processo di riavvio pu? durare fino a dieci 
minuti perch? il nodo prima di aggiornare deve controllare se sia presente una 
chiave di revoca.
 WelcomeToadlet.updatingThanks=Grazie per usare Freenet
 WelcomeToadlet.updatingTitle=Aggiornamento del nodo in corso
 WelcomeToadlet.uriWouldHaveBeen=La URI sarebbe stata: ${uri}
 WelcomeToadlet.version=Freenet ${fullVersion} Build ${build} r${rev}
 WelcomeToadlet.versionHeader=Informazioni sulla Versione e Controllo del Nodo
 WelcomeToadlet.writtenDatabaseStats=Le statistiche di runtime del database 
sono state scritte nel file di log del wrapper
-WrapperConfig.wrapper.java.maxmemory.long=Limita la quantit? massima di 
memoria utilizzabile da Freenet. Freenet ha bisogno di molta pi? memoria se si 
hanno molti e/o grossi file in coda di dowload/upload,  ed in misura minore se 
il nodo ? dotato di un datastore di dimensioni abbondanti.  I cambiamenti 
saranno effettivi dopo il riavvio del nodo.
+WrapperConfig.wrapper.java.maxmemory.long=Limita la quantit? massima di 
memoria utilizzabile da Freenet. Freenet ha bisogno di molta pi? memoria se si 
hanno molti e/o grossi file in coda di dowload/upload,  ed in misura minore se 
il nodo ? dotato di un datastore di dimensioni abbondanti.  I cambiamenti 
saranno effettivi dopo il riavvio del nodo.
 WrapperConfig.wrapper.java.maxmemory.short=Memoria massima (in megabytes)
 testing.test=test${test1}test${test2}test
-?BookmarkEditorToadlet.pasteOrCancel=Click su un'icona incolla o cancella.
+?BookmarkEditorToadlet.pasteOrCancel=Click su un'icona incolla o cancella.
 End

Modified: branches/db4o/freenet/src/freenet/node/Announcer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Announcer.java       2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/Announcer.java       2008-09-24 
23:10:15 UTC (rev 22827)
@@ -242,7 +242,7 @@
        }

        private long timeGotEnoughPeers = -1;
-       
+       private final Object timeGotEnoughPeersLock = new Object();
        private boolean killedAnnouncementTooOld;

        /** @return True if we have enough peers that we don't need to 
announce. */
@@ -254,7 +254,7 @@
                if(opennetCount >= target) {
                        if(logMINOR)
                                Logger.minor(this, "We have enough opennet 
peers: "+opennetCount+" > "+target+" since 
"+(System.currentTimeMillis()-timeGotEnoughPeers)+" ms");
-                       synchronized(this) {
+                       synchronized(timeGotEnoughPeersLock) {
                                if(timeGotEnoughPeers <= 0)
                                        timeGotEnoughPeers = 
System.currentTimeMillis();
                        }
@@ -278,7 +278,7 @@
                        }

                }
-               synchronized(this) {
+               synchronized(timeGotEnoughPeersLock) {
                        timeGotEnoughPeers = -1;
                }
                return false;
@@ -288,8 +288,10 @@
         * Get the earliest time at which we had enough opennet peers. This is 
reset when we drop
         * below the threshold.
         */
-       synchronized long timeGotEnoughPeers() {
-               return timeGotEnoughPeers;
+       long timeGotEnoughPeers() {
+               synchronized(timeGotEnoughPeersLock) {
+                       return timeGotEnoughPeers;
+               }
        }

        private boolean ignoreIPUndetected;

Modified: branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java 2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java 2008-09-24 
23:10:15 UTC (rev 22827)
@@ -511,7 +511,7 @@
                                                node.usm.send(this, n2nm, null);
                                                Logger.normal(this, "Sent 
queued ("+fileNumber+") N2NM to '"+getName()+"': "+n2nm);
                                                sendSuccess = true;
-                                               
queuedToSendN2NMExtraPeerDataFileNumbers.remove(new Integer(fileNumber));
+                                               
queuedToSendN2NMExtraPeerDataFileNumbers.remove(fileNumber);
                                        }
                                        deleteExtraPeerDataFile(fileNumber);
                                } catch (NotConnectedException e) {
@@ -558,7 +558,7 @@
                                }
                                nextFileNumber = localFileNumbers[i].intValue() 
+ 1;
                        }
-                       extraPeerDataFileNumbers.add(new 
Integer(nextFileNumber));
+                       extraPeerDataFileNumbers.add(nextFileNumber);
                }
                FileOutputStream fos;
                File extraPeerDataFile = new 
File(extraPeerDataPeerDir.getPath()+File.separator+nextFileNumber);
@@ -613,7 +613,7 @@
                        return;
                }
                synchronized(extraPeerDataFileNumbers) {
-                       extraPeerDataFileNumbers.remove(new 
Integer(fileNumber));
+                       extraPeerDataFileNumbers.remove(fileNumber);
                }
                if(!extraPeerDataFile.delete()) {
                        if(extraPeerDataFile.exists()) {
@@ -724,7 +724,7 @@
        public void queueN2NM(SimpleFieldSet fs) {
                int fileNumber = writeNewExtraPeerDataFile( fs, 
Node.EXTRA_PEER_DATA_TYPE_QUEUED_TO_SEND_N2NM);
                synchronized(queuedToSendN2NMExtraPeerDataFileNumbers) {
-                       queuedToSendN2NMExtraPeerDataFileNumbers.add(new 
Integer(fileNumber));
+                       
queuedToSendN2NMExtraPeerDataFileNumbers.add(fileNumber);
                }
        }

@@ -767,9 +767,9 @@
        // FIXME this should be persistent across node restarts

        /** Files I have offered to this peer */
-       private final HashMap myFileOffersByUID = new HashMap();
+       private final HashMap<Long, FileOffer> myFileOffersByUID = new 
HashMap<Long, FileOffer>();
        /** Files this peer has offered to me */
-       private final HashMap hisFileOffersByUID = new HashMap();
+       private final HashMap<Long, FileOffer> hisFileOffersByUID = new 
HashMap<Long, FileOffer>();

        private void storeOffers() {
                // FIXME do something
@@ -870,10 +870,9 @@
                }

                protected void remove() {
-                       Long l = new Long(uid);
                        synchronized(DarknetPeerNode.this) {
-                               myFileOffersByUID.remove(l);
-                               hisFileOffersByUID.remove(l);
+                               myFileOffersByUID.remove(uid);
+                               hisFileOffersByUID.remove(uid);
                        }
                        data.close();
                }
@@ -1342,7 +1341,7 @@
                RandomAccessThing data = new RandomAccessFileWrapper(filename, 
"r");
                FileOffer fo = new FileOffer(uid, data, fnam, mime, message);
                synchronized(this) {
-                       myFileOffersByUID.put(new Long(uid), fo);
+                       myFileOffersByUID.put(uid, fo);
                }
                storeOffers();
                long now = System.currentTimeMillis();
@@ -1406,9 +1405,10 @@
                        Logger.error(this, "Could not parse offer: "+e+" on 
"+this+" :\n"+fs, e);
                        return;
                }
-               Long u = new Long(offer.uid);
-               synchronized(this) {
-                       if(hisFileOffersByUID.containsKey(u)) return; // Ignore 
re-advertisement
+               Long u = offer.uid;
+               synchronized (this) {
+                       if (hisFileOffersByUID.containsKey(u))
+                               return; // Ignore re-advertisement
                        hisFileOffersByUID.put(u, offer);
                }

@@ -1425,7 +1425,7 @@
                        Logger.minor(this, "Accepting transfer "+id+" on 
"+this);
                FileOffer fo;
                synchronized(this) {
-                       fo = (FileOffer) hisFileOffersByUID.get(new Long(id));
+                       fo = hisFileOffersByUID.get(id);
                }
                fo.accept();
        }
@@ -1433,7 +1433,7 @@
        public void rejectTransfer(long id) {
                FileOffer fo;
                synchronized(this) {
-                       fo = (FileOffer) hisFileOffersByUID.remove(new 
Long(id));
+                       fo = hisFileOffersByUID.remove(id);
                }
                fo.reject();
        }
@@ -1451,10 +1451,9 @@
                }
                if(logMINOR)
                        Logger.minor(this, "Offer accepted for "+uid);
-               Long u = new Long(uid);
                FileOffer fo;
                synchronized(this) {
-                       fo = (FileOffer) (myFileOffersByUID.get(u));
+                       fo = (myFileOffersByUID.get(uid));
                }
                if(fo == null) {
                        Logger.error(this, "No such offer: "+uid);
@@ -1486,7 +1485,7 @@

                FileOffer fo;
                synchronized(this) {
-                       fo = (FileOffer) myFileOffersByUID.remove(new 
Long(uid));
+                       fo = myFileOffersByUID.remove(uid);
                }
                fo.onRejected();
        }

Modified: branches/db4o/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/KeyTracker.java      2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/KeyTracker.java      2008-09-24 
23:10:15 UTC (rev 22827)
@@ -220,7 +220,6 @@
                 * Constraint: urgentTime is always greater than activeTime.
                 */
                long activeTime;
-               final Integer packetNumberAsInteger;

                void sent() throws UpdatableSortedLinkedListKilledException {
                        long now = System.currentTimeMillis();
@@ -232,7 +231,6 @@

                BaseQueuedResend(int packetNumber) {
                        this.packetNumber = packetNumber;
-                       packetNumberAsInteger = new Integer(packetNumber);
                        long now = System.currentTimeMillis();
                        activeTime = initialActiveTime(now);
                        urgentTime = activeTime + urgentDelay();
@@ -278,7 +276,7 @@
                }

                public Object indexValue() {
-                       return packetNumberAsInteger;
+                       return packetNumber;
                }
                private DoublyLinkedList parent;

@@ -327,13 +325,9 @@
                        return now + activeDelay;
                }

-               QueuedAckRequest(int packetNumber, boolean sendSoon) {
+               QueuedAckRequest(int packetNumber) {
                        super(packetNumber);
-                       this.createdTime = System.currentTimeMillis();
-                       if(sendSoon) {
-                               activeTime -= activeDelay;
-                               urgentTime -= activeDelay;
-                       }
+                       this.createdTime = System.currentTimeMillis();          
        
                }

                @Override
@@ -479,7 +473,7 @@
                        }
                        if(logMINOR)
                                Logger.minor(this, "Queueing ack request for " 
+ packetNumber + " on " + this);
-                       QueuedAckRequest qrr = new 
QueuedAckRequest(packetNumber, false);
+                       QueuedAckRequest qrr = new 
QueuedAckRequest(packetNumber);
                        ackRequestQueue.add(qrr);
                }
        }

Modified: branches/db4o/freenet/src/freenet/node/LocationManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/LocationManager.java 2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/LocationManager.java 2008-09-24 
23:10:15 UTC (rev 22827)
@@ -246,7 +246,6 @@
         Message origMessage;
         PeerNode pn;
         long uid;
-        Long luid;
         RecentlyForwardedItem item;

         IncomingSwapRequestHandler(Message msg, PeerNode pn, 
RecentlyForwardedItem item) {
@@ -254,7 +253,6 @@
             this.pn = pn;
             this.item = item;
             uid = origMessage.getLong(DMT.UID);
-            luid = new Long(uid);
         }

         public void run() {
@@ -855,9 +853,8 @@
      * to be handled otherwise.
      */
     public boolean handleSwapRequest(Message m, PeerNode pn) {
-        long oldID = m.getLong(DMT.UID);
-        Long luid = new Long(oldID);
-        long newID = oldID+1;
+        final long oldID = m.getLong(DMT.UID);
+        final long newID = oldID + 1;
         /**
          * UID is used to record the state i.e. UID x, came in from node a, 
forwarded to node b.
          * We increment it on each hop, because in order for the node 
selection to be as random as
@@ -865,7 +862,7 @@
          * twice or more. However, if we get a request with either the 
incoming or the outgoing 
          * UID, we can safely kill it as it's clearly the result of a bug.
          */
-        RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(luid);
+        RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(oldID);
         if(item != null) {
                if(logMINOR) Logger.minor(this, "Rejecting - same ID as 
previous request");
             // Reject
@@ -1012,8 +1009,8 @@
        private RecentlyForwardedItem addForwardedItem(long uid, long oid, 
PeerNode pn, PeerNode randomPeer) {
         RecentlyForwardedItem item = new RecentlyForwardedItem(uid, oid, pn, 
randomPeer);
         synchronized(recentlyForwardedIDs) {
-               recentlyForwardedIDs.put(new Long(uid), item);
-               recentlyForwardedIDs.put(new Long(oid), item);
+               recentlyForwardedIDs.put(uid, item);
+                       recentlyForwardedIDs.put(oid, item);
         }
         return item;
     }
@@ -1023,9 +1020,8 @@
      * @return True if we recognized and forwarded this reply.
      */
     public boolean handleSwapReply(Message m, PeerNode source) {
-        long uid = m.getLong(DMT.UID);
-        Long luid = new Long(uid);
-        RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(luid);
+        final long uid = m.getLong(DMT.UID);
+               RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(uid);
         if(item == null) {
             Logger.error(this, "Unrecognized SwapReply: ID "+uid);
             return false;
@@ -1060,9 +1056,8 @@
      * @return True if we recognized and forwarded this message.
      */
     public boolean handleSwapRejected(Message m, PeerNode source) {
-        long uid = m.getLong(DMT.UID);
-        Long luid = new Long(uid);
-        RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(luid);
+        final long uid = m.getLong(DMT.UID);
+               RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(uid);
         if(item == null) return false;
         if(item.requestSender == null){
                if(logMINOR) Logger.minor(this, "Got a FNPSwapRejected without 
any requestSender set! we can't and won't claim it! UID="+uid);
@@ -1095,9 +1090,8 @@
      * @return True if we recognized and forwarded this message.
      */
     public boolean handleSwapCommit(Message m, PeerNode source) {
-        long uid = m.getLong(DMT.UID);
-        Long luid = new Long(uid);
-        RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(luid);
+        final long uid = m.getLong(DMT.UID);
+               RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(uid);
         if(item == null) return false;
         if(item.routedTo == null) return false;
         if(source != item.requestSender) {
@@ -1123,10 +1117,9 @@
      * @return True if we recognized and forwarded this message.
      */
     public boolean handleSwapComplete(Message m, PeerNode source) {
-        long uid = m.getLong(DMT.UID);
+        final long uid = m.getLong(DMT.UID);
         if(logMINOR) Logger.minor(this, "handleSwapComplete("+uid+ ')');
-        Long luid = new Long(uid);
-        RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(luid);
+        RecentlyForwardedItem item = (RecentlyForwardedItem) 
recentlyForwardedIDs.get(uid);
         if(item == null) {
                if(logMINOR) Logger.minor(this, "Item not found: "+uid+": "+m);
             return false;
@@ -1277,8 +1270,8 @@
             Logger.error(this, "removeRecentlyForwardedItem(null)", new 
Exception("error"));
         }
         synchronized(recentlyForwardedIDs) {
-               recentlyForwardedIDs.remove(new Long(item.incomingID));
-               recentlyForwardedIDs.remove(new Long(item.outgoingID));
+               recentlyForwardedIDs.remove(item.incomingID);
+                       recentlyForwardedIDs.remove(item.outgoingID);
         }
     }


Modified: branches/db4o/freenet/src/freenet/node/Node.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Node.java    2008-09-24 22:52:41 UTC 
(rev 22826)
+++ branches/db4o/freenet/src/freenet/node/Node.java    2008-09-24 23:10:15 UTC 
(rev 22827)
@@ -216,16 +216,17 @@
        private static class L10nCallback extends StringCallback implements 
EnumerableOptionCallback {

                public String get() {
-                       return 
L10n.mapLanguageNameToLongName(L10n.getSelectedLanguage());
+                       return L10n.getSelectedLanguage().fullName;
                }

                public void set(String val) throws InvalidConfigValueException {
-                       if(get().equalsIgnoreCase(val)) return;
+                       if(val == null || get().equalsIgnoreCase(val)) return;
                        try {
                                L10n.setLanguage(val);
                        } catch (MissingResourceException e) {
                                throw new 
InvalidConfigValueException(e.getLocalizedMessage());
                        }
+                       PluginManager.setLanguage(L10n.getSelectedLanguage());
                }

                public void setPossibleValues(String[] val) {
@@ -233,10 +234,7 @@
                }

                public String[] getPossibleValues() {
-                       String[] result = new 
String[L10n.AVAILABLE_LANGUAGES.length];
-                       for(int i=0; i<L10n.AVAILABLE_LANGUAGES.length; i++)
-                               result[i] = L10n.AVAILABLE_LANGUAGES[i][1];
-                       return result;
+                       return L10n.LANGUAGE.valuesWithFullNames();
                }
        }

@@ -679,7 +677,7 @@
                        try {
                                
L10n.setLanguage(nodeConfig.getOption("l10n").getDefault());
                        } catch (MissingResourceException e1) {
-                               L10n.setLanguage(L10n.FALLBACK_DEFAULT);
+                               
L10n.setLanguage(L10n.LANGUAGE.getDefault().shortCode);
                        }
                }

@@ -909,12 +907,7 @@
                        oldBootID = -1;
                        // If we have an error in reading, *or in writing*, we 
don't reliably know the last boot ID.
                } finally {
-                       try {
-                               if(raf != null)
-                                       raf.close();
-                       } catch (IOException e) {
-                               // Ignore
-                       }
+                       Closer.close(raf);
                }
                lastBootID = oldBootID;

@@ -1276,7 +1269,8 @@
                                return isAllowedToConnectToSeednodes;
                        }
                        public void set(Boolean val) throws 
InvalidConfigValueException {
-                               if(val == get()) return;
+                               if (get().equals(val))
+                                               return;
                                synchronized(Node.this) {
                                        if(opennet != null)
                                                throw new 
InvalidConfigValueException("Can't change that setting on the fly when opennet 
is already active!");

Modified: branches/db4o/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeClientCore.java  2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/NodeClientCore.java  2008-09-24 
23:10:15 UTC (rev 22827)
@@ -1,6 +1,5 @@
 package freenet.node;

-import freenet.config.NodeNeedRestartException;
 import java.io.File;
 import java.io.IOException;
 import java.net.URI;
@@ -32,6 +31,7 @@
 import freenet.clients.http.filter.GenericReadFilterCallback;
 import freenet.config.Config;
 import freenet.config.InvalidConfigValueException;
+import freenet.config.NodeNeedRestartException;
 import freenet.config.SubConfig;
 import freenet.crypt.RandomSource;
 import freenet.io.xfer.AbortedException;
@@ -177,6 +177,8 @@
                                        // FIXME
                                        throw new 
InvalidConfigValueException(l10n("movingTempDirOnTheFlyNotSupported"));
                                }
+                               
+                               @Override
                                public boolean isReadOnly() {
                                        return true;
                                }
@@ -205,7 +207,8 @@
                        }

                        public void set(Boolean val) throws 
InvalidConfigValueException {
-                               if((val == get()) || 
(persistentTempBucketFactory == null)) return;
+                               if (get().equals(val) || 
(persistentTempBucketFactory == null))
+                                               return;
                                persistentTempBucketFactory.setEncryption(val);
                        }
                });
@@ -223,6 +226,8 @@
                                        // FIXME
                                        throw new 
InvalidConfigValueException("Moving persistent temp directory on the fly not 
supported at present");
                                }
+                               
+                               @Override
                                public boolean isReadOnly() {
                                        return true;
                                }
@@ -244,14 +249,15 @@
                clientContext.init(requestStarters);
                InsertCompressor.load(container, clientContext);

-               nodeConfig.register("maxRAMBucketSize", "32KiB", sortOrder++, 
true, false, "NodeClientCore.maxRAMBucketSize", 
"NodeClientCore.maxRAMBucketSizeLong", new LongCallback() {
+               nodeConfig.register("maxRAMBucketSize", "128KiB", sortOrder++, 
true, false, "NodeClientCore.maxRAMBucketSize", 
"NodeClientCore.maxRAMBucketSizeLong", new LongCallback() {

                        public Long get() {
                                return (tempBucketFactory == null ? 0 : 
tempBucketFactory.getMaxRAMBucketSize());
                        }

                        public void set(Long val) throws 
InvalidConfigValueException {
-                               if((val == get()) || (tempBucketFactory == 
null)) return;
+                               if (get().equals(val) || (tempBucketFactory == 
null))
+                                               return;
                                tempBucketFactory.setMaxRAMBucketSize(val);
                        }
                });
@@ -262,7 +268,8 @@
                        }

                        public void set(Long val) throws 
InvalidConfigValueException {
-                               if((val == get()) || (tempBucketFactory == 
null)) return;
+                               if (get().equals(val) || (tempBucketFactory == 
null))
+                                               return;
                                tempBucketFactory.setMaxRamUsed(val);
                        }
                });
@@ -274,11 +281,12 @@
                        }

                        public void set(Boolean val) throws 
InvalidConfigValueException {
-                               if((val == get()) || (tempBucketFactory == 
null)) return;
+                               if (get().equals(val) || (tempBucketFactory == 
null))
+                                               return;
                                tempBucketFactory.setEncryption(val);
                        }
                });
-               tempBucketFactory = new 
TempBucketFactory(tempFilenameGenerator, 
nodeConfig.getLong("maxRAMBucketSize"), 
nodeConfig.getLong("RAMBucketPoolSize"), random, node.fastWeakRandom, 
nodeConfig.getBoolean("encryptTempBuckets"));
+               tempBucketFactory = new TempBucketFactory(node.executor, 
tempFilenameGenerator, nodeConfig.getLong("maxRAMBucketSize"), 
nodeConfig.getLong("RAMBucketPoolSize"), random, node.fastWeakRandom, 
nodeConfig.getBoolean("encryptTempBuckets"));

                healingQueue = new SimpleHealingQueue(
                                new InsertContext(tempBucketFactory, 
tempBucketFactory, persistentTempBucketFactory,
@@ -355,7 +363,7 @@
                        });
                
setUploadAllowedDirs(nodeConfig.getStringArr("uploadAllowedDirs"));

-               nodeConfig.register("maxArchiveSize", "5MiB", sortOrder++, 
true, false, "NodeClientCore.maxArchiveSize", 
"NodeClientCore.maxArchiveSizeLong", new LongCallback() {
+               nodeConfig.register("maxArchiveSize", "2MiB", sortOrder++, 
true, false, "NodeClientCore.maxArchiveSize", 
"NodeClientCore.maxArchiveSizeLong", new LongCallback() {

                        @Override
                        public Long get() {
@@ -364,7 +372,8 @@

                        @Override
                        public void set(Long val) throws 
InvalidConfigValueException, NodeNeedRestartException {
-                               if(val == get()) return;
+                               if (get().equals(val))
+                                               return;
                                archiveManager.setMaxArchiveSize(val);
                        }
                });

Modified: branches/db4o/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeCrypto.java      2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/NodeCrypto.java      2008-09-24 
23:10:15 UTC (rev 22827)
@@ -370,7 +370,7 @@

        private byte[] myCompressedRef(boolean setup, boolean heavySetup, 
boolean forARK) {
                SimpleFieldSet fs = exportPublicFieldSet(setup, heavySetup, 
forARK);
-               boolean shouldStripGroup = ((setup || heavySetup) && !forARK) 
&& Global.DSAgroupBigA.equals(cryptoGroup);
+               boolean shouldStripGroup = heavySetup && 
Global.DSAgroupBigA.equals(cryptoGroup);
                if(shouldStripGroup)
                        fs.removeSubset("dsaGroup");


Modified: branches/db4o/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeStarter.java     2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/NodeStarter.java     2008-09-24 
23:10:15 UTC (rev 22827)
@@ -33,7 +33,7 @@

        private Node node;
        private static LoggingConfigHandler logConfigHandler;
-       public final static int RECOMMENDED_EXT_BUILD_NUMBER = 20;
+       public final static int RECOMMENDED_EXT_BUILD_NUMBER = 21;
        /*
        (File.separatorChar == '\\') &&
        
(System.getProperty("os.arch").toLowerCase().matches("(i?[x0-9]86_64|amd64)")) 
? 6 : 2;

Modified: branches/db4o/freenet/src/freenet/node/NodeStats.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeStats.java       2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/NodeStats.java       2008-09-24 
23:10:15 UTC (rev 22827)
@@ -216,7 +216,8 @@
                                                return threadLimit;
                                        }
                                        public void set(Integer val) throws 
InvalidConfigValueException {
-                                               if(val == get()) return;
+                                               if (get().equals(val))
+                                               return;
                                                if(val < 100)
                                                        throw new 
InvalidConfigValueException(l10n("valueTooLow"));
                                                threadLimit = val;
@@ -231,7 +232,8 @@
                                                return aggressiveGCModificator;
                                        }
                                        public void set(Integer val) throws 
InvalidConfigValueException {
-                                               if(val == get()) return;
+                                               if (get().equals(val))
+                                               return;
                                                Logger.normal(this, "Changing 
aggressiveGCModificator to "+val);
                                                aggressiveGCModificator = val;
                                        }
@@ -246,7 +248,8 @@
                                        }

                                        public void set(Boolean val) throws 
InvalidConfigValueException {
-                                               if(val == get()) return;
+                                               if (get().equals(val))
+                                               return;

                                                if(val)
                                                        myMemoryChecker.start();

Modified: branches/db4o/freenet/src/freenet/node/PeerManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/PeerManager.java     2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/PeerManager.java     2008-09-24 
23:10:15 UTC (rev 22827)
@@ -80,6 +80,21 @@
        /** routableConnectionStats update interval (milliseconds) */
        private static final long routableConnectionStatsUpdateInterval = 7 * 
1000;  // 7 seconds

+       /** Should update the peer-file ? */
+       private volatile boolean shouldWritePeers = false;
+       private static final int MIN_WRITEPEERS_DELAY = 5*1000; // 5sec
+       private final Runnable writePeersRunnable = new Runnable() {
+
+               public void run() {
+                       if(shouldWritePeers) {
+                               shouldWritePeers = false;
+                               writePeersInner();
+                       }
+                       
+                       node.ps.queueTimedJob(writePeersRunnable, 
MIN_WRITEPEERS_DELAY);
+               }
+       };
+       
        /**
         * Track the number of times a PeerNode has been selected by the 
routing algorithm
         * @see PeerNode.numberOfSelections
@@ -1069,12 +1084,7 @@
        private final Object writePeerFileSync = new Object();

        void writePeers() {
-               node.ps.queueTimedJob(new Runnable() {
-
-                       public void run() {
-                               writePeersInner();
-                       }
-               }, 0);
+               shouldWritePeers = true;
        }

        protected StringBuilder getDarknetPeersString() {
@@ -1282,6 +1292,7 @@
                ua = new PeerManagerUserAlert(node.nodeStats);
                updatePMUserAlert();
                node.clientCore.alerts.register(ua);
+               node.ps.queueTimedJob(writePeersRunnable, 0);
        }

        public int countNonBackedOffPeers() {

Modified: branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -140,17 +140,18 @@

        public synchronized Object[] allKeys(ObjectContainer container) {
                if(finished) return new Object[] {};
-               return new Object[] { new Integer(0) };
+               return new Object[] { 0 };
        }

        public synchronized Object[] sendableKeys(ObjectContainer container) {
                if(finished) return new Object[] {};
-               return new Object[] { new Integer(0) };
+               return new Object[] { 0 };
        }

        public synchronized Object chooseKey(KeysFetchingLocally keys, 
ObjectContainer container, ClientContext context) {
                if(finished) return null;
-               else return new Integer(0);
+               else
+                       return 0;
        }

        public boolean isSSK() {

Modified: branches/db4o/freenet/src/freenet/node/TestnetHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/TestnetHandler.java  2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/TestnetHandler.java  2008-09-24 
23:10:15 UTC (rev 22827)
@@ -243,7 +243,8 @@
                }

                public void set(Integer val) throws InvalidConfigValueException 
{
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        node.testnetHandler.rebind(val);
                }
        }       

Modified: 
branches/db4o/freenet/src/freenet/node/TextModeClientInterfaceServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/TextModeClientInterfaceServer.java   
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/TextModeClientInterfaceServer.java   
2008-09-24 23:10:15 UTC (rev 22827)
@@ -116,7 +116,8 @@
        }

        public void set(Boolean val) throws InvalidConfigValueException {
-               if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                // FIXME implement - see bug #122
                throw new InvalidConfigValueException("Cannot be updated on the 
fly");
        }
@@ -132,7 +133,8 @@
        }

        public void set(Boolean val) throws InvalidConfigValueException {
-               if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        if(!SSL.available()) {
                                throw new InvalidConfigValueException("Enable 
SSL support before use ssl with TMCI");
                        }
@@ -157,7 +159,8 @@
        }

        public void set(Boolean val) throws InvalidConfigValueException {
-               if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                // FIXME implement - see bug #122
                throw new InvalidConfigValueException("Cannot be updated on the 
fly");
        }
@@ -236,7 +239,8 @@

        // TODO: implement it
        public void set(Integer val) throws InvalidConfigValueException {
-               if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                core.getTextModeClientInterface().setPort(val);
        }
     }

Modified: branches/db4o/freenet/src/freenet/node/UptimeEstimator.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/UptimeEstimator.java 2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/UptimeEstimator.java 2008-09-24 
23:10:15 UTC (rev 22827)
@@ -11,11 +11,11 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.text.DecimalFormat;

 import freenet.support.Fields;
 import freenet.support.Logger;
 import freenet.support.io.Closer;
-import java.text.DecimalFormat;

 /**
  * A class to estimate the node's average uptime. Every 5 minutes (with a 
fixed offset), we write
@@ -88,6 +88,8 @@
                                }
                        } catch (EOFException e) {
                                // Finished
+                       } finally {
+                               Closer.close(dis);
                        }
                } catch (IOException e) {
                        Logger.error(this, "Unable to read old uptime file: 
"+file+" - we will assume we weren't online during that period");
@@ -119,6 +121,7 @@
                } catch (IOException e) {
                        Logger.error(this, "Unable to write to uptime estimator 
log file: "+logFile);
                } finally {
+                       Closer.close(dos);
                        Closer.close(fos);
                        // Schedule next time
                        schedule(now);

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-09-24 
23:10:15 UTC (rev 22827)
@@ -203,7 +203,7 @@
                }

                public void set(Integer val) throws InvalidConfigValueException 
{
-                       if(val != get()) {
+                       if (!get().equals(val)) {
                                throw new InvalidConfigValueException("Cannot 
change FCP port number on the fly");
                        }
                }
@@ -226,7 +226,7 @@
                }
 //TODO: Allow it
                public void set(Boolean val) throws InvalidConfigValueException 
{
-                       if(val != get()) {
+                       if (!get().equals(val)) {
                                throw new 
InvalidConfigValueException(l10n("cannotStartOrStopOnTheFly"));
                        }
                }
@@ -243,7 +243,8 @@
                }

                public void set(Boolean val) throws InvalidConfigValueException 
{
-               if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        if(!SSL.available()) {
                                throw new InvalidConfigValueException("Enable 
SSL support before use ssl with FCP");
                        }
@@ -365,7 +366,8 @@
                }

                public void set(Boolean val) throws InvalidConfigValueException 
{
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        server.assumeDownloadDDAIsAllowed = val;
                }
        }
@@ -378,7 +380,8 @@
                }

                public void set(Boolean val) throws InvalidConfigValueException 
{
-                       if(val == get()) return;
+                       if (get().equals(val))
+                               return;
                        server.assumeUploadDDAIsAllowed = val;
                }
        }

Modified: branches/db4o/freenet/src/freenet/node/fcp/NodeHelloMessage.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/NodeHelloMessage.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/node/fcp/NodeHelloMessage.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -45,7 +45,7 @@
                sfs.putSingle("Testnet", Boolean.toString(node == null ? false 
: node.isTestnetEnabled()));
                sfs.putSingle("CompressionCodecs", 
Integer.toString(Compressor.countCompressAlgorithms()));
                sfs.putSingle("ConnectionIdentifier", id);
-               sfs.putSingle("NodeLanguage", L10n.getSelectedLanguage());
+               sfs.putSingle("NodeLanguage", 
L10n.getSelectedLanguage().toString());
                return sfs;
        }


Modified: 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java  
    2008-09-24 22:52:41 UTC (rev 22826)
+++ 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java  
    2008-09-24 23:10:15 UTC (rev 22827)
@@ -83,7 +83,7 @@
        /** Maximum time between asking for the main jar and it starting to 
transfer */
        static final int REQUEST_MAIN_JAR_TIMEOUT = 60*1000;
        //** Grace time before we use UoM to update */
-       public static final int GRACE_TIME = 60*60*1000; // 1h
+       public static final int GRACE_TIME = 3*60*60*1000; // 3h
        private boolean logMINOR;

        private UserAlert alert;
@@ -231,8 +231,9 @@
                                // If we have fetches running already, then 
sendUOMRequestMain() will add the offer to nodesOfferedMainJar,
                                // so that if all our fetches fail, we can 
fetch from this node.
                                        if(!isOutdated) {
-                                               Logger.error(this, "The update 
process seems to have been stuck for over an hour; let's switch to UoM! SHOULD 
NOT HAPPEN! (1)");
-                                               System.out.println("The update 
process seems to have been stuck for over an hour; let's switch to UoM! SHOULD 
NOT HAPPEN! (1)");
+                                               String howLong = 
TimeUtil.formatTime(now - started);
+                                               Logger.error(this, "The update 
process seems to have been stuck for "+ howLong +"; let's switch to UoM! SHOULD 
NOT HAPPEN! (1)");
+                                               System.out.println("The update 
process seems to have been stuck for "+ howLong +"; let's switch to UoM! SHOULD 
NOT HAPPEN! (1)");
                                        } else
                                                if(logMINOR) Logger.minor(this, 
"Fetching via UOM as our build is deprecated");
                                        // Fetch it
@@ -260,8 +261,8 @@
                                                if(!updateManager.isEnabled()) 
return;
                                                
if(updateManager.hasNewMainJar()) return;
                                                
if(!updateManager.node.isOudated()) {
-                                                       Logger.error(this, "The 
update process seems to have been stuck for over an hour; let's switch to UoM! 
SHOULD NOT HAPPEN! (2)");
-                                                       System.out.println("The 
update process seems to have been stuck for over an hour; let's switch to UoM! 
SHOULD NOT HAPPEN! (2)");
+                                                       Logger.error(this, "The 
update process seems to have been stuck for too long; let's switch to UoM! 
SHOULD NOT HAPPEN! (2)");
+                                                       System.out.println("The 
update process seems to have been stuck for too long; let's switch to UoM! 
SHOULD NOT HAPPEN! (2)");
                                                }
                                                maybeRequestMainJar();
                                        }
@@ -387,6 +388,7 @@
                        super(false, null, null, null, null, 
UserAlert.CRITICAL_ERROR, true, null, false, null);
                }

+               @Override
                public HTMLNode getHTMLText() {
                        HTMLNode div = new HTMLNode("div");

@@ -438,6 +440,7 @@
                        return L10n.getString("PeersSayKeyBlownAlert."+key, 
pattern, value);
                }

+               @Override
                public String getText() {
                        StringBuffer sb = new StringBuffer();
                        sb.append(l10n("intro")).append("\n\n");
@@ -481,14 +484,17 @@
                        return sb.toString();
                }

+               @Override
                public String getTitle() {
                        return l10n("titleWithCount", "count", 
Integer.toString(nodesSayKeyRevoked.size()));
                }

+               @Override
                public void isValid(boolean validity) {
                        // Do nothing
                }

+               @Override
                public String getShortText() {
                        return l10n("short");
                }
@@ -607,6 +613,7 @@
                                                Logger.minor(this, "Message 
sent, data soon");
                                }

+                               @Override
                                public String toString() {
                                        return super.toString() + 
"("+uid+":"+source.getPeer()+")";
                                }
@@ -981,6 +988,7 @@
                                                Logger.minor(this, "Message 
sent, data soon");
                                }

+                               @Override
                                public String toString() {
                                        return super.toString() + 
"("+uid+":"+source.getPeer()+")";
                                }

Modified: 
branches/db4o/freenet/src/freenet/pluginmanager/ForwardPortCallback.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/ForwardPortCallback.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/pluginmanager/ForwardPortCallback.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -9,6 +9,6 @@
 public interface ForwardPortCallback {

        /** Called to indicate status on one or more forwarded ports. */
-       public void portForwardStatus(Map /*<ForwardPort,ForwardPortStatus>*/ 
statuses);
+       public void portForwardStatus(Map<ForwardPort,ForwardPortStatus> 
statuses);

 }

Copied: branches/db4o/freenet/src/freenet/pluginmanager/FredPluginL10n.java 
(from rev 22306, trunk/freenet/src/freenet/pluginmanager/FredPluginL10n.java)
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/FredPluginL10n.java         
                (rev 0)
+++ branches/db4o/freenet/src/freenet/pluginmanager/FredPluginL10n.java 
2008-09-24 23:10:15 UTC (rev 22827)
@@ -0,0 +1,19 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.pluginmanager;
+
+import freenet.l10n.L10n.LANGUAGE;
+
+/**
+ * Interface that has to be implemented for plugins that wants to use
+ * PageMaker.addNavigationLink(..) 
+ * 
+ * @author saces
+ */
+public interface FredPluginL10n {
+
+       public String getString(String key);
+       
+       public void setLanguage(LANGUAGE newLanguage);
+}

Modified: 
branches/db4o/freenet/src/freenet/pluginmanager/FredPluginPortForward.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/FredPluginPortForward.java  
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/pluginmanager/FredPluginPortForward.java  
2008-09-24 23:10:15 UTC (rev 22827)
@@ -16,6 +16,6 @@
         * @param cb Callback to be called with success/failure of each 
forward. Some
         * plugins may return a probabilistic success e.g. with UP&P.
         */
-       public void onChangePublicPorts(Set/*<ForwardPort>*/ ports, 
ForwardPortCallback cb);
+       public void onChangePublicPorts(Set<ForwardPort> ports, 
ForwardPortCallback cb);

 }

Copied: branches/db4o/freenet/src/freenet/pluginmanager/FredPluginThemed.java 
(from rev 22306, trunk/freenet/src/freenet/pluginmanager/FredPluginThemed.java)
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/FredPluginThemed.java       
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/pluginmanager/FredPluginThemed.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -0,0 +1,21 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.pluginmanager;
+
+import freenet.clients.http.PageMaker.THEME;
+
+/**
+ * Interface that has to be implemented for plugins that wants to use
+ * nodes html look (css theme) but not PageMaker.<br /> 
+ * 
+ * Very geek'ish and not recommended. Use PageMaker instead. {see 
FredPluginL10n}
+ *  
+ * @author saces
+ *
+ */
+public interface FredPluginThemed {
+
+       public void setTheme(THEME theme);
+
+}

Modified: 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java   
    2008-09-24 22:52:41 UTC (rev 22826)
+++ 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java   
    2008-09-24 23:10:15 UTC (rev 22827)
@@ -84,7 +84,12 @@
                                Certificate cert = (Certificate) it.next();
                                
ks.setCertificateEntry(cert.getPublicKey().toString(), cert);
                        }
-                       ks.store(new FileOutputStream(TMP_KEYSTORE), new 
char[0]);
+                       FileOutputStream tmpFOS = new 
FileOutputStream(TMP_KEYSTORE);
+                       try {
+                               ks.store(tmpFOS, new char[0]);
+                       } finally {
+                               Closer.close(tmpFOS);
+                       }
                        System.out.println("The CA has been imported into the 
trustStore");
                } catch(Exception e) {
                        System.err.println("Error while handling the CA :" + 
e.getMessage());

Modified: branches/db4o/freenet/src/freenet/pluginmanager/PluginHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginHandler.java  
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginHandler.java  
2008-09-24 23:10:15 UTC (rev 22827)
@@ -20,7 +20,7 @@
         * @param plug
         */
        public static PluginInfoWrapper startPlugin(PluginManager pm, String 
filename, FredPlugin plug, PluginRespirator pr) {
-               final PluginInfoWrapper pi = new PluginInfoWrapper(plug, 
filename);
+               final PluginInfoWrapper pi = new PluginInfoWrapper(pr, plug, 
filename);
                final PluginStarter ps = new PluginStarter(pr, pi);
                ps.setPlugin(pm, plug);
                // We must start the plugin *after startup has finished*

Modified: branches/db4o/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java      
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java      
2008-09-24 23:10:15 UTC (rev 22827)
@@ -13,6 +13,7 @@
        private final String className;
        private Thread thread;
        private final long start;
+       final PluginRespirator pr;
        private final String threadName;
        final FredPlugin plug;
        private final boolean isPproxyPlugin;
@@ -27,11 +28,14 @@
        private HashSet<String> toadletLinks = new HashSet<String>();
        private volatile boolean stopping = false;
        private volatile boolean unregistered = false;
+       private final boolean isThemedPlugin;
+       private final boolean isL10nPlugin;

-       public PluginInfoWrapper(FredPlugin plug, String filename) {
+       public PluginInfoWrapper(PluginRespirator pr, FredPlugin plug, String 
filename) {
                this.plug = plug;
                className = plug.getClass().toString();
                this.filename = filename;
+               this.pr = pr;
                threadName = 'p' + className.replaceAll("^class ", "") + '_' + 
hashCode();
                start = System.currentTimeMillis();
                fedPluginThread = true;
@@ -43,6 +47,8 @@
                isMultiplePlugin = (plug instanceof FredPluginMultiple);
                isFCPPlugin = (plug instanceof FredPluginFCP);
                isVersionedPlugin = (plug instanceof FredPluginVersioned);
+               isThemedPlugin = (plug instanceof FredPluginThemed);
+               isL10nPlugin = (plug instanceof FredPluginL10n);
        }

        void setThread(Thread ps) {
@@ -179,6 +185,13 @@
        public boolean isFCPPlugin() {
                return isFCPPlugin;
        }
+       
+       public boolean isThemedPlugin() {
+               return isThemedPlugin;
+       }
+       public boolean isL10nPlugin() {
+               return isL10nPlugin;
+       }

        public synchronized boolean isStopping() {
                return stopping;

Modified: branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java  
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java  
2008-09-24 23:10:15 UTC (rev 22827)
@@ -25,10 +25,12 @@
 import java.util.zip.ZipException;

 import freenet.client.HighLevelSimpleClient;
+import freenet.clients.http.PageMaker.THEME;
 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
 import freenet.keys.FreenetURI;
 import freenet.l10n.L10n;
+import freenet.l10n.L10n.LANGUAGE;
 import freenet.node.Node;
 import freenet.node.NodeClientCore;
 import freenet.node.RequestStarter;
@@ -38,10 +40,12 @@
 import freenet.support.HexUtil;
 import freenet.support.JarClassLoader;
 import freenet.support.Logger;
+import freenet.support.SerialExecutor;
 import freenet.support.api.HTTPRequest;
 import freenet.support.api.StringArrCallback;
 import freenet.support.io.Closer;
 import freenet.support.io.FileUtil;
+import freenet.support.io.NativeThread;

 public class PluginManager {

@@ -65,9 +69,14 @@
        private boolean logMINOR;
        private boolean logDEBUG;
        private final HighLevelSimpleClient client;
+       
+       private static PluginManager selfinstance = null;

+       private THEME fproxyTheme;
+       
+       private final SerialExecutor executor;
+
        public PluginManager(Node node) {
-
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
                // config 
@@ -85,7 +94,10 @@

                client = 
core.makeClient(RequestStarter.INTERACTIVE_PRIORITY_CLASS, true);

-
+               // callback executor
+               executor = new SerialExecutor(NativeThread.NORM_PRIORITY);
+               executor.start(node.executor, "PM callback executor");
+               
                pmconfig = new SubConfig("pluginmanager", node.config);
 //             pmconfig.register("configfile", "fplugins.ini", 9, true, true, 
"PluginConfig.configFile", "PluginConfig.configFileLong",
 //                             new StringCallback() {
@@ -140,6 +152,9 @@
                                startPluginAuto(name, false);

                pmconfig.finishedInitialization();
+               
+               fproxyTheme = 
THEME.themeFromName(node.config.get("fproxy").getString("css"));
+               selfinstance = this;
        }

        private String[] getConfigLoadString() {
@@ -204,7 +219,7 @@
        }

        public void startPluginFreenet(final String filename, boolean store) {
-               realStartPlugin(new PluginDownLoaderFreenet(client), filename, 
true);
+               realStartPlugin(new PluginDownLoaderFreenet(client), filename, 
store);
        }

        private void realStartPlugin(final PluginDownLoader pdl, final String 
filename, final boolean store) {
@@ -222,7 +237,7 @@
                                try {
                                        plug = loadPlugin(pdl, filename);
                                        
pluginProgress.setProgress(PluginProgress.STARTING);
-                                       PluginInfoWrapper pi = 
PluginHandler.startPlugin(PluginManager.this, filename, plug, new 
PluginRespirator(node, PluginManager.this));
+                                       PluginInfoWrapper pi = 
PluginHandler.startPlugin(PluginManager.this, filename, plug, new 
PluginRespirator(node, PluginManager.this, plug));
                                        synchronized(pluginWrappers) {
                                                pluginWrappers.add(pi);
                                        }
@@ -845,4 +860,52 @@
                        return "PluginProgress[name=" + name + ",startingTime=" 
+ startingTime + ",progress=" + pluginProgress + "]";
                }
        }
+
+       public void setFProxyTheme(final THEME cssName) {
+               //if (fproxyTheme.equals(cssName)) return;
+               fproxyTheme = cssName;
+               synchronized(pluginWrappers) {
+                       for(PluginInfoWrapper pi: pluginWrappers) {
+                               pi.pr.getPageMaker().setTheme(cssName);
+                               if(pi.isThemedPlugin()) {
+                                       final FredPluginThemed plug = 
(FredPluginThemed)(pi.plug);
+                                       executor.execute(new Runnable() {
+                                               public void run() {
+                                                       try {
+                                                               
plug.setTheme(cssName);
+                                                       } catch (Throwable t) {
+                                                               
Logger.error(this, "Cought Trowable in Callback", t);
+                                                       }
+                                               }}, "Callback");
+                               }
+                       }
+               }
+       }
+
+       public static void setLanguage(LANGUAGE lang) {
+               if (selfinstance == null) return;
+               selfinstance.setPluginLanguage(lang);
+       }
+
+       private void setPluginLanguage(final LANGUAGE lang) {
+               synchronized(pluginWrappers) {
+                       for(PluginInfoWrapper pi: pluginWrappers) {
+                               if(pi.isL10nPlugin()) {
+                                       final FredPluginL10n plug = 
(FredPluginL10n)(pi.plug);
+                                       executor.execute(new Runnable() {
+                                               public void run() {
+                                                       try {
+                                                               
plug.setLanguage(lang);
+                                                       } catch (Throwable t) {
+                                                               
Logger.error(this, "Cought Trowable in Callback", t);
+                                                       }
+                                               }}, "Callback");
+                               }
+                       }
+               }
+       }
+
+       public THEME getFProxyTheme() {
+               return fproxyTheme;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/pluginmanager/PluginRespirator.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginRespirator.java       
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginRespirator.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -14,11 +14,18 @@
        private final HighLevelSimpleClient hlsc;
        private final Node node;
        private final PageMaker pageMaker;
+       private final FredPlugin plugin;
+       private final PluginManager pluginManager;

-       public PluginRespirator(Node node, PluginManager pm) {
+       public PluginRespirator(Node node, PluginManager pm, FredPlugin plug) {
                this.node = node;
                this.hlsc = 
node.clientCore.makeClient(RequestStarter.INTERACTIVE_PRIORITY_CLASS);
-               this.pageMaker = new PageMaker("clean");
+               this.plugin = plug;
+               this.pluginManager = pm;
+               if (plugin instanceof FredPluginL10n)
+                       pageMaker = new PageMaker((FredPluginL10n)plugin, 
pluginManager.getFProxyTheme());
+               else
+                       pageMaker = new PageMaker(null, 
pluginManager.getFProxyTheme());
        }

        //public HighLevelSimpleClient getHLSimpleClient() throws 
PluginSecurityException {

Modified: branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 
2008-09-24 23:10:15 UTC (rev 22827)
@@ -37,7 +37,6 @@

 import freenet.crypt.RandomSource;
 import freenet.keys.KeyVerifyException;
-import freenet.node.NodeInitException;
 import freenet.node.SemiOrderedShutdownHook;
 import freenet.support.Fields;
 import freenet.support.HexUtil;
@@ -498,7 +497,7 @@
                                        maybeQuickShrink(true);
                                        return;
                                }
-                               Integer blockNum = new 
Integer((int)storeBlock.offset);
+                               Integer blockNum = (int) storeBlock.offset;
                                //Long seqNum = new 
Long(storeBlock.recentlyUsed);
                                //System.out.println("#"+x+" seq "+seqNum+": 
block "+blockNum);
                                if(blockNum.longValue() >= realSize) {
@@ -2303,4 +2302,19 @@
        envConfig.setConfigParam("je.env.backgroundSleepInterval", "10000" /* 
microseconds */); // 10ms
         return envConfig;
     }
+
+    public boolean probablyInStore(byte[] routingKey) {
+       DatabaseEntry routingkeyDBE = new DatabaseEntry(routingKey);
+               DatabaseEntry blockDBE = new DatabaseEntry();
+               synchronized (this) {
+                       if (closed)
+                               return false;
+               }
+
+               try {
+                       return keysDB.get(null, routingkeyDBE, blockDBE, 
LockMode.READ_UNCOMMITTED) == OperationStatus.SUCCESS;
+               } catch (DatabaseException e) {
+                       return false;
+               } 
+       }
 }

Modified: branches/db4o/freenet/src/freenet/store/FreenetStore.java
===================================================================
--- branches/db4o/freenet/src/freenet/store/FreenetStore.java   2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/store/FreenetStore.java   2008-09-24 
23:10:15 UTC (rev 22827)
@@ -53,4 +53,12 @@
        public long writes();

        public long keyCount();
+       
+       /**
+        * Check if a routing key probably
+        * 
+        * @param routingkey
+        * @return <code>false</code> <b>only</b> if the key does not exist in 
store.
+        */
+       public boolean probablyInStore(byte[] routingKey);
 }

Modified: branches/db4o/freenet/src/freenet/store/RAMFreenetStore.java
===================================================================
--- branches/db4o/freenet/src/freenet/store/RAMFreenetStore.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/store/RAMFreenetStore.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -122,4 +122,8 @@
                return writes;
        }

+       public boolean probablyInStore(byte[] routingKey) {
+               ByteArrayWrapper key = new ByteArrayWrapper(routingKey);
+               return blocksByRoutingKey.get(key) != null;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/support/Fields.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/Fields.java       2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/Fields.java       2008-09-24 
23:10:15 UTC (rev 22827)
@@ -21,54 +21,56 @@
         * All possible chars for representing a number as a String. Used to
         * optimize numberList().
         */
-       private final static char[] digits =
-               {
-                       '0',
-                       '1',
-                       '2',
-                       '3',
-                       '4',
-                       '5',
-                       '6',
-                       '7',
-                       '8',
-                       '9',
-                       'a',
-                       'b',
-                       'c',
-                       'd',
-                       'e',
-                       'f',
-                       'g',
-                       'h',
-                       'i',
-                       'j',
-                       'k',
-                       'l',
-                       'm',
-                       'n',
-                       'o',
-                       'p',
-                       'q',
-                       'r',
-                       's',
-                       't',
-                       'u',
-                       'v',
-                       'w',
-                       'x',
-                       'y',
-                       'z' };
-
+       private final static char[] digits = {
+               '0',
+               '1',
+               '2',
+               '3',
+               '4',
+               '5',
+               '6',
+               '7',
+               '8',
+               '9',
+               'a',
+               'b',
+               'c',
+               'd',
+               'e',
+               'f',
+               'g',
+               'h',
+               'i',
+               'j',
+               'k',
+               'l',
+               'm',
+               'n',
+               'o',
+               'p',
+               'q',
+               'r',
+               's',
+               't',
+               'u',
+               'v',
+               'w',
+               'x',
+               'y',
+               'z'
+       };
        private static final long[] MULTIPLES = {
-               1000,                                           1l << 10,
-               1000 * 1000,                                    1l << 20,
-               1000l * 1000l * 1000l,                          1l << 30,
-               1000l * 1000l * 1000l * 1000l,                  1l << 40,
-               1000l * 1000l * 1000l * 1000l * 1000,           1l << 50,
-               1000l * 1000l * 1000l * 1000l * 1000l * 1000l,  1l << 60
+               1000, 1l << 10,
+               1000 * 1000, 1l << 20,
+               1000l * 1000l * 1000l, 1l << 30,
+               1000l * 1000l * 1000l * 1000l, 1l << 40,
+               1000l * 1000l * 1000l * 1000l * 1000, 1l << 50,
+               1000l * 1000l * 1000l * 1000l * 1000l * 1000l, 1l << 60
        };
-       
+       private static final String[] MULTIPLES_2 = {
+               "k", "K", "m", "M", "g", "G", "t", "T", "p", "P", "e", "E"
+       };
+
        /**
         * Converts a hex string into a long. Long.parseLong(hex, 16) assumes 
the
         * input is nonnegative unless there is a preceding minus sign. This 
method
@@ -88,14 +90,14 @@
        public static final long hexToLong(String hex)
                throws NumberFormatException {
                int len = hex.length();
-               if (len > 16)
+               if(len > 16)
                        throw new NumberFormatException();

                long l = 0;
-               for (int i = 0; i < len; i++) {
+               for(int i = 0; i < len; i++) {
                        l <<= 4;
                        int c = Character.digit(hex.charAt(i), 16);
-                       if (c < 0)
+                       if(c < 0)
                                throw new NumberFormatException();
                        l |= c;
                }
@@ -120,14 +122,14 @@
         */
        public static final int hexToInt(String hex) throws 
NumberFormatException {
                int len = hex.length();
-               if (len > 16)
+               if(len > 16)
                        throw new NumberFormatException();

                int l = 0;
-               for (int i = 0; i < len; i++) {
+               for(int i = 0; i < len; i++) {
                        l <<= 4;
                        int c = Character.digit(hex.charAt(i), 16);
-                       if (c < 0)
+                       if(c < 0)
                                throw new NumberFormatException();
                        l |= c;
                }
@@ -149,7 +151,8 @@
         */
        /* wooo, rocket science! (this is purely abstraction people) */
        public static final boolean stringToBool(String s, boolean def) {
-               if(s == null) return def;
+               if(s == null)
+                       return def;
                return (def ? !s.equalsIgnoreCase("false") : 
s.equalsIgnoreCase("true"));
        }

@@ -159,10 +162,13 @@
         * @return
         */
        public static boolean stringToBool(String s) throws 
NumberFormatException {
-               if(s == null) throw new NumberFormatException("Null");
-               if(s.equalsIgnoreCase("false") || s.equalsIgnoreCase("no")) 
return false;
-               if(s.equalsIgnoreCase("true") || s.equalsIgnoreCase("yes")) 
return true;
-               throw new NumberFormatException("Invalid boolean: "+s);
+               if(s == null)
+                       throw new NumberFormatException("Null");
+               if(s.equalsIgnoreCase("false") || s.equalsIgnoreCase("no"))
+                       return false;
+               if(s.equalsIgnoreCase("true") || s.equalsIgnoreCase("yes"))
+                       return true;
+               throw new NumberFormatException("Invalid boolean: " + s);
        }

        /**
@@ -177,10 +183,11 @@
        }

        public static final String[] commaList(String ls) {
-               if(ls == null) return null;
+               if(ls == null)
+                       return null;
                StringTokenizer st = new StringTokenizer(ls, ",");
                String[] r = new String[st.countTokens()];
-               for (int i = 0; i < r.length; i++) {
+               for(int i = 0; i < r.length; i++) {
                        r[i] = st.nextToken().trim();
                }
                return r;
@@ -191,10 +198,10 @@
        }

        public static final String textList(String[] ls, char ch) {
-               StringBuffer sb = new StringBuffer();
-               for (int i = 0; i < ls.length; i++) {
+               StringBuilder sb = new StringBuilder();
+               for(int i = 0; i < ls.length; i++) {
                        sb.append(ls[i]);
-                       if (i != ls.length - 1)
+                       if(i != ls.length - 1)
                                sb.append(ch);
                }
                return sb.toString();
@@ -204,7 +211,7 @@
                throws NumberFormatException {
                StringTokenizer st = new StringTokenizer(ls, ",");
                long[] r = new long[st.countTokens()];
-               for (int i = 0; i < r.length; i++) {
+               for(int i = 0; i < r.length; i++) {
                        r[i] = hexToLong(st.nextToken());
                }
                return r;
@@ -212,8 +219,8 @@

        public static final String numberList(long[] ls) {
                char[] numberBuf = new char[64];
-               StringBuffer listBuf = new StringBuffer(ls.length * 18);
-               for (int i = 0; i < ls.length; i++) {
+               StringBuilder listBuf = new StringBuilder(ls.length * 18);
+               for(int i = 0; i < ls.length; i++) {

                        // Convert the number into a string in a fixed size 
buffer.
                        long l = ls[i];
@@ -221,12 +228,11 @@
                        do {
                                numberBuf[--charPos] = digits[(int) (l & 0x0F)];
                                l >>>= 4;
-                       } while (l != 0);
+                       } while(l != 0);

                        listBuf.append(numberBuf, charPos, (64 - charPos));
-                       if (i != ls.length - 1) {
+                       if(i != ls.length - 1)
                                listBuf.append(',');
-                       }
                }
                return listBuf.toString();
        }
@@ -242,53 +248,39 @@
        public static final long dateTime(String date)
                throws NumberFormatException {

-               if (date.length() == 0)
+               if(date.length() == 0)
                        throw new NumberFormatException("Date time empty");

-               if ((date.charAt(0) == '-') || (date.charAt(0) == '+')) {
+               if((date.charAt(0) == '-') || (date.charAt(0) == '+')) {
                        // Relative date
-                       StringBuffer sb = new StringBuffer(10);
-                       for (int x = 1; x < date.length(); x++) {
+                       StringBuilder sb = new StringBuilder(10);
+                       for(int x = 1; x < date.length(); x++) {
                                char c = date.charAt(x);
-                               if (Character.isDigit(c)) {
+                               if(Character.isDigit(c))
                                        sb.append(c);
-                               } else
+                               else
                                        break;
                        }
                        int num = Integer.parseInt(sb.toString());
                        int chop = 1 + sb.length();
                        int deltaType = 0;
-                       if (date.length() == chop)
+                       if(date.length() == chop)
                                deltaType = Calendar.DAY_OF_YEAR;
                        else {
                                String deltaTypeString = 
date.substring(chop).toLowerCase();
-                               if (deltaTypeString.equals("y")
-                                       || deltaTypeString.equals("year"))
+                               if(deltaTypeString.equals("y") || 
deltaTypeString.equals("year"))
                                        deltaType = Calendar.YEAR;
-                               else if (
-                                       deltaTypeString.equals("month")
-                                               || deltaTypeString.equals("mo"))
+                               else if(deltaTypeString.equals("month") || 
deltaTypeString.equals("mo"))
                                        deltaType = Calendar.MONTH;
-                               else if (
-                                       deltaTypeString.equals("week")
-                                               || deltaTypeString.equals("w"))
+                               else if(deltaTypeString.equals("week") || 
deltaTypeString.equals("w"))
                                        deltaType = Calendar.WEEK_OF_YEAR;
-                               else if (
-                                       deltaTypeString.equals("day")
-                                               || deltaTypeString.equals("d"))
+                               else if(deltaTypeString.equals("day") || 
deltaTypeString.equals("d"))
                                        deltaType = Calendar.DAY_OF_YEAR;
-                               else if (
-                                       deltaTypeString.equals("hour")
-                                               || deltaTypeString.equals("h"))
+                               else if(deltaTypeString.equals("hour") || 
deltaTypeString.equals("h"))
                                        deltaType = Calendar.HOUR;
-                               else if (
-                                       deltaTypeString.equals("minute")
-                                               || 
deltaTypeString.equals("min"))
+                               else if(deltaTypeString.equals("minute") || 
deltaTypeString.equals("min"))
                                        deltaType = Calendar.MINUTE;
-                               else if (
-                                       deltaTypeString.equals("second")
-                                               || deltaTypeString.equals("s")
-                                               || 
deltaTypeString.equals("sec"))
+                               else if(deltaTypeString.equals("second") || 
deltaTypeString.equals("s") || deltaTypeString.equals("sec"))
                                        deltaType = Calendar.SECOND;
                                else
                                        throw new NumberFormatException(
@@ -301,8 +293,7 @@

                int dash = date.indexOf('-');

-               if (!((dash == -1) && (date.length() == 8))
-                       && !((dash == 8) && (date.length() == 17)))
+               if(!((dash == -1) && (date.length() == 8)) && !((dash == 8) && 
(date.length() == 17)))
                        throw new NumberFormatException(
                                "Date time: " + date + " not correct.");
                int year = Integer.parseInt(date.substring(0, 4));
@@ -315,17 +306,14 @@

                // Note that month is zero based in GregorianCalender!
                try {
-                       return (
-                               new GregorianCalendar(
-                                       year,
-                                       month - 1,
-                                       day,
-                                       hour,
-                                       minute,
-                                       second))
-                               .getTime()
-                               .getTime();
-               } catch (Exception e) {
+                       return (new GregorianCalendar(
+                               year,
+                               month - 1,
+                               day,
+                               hour,
+                               minute,
+                               second)).getTime().getTime();
+               } catch(Exception e) {
                        e.printStackTrace();
                        // The API docs don't say which exception is thrown on 
bad numbers!
                        throw new NumberFormatException("Invalid date " + date 
+ ": " + e);
@@ -342,7 +330,7 @@
                //String dateString = f.format(c.getTime());
                String dateString = f.format(new Date(time * 1000));

-               if (dateString.endsWith("-00:00:00"))
+               if(dateString.endsWith("-00:00:00"))
                        dateString = dateString.substring(0, 8);

                return dateString;
@@ -350,14 +338,14 @@

        public static final int compareBytes(byte[] b1, byte[] b2) {
                int len = Math.max(b1.length, b2.length);
-               for (int i = 0; i < len; ++i) {
-                       if (i == b1.length)
+               for(int i = 0; i < len; ++i) {
+                       if(i == b1.length)
                                return i == b2.length ? 0 : -1;
-                       else if (i == b2.length)
+                       else if(i == b2.length)
                                return 1;
-                       else if ((0xff & b1[i]) > (0xff & b2[i]))
+                       else if((0xff & b1[i]) > (0xff & b2[i]))
                                return 1;
-                       else if ((0xff & b1[i]) < (0xff & b2[i]))
+                       else if((0xff & b1[i]) < (0xff & b2[i]))
                                return -1;
                }
                return 0;
@@ -369,24 +357,24 @@
                int aoff,
                int boff,
                int len) {
-               for (int i = 0; i < len; ++i) {
-                       if (i + aoff == a.length)
+               for(int i = 0; i < len; ++i) {
+                       if(i + aoff == a.length)
                                return i + boff == b.length ? 0 : -1;
-                       else if (i + boff == b.length)
+                       else if(i + boff == b.length)
                                return 1;
-                       else if ((0xff & a[i + aoff]) > (0xff & b[i + boff]))
+                       else if((0xff & a[i + aoff]) > (0xff & b[i + boff]))
                                return 1;
-                       else if ((0xff & a[i + aoff]) < (0xff & b[i + boff]))
+                       else if((0xff & a[i + aoff]) < (0xff & b[i + boff]))
                                return -1;
                }
                return 0;
        }

        public static final boolean byteArrayEqual(byte[] a, byte[] b) {
-               if (a.length != b.length)
+               if(a.length != b.length)
                        return false;
-               for (int i = 0; i < a.length; ++i)
-                       if (a[i] != b[i])
+               for(int i = 0; i < a.length; ++i)
+                       if(a[i] != b[i])
                                return false;
                return true;
        }
@@ -397,10 +385,10 @@
                int aoff,
                int boff,
                int len) {
-               if ((a.length < aoff + len) || (b.length < boff + len))
+               if((a.length < aoff + len) || (b.length < boff + len))
                        return false;
-               for (int i = 0; i < len; ++i)
-                       if (a[i + aoff] != b[i + boff])
+               for(int i = 0; i < len; ++i)
+                       if(a[i + aoff] != b[i + boff])
                                return false;
                return true;
        }
@@ -409,9 +397,11 @@
         * Compares byte arrays lexicographically.
         */
        public static final class ByteArrayComparator implements Comparator {
+
                public final int compare(Object o1, Object o2) {
                        return compare((byte[]) o1, (byte[]) o2);
                }
+
                public static final int compare(byte[] o1, byte[] o2) {
                        return compareBytes(o1, o2);
                }
@@ -419,18 +409,17 @@

        // could add stuff like IntegerComparator, LongComparator etc.
        // if we need it
-
        public static final int hashCode(byte[] b) {
-           return hashCode(b, 0, b.length);
+               return hashCode(b, 0, b.length);
        }
-       
+
        /**
         * A generic hashcode suited for byte arrays that are more or less 
random.
         */
        public static final int hashCode(byte[] b, int ptr, int length) {
                int h = 0;
-               for (int i = length - 1; i >= 0; --i) {
-                       int x = b[ptr+i] & 0xff;
+               for(int i = length - 1; i >= 0; --i) {
+                       int x = b[ptr + i] & 0xff;
                        h ^= x << ((i & 3) << 3);
                }
                return h;
@@ -441,172 +430,176 @@
         */
        public static final long longHashCode(byte[] b) {
                return longHashCode(b, 0, b.length);
-       }       
+       }

        /**
         * Long version of above Not believed to be secure in any sense of the 
word :)
         */
        public static final long longHashCode(byte[] b, int offset, int length) 
{
                long h = 0;
-               for (int i = length - 1; i >= 0; --i) {
-                       int x = b[i+offset] & 0xff;
+               for(int i = length - 1; i >= 0; --i) {
+                       int x = b[i + offset] & 0xff;
                        h ^= ((long) x) << ((i & 7) << 3);
                }
                return h;
        }

-    /**
-     * @param addr
-     * @return
-     */
-    public static String commaList(Object[] addr) {
-               StringBuffer sb = new StringBuffer();
-               for (int i = 0; i < addr.length; i++) {
+       /**
+        * @param addr
+        * @return
+        */
+       public static String commaList(Object[] addr) {
+               StringBuilder sb = new StringBuilder();
+               for(int i = 0; i < addr.length; i++) {
                        sb.append(addr[i]);
-                       if (i != addr.length - 1)
+                       if(i != addr.length - 1)
                                sb.append(',');
                }
                return sb.toString();
-    }
+       }

-    /**
-     * Convert an array of longs to an array of bytes, using a 
-     * consistent endianness.
-     */
-    public static byte[] longsToBytes(long[] longs) {
-        byte[] buf = new byte[longs.length * 8];
-        for(int i=0;i<longs.length;i++) {
-            long x = longs[i];
-            for(int j=0;j<8;j++) {
-                buf[i*8+j] = (byte)x;
-                x >>>= 8;
-            }
-        }
-        return buf;
-    }
-    
-    /**
-     * Convert an array of bytes to an array of longs.
-     */
-    public static long[] bytesToLongs(byte[] buf) {
-       return bytesToLongs(buf, 0, buf.length);
-    }
-    
-    /**
-     * Convert an array of bytes to an array of longs.
-     * @param buf
-     * @param length 
-     * @param offset 
-     * @return
-     */
-    public static long[] bytesToLongs(byte[] buf, int offset, int length) {
-        if(length % 8 != 0) throw new IllegalArgumentException();
-        long[] longs = new long[length/8];
-        for(int i=0;i<longs.length;i++) {
-            long x = 0;
-            for(int j=7;j>=0;j--) {
-                long y = (buf[offset+i*8+j] & 0xff);
-                x = (x << 8) | y;
-            }
-            longs[i] = x;
-        }
-        return longs;
-    }
+       /**
+        * Convert an array of longs to an array of bytes, using a 
+        * consistent endianness.
+        */
+       public static byte[] longsToBytes(long[] longs) {
+               byte[] buf = new byte[longs.length * 8];
+               for(int i = 0; i < longs.length; i++) {
+                       long x = longs[i];
+                       for(int j = 0; j < 8; j++) {
+                               buf[i * 8 + j] = (byte) x;
+                               x >>>= 8;
+                       }
+               }
+               return buf;
+       }

-    /**
-     * Convert an array of bytes to a single long.
-     */
-    public static long bytesToLong(byte[] buf) {
-        if(buf.length < 8) throw new IllegalArgumentException();
-        long x = 0;
-        for(int j=7;j>=0;j--) {
-            long y = (buf[j] & 0xff);
-            x = (x << 8) | y;
-        }
-        return x;
-    }
+       /**
+        * Convert an array of bytes to an array of longs.
+        */
+       public static long[] bytesToLongs(byte[] buf) {
+               return bytesToLongs(buf, 0, buf.length);
+       }

-    /**
-     * Convert an array of bytes to a single int.
-     */
+       /**
+        * Convert an array of bytes to an array of longs.
+        * @param buf
+        * @param length 
+        * @param offset 
+        * @return
+        */
+       public static long[] bytesToLongs(byte[] buf, int offset, int length) {
+               if(length % 8 != 0)
+                       throw new IllegalArgumentException();
+               long[] longs = new long[length / 8];
+               for(int i = 0; i < longs.length; i++) {
+                       long x = 0;
+                       for(int j = 7; j >= 0; j--) {
+                               long y = (buf[offset + i * 8 + j] & 0xff);
+                               x = (x << 8) | y;
+                       }
+                       longs[i] = x;
+               }
+               return longs;
+       }
+
+       /**
+        * Convert an array of bytes to a single long.
+        */
+       public static long bytesToLong(byte[] buf) {
+               if(buf.length < 8)
+                       throw new IllegalArgumentException();
+               long x = 0;
+               for(int j = 7; j >= 0; j--) {
+                       long y = (buf[j] & 0xff);
+                       x = (x << 8) | y;
+               }
+               return x;
+       }
+
+       /**
+        * Convert an array of bytes to a single int.
+        */
        public static int bytesToInt(byte[] buf, int offset) {
-        if(buf.length < 4) throw new IllegalArgumentException();
-        int x = 0;
-        for(int j=3;j>=0;j--) {
-            int y = (buf[j+offset] & 0xff);
-            x = (x << 8) | y;
-        }
-        return x;
+               if(buf.length < 4)
+                       throw new IllegalArgumentException();
+               int x = 0;
+               for(int j = 3; j >= 0; j--) {
+                       int y = (buf[j + offset] & 0xff);
+                       x = (x << 8) | y;
+               }
+               return x;
        }
-       
+
        public static int[] bytesToInts(byte[] buf, int offset, int length) {
-               if(length % 4 != 0) throw new IllegalArgumentException();
-               int[] ints = new int[length/4];
-               for(int i=0;i<ints.length;i++) {
+               if(length % 4 != 0)
+                       throw new IllegalArgumentException();
+               int[] ints = new int[length / 4];
+               for(int i = 0; i < ints.length; i++) {
                        int x = 0;
-                       for(int j=3;j>=0;j--) {
-                               int y = (buf[j+offset] & 0xff);
+                       for(int j = 3; j >= 0; j--) {
+                               int y = (buf[j + offset] & 0xff);
                                x = (x << 8) | y;
                        }
                        ints[i] = x;
                }
                return ints;
        }
-       
+
        public static int[] bytesToInts(byte[] buf) {
                return bytesToInts(buf, 0, buf.length);
        }
-       
-    public static byte[] longToBytes(long x) {
-        byte[] buf = new byte[8];
-        for(int j=0;j<8;j++) {
-            buf[j] = (byte)x;
-            x >>>= 8;
-        }
-        return buf;
-    }

+       public static byte[] longToBytes(long x) {
+               byte[] buf = new byte[8];
+               for(int j = 0; j < 8; j++) {
+                       buf[j] = (byte) x;
+                       x >>>= 8;
+               }
+               return buf;
+       }
+
        public static byte[] intsToBytes(int[] ints) {
-        byte[] buf = new byte[ints.length * 8];
-        for(int i=0;i<ints.length;i++) {
-            long x = ints[i];
-            for(int j=0;j<4;j++) {
-                buf[i*4+j] = (byte)x;
-                x >>>= 8;
-            }
-        }
-        return buf;
+               byte[] buf = new byte[ints.length * 8];
+               for(int i = 0; i < ints.length; i++) {
+                       long x = ints[i];
+                       for(int j = 0; j < 4; j++) {
+                               buf[i * 4 + j] = (byte) x;
+                               x >>>= 8;
+                       }
+               }
+               return buf;
        }

        public static long parseLong(String s, long defaultValue) {
                try {
                        return Long.parseLong(s);
-               } catch (NumberFormatException e) {
-                       Logger.error(Fields.class, "Failed to parse value as 
long: "+s+" : "+e, e);
+               } catch(NumberFormatException e) {
+                       Logger.error(Fields.class, "Failed to parse value as 
long: " + s + " : " + e, e);
                        return defaultValue;
                }
        }
-       
+
        public static int parseInt(String s, int defaultValue) {
                try {
                        return Integer.parseInt(s);
-               } catch (NumberFormatException e) {
-                       Logger.error(Fields.class, "Failed to parse value as 
int: "+s+" : "+e, e);
+               } catch(NumberFormatException e) {
+                       Logger.error(Fields.class, "Failed to parse value as 
int: " + s + " : " + e, e);
                        return defaultValue;
                }
        }
-       
+
        public static long parseShort(String s, short defaultValue) {
                try {
                        return Short.parseShort(s);
-               } catch (NumberFormatException e) {
-                       Logger.error(Fields.class, "Failed to parse value as 
short: "+s+" : "+e, e);
+               } catch(NumberFormatException e) {
+                       Logger.error(Fields.class, "Failed to parse value as 
short: " + s + " : " + e, e);
                        return defaultValue;
                }
        }
-       
-    /**
-     * Parse a human-readable string possibly including SI and ICE units into 
a short.
+
+       /**
+        * Parse a human-readable string possibly including SI and ICE units 
into a short.
         * @throws NumberFormatException
         *             if the string is not parseable
         */
@@ -616,13 +609,12 @@
                int x = s.length() - 1;
                int idx;
                try {
-                       while ((x >= 0)
-                               && ((idx = "kK".indexOf(s.charAt(x))) != -1)) {
+                       while((x >= 0) && ((idx = "kK".indexOf(s.charAt(x))) != 
-1)) {
                                x--;
                                res *= MULTIPLES[idx];
                        }
                        res *= Double.parseDouble(s.substring(0, x + 1));
-               } catch (ArithmeticException e) {
+               } catch(ArithmeticException e) {
                        res = Short.MAX_VALUE;
                        throw new NumberFormatException(e.getMessage());
                }
@@ -640,19 +632,18 @@
                int x = s.length() - 1;
                int idx;
                try {
-                       while ((x >= 0)
-                               && ((idx = "kKmMgG".indexOf(s.charAt(x))) != 
-1)) {
+                       while((x >= 0) && ((idx = 
"kKmMgG".indexOf(s.charAt(x))) != -1)) {
                                x--;
                                res *= MULTIPLES[idx];
                        }
                        res *= Double.parseDouble(s.substring(0, x + 1));
-               } catch (ArithmeticException e) {
+               } catch(ArithmeticException e) {
                        res = Integer.MAX_VALUE;
                        throw new NumberFormatException(e.getMessage());
                }
                return res;
        }
-       
+
        /**
         * Parse a human-readable string possibly including SI and ICE units 
into a long.
         * @throws NumberFormatException
@@ -664,20 +655,21 @@
                int x = s.length() - 1;
                int idx;
                try {
-                       while ((x >= 0)
-                               && ((idx = "kKmMgGtTpPeE".indexOf(s.charAt(x))) 
!= -1)) {
+                       while((x >= 0) && ((idx = 
"kKmMgGtTpPeE".indexOf(s.charAt(x))) != -1)) {
                                x--;
                                res *= MULTIPLES[idx];
                        }
                        String multiplier = s.substring(0, x + 1).trim();
                        if(multiplier.indexOf('.') > -1 || 
multiplier.indexOf('E') > -1) {
                                res *= Double.parseDouble(multiplier);
-                               if(Logger.shouldLog(Logger.MINOR, 
Fields.class)) Logger.minor(Fields.class, "Parsed "+multiplier+" of "+s+" as 
double: "+res);
+                               if(Logger.shouldLog(Logger.MINOR, Fields.class))
+                                       Logger.minor(Fields.class, "Parsed " + 
multiplier + " of " + s + " as double: " + res);
                        } else {
                                res *= Long.parseLong(multiplier);
-                               if(Logger.shouldLog(Logger.MINOR, 
Fields.class)) Logger.minor(Fields.class, "Parsed "+multiplier+" of "+s+" as 
long: "+res);
+                               if(Logger.shouldLog(Logger.MINOR, Fields.class))
+                                       Logger.minor(Fields.class, "Parsed " + 
multiplier + " of " + s + " as long: " + res);
                        }
-               } catch (ArithmeticException e) {
+               } catch(ArithmeticException e) {
                        res = Long.MAX_VALUE;
                        throw new NumberFormatException(e.getMessage());
                }
@@ -685,16 +677,15 @@
        }

        public static String longToString(long val) {
-               String[] u = { "k", "K", "m", "M", "g", "G", "t", "T", "p", 
"P", "e", "E" };
                String ret = Long.toString(val);

-               if (val <= 0)
+               if(val <= 0)
                        return ret;

-               for (int i = MULTIPLES.length - 1; i >= 0; i--) {
-                       if (val > MULTIPLES[i] && val % MULTIPLES[i] == 0) {
-                               ret = (val / MULTIPLES[i]) + u[i];
-                               if (!u[i].toLowerCase().equals(u[i]))
+               for(int i = MULTIPLES.length - 1; i >= 0; i--) {
+                       if(val > MULTIPLES[i] && val % MULTIPLES[i] == 0) {
+                               ret = (val / MULTIPLES[i]) + MULTIPLES_2[i];
+                               
if(!MULTIPLES_2[i].toLowerCase().equals(MULTIPLES_2[i]))
                                        ret += "iB";
                                break;
                        }
@@ -703,16 +694,15 @@
        }

        public static String intToString(int val) {
-               String[] u = { "k", "K", "m", "M", "g", "G", "t", "T", "p", 
"P", "e", "E" };
                String ret = Integer.toString(val);

-               if (val <= 0)
+               if(val <= 0)
                        return ret;

-               for (int i = MULTIPLES.length - 1; i >= 0; i--) {
-                       if (val > MULTIPLES[i] && val % MULTIPLES[i] == 0) {
-                               ret = (val / MULTIPLES[i]) + u[i];
-                               if (!u[i].toLowerCase().equals(u[i]))
+               for(int i = MULTIPLES.length - 1; i >= 0; i--) {
+                       if(val > MULTIPLES[i] && val % MULTIPLES[i] == 0) {
+                               ret = (val / MULTIPLES[i]) + MULTIPLES_2[i];
+                               
if(!MULTIPLES_2[i].toLowerCase().equals(MULTIPLES_2[i]))
                                        ret += "iB";
                                break;
                        }
@@ -721,16 +711,15 @@
        }

        public static String shortToString(short val) {
-               String[] u = { "k", "K", "m", "M", "g", "G", "t", "T", "p", 
"P", "e", "E" };
                String ret = Short.toString(val);

-               if (val <= 0)
+               if(val <= 0)
                        return ret;
-               
-               for (int i = MULTIPLES.length - 1; i >= 0; i--) {
-                       if (val > MULTIPLES[i] && val % MULTIPLES[i] == 0) {
-                               ret = (val / MULTIPLES[i]) + u[i];
-                               if (!u[i].toLowerCase().equals(u[i]))
+
+               for(int i = MULTIPLES.length - 1; i >= 0; i--) {
+                       if(val > MULTIPLES[i] && val % MULTIPLES[i] == 0) {
+                               ret = (val / MULTIPLES[i]) + MULTIPLES_2[i];
+                               
if(!MULTIPLES_2[i].toLowerCase().equals(MULTIPLES_2[i]))
                                        ret += "iB";
                                break;
                        }
@@ -741,14 +730,14 @@
        public static double[] bytesToDoubles(byte[] data, int offset, int 
length) {
                long[] longs = bytesToLongs(data, offset, length);
                double[] doubles = new double[longs.length];
-               for(int i=0;i<longs.length;i++)
+               for(int i = 0; i < longs.length; i++)
                        doubles[i] = Double.longBitsToDouble(longs[i]);
                return doubles;
        }

        public static byte[] doublesToBytes(double[] doubles) {
                long[] longs = new long[doubles.length];
-               for(int i=0;i<longs.length;i++)
+               for(int i = 0; i < longs.length; i++)
                        longs[i] = Double.doubleToLongBits(doubles[i]);
                return longsToBytes(longs);
        }
@@ -765,18 +754,16 @@
                int end = origEnd;
                while(true) {
                        if(end < begin) // so we can use origEnd=length-1 
without worrying length=0
-                               return -begin-1;
+                               return -begin - 1;

                        int middle = (begin + end) >>> 1;
                        if(values[middle] == key)
                                return middle;
-                       
-                       if(values[middle] > key) {
+
+                       if(values[middle] > key)
                                end = middle - 1;
-                       } else if(values[middle] < key) {
+                       else if(values[middle] < key)
                                begin = middle + 1;
-                       }
                }
        }
-
 }

Modified: branches/db4o/freenet/src/freenet/support/FileLoggerHook.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/FileLoggerHook.java       
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/FileLoggerHook.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -13,6 +13,7 @@
 import java.net.InetAddress;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
@@ -22,7 +23,6 @@
 import java.util.NoSuchElementException;
 import java.util.StringTokenizer;
 import java.util.TimeZone;
-import java.util.Vector;
 import java.util.zip.GZIPOutputStream;

 import freenet.node.Version;
@@ -95,7 +95,7 @@
         * Something wierd happens when the disk gets full, also we don't want 
to
         * block So run the actual write on another thread
         */
-       protected final LinkedList list = new LinkedList();
+       protected final LinkedList<byte[]> list = new LinkedList<byte[]>();
        protected long listBytes = 0;

        protected int MAX_LIST_SIZE = 100000;
@@ -103,7 +103,7 @@
        // FIXME: should reimplement LinkedList with minimal locking

        long maxOldLogfilesDiskUsage;
-       protected final LinkedList logFiles = new LinkedList();
+       protected final LinkedList<OldLogFile> logFiles = new 
LinkedList<OldLogFile>();
        private long oldLogFilesDiskSpaceUsage = 0;

        private static class OldLogFile {
@@ -132,7 +132,7 @@
        }

        public void setInterval(String intervalName) throws 
IntervalParseException {
-               StringBuffer sb = new StringBuffer(intervalName.length());
+               StringBuilder sb = new StringBuilder(intervalName.length());
                for(int i=0;i<intervalName.length();i++) {
                        char c = intervalName.charAt(i);
                        if(!Character.isDigit(c)) break;
@@ -175,7 +175,7 @@
        }

        protected String getHourLogName(Calendar c, boolean compressed) {
-               StringBuffer buf = new StringBuffer(50);
+               StringBuilder buf = new StringBuilder(50);
                buf.append(baseFilename).append('-');
                buf.append(Version.buildNumber());
                buf.append('-');
@@ -194,7 +194,7 @@
                return buf.toString();
        }

-       private StringBuffer pad2digits(StringBuffer buf, int x) {
+       private StringBuilder pad2digits(StringBuilder buf, int x) {
                String s = Integer.toString(x);
                if (s.length() == 1) {
                        buf.append('0');
@@ -208,9 +208,10 @@
                        super("Log File Writer Thread");
                }

+               @SuppressWarnings("fallthrough")
                public void run() {
                        File currentFilename = null;
-                       Object o = null;
+                       byte[] o = null;
                        long thisTime;
                        long lastTime = -1;
                        long startTime;
@@ -245,7 +246,7 @@
                                filename = getHourLogName(gc, true);
                                currentFilename = new File(filename);
                                synchronized(logFiles) {
-                                       if((!logFiles.isEmpty()) && 
((OldLogFile)logFiles.getLast()).filename.equals(currentFilename)) {
+                                       if ((!logFiles.isEmpty()) && 
logFiles.getLast().filename.equals(currentFilename)) {
                                                logFiles.removeLast();
                                        }
                                }
@@ -334,11 +335,11 @@
                                                        }
                                                }
                                                o = list.removeFirst();
-                                               listBytes -= (((byte[]) 
o).length + LINE_OVERHEAD);
+                                               listBytes -= o.length + 
LINE_OVERHEAD;
                                        }
-                                       myWrite(logStream, ((byte[]) o));
+                                       myWrite(logStream,  o);
                                if(altLogStream != null)
-                                       myWrite(altLogStream, (byte[]) o);
+                                       myWrite(altLogStream, o);
                                } catch (OutOfMemoryError e) {
                                        System.err.println(e.getClass());
                                        System.err.println(e.getMessage());
@@ -473,7 +474,7 @@
                                        if(logFiles.isEmpty()) {
                                                System.err.println("ERROR: 
INCONSISTENT LOGGER TOTALS: Log file list is empty but still used 
"+oldLogFilesDiskSpaceUsage+" bytes!");
                                        }
-                                       olf = (OldLogFile) 
logFiles.removeFirst();
+                                       olf = logFiles.removeFirst();
                                }
                                olf.filename.delete();
                                oldLogFilesDiskSpaceUsage -= olf.size;
@@ -719,9 +720,10 @@
                        fmt = "d:c:h:t:p:m";
                char[] f = fmt.toCharArray();

-               Vector fmtVec = new Vector(), strVec = new Vector();
+               ArrayList<Integer> fmtVec = new ArrayList<Integer>();
+               ArrayList<String> strVec = new ArrayList<String>();

-               StringBuffer sb = new StringBuffer();
+               StringBuilder sb = new StringBuilder();

                boolean comment = false;
                for (int i = 0; i < f.length; ++i) {
@@ -730,11 +732,11 @@
                                getUName();
                        if (!comment && (type != 0)) {
                                if (sb.length() > 0) {
-                                       strVec.addElement(sb.toString());
-                                       fmtVec.addElement(new Integer(0));
-                                       sb = new StringBuffer();
+                                       strVec.add(sb.toString());
+                                       fmtVec.add(0);
+                                       sb = new StringBuilder();
                                }
-                               fmtVec.addElement(new Integer(type));
+                               fmtVec.add(type);
                        } else if (f[i] == '\\') {
                                comment = true;
                        } else {
@@ -743,17 +745,17 @@
                        }
                }
                if (sb.length() > 0) {
-                       strVec.addElement(sb.toString());
-                       fmtVec.addElement(new Integer(0));
+                       strVec.add(sb.toString());
+                       fmtVec.add(0);
                }

                this.fmt = new int[fmtVec.size()];
                int size = fmtVec.size();
                for (int i = 0; i < size; ++i)
-                       this.fmt[i] = ((Integer) 
fmtVec.elementAt(i)).intValue();
+                       this.fmt[i] = fmtVec.get(i);

                this.str = new String[strVec.size()];
-               str = (String[]) strVec.toArray(str);
+               str = strVec.toArray(str);
        }

        private void setDateFormat(String dfmt) {
@@ -769,14 +771,14 @@
                df.setTimeZone(TimeZone.getTimeZone("UTC"));
        }

-       public void log(Object o, Class c, String msg, Throwable e, int 
priority) {
+       public void log(Object o, Class<?> c, String msg, Throwable e, int 
priority) {
                if (!instanceShouldLog(priority, c))
                        return;

                if (closed)
                        return;

-               StringBuffer sb = new StringBuffer( e == null ? 512 : 1024 );
+               StringBuilder sb = new StringBuilder( e == null ? 512 : 1024 );
                int sctr = 0;

                for (int i = 0; i < fmt.length; ++i) {
@@ -858,7 +860,7 @@
                                        || (listBytes > (MAX_LIST_BYTES * 
0.9F))) {
                                        byte[] ss;
                                        try {
-                                               ss = (byte[]) 
(list.removeFirst());
+                                               ss = list.removeFirst();
                                        } catch (NoSuchElementException e) {
                                                // Yes I know this is 
impossible but it happens with 1.6 with heap profiling enabled
                                                noElementCount++;
@@ -943,7 +945,7 @@
        public void listAvailableLogs(OutputStreamWriter writer) throws 
IOException {
                OldLogFile[] oldLogFiles;
                synchronized(logFiles) {
-                       oldLogFiles = (OldLogFile[]) logFiles.toArray(new 
OldLogFile[logFiles.size()]);
+                       oldLogFiles = logFiles.toArray(new 
OldLogFile[logFiles.size()]);
                }
                DateFormat tempDF = 
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, 
Locale.ENGLISH);
                tempDF.setTimeZone(TimeZone.getTimeZone("GMT"));
@@ -956,9 +958,9 @@
        public void sendLogByContainedDate(long time, OutputStream os) throws 
IOException {
                OldLogFile toReturn = null;
                synchronized(logFiles) {
-                       Iterator i = logFiles.iterator();
+                       Iterator<OldLogFile> i = logFiles.iterator();
                        while(i.hasNext()) {
-                               OldLogFile olf = (OldLogFile) i.next();
+                               OldLogFile olf = i.next();
                        boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                        if(logMINOR)
                                Logger.minor(this, "Checking "+time+" against 
"+olf.filename+" : start="+olf.start+", end="+olf.end);
@@ -1040,7 +1042,7 @@
                                OldLogFile olf;
                                synchronized(logFiles) {
                                        if(logFiles.isEmpty()) return;
-                                       olf = (OldLogFile) 
logFiles.removeFirst();
+                                       olf = logFiles.removeFirst();
                                }
                                olf.filename.delete();
                                oldLogFilesDiskSpaceUsage -= olf.size;

Modified: 
branches/db4o/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java  
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java  
2008-09-24 23:10:15 UTC (rev 22827)
@@ -18,7 +18,7 @@
 public class LimitedRangeIntByteArrayMap {

        private static boolean logMINOR;
-    private final HashMap contents;
+    private final HashMap<Integer, LimitedRangeIntByteArrayMapElement> 
contents;
     private int minValue;
     private int maxValue;
     private final int maxRange;
@@ -27,7 +27,7 @@

     public LimitedRangeIntByteArrayMap(int maxRange) {
         this.maxRange = maxRange;
-        contents = new HashMap();
+        contents = new HashMap<Integer, LimitedRangeIntByteArrayMapElement>();
         minValue = -1;
         maxValue = -1;
         flag = false;
@@ -43,32 +43,29 @@
     }

     public synchronized byte[] get(int index) {
-        Integer i = new Integer(index);
-        LimitedRangeIntByteArrayMapElement wrapper = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+        LimitedRangeIntByteArrayMapElement wrapper = contents.get(index);
         if(wrapper != null)
             return wrapper.data;
         else return null;
     }

     public synchronized AsyncMessageCallback[] getCallbacks(int index) {
-        Integer i = new Integer(index);
-        LimitedRangeIntByteArrayMapElement wrapper = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+        LimitedRangeIntByteArrayMapElement wrapper = contents.get(index);
         if(wrapper != null)
             return wrapper.callbacks;
         else return null;
     }

     public synchronized long getTime(int index) {
-        Integer i = new Integer(index);
-        LimitedRangeIntByteArrayMapElement wrapper = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+        LimitedRangeIntByteArrayMapElement wrapper = contents.get(index);
         if(wrapper != null)
             return wrapper.createdTime;
         else return -1;
     }

        public short getPriority(int index, short defaultValue) {
-        Integer i = new Integer(index);
-        LimitedRangeIntByteArrayMapElement wrapper = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+        Integer i = index;
+        LimitedRangeIntByteArrayMapElement wrapper = contents.get(i);
         if(wrapper != null)
             return wrapper.priority;
         else return defaultValue;
@@ -78,8 +75,7 @@
      * Get the time at which an index was re-added last.
      */
     public synchronized long getReaddedTime(int index) {
-       Integer i = new Integer(index);
-       LimitedRangeIntByteArrayMapElement wrapper = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+       LimitedRangeIntByteArrayMapElement wrapper = contents.get(index);
        if(wrapper != null)
                return wrapper.reputTime;
        else return -1;
@@ -108,10 +104,9 @@
             minValue = index;
         }
         if(data == null) throw new NullPointerException();
-        Integer i = new Integer(index);
-        LimitedRangeIntByteArrayMapElement le = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+        LimitedRangeIntByteArrayMapElement le = contents.get(index);
         if(le == null)
-               contents.put(new Integer(index), new 
LimitedRangeIntByteArrayMapElement(index, data, callbacks, priority));
+               contents.put(index, new 
LimitedRangeIntByteArrayMapElement(index, data, callbacks, priority));
         else
                le.reput();
         notifyAll();
@@ -166,7 +161,7 @@
      */
     public synchronized boolean remove(int index) {
        if(logMINOR) Logger.minor(this, "Removing "+index+" - min="+minValue+" 
max="+maxValue);
-        if(contents.remove(new Integer(index)) != null) {
+        if (contents.remove(index) != null) {
             if((index > minValue) && (index < maxValue)) return true;
             if(contents.size() == 0) {
                 minValue = maxValue = -1;

Modified: branches/db4o/freenet/src/freenet/support/Logger.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/Logger.java       2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/Logger.java       2008-09-24 
23:10:15 UTC (rev 22827)
@@ -242,7 +242,7 @@
                logger.log(o, s, t, DEBUG);
        }

-       public synchronized static void error(Class c, String s) {
+       public synchronized static void error(Class<?> c, String s) {
                logger.log(c, s, ERROR);
        }

@@ -254,7 +254,7 @@
                logger.log(o, s, e, ERROR);
        }

-       public synchronized static void minor(Class c, String s) {
+       public synchronized static void minor(Class<?> c, String s) {
                logger.log(c, s, MINOR);
        }

@@ -266,7 +266,7 @@
                logger.log(o, s, t, MINOR);
        }

-       public synchronized static void minor(Class class1, String string, 
Throwable t) {
+       public synchronized static void minor(Class<?> class1, String string, 
Throwable t) {
                logger.log(class1, string, t, MINOR);
        }

@@ -278,7 +278,7 @@
                logger.log(o, s, t, NORMAL);
        }

-       public synchronized static void normal(Class c, String s) {
+       public synchronized static void normal(Class<?> c, String s) {
                logger.log(c, s, NORMAL);
        }

@@ -303,7 +303,7 @@
         */
        public abstract void log(
                        Object o,
-                       Class source,
+                       Class<?> source,
                        String message,
                        Throwable e,
                        int priority);
@@ -335,7 +335,7 @@
         * @param priority The priority of the mesage, one of Logger.ERROR,
         *                 Logger.NORMAL, Logger.MINOR, or Logger.DEBUG.
         */
-       public abstract void log(Class c, String message, int priority);
+       public abstract void log(Class<?> c, String message, int priority);

        /**
         * Log a message from static code.
@@ -345,12 +345,12 @@
         * @param priority The priority of the mesage, one of Logger.ERROR,
         *                 Logger.NORMAL, Logger.MINOR, or Logger.DEBUG.
         */
-       public abstract void log(Class c, String message, Throwable e,
+       public abstract void log(Class<?> c, String message, Throwable e,
                        int priority);

-       public abstract boolean instanceShouldLog(int priority, Class c);
+       public abstract boolean instanceShouldLog(int priority, Class<?> c);

-       public synchronized static boolean shouldLog(int priority, Class c) {
+       public static boolean shouldLog(int priority, Class<?> c) {
                return logger.instanceShouldLog(priority, c);
        }


Modified: branches/db4o/freenet/src/freenet/support/LoggerHook.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/LoggerHook.java   2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/LoggerHook.java   2008-09-24 
23:10:15 UTC (rev 22827)
@@ -1,5 +1,6 @@
 package freenet.support;

+import java.util.ArrayList;
 import java.util.StringTokenizer;
 import java.util.Vector;

@@ -45,7 +46,7 @@
         */
        public abstract void log(
                        Object o,
-                       Class source,
+                       Class<?> source,
                        String message,
                        Throwable e,
                        int priority);
@@ -85,13 +86,13 @@
         * @param priority The priority of the mesage, one of Logger.ERROR,
         *                 Logger.NORMAL, Logger.MINOR, or Logger.DEBUG.
         */
-       public void log(Class c, String message, int priority) {
+       public void log(Class<?> c, String message, int priority) {
                if (!instanceShouldLog(priority,c)) return;
                log(null, c, message, null, priority);
        }


-       public void log(Class c, String message, Throwable e, int priority) {
+       public void log(Class<?> c, String message, Throwable e, int priority) {
                if (!instanceShouldLog(priority, c))
                        return;
                log(null, c, message, e, priority);
@@ -117,7 +118,7 @@
                if ((details == null) || (details.length() == 0))
                        return;
                StringTokenizer st = new StringTokenizer(details, ",", false);
-               Vector stuff = new Vector();
+               ArrayList<DetailedThreshold> stuff = new 
ArrayList<DetailedThreshold>();
                while (st.hasMoreTokens()) {
                        String token = st.nextToken();
                        if (token.length() == 0)
@@ -134,12 +135,17 @@
                }
                DetailedThreshold[] newThresholds = new 
DetailedThreshold[stuff.size()];
                stuff.toArray(newThresholds);
-               detailedThresholds = newThresholds;
+               synchronized(this) {
+                       detailedThresholds = newThresholds;
+               }
        }

        public String getDetailedThresholds() {
-               DetailedThreshold[] thresh = detailedThresholds;
-               StringBuffer sb = new StringBuffer();
+               DetailedThreshold[] thresh = null;
+               synchronized(this) {
+                       thresh = detailedThresholds;
+               }
+               StringBuilder sb = new StringBuilder();
                for(int i=0;i<thresh.length;i++) {
                        if(i != 0)
                                sb.append(',');
@@ -194,16 +200,19 @@
                }
        }

-       public boolean instanceShouldLog(int priority, Class c) {
-               int thresh = threshold;
-               if ((c != null) && (detailedThresholds.length != 0)) {
+       public boolean instanceShouldLog(int priority, Class<?> c) {
+               DetailedThreshold[] thresholds;
+               int thresh;
+               synchronized(this) {
+                       thresholds = detailedThresholds;
+                       thresh = threshold;
+               }
+               if ((c != null) && (thresholds.length > 0)) {
                        String cname = c.getName();
-                       for (int i = 0; i < detailedThresholds.length; i++) {
-                               DetailedThreshold dt = detailedThresholds[i];
-                               if (cname.startsWith(dt.section)) {
-                                       thresh = dt.dThreshold;
+                               for(DetailedThreshold dt : thresholds) {
+                                       if(cname.startsWith(dt.section))
+                                               thresh = dt.dThreshold;
                                }
-                       }
                }
                return priority >= thresh;
        }

Modified: branches/db4o/freenet/src/freenet/support/NumberedRecentItems.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/NumberedRecentItems.java  
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/NumberedRecentItems.java  
2008-09-24 23:10:15 UTC (rev 22827)
@@ -29,7 +29,7 @@
     }

     public synchronized NumberedItem get(int num) {
-        int x = java.util.Arrays.binarySearch(items, new Integer(num), 
myComparator);
+        int x = Arrays.binarySearch(items, num, myComparator);
         if(x >= 0) return items[x];
         return null;
     }
@@ -42,7 +42,7 @@
      */
     public synchronized boolean add(NumberedItem item) {
         long num = item.getNumber();
-        int x = Arrays.binarySearch(items, new Long(num), myComparator);
+        int x = Arrays.binarySearch(items, num, myComparator);
         if(Logger.shouldLog(Logger.MINOR, this))
                Logger.minor(this, "Search pos: "+x);
         if(x >= 0) return false; // already present
@@ -97,7 +97,7 @@
     }

     public synchronized NumberedItem[] getAfter(long target) {
-        int x = Arrays.binarySearch(items, new Long(target), myComparator);
+        int x = Arrays.binarySearch(items, target, myComparator);
         if(x == items.length-1) return null;
         if(x >= 0) {
             NumberedItem[] out = new NumberedItem[items.length-x-1];

Modified: branches/db4o/freenet/src/freenet/support/Serializer.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/Serializer.java   2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/Serializer.java   2008-09-24 
23:10:15 UTC (rev 22827)
@@ -63,15 +63,15 @@
                        throw new IOException("Boolean is non boolean value: 
"+bool);
                } else if (type.equals(Byte.class)) {
                        int b = dis.readByte();
-                       return new Byte((byte) b);
+                       return (byte) b;
                } else if (type.equals(Short.class)) {
-                       return new Short(dis.readShort());
+                       return dis.readShort();
                } else if (type.equals(Integer.class)) {
-                       return new Integer(dis.readInt());
+                       return dis.readInt();
                } else if (type.equals(Long.class)) {
-                       return new Long(dis.readLong());
+                       return dis.readLong();
                } else if (type.equals(Double.class)) {
-                   return new Double(dis.readDouble());
+                   return dis.readDouble();
                } else if (type.equals(String.class)) {
                        int length = dis.readInt();
                        StringBuffer sb = new StringBuffer(length);

Modified: 
branches/db4o/freenet/src/freenet/support/SimpleIntNumberedItemComparator.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/support/SimpleIntNumberedItemComparator.java  
    2008-09-24 22:52:41 UTC (rev 22826)
+++ 
branches/db4o/freenet/src/freenet/support/SimpleIntNumberedItemComparator.java  
    2008-09-24 23:10:15 UTC (rev 22827)
@@ -2,7 +2,7 @@

 import java.util.Comparator;

-public class SimpleIntNumberedItemComparator implements Comparator {
+public class SimpleIntNumberedItemComparator implements Comparator<Object> {

        private final boolean nullAtStart;


Modified: branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java 
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java 
2008-09-24 23:10:15 UTC (rev 22827)
@@ -13,7 +13,7 @@

        private IntNumberedItem[] data;
        private int length;
-       private static final Comparator comparator = new 
SimpleIntNumberedItemComparator(true);
+       private static final Comparator<Object> comparator = new 
SimpleIntNumberedItemComparator(true);
        private static final int MIN_SIZE = 4;
        private final boolean persistent;

@@ -38,7 +38,7 @@
                        for(int i=0;i<length;i++)
                                container.activate(data[i], 1);
                }
-               int x = Arrays.binarySearch(data, new Integer(retryCount), 
comparator);
+               int x = Arrays.binarySearch(data, retryCount, comparator);
                if(x >= 0)
                        return data[x];
                return null;
@@ -50,7 +50,7 @@
                        for(int i=0;i<length;i++)
                                container.activate(data[i], 1);
                }
-               int x = Arrays.binarySearch(data, new Integer(item), 
comparator);
+               int x = Arrays.binarySearch(data, item, comparator);
                if(x >= 0) {
                        if(x < length-1)
                                System.arraycopy(data, x+1, data, x, 
length-x-1);
@@ -92,7 +92,7 @@
                        for(int i=0;i<length;i++)
                                container.activate(data[i], 1);
                }
-               int x = Arrays.binarySearch(data, new 
Integer(grabber.getNumber()), comparator);
+               int x = Arrays.binarySearch(data, grabber.getNumber(), 
comparator);
                if(x >= 0) return false;
                // insertion point
                x = -x-1;
@@ -106,7 +106,7 @@
                        for(int i=0;i<length;i++)
                                container.activate(data[i], 1);
                }
-               int x = Arrays.binarySearch(data, new 
Integer(grabber.getNumber()), comparator);
+               int x = Arrays.binarySearch(data, grabber.getNumber(), 
comparator);
                if(x >= 0) {
                        if(grabber != data[x])
                                throw new IllegalArgumentException(); // 
already exists

Modified: branches/db4o/freenet/src/freenet/support/compress/GzipCompressor.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/compress/GzipCompressor.java      
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/compress/GzipCompressor.java      
2008-09-24 23:10:15 UTC (rev 22827)
@@ -17,6 +17,8 @@
 public class GzipCompressor extends Compressor {

        public Bucket compress(Bucket data, BucketFactory bf, long maxLength) 
throws IOException, CompressionOutputSizeException {
+               if(maxLength <= 0)
+                       throw new IllegalArgumentException();
                Bucket output = bf.makeBucket(maxLength);
                InputStream is = null;
                OutputStream os = null;

Modified: branches/db4o/freenet/src/freenet/support/io/ArrayBucket.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/ArrayBucket.java       
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/io/ArrayBucket.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -1,6 +1,5 @@
 package freenet.support.io;

-import freenet.support.Logger;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -14,53 +13,42 @@
 import freenet.support.api.Bucket;

 /**
- * A bucket that stores data in RAM
+ * A bucket that stores data in the memory.
+ * 
+ * FIXME: No synchronization, should there be?
+ * 
+ * @author oskar
  */
 public class ArrayBucket implements Bucket {

-       private final ArrayList<byte[]> data;
-       private final String name;
-       private volatile boolean readOnly;
-       
-       /** The maximum size of the bucket; -1 means no maxSize */
-       private final long maxSize;
-       private long size;
-       
-       private static boolean logDEBUG = false;
-       
-       public ArrayBucket(long maxSize) {
-               this("ArrayBucket", maxSize);
+       private final ArrayList data;
+       private String name;
+       private boolean readOnly;
+
+       public ArrayBucket() {
+               this("ArrayBucket");
        }
-       
-       public ArrayBucket(byte[] finalData) {
-               this(finalData, finalData.length);
-               setReadOnly();
-       }

-       public ArrayBucket(byte[] initdata, long maxSize) {
-               this("ArrayBucket", maxSize);
+       public ArrayBucket(byte[] initdata) {
+               this("ArrayBucket");
                data.add(initdata);
        }

-       ArrayBucket(String name, long maxSize) {
-               data = new ArrayList<byte[]>();
+       public ArrayBucket(String name) {
+               data = new ArrayList();
                this.name = name;
-               this.maxSize = maxSize;
-               if(logDEBUG && maxSize < 0)
-                       Logger.minor(this, "Has been called with maxSize<0 !", 
new NullPointerException());
        }

-       public synchronized OutputStream getOutputStream() throws IOException {
+       public OutputStream getOutputStream() throws IOException {
                if(readOnly) throw new IOException("Read only");
                return new ArrayBucketOutputStream();
        }

-       public synchronized InputStream getInputStream() {
+       public InputStream getInputStream() {
                return new ArrayBucketInputStream();
        }

-       @Override
-       public synchronized String toString() {
+       public String toString() {
                StringBuffer s = new StringBuffer(250);
                for (Iterator i = data.iterator(); i.hasNext();) {
                        byte[] b = (byte[]) i.next();
@@ -69,7 +57,7 @@
                return s.toString();
        }

-       public synchronized void read(InputStream in) throws IOException {
+       public void read(InputStream in) throws IOException {
                OutputStream out = new ArrayBucketOutputStream();
                int i;
                byte[] b = new byte[8 * 1024];
@@ -79,7 +67,12 @@
                out.close();
        }

-       public synchronized long size() {
+       public long size() {
+               long size = 0;
+               for (Iterator i = data.iterator(); i.hasNext();) {
+                       byte[] b = (byte[]) i.next();
+                       size += b.length;
+               }
                return size;
        }

@@ -88,40 +81,19 @@
        }

        private class ArrayBucketOutputStream extends ByteArrayOutputStream {
-               boolean hasBeenClosed = false;
+               private boolean hasBeenClosed = false;

                public ArrayBucketOutputStream() {
                        super();
                }
-               
-               @Override
-               public synchronized void write(byte b[], int off, int len) {
-                       if(readOnly) throw new IllegalStateException("Read 
only");
-                       long sizeIfWritten = size + len;
-                       if(logDEBUG && maxSize > -1 && maxSize < sizeIfWritten) 
// FIXME: should be IOE but how to do it?
-                               throw new IllegalArgumentException("The maxSize 
of the bucket is "+maxSize+
-                                       " and writing "+len+ " bytes to it 
would make it oversize!");
-                       super.write(b, off, len);
-                       size = sizeIfWritten;
-               }
-               
-               @Override
-               public synchronized void write(int b) {
-                       if(readOnly) throw new IllegalStateException("Read 
only");
-                       long sizeIfWritten = size + 1;
-                       if(logDEBUG && maxSize > -1 && maxSize < sizeIfWritten) 
// FIXME: should be IOE but how to do it?
-                               throw new IllegalArgumentException("The maxSize 
of the bucket is "+maxSize+
-                                       " and writing 1 byte to it would make 
it oversize!");
-                       super.write(b);
-                       size = sizeIfWritten;
-               }

                @Override
                public synchronized void close() throws IOException {
                        if(hasBeenClosed) return;
-                       hasBeenClosed = true;
                        data.add(super.toByteArray());
                        if(readOnly) throw new IOException("Read only");
+                       // FIXME maybe we should throw on write instead? :)
+                       hasBeenClosed = true;
                }
        }

@@ -134,11 +106,11 @@
                        i = data.iterator();
                }

-               public synchronized int read() {
+               public int read() {
                        return priv_read();
                }

-               private synchronized int priv_read() {
+               private int priv_read() {
                        if (in == null) {
                                if (i.hasNext()) {
                                        in = new ByteArrayInputStream((byte[]) 
i.next());
@@ -146,26 +118,24 @@
                                        return -1;
                                }
                        }
-                       int x = in.read();
-                       if (x == -1) {
+                       int i = in.read();
+                       if (i == -1) {
                                in = null;
                                return priv_read();
                        } else {
-                               return x;
+                               return i;
                        }
                }

-               @Override
-               public synchronized int read(byte[] b) {
+               public int read(byte[] b) {
                        return priv_read(b, 0, b.length);
                }

-               @Override
-               public synchronized int read(byte[] b, int off, int len) {
+               public int read(byte[] b, int off, int len) {
                        return priv_read(b, off, len);
                }

-               private synchronized int priv_read(byte[] b, int off, int len) {
+               private int priv_read(byte[] b, int off, int len) {
                        if (in == null) {
                                if (i.hasNext()) {
                                        in = new ByteArrayInputStream((byte[]) 
i.next());
@@ -173,17 +143,16 @@
                                        return -1;
                                }
                        }
-                       int x = in.read(b, off, len);
-                       if (x == -1) {
+                       int i = in.read(b, off, len);
+                       if (i == -1) {
                                in = null;
                                return priv_read(b, off, len);
                        } else {
-                               return x;
+                               return i;
                        }
                }

-               @Override
-               public synchronized int available() {
+               public int available() {
                        if (in == null) {
                                if (i.hasNext()) {
                                        in = new ByteArrayInputStream((byte[]) 
i.next());
@@ -204,17 +173,15 @@
                readOnly = true;
        }

-       public synchronized void free() {
-               readOnly = true;
+       public void free() {
                data.clear();
-               size = 0;
                // Not much else we can do.
        }

-       public synchronized byte[] toByteArray() {
+       public byte[] toByteArray() {
                long sz = size();
-               int bufSize = (int)sz;
-               byte[] buf = new byte[bufSize];
+               int size = (int)sz;
+               byte[] buf = new byte[size];
                int index = 0;
                for(Iterator i=data.iterator();i.hasNext();) {
                        byte[] obuf = (byte[]) i.next();

Modified: branches/db4o/freenet/src/freenet/support/io/ArrayBucketFactory.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/ArrayBucketFactory.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/io/ArrayBucketFactory.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -11,7 +11,7 @@
 public class ArrayBucketFactory implements BucketFactory {

        public Bucket makeBucket(long size) throws IOException {
-               return new ArrayBucket(size);
+               return new ArrayBucket();
        }

        public void freeBucket(Bucket b) throws IOException {

Modified: branches/db4o/freenet/src/freenet/support/io/BaseFileBucket.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/BaseFileBucket.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/io/BaseFileBucket.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -151,6 +151,7 @@

                }

+               @Override
                public void write(byte[] b) throws IOException {
                        synchronized (BaseFileBucket.this) {
                                confirmWriteSynchronized();
@@ -159,6 +160,7 @@
                        }
                }

+               @Override
                public void write(byte[] b, int off, int len) throws 
IOException {
                        synchronized (BaseFileBucket.this) {
                                confirmWriteSynchronized();
@@ -167,6 +169,7 @@
                        }
                }

+               @Override
                public void write(int b) throws IOException {
                        synchronized (BaseFileBucket.this) {
                                confirmWriteSynchronized();
@@ -175,6 +178,7 @@
                        }
                }

+               @Override
                public void close() throws IOException {
                        File file;
                        synchronized(this) {
@@ -213,6 +217,7 @@
                        }
                }

+               @Override
                public String toString() {
                        return 
super.toString()+":"+BaseFileBucket.this.toString();
                }
@@ -225,6 +230,7 @@
                        super(f);
                }

+               @Override
                public void close() throws IOException {
                        synchronized(this) {
                                if(closed) return;
@@ -234,6 +240,7 @@
                        super.close();
                }

+               @Override
                public String toString() {
                        return 
super.toString()+":"+BaseFileBucket.this.toString();
                }
@@ -277,6 +284,7 @@
                getFile().delete();
        }

+       @Override
        protected void finalize() {
                if(deleteOnFinalize())
                        free(true);

Modified: branches/db4o/freenet/src/freenet/support/io/BucketTools.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/BucketTools.java       
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/io/BucketTools.java       
2008-09-24 23:10:15 UTC (rev 22827)
@@ -141,31 +141,31 @@
        }

        public final static int[] nullIndices(Bucket[] array) {
-               List list = new ArrayList();
+               List<Integer> list = new ArrayList();
                for (int i = 0; i < array.length; i++) {
                        if (array[i] == null) {
-                               list.add(new Integer(i));
+                               list.add(i);
                        }
                }

                int[] ret = new int[list.size()];
                for (int i = 0; i < list.size(); i++) {
-                       ret[i] = ((Integer) list.get(i)).intValue();
+                       ret[i] = list.get(i);
                }
                return ret;
        }

        public final static int[] nonNullIndices(Bucket[] array) {
-               List list = new ArrayList();
+               List<Integer> list = new ArrayList();
                for (int i = 0; i < array.length; i++) {
                        if (array[i] != null) {
-                               list.add(new Integer(i));
+                               list.add(i);
                        }
                }

                int[] ret = new int[list.size()];
                for (int i = 0; i < list.size(); i++) {
-                       ret[i] = ((Integer) list.get(i)).intValue();
+                       ret[i] = list.get(i);
                }
                return ret;
        }
@@ -200,10 +200,8 @@
                        dis = new DataInputStream(is);
                        dis.readFully(data);
                } finally {
-                       if(dis != null)
-                               dis.close();
-                       else
-                               is.close();
+                       Closer.close(dis);
+                       Closer.close(is);
                }
                return data;
        }
@@ -288,14 +286,16 @@
                                if(bytes <= 0) {
                                        if(truncateLength == Long.MAX_VALUE)
                                                break;
-                                       new IOException().printStackTrace();
-                                       throw new IOException("Could not move 
required quantity of data in copyTo: "+bytes+" (moved "+moved+" of 
"+truncateLength+"): unable to read from "+is);
+                                       IOException ioException = new 
IOException("Could not move required quantity of data in copyTo: "+bytes+" 
(moved "+moved+" of "+truncateLength+"): unable to read from "+is);
+                                       ioException.printStackTrace();
+                                       throw ioException; 
                                }
                                os.write(buf, 0, bytes);
                                moved += bytes;
                        }
                } finally {
                        is.close();
+                       os.flush();
                }
        }


Modified: branches/db4o/freenet/src/freenet/support/io/FileUtil.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/FileUtil.java  2008-09-24 
22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/io/FileUtil.java  2008-09-24 
23:10:15 UTC (rev 22827)
@@ -111,11 +111,9 @@
                        }

                } finally {
-                       try {
-                               if(isr != null) isr.close();
-                               if(bis != null) bis.close();
-                               if(fis != null) fis.close();
-                       } catch (IOException e) {}
+                       Closer.close(isr);
+                       Closer.close(bis);
+                       Closer.close(fis);
                }
                return result.toString();
        }

Modified: 
branches/db4o/freenet/src/freenet/support/io/LineReadingInputStream.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/LineReadingInputStream.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/io/LineReadingInputStream.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -33,7 +33,7 @@

                byte[] buf = new byte[Math.max(Math.min(128, maxLength), 
Math.min(1024, bufferSize))];
                int ctr = 0;
-               mark(Integer.MAX_VALUE); // Might be more than maxLengh if we 
use utf8
+               mark(maxLength + 2); // in case we have both a \r and a \n
                while(true) {
                        int x = read(buf, ctr, buf.length - ctr);
                        if(x == -1) {

Modified: 
branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
  2008-09-24 22:52:41 UTC (rev 22826)
+++ 
branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
  2008-09-24 23:10:15 UTC (rev 22827)
@@ -170,6 +170,17 @@
                        }
                }

+               // Override this or FOS will use write(int)
+               @Override
+               public void write(byte[] buf) throws IOException {
+                       if(closed)
+                               throw new IOException("Already closed!");
+                       if(streamNumber != lastOutputStream)
+                               throw new IllegalStateException("Writing to old 
stream in "+getName());
+                       write(buf, 0, buf.length);
+               }
+               
+               @Override
                public void write(byte[] buf, int offset, int length) throws 
IOException {
                        if(closed) throw new IOException("Already closed!");
                        if(streamNumber != lastOutputStream)
@@ -184,14 +195,7 @@
                        }
                }

-               // Override this or FOS will use write(int)
-               public void write(byte[] buf) throws IOException {
-                       if(closed) throw new IOException("Already closed!");
-                       if(streamNumber != lastOutputStream)
-                               throw new IllegalStateException("Writing to old 
stream in "+getName());
-                       write(buf, 0, buf.length);
-               }
-               
+               @Override
                public void close() throws IOException {
                        if(closed) return;
                        try {
@@ -245,11 +249,13 @@
                        return pcfb.decipher(x);
                }

+               @Override
                public final int available() {
                        int x = (int)Math.min(dataLength - ptr, 
Integer.MAX_VALUE);
                        return (x < 0) ? 0 : x;
                }

+               @Override
                public int read(byte[] buf, int offset, int length) throws 
IOException {
                        // FIXME remove debugging
                        if((length+offset > buf.length) || (offset < 0) || 
(length < 0))
@@ -264,10 +270,12 @@
                        return readBytes;
                }

+               @Override
                public int read(byte[] buf) throws IOException {
                        return read(buf, 0, buf.length);
                }

+               @Override
                public long skip(long bytes) throws IOException {
                        byte[] buf = new byte[(int)Math.min(4096, bytes)];
                        long skipped = 0;
@@ -279,6 +287,7 @@
                        return skipped;
                }

+               @Override
                public void close() throws IOException {
                        in.close();
                }
@@ -328,6 +337,7 @@
                return "Encrypted:"+bucket.getName();
        }

+       @Override
        public String toString() {
                return super.toString()+ ':' +bucket.toString();
        }

Modified: branches/db4o/freenet/src/freenet/support/io/TempBucketFactory.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/TempBucketFactory.java 
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/src/freenet/support/io/TempBucketFactory.java 
2008-09-24 23:10:15 UTC (rev 22827)
@@ -4,6 +4,10 @@
 package freenet.support.io;

 import freenet.crypt.RandomSource;
+import freenet.support.Executor;
+import freenet.support.Logger;
+import freenet.support.SizeUtil;
+import freenet.support.TimeUtil;
 import java.io.IOException;

 import freenet.support.api.Bucket;
@@ -12,53 +16,301 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.LinkedList;
+import java.util.Queue;
 import java.util.Random;
+import java.util.Vector;
+import java.util.concurrent.LinkedBlockingQueue;

 import com.db4o.ObjectContainer;

 /**
  * Temporary Bucket Factory
+ * 
+ * Buckets created by this factory can be either:
+ *     - ArrayBuckets
+ * OR
+ *     - FileBuckets
+ * 
+ * ArrayBuckets are used if and only if:
+ *     1) there is enough room remaining on the pool (@see maxRamUsed and @see 
bytesInUse)
+ *     2) the initial size is smaller than (@maxRAMBucketSize)
+ * 
+ * Depending on how they are used they might switch from one type to another 
transparently.
+ * 
+ * Currently they are two factors considered for a migration:
+ *     - if they are long-lived or not (@see RAMBUCKET_MAX_AGE)
+ *     - if their size is over RAMBUCKET_CONVERSION_FACTOR*maxRAMBucketSize
  */
 public class TempBucketFactory implements BucketFactory {
+       public final static long defaultIncrement = 4096;
+       public final static float DEFAULT_FACTOR = 1.25F;
+       
+       private final FilenameGenerator filenameGenerator;
+       private long bytesInUse = 0;
+       private final RandomSource strongPRNG;
+       private final Random weakPRNG;
+       private final Executor executor;
+       private volatile boolean logMINOR;
+       private volatile boolean reallyEncrypt;
+       
+       /** How big can the defaultSize be for us to consider using RAMBuckets? 
*/
+       private long maxRAMBucketSize;
+       /** How much memory do we dedicate to the RAMBucketPool? (in bytes) */
+       private long maxRamUsed;
+       
+       /** How old is a long-lived RAMBucket? */
+       private final int RAMBUCKET_MAX_AGE = 5*60*1000; // 5mins
+       /** How many times the maxRAMBucketSize can a RAMBucket be before it 
gets migrated? */
+       private final int RAMBUCKET_CONVERSION_FACTOR = 4;
+       
        public class TempBucket implements Bucket {
+               /** The underlying bucket itself */
                private Bucket currentBucket;
+               /** We have to account the size of the underlying bucket 
ourself in order to be able to access it fast */
+               private long currentSize;
+               /** A link to the "real" underlying outputStream, even if we 
migrated */
+               private OutputStream os = null;
+               /** All the open-streams to reset or close on migration or 
free() */
+               private final Vector<TempBucketInputStream> tbis;
+               /** An identifier used to know when to deprecate the 
InputStreams */
+               private short osIndex;
+               /** A timestamp used to evaluate the age of the bucket and 
maybe consider it for a migration */
+               public final long creationTime;
+               private boolean hasBeenFreed = false;

-               public TempBucket(Bucket cur) {
+               public TempBucket(long now, Bucket cur) {
+                       if(cur == null)
+                               throw new NullPointerException();
                        this.currentBucket = cur;
+                       this.creationTime = now;
+                       this.osIndex = 0;
+                       this.tbis = new Vector<TempBucketInputStream>();
                }

-               public final void migrateToFileBucket() throws IOException {
-                       RAMBucket ramBucket = null;
+               private void closeInputStreams(boolean forFree) {
+                       for(TempBucketInputStream is : tbis) {
+                               try {
+                                       if(forFree)
+                                               is.close();
+                                       else
+                                               is._maybeResetInputStream();
+                               } catch(IOException e) {
+                                       Closer.close(is);
+                                       tbis.remove(is);
+                               }
+                       }
+               }
+               
+               /** A blocking method to force-migrate from a RAMBucket to a 
FileBucket */
+               private final void migrateToFileBucket() throws IOException {
+                       Bucket toMigrate = null;
                        synchronized(this) {
-                               if(!isRAMBucket())
+                               if(!isRAMBucket() || hasBeenFreed)
+                                       // Nothing to migrate! We don't want to 
switch back to ram, do we?                                      
                                        return;
-
-                               ramBucket = (RAMBucket) currentBucket;
-                               TempFileBucket tempFB = new 
TempFileBucket(filenameGenerator.makeRandomFilename(), filenameGenerator);
-                               BucketTools.copy(currentBucket, tempFB);
+                               toMigrate = currentBucket;
+                               Bucket tempFB = _makeFileBucket();
+                               if(os != null) {
+                                       os.flush();
+                                       Closer.close(os);
+                                       // DO NOT INCREMENT THE osIndex HERE!
+                                       os = tempFB.getOutputStream();
+                                       if(currentSize > 0)
+                                               BucketTools.copyTo(toMigrate, 
os, currentSize);
+                               }
+                               if(toMigrate.isReadOnly())
+                                       tempFB.setReadOnly();
+                               
+                               closeInputStreams(false);
+                               
                                currentBucket = tempFB;
+                               // We need streams to be reset to point to the 
new bucket
                        }
-                       ramBucket.free();
+                       if(logMINOR)
+                               Logger.minor(this, "We have migrated 
"+toMigrate.hashCode());
+                       
+                       // We can free it on-thread as it's a rambucket
+                       toMigrate.free();
+                       // Might have changed already so we can't rely on 
currentSize!
+                       _hasFreed(toMigrate.size());
                }

-               public final synchronized boolean isRAMBucket() {
-                       return (currentBucket instanceof RAMBucket);
+               public synchronized final boolean isRAMBucket() {
+                       return (currentBucket instanceof ArrayBucket);
                }

                public synchronized OutputStream getOutputStream() throws 
IOException {
-                       return currentBucket.getOutputStream();
+                       if(osIndex > 0)
+                               throw new IOException("Only one OutputStream 
per bucket!");
+                       return new TempBucketOutputStream(++osIndex);
                }

+               private class TempBucketOutputStream extends OutputStream {
+                       private final short idx;
+                       
+                       TempBucketOutputStream(short idx) throws IOException {
+                               this.idx = idx;
+                               if(os == null)
+                                       os = currentBucket.getOutputStream();
+                       }
+                       
+                       private void _maybeMigrateRamBucket(long futureSize) 
throws IOException {
+                               if(isRAMBucket()) {
+                                       boolean shouldMigrate = false;
+                                       boolean isOversized = false;
+                                       
+                                       if(futureSize >= 
Math.min(Integer.MAX_VALUE, maxRAMBucketSize * RAMBUCKET_CONVERSION_FACTOR)) {
+                                               isOversized = true;
+                                               shouldMigrate = true;
+                                       } else if ((futureSize - currentSize) + 
bytesInUse >= maxRamUsed)
+                                               shouldMigrate = true;
+                                       
+                                       if(shouldMigrate) {
+                                               if(logMINOR) {
+                                                       if(isOversized)
+                                                               
Logger.minor(this, "The bucket is over 
"+SizeUtil.formatSize(maxRAMBucketSize*RAMBUCKET_CONVERSION_FACTOR)+": we will 
force-migrate it to disk.");
+                                                       else
+                                                               
Logger.minor(this, "The bucketpool is full: force-migrate before we go over the 
limit");
+                                               }
+                                               migrateToFileBucket();
+                                       }
+                               }
+                       }
+                       
+                       @Override
+                       public final void write(int b) throws IOException {
+                               synchronized(TempBucket.this) {
+                                       long futureSize = currentSize + 1;
+                                       _maybeMigrateRamBucket(futureSize);
+                                       os.write(b);
+                                       currentSize = futureSize;
+                                       if(isRAMBucket()) // We need to 
re-check because it might have changed!
+                                               _hasTaken(1);
+                               }
+                       }
+                       
+                       @Override
+                       public final void write(byte b[], int off, int len) 
throws IOException {
+                               synchronized(TempBucket.this) {
+                                       long futureSize = currentSize + len;
+                                       _maybeMigrateRamBucket(futureSize);
+                                       os.write(b, off, len);
+                                       currentSize = futureSize;
+                                       if(isRAMBucket()) // We need to 
re-check because it might have changed!
+                                               _hasTaken(len);
+                               }
+                       }
+                       
+                       @Override
+                       public final void flush() throws IOException {
+                               synchronized(TempBucket.this) {
+                                       _maybeMigrateRamBucket(currentSize);
+                                       os.flush();
+                               }
+                       }
+                       
+                       @Override
+                       public final void close() throws IOException {
+                               synchronized(TempBucket.this) {
+                                       _maybeMigrateRamBucket(currentSize);
+                                       os.flush();
+                                       os.close();
+                                       // DO NOT NULL os OUT HERE!
+                               }
+                       }
+               }
+
                public synchronized InputStream getInputStream() throws 
IOException {
-                       return currentBucket.getInputStream();
+                       if(os == null)
+                               throw new IOException("No OutputStream has been 
openned! Why would you want an InputStream then?");
+                       TempBucketInputStream is = new 
TempBucketInputStream(osIndex);
+                       tbis.add(is);
+                       
+                       return is;
                }
+               
+               private class TempBucketInputStream extends InputStream {
+                       /** The current InputStream we use from the underlying 
bucket */
+                       private InputStream currentIS;
+                       /** Keep a counter to know where we are on the stream 
(useful when we have to reset and skip) */
+                       private long index = 0;
+                       /** Will change if a new OutputStream is openned: used 
to detect deprecation */
+                       private final short idx;
+                       
+                       TempBucketInputStream(short idx) throws IOException {
+                               this.idx = idx;
+                               this.currentIS = currentBucket.getInputStream();
+                       }
+                       
+                       public void _maybeResetInputStream() throws IOException 
{
+                               if(idx != osIndex)
+                                       close();
+                       }
+                       
+                       @Override
+                       public final int read() throws IOException {
+                               synchronized(TempBucket.this) {
+                                       int toReturn = currentIS.read();
+                                       if(toReturn != -1)
+                                               index++;
+                                       return toReturn;
+                               }
+                       }
+                       
+                       @Override
+                       public int read(byte b[]) throws IOException {
+                               synchronized(TempBucket.this) {
+                                       return read(b, 0, b.length);
+                               }
+                       }
+                       
+                       @Override
+                       public int read(byte b[], int off, int len) throws 
IOException {
+                               synchronized(TempBucket.this) {
+                                       int toReturn = currentIS.read(b, off, 
len);
+                                       if(toReturn > 0)
+                                               index += toReturn;
+                                       return toReturn;
+                               }
+                       }
+                       
+                       @Override
+                       public long skip(long n) throws IOException {
+                               synchronized(TempBucket.this) {
+                                       long skipped = currentIS.skip(n);
+                                       index += skipped;
+                                       return skipped;
+                               }
+                       }
+                       
+                       @Override
+                       public int available() throws IOException {
+                               synchronized(TempBucket.this) {
+                                       return currentIS.available();
+                               }
+                       }
+                       
+                       @Override
+                       public boolean markSupported() {
+                               return false;
+                       }
+                       
+                       @Override
+                       public final void close() throws IOException {
+                               synchronized(TempBucket.this) {
+                                       Closer.close(currentIS);
+                                       tbis.remove(this);
+                               }
+                       }
+               }

                public synchronized String getName() {
                        return currentBucket.getName();
                }

                public synchronized long size() {
-                       return currentBucket.size();
+                       return currentSize;
                }

                public synchronized boolean isReadOnly() {
@@ -70,7 +322,18 @@
                }

                public synchronized void free() {
+                       if(hasBeenFreed) return;
+                       hasBeenFreed = true;
+                       
+                       Closer.close(os);
+                       closeInputStreams(true);
                        currentBucket.free();
+                       if(isRAMBucket()) {
+                               _hasFreed(currentSize);
+                               synchronized(ramBucketQueue) {
+                                       ramBucketQueue.remove(this);
+                               }
+                       }
                }

                public Bucket createShadow() throws IOException {
@@ -87,42 +350,17 @@
                        container.set(this);
                }
        }
-
-       private class RAMBucket extends ArrayBucket {
-               public RAMBucket(long size) {
-                       super("RAMBucket", size);
-                       _hasTaken(size);
-               }
-               
-               @Override
-               public void free() {
-                       super.free();
-                       _hasFreed(size());
-               }
-       }

-       private final FilenameGenerator filenameGenerator;
-       private long bytesInUse = 0;
-       
-       public final static long defaultIncrement = 4096;
-       
-       public final static float DEFAULT_FACTOR = 1.25F;
-       
-       public long maxRAMBucketSize;
-       public long maxRamUsed;
-
-       private final RandomSource strongPRNG;
-       private final Random weakPRNG;
-       private volatile boolean reallyEncrypt;
-
        // Storage accounting disabled by default.
-       public TempBucketFactory(FilenameGenerator filenameGenerator, long 
maxBucketSizeKeptInRam, long maxRamUsed, RandomSource strongPRNG, Random 
weakPRNG, boolean reallyEncrypt) {
+       public TempBucketFactory(Executor executor, FilenameGenerator 
filenameGenerator, long maxBucketSizeKeptInRam, long maxRamUsed, RandomSource 
strongPRNG, Random weakPRNG, boolean reallyEncrypt) {
                this.filenameGenerator = filenameGenerator;
                this.maxRamUsed = maxRamUsed;
                this.maxRAMBucketSize = maxBucketSizeKeptInRam;
                this.strongPRNG = strongPRNG;
                this.weakPRNG = weakPRNG;
                this.reallyEncrypt = reallyEncrypt;
+               this.executor = executor;
+               this.logMINOR = Logger.shouldLog(Logger.MINOR, this);
        }

        public Bucket makeBucket(long size) throws IOException {
@@ -146,22 +384,27 @@
        }

        public synchronized void setMaxRamUsed(long size) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
                maxRamUsed = size;
        }

        public synchronized long getMaxRamUsed() {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
                return maxRamUsed;
        }

        public synchronized void setMaxRAMBucketSize(long size) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
                maxRAMBucketSize = size;
        }

        public synchronized long getMaxRAMBucketSize() {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
                return maxRAMBucketSize;
        }

        public void setEncryption(boolean value) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
                reallyEncrypt = value;
        }

@@ -184,7 +427,10 @@
        public TempBucket makeBucket(long size, float factor, long increment) 
throws IOException {
                Bucket realBucket = null;
                boolean useRAMBucket = false;
+               long now = System.currentTimeMillis();

+               // We need to clean the queue in order to have "space" to host 
new buckets
+               cleanBucketQueue(now);
                synchronized(this) {
                        if((size > 0) && (size <= maxRAMBucketSize) && 
(bytesInUse <= maxRamUsed)) {
                                useRAMBucket = true;
@@ -192,10 +438,59 @@
                }

                // Do we want a RAMBucket or a FileBucket?
-               realBucket = (useRAMBucket ? new RAMBucket(size) : new 
TempFileBucket(filenameGenerator.makeRandomFilename(), filenameGenerator));
-               // Do we want it to be encrypted?
-               realBucket = (!reallyEncrypt ? realBucket : new 
PaddedEphemerallyEncryptedBucket(realBucket, 1024, strongPRNG, weakPRNG));
+               realBucket = (useRAMBucket ? new ArrayBucket() : 
_makeFileBucket());

-               return new TempBucket(realBucket);
+               TempBucket toReturn = new TempBucket(now, realBucket);
+               if(useRAMBucket) { // No need to consider them for migration if 
they can't be migrated
+                       synchronized(ramBucketQueue) {
+                               ramBucketQueue.add(toReturn);
+                       }
+               }
+               return toReturn;
+}
+       
+       /** Migrate all long-lived buckets from the queue */
+       private void cleanBucketQueue(long now) {
+               boolean shouldContinue = true;
+               // create a new list to avoid race-conditions
+               final Queue<TempBucket> toMigrate = new 
LinkedList<TempBucket>();
+               do {
+                       synchronized(ramBucketQueue) {
+                               final TempBucket tmpBucket = 
ramBucketQueue.peek();
+                               if((tmpBucket == null) || 
(tmpBucket.creationTime + RAMBUCKET_MAX_AGE > now))
+                                       shouldContinue = false;
+                               else {
+                                       if(logMINOR)
+                                               Logger.minor(this, "The bucket 
is "+TimeUtil.formatTime(now - tmpBucket.creationTime)+" old: we will 
force-migrate it to disk.");
+                                       ramBucketQueue.remove(tmpBucket);
+                                       toMigrate.add(tmpBucket);
+                               }
+                       }
+               } while(shouldContinue);
+
+               if(toMigrate.size() > 0) {
+                       executor.execute(new Runnable() {
+
+                               public void run() {
+                                       if(logMINOR)
+                                               Logger.minor(this, "We are 
going to migrate " + toMigrate.size() + " RAMBuckets");
+                                       for(TempBucket tmpBucket : toMigrate) {
+                                               try {
+                                                       
tmpBucket.migrateToFileBucket();
+                                               } catch(IOException e) {
+                                                       Logger.error(tmpBucket, 
"An IOE occured while migrating long-lived buckets:" + e.getMessage(), e);
+                                               }
+                                       }
+                               }
+                       }, "RAMBucket migrator ("+now+')');
+               }
        }
-}
+       
+       private final Queue<TempBucket> ramBucketQueue = new 
LinkedBlockingQueue<TempBucket>();
+       
+       private Bucket _makeFileBucket() {
+               Bucket fileBucket = new 
TempFileBucket(filenameGenerator.makeRandomFilename(), filenameGenerator);
+               // Do we want it to be encrypted?
+               return (reallyEncrypt ? new 
PaddedEphemerallyEncryptedBucket(fileBucket, 1024, strongPRNG, weakPRNG) : 
fileBucket);
+       }
+}
\ No newline at end of file

Modified: 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
===================================================================
--- 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java   
    2008-09-24 22:52:41 UTC (rev 22826)
+++ 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java   
    2008-09-24 23:10:15 UTC (rev 22827)
@@ -64,6 +64,6 @@
                URI baseURI = new URI(BASE_URI);
                byte[] dataToFilter = data.getBytes("UTF-8");

-               return ContentFilter.filter(new ArrayBucket(dataToFilter, -1), 
bf, typeName, baseURI, null).data.toString();
+               return ContentFilter.filter(new ArrayBucket(dataToFilter), bf, 
typeName, baseURI, null).data.toString();
        }
 }

Modified: branches/db4o/freenet/test/freenet/support/HTMLNodeTest.java
===================================================================
--- branches/db4o/freenet/test/freenet/support/HTMLNodeTest.java        
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/test/freenet/support/HTMLNodeTest.java        
2008-09-24 23:10:15 UTC (rev 22827)
@@ -211,11 +211,11 @@
                HTMLNode methodHTMLNode = new HTMLNode(SAMPLE_OKAY_NODE_NAME);
                methodHTMLNode.addChild(SAMPLE_OKAY_NODE_NAME, 
                                SAMPLE_OKAY_ATTRIBUTE_NAME, 
SAMPLE_ATTRIBUTE_VALUE);
-               List childrenList = methodHTMLNode.children;
+               List<HTMLNode> childrenList = methodHTMLNode.children;
                assertEquals(1,childrenList.size());
                assertEquals(generateNoContentNodeOutput(SAMPLE_OKAY_NODE_NAME,
                                
SAMPLE_OKAY_ATTRIBUTE_NAME,SAMPLE_ATTRIBUTE_VALUE),
-                               ((HTMLNode)childrenList.get(0)).generate());
+                               childrenList.get(0).generate());
        }

        /**
@@ -228,12 +228,12 @@
                methodHTMLNode.addChild(SAMPLE_OKAY_NODE_NAME, 
                                SAMPLE_OKAY_ATTRIBUTE_NAME, 
SAMPLE_ATTRIBUTE_VALUE,
                                SAMPLE_NODE_CONTENT);
-               List childrenList = methodHTMLNode.children;
+               List<HTMLNode> childrenList = methodHTMLNode.children;
                assertEquals(1,childrenList.size());
                assertEquals(generateFullNodeOutput(SAMPLE_OKAY_NODE_NAME,
                                SAMPLE_OKAY_ATTRIBUTE_NAME, 
SAMPLE_ATTRIBUTE_VALUE, 
                                SAMPLE_NODE_CONTENT),
-                                       
((HTMLNode)childrenList.get(0)).generate());
+                                       childrenList.get(0).generate());
        }

        /**
@@ -274,9 +274,9 @@
         * @param attributesValues the attributes values to check
         */
        private void testSingleChildAttributes(HTMLNode aHTMLNode,String[] 
attibutesNames, String[] attributesValues) {
-               List childrenList = aHTMLNode.children;
+               List<HTMLNode> childrenList = aHTMLNode.children;
                assertEquals(1,childrenList.size());
-               HTMLNode childHTMLNode = (HTMLNode)childrenList.get(0);
+               HTMLNode childHTMLNode = childrenList.get(0);
                
assertEquals(attibutesNames.length,childHTMLNode.getAttributes().size());
                for(int i = 0 ; i<attibutesNames.length;i++)
                        assertEquals(attributesValues[i],
@@ -296,7 +296,7 @@
                //since the HTMLNode name is not "#", or "%",
                //the content will be a new child with the "#" name
                assertEquals(SAMPLE_NODE_CONTENT,
-                               
((HTMLNode)(methodHTMLNode.children.get(0))).getContent());
+                               methodHTMLNode.children.get(0).getContent());
                assertNull(methodHTMLNode.getContent());

                methodHTMLNode = new HTMLNode("#",SAMPLE_NODE_CONTENT);

Modified: branches/db4o/freenet/test/freenet/support/LRUHashtableTest.java
===================================================================
--- branches/db4o/freenet/test/freenet/support/LRUHashtableTest.java    
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/test/freenet/support/LRUHashtableTest.java    
2008-09-24 23:10:15 UTC (rev 22827)
@@ -50,8 +50,8 @@
         * @param size HashTable size
         * @return the created LRUHashtable
         */
-       private LRUHashtable createSampleHashTable(int size) {
-               LRUHashtable methodLRUht = new LRUHashtable();
+       private LRUHashtable<Object, Object> createSampleHashTable(int size) {
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                Object[][] sampleObjects = createSampleKeyVal(size);
                for (int i=0;i<sampleObjects.length;i++)
                        
methodLRUht.push(sampleObjects[i][0],sampleObjects[i][1]);
@@ -66,7 +66,7 @@
         * @param aValue the correspondent value
         * @return true if the key is present and returned value is the same as 
in the argument
         */
-       private boolean verifyKeyValPresence(LRUHashtable aLRUht, Object aKey, 
Object aValue) {
+       private boolean verifyKeyValPresence(LRUHashtable<Object, Object> 
aLRUht, Object aKey, Object aValue) {
                if (aLRUht.containsKey(aKey))
                        return aLRUht.get(aKey).equals(aValue);
                return false;
@@ -80,7 +80,7 @@
         * is raised
         */
        public void testPushNull() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                try {
                        //a null value is admitted
                        methodLRUht.push(new Object(),null);}           
@@ -104,7 +104,7 @@
         * time.
         */
        public void testPushSameObjTwice() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                Object[][] sampleObj = {
                                { new Integer(sampleElemsNumber), new Object() 
}, 
                                { new Integer(sampleElemsNumber+1), new 
Object() } };
@@ -132,7 +132,7 @@
         * values.
         */
        public void testPushSameKey() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                Object[][] sampleObj = {
                                { new Integer(sampleElemsNumber), new Object() 
}, 
                                { new Integer(sampleElemsNumber+1), new 
Object() } };
@@ -162,7 +162,7 @@
         * HashTable entry deleted
         */
        public void testPopKey() {
-               LRUHashtable methodLRUht = new LRUHashtable();
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                Object[][] sampleObjects = 
createSampleKeyVal(sampleElemsNumber);
                //pushing objects
                for (int i=0; i<sampleObjects.length; i++)              
@@ -182,7 +182,7 @@
         * HashTable entry deleted
         */
        public void testPopValue() {
-               LRUHashtable methodLRUht = new LRUHashtable();
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                Object[][] sampleObjects = 
createSampleKeyVal(sampleElemsNumber);
                //pushing objects
                for (int i=0; i<sampleObjects.length; i++)
@@ -210,7 +210,7 @@
         * verifying if their peekValue is correct
         */
        public void testPeekValue() {
-               LRUHashtable methodLRUht = new LRUHashtable();
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                Object[][] sampleObjects = 
createSampleKeyVal(sampleElemsNumber);
                //pushing objects
                for (int i=0; i<sampleObjects.length; i++)
@@ -232,7 +232,7 @@
         * the LRUHashTable
         */
        public void testSize() {
-               LRUHashtable methodLRUht = new LRUHashtable();
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                Object[][] sampleObjects = 
createSampleKeyVal(sampleElemsNumber);
                assertTrue(methodLRUht.size()==0);
                //pushing objects
@@ -253,7 +253,7 @@
         * the HashTable size.
         */
        public void testRemoveKey() {
-               LRUHashtable methodLRUht = new LRUHashtable();
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                Object[][] sampleObjects = 
createSampleKeyVal(sampleElemsNumber);
                //pushing objects
                for (int i=0; i<sampleObjects.length; i++)
@@ -271,7 +271,7 @@
         * setting up a sample queue.
         */
        public void testRemoveNullKey() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                try {
                        methodLRUht.removeKey(null);
                        fail("Expected Exception Error Not Thrown!"); }
@@ -285,7 +285,7 @@
         * setting up a sample LRUHashtable.
         */
        public void testRemoveNotPresent() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                assertFalse(methodLRUht.removeKey(new Object()));
        }

@@ -296,7 +296,7 @@
         * Then it search for a present one.
         */
        public void testContainsKey() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                assertFalse(methodLRUht.containsKey(new Object()));
                Object methodSampleObj = new Object();
                methodLRUht.push(methodSampleObj,null);
@@ -310,7 +310,7 @@
         * then it search a present key.
         */
        public void testGet() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                assertNull(methodLRUht.get(new Object()));
                Object methodSampleKey = new Object();
                Object methodSampleValue = new Object();
@@ -323,7 +323,7 @@
         * a null key.
         */
        public void testGetNullKey() {
-               LRUHashtable methodLRUht = 
createSampleHashTable(sampleElemsNumber);
+               LRUHashtable<Object, Object> methodLRUht = 
createSampleHashTable(sampleElemsNumber);
                try {
                        methodLRUht.get(null);
                        fail("Expected Exception Error Not Thrown!"); }
@@ -337,7 +337,7 @@
         * is correct
         */
        public void testKeys() {
-               LRUHashtable methodLRUht = new LRUHashtable();
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                Object[][] sampleObjects = 
createSampleKeyVal(sampleElemsNumber);
                //pushing objects
                for (int i=0; i<sampleObjects.length; i++)
@@ -356,7 +356,7 @@
         * out all keys in a sample LRUHashTable
         */
        public void testIsEmpty() {
-               LRUHashtable methodLRUht = new LRUHashtable();
+               LRUHashtable<Object, Object> methodLRUht = new 
LRUHashtable<Object, Object>();
                assertTrue(methodLRUht.isEmpty());
                methodLRUht = createSampleHashTable(sampleElemsNumber);
                //popping keys

Modified: branches/db4o/freenet/test/freenet/support/MultiValueTableTest.java
===================================================================
--- branches/db4o/freenet/test/freenet/support/MultiValueTableTest.java 
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/test/freenet/support/MultiValueTableTest.java 
2008-09-24 23:10:15 UTC (rev 22827)
@@ -15,12 +15,12 @@
  */
 package freenet.support;

+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Random;
-import java.util.Arrays;

 import junit.framework.TestCase;

@@ -51,7 +51,7 @@
                for (int i=0; i<sampleObjects.length;i++) {
                        if (isRandom) 
                                methodValuesNumber = 
1+rnd.nextInt(valuesNumber);
-                       sampleObjects[i][0] = new Integer(i);
+                       sampleObjects[i][0] = i;
                        sampleObjects[i][1] = 
fillSampleValuesList(methodValuesNumber); }
                return sampleObjects;
        }

Modified: 
branches/db4o/freenet/test/freenet/support/compress/GzipCompressorTest.java
===================================================================
--- branches/db4o/freenet/test/freenet/support/compress/GzipCompressorTest.java 
2008-09-24 22:52:41 UTC (rev 22826)
+++ branches/db4o/freenet/test/freenet/support/compress/GzipCompressorTest.java 
2008-09-24 23:10:15 UTC (rev 22827)
@@ -111,7 +111,7 @@
        public void testCompressException() {

                byte[] uncompressedData = UNCOMPRESSED_DATA_1.getBytes();
-               Bucket inBucket = new ArrayBucket(uncompressedData, 
uncompressedData.length);
+               Bucket inBucket = new ArrayBucket(uncompressedData);
                BucketFactory factory = new ArrayBucketFactory();

                try {
@@ -133,7 +133,7 @@

                byte[] compressedData = doCompress(uncompressedData);

-               Bucket inBucket = new ArrayBucket(compressedData, 
uncompressedData.length);
+               Bucket inBucket = new ArrayBucket(compressedData);
                BucketFactory factory = new ArrayBucketFactory();

                try {
@@ -147,7 +147,7 @@

        private byte[] doBucketDecompress(byte[] compressedData) {

-               Bucket inBucket = new ArrayBucket(compressedData, 
compressedData.length);
+               Bucket inBucket = new ArrayBucket(compressedData);
                BucketFactory factory = new ArrayBucketFactory();
                Bucket outBucket = null;

@@ -179,7 +179,7 @@
        }

        private byte[] doCompress(byte[] uncompressedData) {
-               Bucket inBucket = new ArrayBucket(uncompressedData, 
uncompressedData.length);
+               Bucket inBucket = new ArrayBucket(uncompressedData);
                BucketFactory factory = new ArrayBucketFactory();
                Bucket outBucket = null;



Reply via email to