Author: toad
Date: 2008-09-26 16:35:23 +0000 (Fri, 26 Sep 2008)
New Revision: 22845

Added:
   branches/db4o/freenet/src/freenet/node/PeerMessageQueue.java
Modified:
   branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.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/staticfiles/defaultbookmarks.dat
   branches/db4o/freenet/src/freenet/io/comm/DMT.java
   branches/db4o/freenet/src/freenet/io/comm/FreenetInetAddress.java
   branches/db4o/freenet/src/freenet/io/comm/MessageCore.java
   branches/db4o/freenet/src/freenet/io/comm/PeerContext.java
   branches/db4o/freenet/src/freenet/io/xfer/BulkReceiver.java
   branches/db4o/freenet/src/freenet/io/xfer/BulkTransmitter.java
   branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties
   branches/db4o/freenet/src/freenet/node/AnnounceSender.java
   branches/db4o/freenet/src/freenet/node/Announcer.java
   branches/db4o/freenet/src/freenet/node/CHKInsertHandler.java
   branches/db4o/freenet/src/freenet/node/CHKInsertSender.java
   branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java
   branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java
   branches/db4o/freenet/src/freenet/node/FailureTable.java
   branches/db4o/freenet/src/freenet/node/FailureTableEntry.java
   branches/db4o/freenet/src/freenet/node/KeyTracker.java
   branches/db4o/freenet/src/freenet/node/LocationManager.java
   branches/db4o/freenet/src/freenet/node/MessageItem.java
   branches/db4o/freenet/src/freenet/node/NetworkIDManager.java
   branches/db4o/freenet/src/freenet/node/Node.java
   branches/db4o/freenet/src/freenet/node/NodeCrypto.java
   branches/db4o/freenet/src/freenet/node/NodeDispatcher.java
   branches/db4o/freenet/src/freenet/node/NodeIPDetector.java
   branches/db4o/freenet/src/freenet/node/NodeIPPortDetector.java
   branches/db4o/freenet/src/freenet/node/OpennetManager.java
   branches/db4o/freenet/src/freenet/node/OutgoingPacketMangler.java
   branches/db4o/freenet/src/freenet/node/PacketSender.java
   branches/db4o/freenet/src/freenet/node/PeerManager.java
   branches/db4o/freenet/src/freenet/node/PeerNode.java
   branches/db4o/freenet/src/freenet/node/RequestHandler.java
   branches/db4o/freenet/src/freenet/node/RequestSender.java
   branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestHandler.java
   branches/db4o/freenet/src/freenet/node/SSKInsertHandler.java
   branches/db4o/freenet/src/freenet/node/SSKInsertSender.java
   branches/db4o/freenet/src/freenet/node/SendMessageOnErrorCallback.java
   branches/db4o/freenet/src/freenet/node/UptimeEstimator.java
   branches/db4o/freenet/src/freenet/node/Version.java
   branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java
   branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java
   
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java
   branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
   branches/db4o/freenet/src/freenet/store/FreenetStore.java
   
branches/db4o/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
   branches/db4o/freenet/src/freenet/support/BloomFilter.java
   branches/db4o/freenet/src/freenet/support/SortedLongSet.java
   branches/db4o/freenet/src/freenet/support/TokenBucket.java
   branches/db4o/freenet/src/freenet/support/UpdatableSortedLinkedList.java
   branches/db4o/freenet/test/freenet/support/UpdatableSortedLinkedListTest.java
Log:
Merge 1165 into db4o branch: 22682 -> 22843


Modified: branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2008-09-26 16:35:23 UTC (rev 22845)
@@ -270,9 +270,9 @@
                                HTMLNode overviewList = 
overviewInfoboxContent.addChild("ul");
                                overviewList.addChild("li", 
"bwlimitDelayTime:\u00a0" + bwlimitDelayTime + "ms");
                                overviewList.addChild("li", 
"nodeAveragePingTime:\u00a0" + nodeAveragePingTime + "ms");
-                               overviewList.addChild("li", 
"networkSizeEstimateSession:\u00a0" + networkSizeEstimateSession + 
"\u00a0nodes");
+                               overviewList.addChild("li", 
"darknetSizeEstimateSession:\u00a0" + networkSizeEstimateSession + 
"\u00a0nodes");
                                if(nodeUptimeSeconds > (48*60*60)) {  // 48 
hours
-                                       overviewList.addChild("li", 
"networkSizeEstimateRecent:\u00a0" + networkSizeEstimateRecent + "\u00a0nodes");
+                                       overviewList.addChild("li", 
"darknetSizeEstimateRecent:\u00a0" + networkSizeEstimateRecent + "\u00a0nodes");
                                }
                                overviewList.addChild("li", "nodeUptime:\u00a0" 
+ nodeUptimeString);
                                overviewList.addChild("li", 
"routingMissDistance:\u00a0" + fix4.format(routingMissDistance));

Modified: branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-09-26 16:35:23 UTC (rev 22845)
@@ -1100,9 +1100,10 @@
                insertForm.addChild("#", " KSK/SSK/USK \u00a0 ");
                insertForm.addChild("input", new String[] { "type", "name", 
"value" }, new String[] { "text", "key", "KSK@" });
                if(ctx.isAllowedFullAccess()) {
-                       insertForm.addChild("#", " \u00a0 ");
-                       insertForm.addChild("input", new String[] { "type", 
"name", "value" }, new String[] { "submit", "insert-local", 
L10n.getString("QueueToadlet.insertFileBrowseLabel") + "..." });
                        insertForm.addChild("br");
+                       insertForm.addChild("#", 
L10n.getString("QueueToadlet.insertFileBrowseLabel")+":");
+                       insertForm.addChild("input", new String[] { "type", 
"name", "value" }, new String[] { "submit", "insert-local", 
L10n.getString("QueueToadlet.insertFileBrowseButton") + "..." });
+                       insertForm.addChild("br");
                }
                insertForm.addChild("#", 
L10n.getString("QueueToadlet.insertFileLabel") + ": ");
                insertForm.addChild("input", new String[] { "type", "name", 
"value" }, new String[] { "file", "filename", "" });

Modified: branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2008-09-26 16:35:23 UTC (rev 22845)
@@ -1002,12 +1002,12 @@
                String nodeUptimeString = TimeUtil.formatTime(nodeUptimeSeconds 
* 1000);  // *1000 to convert to milliseconds
                overviewList.addChild("li", "bwlimitDelayTime:\u00a0" + 
bwlimitDelayTime + "ms");
                overviewList.addChild("li", "nodeAveragePingTime:\u00a0" + 
nodeAveragePingTime + "ms");
-               overviewList.addChild("li", "networkSizeEstimateSession:\u00a0" 
+ networkSizeEstimateSession + "\u00a0nodes");
+               overviewList.addChild("li", "darknetSizeEstimateSession:\u00a0" 
+ networkSizeEstimateSession + "\u00a0nodes");
                if(nodeUptimeSeconds > (24*60*60)) {  // 24 hours
-                       overviewList.addChild("li", 
"networkSizeEstimate24h:\u00a0" + networkSizeEstimate24h + "\u00a0nodes");
+                       overviewList.addChild("li", 
"darknetSizeEstimate24h:\u00a0" + networkSizeEstimate24h + "\u00a0nodes");
                }
                if(nodeUptimeSeconds > (48*60*60)) {  // 48 hours
-                       overviewList.addChild("li", 
"networkSizeEstimate48h:\u00a0" + networkSizeEstimate48h + "\u00a0nodes");
+                       overviewList.addChild("li", 
"darknetSizeEstimate48h:\u00a0" + networkSizeEstimate48h + "\u00a0nodes");
                }
                if ((numberOfRemotePeerLocationsSeenInSwaps > 0.0) && ((swaps > 
0.0) || (noSwaps > 0.0))) {
                        overviewList.addChild("li", 
"avrConnPeersPerNode:\u00a0" + 
fix6p6.format(numberOfRemotePeerLocationsSeenInSwaps/(swaps+noSwaps)) + 
"\u00a0peers");

Modified: branches/db4o/freenet/src/freenet/clients/http/filter/GIFFilter.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/filter/GIFFilter.java        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/clients/http/filter/GIFFilter.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -69,7 +69,6 @@
        public Bucket writeFilter(Bucket data, BucketFactory bf, String charset,
                        HashMap otherParams, FilterCallback cb) throws 
DataFilterException,
                        IOException {
-               // TODO Auto-generated method stub
                return null;
        }


Modified: branches/db4o/freenet/src/freenet/clients/http/filter/JPEGFilter.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/filter/JPEGFilter.java       
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/clients/http/filter/JPEGFilter.java       
2008-09-26 16:35:23 UTC (rev 22845)
@@ -442,7 +442,6 @@
        public Bucket writeFilter(Bucket data, BucketFactory bf, String charset,
                        HashMap otherParams, FilterCallback cb) throws 
DataFilterException,
                        IOException {
-               // TODO Auto-generated method stub
                return null;
        }


Modified: 
branches/db4o/freenet/src/freenet/clients/http/staticfiles/defaultbookmarks.dat
===================================================================
--- 
branches/db4o/freenet/src/freenet/clients/http/staticfiles/defaultbookmarks.dat 
    2008-09-26 14:55:48 UTC (rev 22844)
+++ 
branches/db4o/freenet/src/freenet/clients/http/staticfiles/defaultbookmarks.dat 
    2008-09-26 16:35:23 UTC (rev 22845)
@@ -1,4 +1,4 @@
-BookmarkCategory=3
+BookmarkCategory=2
 Version=1
 Bookmark=0
 BookmarkCategory0.Name=Indexes
@@ -7,63 +7,40 @@
 BookmarkCategory0.Content.Bookmark0.Name=The Ultimate FreeNet Index
 BookmarkCategory0.Content.Bookmark0.Description=A new one-page index with a 
menu including categories
 BookmarkCategory0.Content.Bookmark0.hasAnActivelink=true
-BookmarkCategory0.Content.Bookmark0.URI=USK at 
0I8gctpUE32CM0iQhXaYpCMvtPPGfT4pjXm01oid5Zc,3dAcn4fX2LyxO6uCnWFTx-2HKZ89uruurcKwLSCxbZ4,AQACAAE/Ultimate-Freenet-Index/31/
+BookmarkCategory0.Content.Bookmark0.URI=USK at 
0I8gctpUE32CM0iQhXaYpCMvtPPGfT4pjXm01oid5Zc,3dAcn4fX2LyxO6uCnWFTx-2HKZ89uruurcKwLSCxbZ4,AQACAAE/Ultimate-Freenet-Index/32/
 BookmarkCategory0.Content.Bookmark3.Name=Index des sites Fran?ais
 BookmarkCategory0.Content.Bookmark3.Description=A small French index with 
descriptions
 BookmarkCategory0.Content.Bookmark3.hasAnActivelink=true
-BookmarkCategory0.Content.Bookmark3.URI=USK at 
RJnh1EnvOSPwOWVRS2nyhC4eIQkKoNE5hcTv7~yY-sM,pOloLxnKWM~AL24iDMHOAvTvCqMlB-p2BO9zK96TOZA,AQACAAE/index_fr/64/
+BookmarkCategory0.Content.Bookmark3.URI=USK at 
RJnh1EnvOSPwOWVRS2nyhC4eIQkKoNE5hcTv7~yY-sM,pOloLxnKWM~AL24iDMHOAvTvCqMlB-p2BO9zK96TOZA,AQACAAE/index_fr/66/
 BookmarkCategory0.Content.Bookmark2.Name=Freenet Activelink Index (SLOW: 
graphical index, preloads all the sites, so takes *ages* to load)
 BookmarkCategory0.Content.Bookmark2.hasAnActivelink=true
 BookmarkCategory0.Content.Bookmark2.Description=A graphical freenet index 
(this will take a long time to load as it preloads the sites)
-BookmarkCategory0.Content.Bookmark2.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index/82/
+BookmarkCategory0.Content.Bookmark2.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index/85/
 BookmarkCategory0.Content.Bookmark1.Name=Freenet Activelink Index Text Version 
(a quick-loading non-graphical index site, no porn)
 BookmarkCategory0.Content.Bookmark1.hasAnActivelink=true
 BookmarkCategory0.Content.Bookmark1.Description=Text version of the Activelink 
Index
-BookmarkCategory0.Content.Bookmark1.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index-text/43/
-BookmarkCategory1.Name=Freenet devel's flogs
+BookmarkCategory0.Content.Bookmark1.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index-text/46/
+BookmarkCategory1.Name=Freenet related software and documentation
 BookmarkCategory1.Content.BookmarkCategory=0
 BookmarkCategory1.Content.Bookmark=5
-BookmarkCategory1.Content.Bookmark4.Name=Wavey
-BookmarkCategory1.Content.Bookmark4.Description=Wavey's flog
-BookmarkCategory1.Content.Bookmark4.hasAnActivelink=true
-BookmarkCategory1.Content.Bookmark4.URI=USK at 
yQ6xZyw6KlKgEBygbncwm0kyyH0QOtxt35V7CFngUKc,c-4iY3l2nmkumKcN4qB1CLmx1tszv8Rqnv184Ys9fgc,AQACAAE/Wavey%27s%20Freenet%20Development%20Flog/18/
-BookmarkCategory1.Content.Bookmark3.Name=Zothar
-BookmarkCategory1.Content.Bookmark3.Description=Zothar's flog
-BookmarkCategory1.Content.Bookmark3.hasAnActivelink=true
-BookmarkCategory1.Content.Bookmark3.URI=USK at 
FgA7EMOmIjfw~OATtonMPZ80xJGDtzZ5TI15b2nIHH8,qeVFtPz2cX0VAif2AMXAS8ajgvbc3SsVp2YkPYczMX0,AQACAAE/Zothar_flog/11/
-BookmarkCategory1.Content.Bookmark2.Name=Bombe
-BookmarkCategory1.Content.Bookmark2.Description=Bombe's flog
-BookmarkCategory1.Content.Bookmark2.hasAnActivelink=true
-BookmarkCategory1.Content.Bookmark2.URI=USK at 
e3myoFyp5avg6WYN16ImHri6J7Nj8980Fm~aQe4EX1U,QvbWT0ImE0TwLODTl7EoJx2NBnwDxTbLTE6zkB-eGPs,AQACAAE/bombe/42/
-BookmarkCategory1.Content.Bookmark1.Name=Nextgen$
-BookmarkCategory1.Content.Bookmark1.Description=NextGen$' flog
-BookmarkCategory1.Content.Bookmark1.hasAnActivelink=true
-BookmarkCategory1.Content.Bookmark1.URI=USK at 
hM9XRwjXIzU8xTSBXNZvTn2KuvTSRFnVn4EER9FQnpM,gsth24O7ud4gL4NwNuYJDUqfaWASOG2zxZY~ChtgPxc,AQACAAE/Flog/7/
-BookmarkCategory1.Content.Bookmark0.Name=Toad
-BookmarkCategory1.Content.Bookmark0.Description=Toad's flog
+BookmarkCategory1.Content.Bookmark0.Name=Freenet Message System
+BookmarkCategory1.Content.Bookmark0.Description=The official freesite of FMS, 
a spam resistant message board system for Freenet
 BookmarkCategory1.Content.Bookmark0.hasAnActivelink=true
-BookmarkCategory1.Content.Bookmark0.URI=USK at 
yGvITGZzrY1vUZK-4AaYLgcjZ7ysRqNTMfdcO8gS-LY,-ab5bJVD3Lp-LXEQqBAhJpMKrKJ19RnNaZMIkusU79s,AQACAAE/toad/12/
-BookmarkCategory2.Name=Freenet related software and documentation
-BookmarkCategory2.Content.BookmarkCategory=0
-BookmarkCategory2.Content.Bookmark=5
-BookmarkCategory2.Content.Bookmark0.Name=Freenet Message System
-BookmarkCategory2.Content.Bookmark0.Description=The official freesite of FMS, 
a spam resistant message board system for Freenet
-BookmarkCategory2.Content.Bookmark0.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark0.URI=USK at 
0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/80/
-BookmarkCategory2.Content.Bookmark1.Name=Freemail
-BookmarkCategory2.Content.Bookmark1.Description=The official site for Freemail 
- email over Freenet
-BookmarkCategory2.Content.Bookmark1.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark1.URI=USK at 
xOg49GNltumTJJzj0fVzuGDpo4hJUsy2UsGQkjE7NY4,EtUH5b9gGpp8JiY-Bm-Y9kHX1q-yDjD-9oRzXn21O9k,AQACAAE/freemail/4/
-BookmarkCategory2.Content.Bookmark2.Name=Publish!
-BookmarkCategory2.Content.Bookmark2.Description=Simple guide to publishing web 
sites to Freenet
-BookmarkCategory2.Content.Bookmark2.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark2.URI=USK at 
940RYvj1-aowEHGsb5HeMTigq8gnV14pbKNsIvUO~-0,FdTbR3gIz21QNfDtnK~MiWgAf2kfwHe-cpyJXuLHdOE,AQACAAE/publish/1/
-BookmarkCategory2.Content.Bookmark3.URI=USK at 
8r-uSRcJPkAr-3v3YJR16OCx~lyV2XOKsiG4MOQQBMM,P42IgNemestUdaI7T6z3Og6P-Hi7g9U~e37R3kWGVj8,AQACAAE/freesite-HOWTO/4/
-BookmarkCategory2.Content.Bookmark3.Name=Freesite HOWTO
-BookmarkCategory2.Content.Bookmark3.Description=A more detailed explanation of 
publishing freesites
-BookmarkCategory2.Content.Bookmark3.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark4.URI=USK at 
ugb~uuscsidMI-Ze8laZe~o3BUIb3S50i25RIwDH99M,9T20t3xoG-dQfMO94LGOl9AxRTkaz~TykFY-voqaTQI,AQACAAE/FAFS/4/
-BookmarkCategory2.Content.Bookmark4.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark4.Name=The Freenet Applications Freesite
-BookmarkCategory2.Content.Bookmark4.Description=Various links to Freenet 
applications, and instructions for using them
+BookmarkCategory1.Content.Bookmark0.URI=USK at 
0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/80/
+BookmarkCategory1.Content.Bookmark1.Name=Freemail
+BookmarkCategory1.Content.Bookmark1.Description=The official site for Freemail 
- email over Freenet
+BookmarkCategory1.Content.Bookmark1.hasAnActivelink=true
+BookmarkCategory1.Content.Bookmark1.URI=USK at 
xOg49GNltumTJJzj0fVzuGDpo4hJUsy2UsGQkjE7NY4,EtUH5b9gGpp8JiY-Bm-Y9kHX1q-yDjD-9oRzXn21O9k,AQACAAE/freemail/4/
+BookmarkCategory1.Content.Bookmark2.Name=Publish!
+BookmarkCategory1.Content.Bookmark2.Description=Simple guide to publishing web 
sites to Freenet
+BookmarkCategory1.Content.Bookmark2.hasAnActivelink=true
+BookmarkCategory1.Content.Bookmark2.URI=USK at 
940RYvj1-aowEHGsb5HeMTigq8gnV14pbKNsIvUO~-0,FdTbR3gIz21QNfDtnK~MiWgAf2kfwHe-cpyJXuLHdOE,AQACAAE/publish/1/
+BookmarkCategory1.Content.Bookmark3.URI=USK at 
8r-uSRcJPkAr-3v3YJR16OCx~lyV2XOKsiG4MOQQBMM,P42IgNemestUdaI7T6z3Og6P-Hi7g9U~e37R3kWGVj8,AQACAAE/freesite-HOWTO/4/
+BookmarkCategory1.Content.Bookmark3.Name=Freesite HOWTO
+BookmarkCategory1.Content.Bookmark3.Description=A more detailed explanation of 
publishing freesites
+BookmarkCategory1.Content.Bookmark3.hasAnActivelink=true
+BookmarkCategory1.Content.Bookmark4.URI=USK at 
ugb~uuscsidMI-Ze8laZe~o3BUIb3S50i25RIwDH99M,9T20t3xoG-dQfMO94LGOl9AxRTkaz~TykFY-voqaTQI,AQACAAE/FAFS/4/
+BookmarkCategory1.Content.Bookmark4.hasAnActivelink=true
+BookmarkCategory1.Content.Bookmark4.Name=The Freenet Applications Freesite
+BookmarkCategory1.Content.Bookmark4.Description=Various links to Freenet 
applications, and instructions for using them
 End

Modified: branches/db4o/freenet/src/freenet/io/comm/DMT.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/DMT.java  2008-09-26 14:55:48 UTC 
(rev 22844)
+++ branches/db4o/freenet/src/freenet/io/comm/DMT.java  2008-09-26 16:35:23 UTC 
(rev 22845)
@@ -132,20 +132,22 @@
        public static final String UPTIME_PERCENT_48H = "uptimePercent48H";

        /** Very urgent */
-       public static final short PRIORITY_NOW=-2;
+       public static final short PRIORITY_NOW=0;
        /** Short timeout, or urgent for other reasons - Accepted, RejectedLoop 
etc. */
-       public static final short PRIORITY_HIGH=-1; // 
+       public static final short PRIORITY_HIGH=1; // 
        /** Unspecified e.g. test-only messages. */
-       public static final short PRIORITY_UNSPECIFIED=0;
+       public static final short PRIORITY_UNSPECIFIED=2;
        /** Long timeout (e.g. DataFound), or moderately urgent. */
-       public static final short PRIORITY_LOW=1; // long timeout, or 
moderately urgent
+       public static final short PRIORITY_LOW=3; // long timeout, or 
moderately urgent
        /**
         * Bulk data transfer, bottom of the heap, high level limiting must 
ensure there is time to send it by 
         * not accepting an infeasible number of requests; starvation will 
cause bwlimitDelayTime to go high and 
         * requests to be rejected. That's the ultimate limiter if even output 
bandwidth liability fails.
         */
-       public static final short PRIORITY_BULK_DATA=2; 
+       public static final short PRIORITY_BULK_DATA=4;

+       public static final short NUM_PRIORITIES = 5;
+       
        // Assimilation

        // New data transmission messages

Modified: branches/db4o/freenet/src/freenet/io/comm/FreenetInetAddress.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/FreenetInetAddress.java   
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/io/comm/FreenetInetAddress.java   
2008-09-26 16:35:23 UTC (rev 22845)
@@ -374,4 +374,8 @@
                        return new FreenetInetAddress(getAddress());
                } else return this;
        }
+
+       public boolean hasHostnameNoIP() {
+               return hostname != null && hostname.length() > 0 && _address == 
null;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/io/comm/MessageCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/MessageCore.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/io/comm/MessageCore.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -87,8 +87,6 @@
                                } finally {
                                        ticker.queueTimedJob(this, 
FILTER_REMOVE_TIME);
                                }
-                               // TODO Auto-generated method stub
-                               
                        }

        }, FILTER_REMOVE_TIME);
@@ -502,7 +500,7 @@
                Logger.error(this, "Trying to send internal-only message "+m+" 
of spec "+m.getSpec(), new Exception("debug"));
                return;
            }
-               destination.sendAsync(m, null, 0, ctr);
+               destination.sendAsync(m, null, ctr);
        }

        public void setDispatcher(Dispatcher d) {

Modified: branches/db4o/freenet/src/freenet/io/comm/PeerContext.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/PeerContext.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/io/comm/PeerContext.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -34,7 +34,7 @@
        int getVersionNumber();

        /** Send a message to the node */
-       public void sendAsync(Message msg, AsyncMessageCallback cb, int 
alreadyReportedBytes, ByteCounter ctr) throws NotConnectedException;
+       public void sendAsync(Message msg, AsyncMessageCallback cb, ByteCounter 
ctr) throws NotConnectedException;

        /** Send a throttled message to the node (may block for a long time). 
         * @throws SyncSendWaitedTooLongException */

Modified: branches/db4o/freenet/src/freenet/io/xfer/BulkReceiver.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/xfer/BulkReceiver.java 2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/io/xfer/BulkReceiver.java 2008-09-26 
16:35:23 UTC (rev 22845)
@@ -48,7 +48,7 @@
                        sentCancel = true;
                }
                try {
-                       peer.sendAsync(DMT.createFNPBulkReceiveAborted(uid), 
null, 0, ctr);
+                       peer.sendAsync(DMT.createFNPBulkReceiveAborted(uid), 
null, ctr);
                } catch (NotConnectedException e) {
                        // Cool
                }
@@ -64,7 +64,7 @@
                        MessageFilter mfPacket = 
MessageFilter.create().setSource(peer).setType(DMT.FNPBulkPacketSend) 
.setField(DMT.UID, uid).setTimeout(TIMEOUT);
                        if(prb.hasWholeFile()) {
                                try {
-                                       
peer.sendAsync(DMT.createFNPBulkReceivedAll(uid), null, 0, ctr);
+                                       
peer.sendAsync(DMT.createFNPBulkReceivedAll(uid), null, ctr);
                                } catch (NotConnectedException e) {
                                        // Ignore, we have the data.
                                }

Modified: branches/db4o/freenet/src/freenet/io/xfer/BulkTransmitter.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/xfer/BulkTransmitter.java      
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/io/xfer/BulkTransmitter.java      
2008-09-26 16:35:23 UTC (rev 22845)
@@ -154,7 +154,7 @@
                        sentCancel = true;
                }
                try {
-                       peer.sendAsync(DMT.createFNPBulkSendAborted(uid), null, 
0, ctr);
+                       peer.sendAsync(DMT.createFNPBulkSendAborted(uid), null, 
ctr);
                } catch (NotConnectedException e) {
                        // Cool
                }

Modified: branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java       
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java       
2008-09-26 16:35:23 UTC (rev 22845)
@@ -148,7 +148,7 @@
                return ((PACKET_SIZE * 1000.0 / getDelay()));
        }

-       public void sendThrottledMessage(Message msg, PeerContext peer, 
DoubleTokenBucket overallThrottle, int packetSize, ByteCounter ctr, long 
deadline, boolean blockForSend) throws NotConnectedException, 
ThrottleDeprecatedException, WaitedTooLongException, 
SyncSendWaitedTooLongException {
+       public void sendThrottledMessage(Message msg, PeerContext peer, int 
packetSize, ByteCounter ctr, long deadline, boolean blockForSend) throws 
NotConnectedException, ThrottleDeprecatedException, WaitedTooLongException, 
SyncSendWaitedTooLongException {
                long start = System.currentTimeMillis();
                long bootID = peer.getBootID();
                synchronized(this) {
@@ -230,15 +230,7 @@
                        Logger.minor(this, "Congestion control wait time: 
"+waitTime+" for "+this);
                MyCallback callback = new MyCallback();
                try {
-                       if(((PeerNode)peer).shouldThrottle()) {
-                               if(logMINOR) Logger.minor(this, "Throttling 
"+peer.shortToString()+" : "+packetSize+" for "+this);
-                               long startTime = System.currentTimeMillis();
-                               overallThrottle.blockingGrab(packetSize);
-                               long delayTime = System.currentTimeMillis() - 
startTime;
-                               
((PeerNode)peer).reportThrottledPacketSendTime(delayTime);
-                       } else if(logMINOR)
-                               Logger.minor(this, "Not throttling 
"+peer.shortToString()+" for "+this);
-                       peer.sendAsync(msg, callback, packetSize, ctr);
+                       peer.sendAsync(msg, callback, ctr);
                        ctr.sentPayload(packetSize);
                        if(blockForSend) {
                                synchronized(callback) {

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties   
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties   
2008-09-26 16:35:23 UTC (rev 22845)
@@ -200,7 +200,7 @@
 DarknetConnectionsToadlet.failedToAddNodeTitle=Failed To Add Node
 DarknetConnectionsToadlet.fcpDisabled=FCP is disabled (for Freenet clients 
such as Frost and Thaw)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (for Freenet clients such 
as Frost and Thaw)
-DarknetConnectionsToadlet.fileReference=Choose the file containing the 
reference here:
+DarknetConnectionsToadlet.fileReference=OR browse for the node reference file 
here:
 DarknetConnectionsToadlet.forceRemove=Force Remove
 DarknetConnectionsToadlet.fproxyDisabled=FProxy is disabled (this web 
interface)
 DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/TCP (this web interface)
@@ -227,7 +227,7 @@
 DarknetConnectionsToadlet.notConnected=Not connected: No connection so far but 
this node is continuously trying to connect.
 DarknetConnectionsToadlet.notConnectedShort=Disconnected
 DarknetConnectionsToadlet.opennetFnpPort=Opennet FNP: ${port}/UDP (used to 
connect to untrusted peers i.e. Strangers; forward this port if you can) 
-DarknetConnectionsToadlet.pasteReference=Paste the reference here (the node 
will usually automatically strip chat client line prefixes):
+DarknetConnectionsToadlet.pasteReference=Enter node reference directly:
 DarknetConnectionsToadlet.privateNote=A private note concerning this peer
 DarknetConnectionsToadlet.privateNoteTitle=Private Note
 DarknetConnectionsToadlet.referenceCopyWarning=Node reference must be copied 
${bold}AS IS${/bold}. Modifying it will make it ${bold}useless${/bold}.
@@ -251,7 +251,7 @@
 DarknetConnectionsToadlet.triedToAddSelf=You can't add your own node to the 
list of remote peers.
 DarknetConnectionsToadlet.unknownAddress=(unknown address)
 DarknetConnectionsToadlet.updateChangedPrivnotes=Update changed private notes
-DarknetConnectionsToadlet.urlReference=Enter the URL of the reference here:
+DarknetConnectionsToadlet.urlReference=OR enter the URL of the node reference 
here:
 DarknetConnectionsToadlet.versionTitle=Version
 ExtOldAgeUserAlert.extTooOld=Your freenet-ext.jar file seems to be outdated: 
we strongly advise you to update it using 
http://downloads.freenetproject.org/alpha/freenet-ext.jar.
 ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext too old
@@ -301,7 +301,7 @@
 FirstTimeWizardToadlet.step5Title=Freenet first time wizard! - Network 
configuration
 FirstTimeWizardToadlet.step6Title=Freenet first time wizard! - Memory usage
 FirstTimeWizardToadlet.step7Title=Freenet first time wizard! - 
Congratulations, your node is now configured
-FirstTimeWizardToadlet.skipWizard=I am not a newbie, please skip the wizard!
+FirstTimeWizardToadlet.skipWizard=I will configure the node manually (not 
recommended).
 FirstTimeWizardToadlet.tenPercentDisk=(= 10% of free disk space)
 FirstTimeWizardToadlet.fivePercentDisk=(= 5% of free disk space)
 FProxyToadlet.abortToHomepage=Abort and return to the FProxy home page
@@ -643,6 +643,7 @@
 Node.buggyJVMTitle=Buggy JVM Warning
 Node.buggyJVMWithLink=The JVM you are using (${version}) is known to be 
${link}buggy${/link}. It may produce OutOfMemoryError's when there is plenty of 
memory available. Please upgrade to at least Sun Java 1.4.2_13, 1.5.0_10 or 1.6 
(recommended).
 Node.bwlimitMustBePositive=Bandwidth limit must be positive
+Node.connectToSeednodesCannotBeChangedMustDisableOpennetOrReboot=Connect to 
seednodes setting: Cannot disable while opennet is running, either disable and 
then re-enable opennet or restart the node.
 Node.databaseMemory=Datastore maximum memory usage
 Node.databaseMemoryLong=Maximum memory usage of the database backing the 
datastore indexes. 0 means no limit (limited to ~ 30% of maximum memory)
 Node.deadlockTitle=Deadlocking likely due to buggy JVM/kernel combination
@@ -670,8 +671,8 @@
 Node.errorApplyingConfig=Error while applying the new config : ${error}
 Node.extraPeerDir=Extra peer data directory
 Node.extraPeerDirLong=Name of directory to put extra peer data in
-Node.forceBigShrink=Do large store shrinks immediately
-Node.forceBigShrinkLong=Whether to do large store shrinks (over 10%) 
immediately (rather than waiting for the next node restart). Online shrinks do 
not preserve the most recently used data, so this is not recommended; use it 
only if you must have an immediate result.
+Node.forceBigShrink=Do large store shrinks immediately (bdbje-index store type 
only)
+Node.forceBigShrinkLong=Whether to do large store shrinks (over 10%) 
immediately (rather than waiting for the next node restart). Online shrinks do 
not preserve the most recently used data, so this is not recommended; use it 
only if you must have an immediate result. Specific to bdbje-index store type.
 Node.inBWLimit=Input bandwidth limit (bytes per second)
 Node.inBWLimitLong=Input bandwidth limit (bytes/sec); the node will try not to 
exceed this; -1 = 4x set outputBandwidthLimit
 Node.invalidStoreSize=Store size must be at least 32MB
@@ -710,10 +711,12 @@
 Node.storeDirectory=Store directory
 Node.storeDirectoryLong=Name of directory to put store files in
 Node.storeMaxMemTooHigh=Giving more than 80% of your ram to BDB is probably 
not what you want to do!
+Node.storePreallocate=Preallocate space for datastore
+Node.storePreallocateLong=Preallocate space for datastore
 Node.storeSize=Store size in bytes
 Node.storeSizeLong=Store size in bytes
 Node.storeType=Store type (LEAVE THIS ALONE)
-Node.storeTypeLong=Datastore type. Currently this can be salt-hash 
(EXPERIMENTIAL, use a salted on-disk hashtable with bloom filter), bdb-index 
(STABLE, use a BerkeleyDBFreenetStore to store the index, and keep the data in 
files on disk), or ram (FOR TESTING ONLY, keep the index and the data in RAM). 
Only use ram if you know what you are doing and have enough RAM to store all 
your data (and note it will not be saved on shutdown)! Changes will not take 
effect until Freenet has been restarted.
+Node.storeTypeLong=Datastore type. Currently this can be salt-hash 
(EXPERIMENTAL, use a salted on-disk hashtable with bloom filter), bdb-index 
(STABLE, use a BerkeleyDBFreenetStore to store the index, and keep the data in 
files on disk), or ram (FOR TESTING ONLY, keep the index and the data in RAM). 
Only use ram if you know what you are doing and have enough RAM to store all 
your data (and note it will not be saved on shutdown)! Changes will not take 
effect until Freenet has been restarted.
 Node.storeBloomFilterSize=Bloom filter size (total) in bytes
 Node.storeBloomFilterSizeLong=Bloom filter size (total) in bytes. Usually 
1/2048th the size of data store is more than enough. Set this to zero to 
disable bloom filter. Set this to -1 to reset to default.
 Node.storeBloomFilterCounting=Use counting bloom filter?
@@ -725,8 +728,8 @@
 Node.tooSmallMTU=Too small MTU
 Node.tooSmallMTULong=Your connection's MTU appears to be ${mtu} bytes. Freenet 
will not function well with an MTU of less than ${minMTU} bytes: connections 
will be unreliable and possibly slow. Please fix the problem if possible.
 Node.tooSmallMTUShort=Connection problems: Your connection's MTU is too short 
for Freenet to work well. Expect problems.
-Node.withAnnouncement=Allow the node to bootstrap itself using seednodes?
-Node.withAnnouncementLong=Allow the node to bootstrap itself using seednodes? 
While this has to be the default behaviour, it's insecure by design.
+Node.withAnnouncement=Allow the node to bootstrap itself using seednodes? 
(Leave this alone unless you know what you're doing)
+Node.withAnnouncementLong=Allow the node to bootstrap itself using seednodes? 
To get onto the opennet (the Strangers network, automatic Freenet connection on 
low/normal network security level), we contact public nodes chosen from a small 
list shipped with Freenet. Obviously this is somewhat insecure, but if you are 
using opennet, you probably need it: if your node is down for a while, 
especially if it is NATed and/or changes its IP address, it will probably need 
to reseed. If you want better security, you need to connect to your friends and 
enable high network security.
 NodeClientCore.maxArchiveSize=Maximum size of any given archive
 NodeClientCore.maxArchiveSizeLong=Maximum size of any given archive
 NodeClientCore.couldNotFindOrCreateDir=Could not find or create directory
@@ -809,10 +812,7 @@
 OpennetConnectionsToadlet.successTimeTitle=Last success
 OpennetConnectionsToadlet.successTime=Last time there was a successful CHK 
fetch from the node
 OpennetConnectionsToadlet.fullTitle=${counts} Strangers (Untrusted Peers) of 
${name}
-OpennetConnectionsToadlet.peersListTitle=My Opennet Peers (untrusted peers 
added by the node in promiscuous mode)
-OpennetUserAlert.warningTitle=Warning: Insecure Mode Enabled: Your node will 
connect to strangers
-OpennetUserAlert.warningShort=Insecure mode is enabled.
-OpennetUserAlert.warning=Freenet is currently running in insecure mode. It is 
easy for anyone to find out that you are running Freenet, and connect to your 
node in order to attack it. Please get some connections to people you trust and 
add them to the Friends page as soon as possible, you will be much less 
vulnerable. When you have added connections to at least 10 friends (adding 
people you don't know will not improve your security), turn off insecure mode 
and your Freenet connection will become invisible to the outside world.
+OpennetConnectionsToadlet.peersListTitle=My Opennet Peers (untrusted peers 
added by the node in low/normal network security level)
 PNGFilter.invalidHeader=The file you tried to fetch is not a PNG. It does not 
include a valid PNG header. It might be some other file format, and your 
browser may do something dangerous with it, therefore we have blocked it.
 PNGFilter.invalidHeaderTitle=Not a PNG - invalid header
 PeerManagerUserAlert.connErrorTitle=Some peers cannot connect
@@ -983,14 +983,15 @@
 QueueToadlet.fileName=Filename
 QueueToadlet.files=Files
 QueueToadlet.follow=Follow Redirect
-QueueToadlet.globalQueueIsEmpty=Global queue is empty
+QueueToadlet.globalQueueIsEmpty=No queued downloads/uploads on the global 
queue.
 QueueToadlet.identifier=Identifier
 QueueToadlet.insertAs=Insert as:
-QueueToadlet.insertFile=Insert File
-QueueToadlet.insertFileLabel=Upload local file through browser (SLOW)
+QueueToadlet.insertFile=Upload a file to Freenet
+QueueToadlet.insertFileLabel=Or upload a file through the browser (SLOW)
 QueueToadlet.insertFileCompressLabel=Compress
 QueueToadlet.insertFileInsertFileLabel=Insert File
-QueueToadlet.insertFileBrowseLabel=Browse files on disk
+QueueToadlet.insertFileBrowseLabel=Upload a file from the node's disk
+QueueToadlet.insertFileBrowseButton=Browse files
 QueueToadlet.insertFileResetForm=Reset Form
 QueueToadlet.key=Key
 QueueToadlet.legend=Legend
@@ -1026,7 +1027,7 @@
 QueueToadlet.siteUploadSucceeded=Your freesite ${filename} (${files} files, 
${size} total size) has been successfully uploaded to Freenet. ${link}Click 
here${/link} to open the site homepage.
 QueueToadlet.size=Size
 QueueToadlet.starting=STARTING
-QueueToadlet.title=Global queue of ${nodeName}
+QueueToadlet.title=Downloads and uploads for ${nodeName}
 QueueToadlet.totalQueuedDownloads=Total queued downloads: ${size}
 QueueToadlet.totalQueuedUploads=Total queued uploads: ${size}
 QueueToadlet.totalSize=Total Size

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties   
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fi.properties   
2008-09-26 16:35:23 UTC (rev 22845)
@@ -491,6 +491,23 @@
 QueueToadlet.wipD=Kesken: lataukset (${size})
 QueueToadlet.wipU=Kesken: l?hetykset (${size})
 RevocationKeyFoundUserAlert.title=Projektin yksityisen avaimen turvallisuus on 
heikentynyt!
+SecurityLevels.fewConnectedFriendsWarning=Sinulla on vain ${connected} 
yhteyden p??ss? olevaa solmua, ja olet lis?nnyt yhteens? ${added} yst?v??. Jos 
asetat verkon tietoturvatason korkeaksi tai maksimiksi, Freenet yhdist?? vain 
yst?viisi, joten solmusi suorituskyky voi n?ht?v?sti laskea, ja jos kaikki 
yst?v?si ovat poissa, olet kokonaan ulkona Freenetist?. Huomaa, ett? yst?viesi 
t?ytyy olla v?ke?, jonka tunnet, ja edes jossain m??rin luotat saadaksesi 
mink??nlaista tietoturvahy?ty?. Tarvitse my?s v?hint??n 5 yhdistetty? yst?v?? 
saadaksesi kelvollisen suorituskyvyn solmullesi. Oletko varma?
+SecurityLevels.friendsThreatLevelConfirmTitle=VAROITUS: asetetaan yst?vien 
tietoturvatasoksi ${mode}
+SecurityLevels.friendsThreatLevelShort=Suojaa, jos yst?v?si hy?kk??v?t 
anonyymiteettisi kimppuun
+SecurityLevels.highFriendsThreatLevelCheckbox=Olen varma, ett? tarvitsen 
korkean tason suojaa vaarallisia ja petollisia yst?v?solmuja vastaan.
+SecurityLevels.highFriendsThreatLevelWarning=Olet vaihtamassa yst?v?uhkatason 
korkeaksi. T?m? laskee Freenetin suorituskyky?, ja sen ei pit?isi olla 
useinkaan tarpeellista. Jos syy t?lle asetukselle on, ettet tunne yst?vi?si, 
sinun kannattaa harkita yhteyden katkaisua heihin ja verkkotason alentamista 
normaaliksi. Jos taas odotat hy?kk??j?n vaarantavan yst?viesi tietokoneet tai 
aktiivisesti yritt?v?n muuttaa heid?t sinua vastaan, t?m? voi olla j?rkev? 
varotoimi.
+SecurityLevels.maximumNetworkThreatLevelCheckbox=Kyll?! Haluan varmasti ottaa 
k?ytt??n maksimiturvallisuuden, ja ymm?rr?n, ett? Freenet on viel? 
kehitysvaiheessa ja viel?kin voi olla mahdollista j?ljitt?? minut, ja t?m? 
asetus voi alentaa Freenetin suorituskyky? eritt?in paljon!
+SecurityLevels.maximumNetworkThreatLevelWarning=${bold}VAROITUS:${/bold} Olet 
asettamassa verkon tietoturvatasoksi maksimia! T?m? hidastaa 
${bold}huomattavasti${/bold} Freenetti?! ?l? aseta t?t? tasoa, ellet oikeasti 
tarvitse t?t? tietoturvaa.
+SecurityLevels.networkThreatLevelConfirmTitle=VAROITUS: asetetaan verkon 
tietoturvatasoksi ${mode}
+SecurityLevels.networkThreatLevelLowCheckbox=Olen varma, ett? haluan enemm?n 
nopeutta, enk? v?lit? pystyyk? kukaan kertomaan, mit? teen Freenetiss?.
+SecurityLevels.networkThreatLevelLowWarning=Olet aikeissa laskea solmusi 
verkon tietoturvataso matalaksi. T?m? tarkoittaa, ett? muukalaiset voivat 
helposti hy?k?t? anonyymiteettisi kimppuun Internetin yli. Oletko varma?
+SecurityLevels.networkThreatLevelShort=Suojaa muukalaisen hy?kk?yksi? vastaan 
heid?n hy?k?tess? Internetin yli.
+SecurityLevels.noConnectedFriendsWarning=Et ole yhdistettyn? yhteenk??n 
yst?v??n, vaikka olet lis?nnyt ${added} yst?v??. Jos olet asettanut verkon 
tietoturvatason korkeaksi tai maksimiksi, kykenet yhdist?m??n Freenettiin vain, 
mik?li yst?v?si ovat paikalla, mit? he eiv?t ole t?ll? hetkell?. Sinun 
kannattaisi lis?t? uusia yst?vi?, k?ytt?? Freenetti? vain kun yst?v?si ovat 
yhdistett?viss?, tai olla k?ytt?m?tt? korkeaa tietoturvatasoa. Huomaa, ett? 
saadaksesi tietoturvaa yst?vist?si, yst?viesi t?ytyy olla v?ke?, johon voit 
edes marginaalisesti luottaa, ja hyv?? suorituskyky? varten tarvitset v?hint??n 
viisi yst?v?? samanaikaisesti. Oletko varma?
+SecurityLevels.noFriendsCheckbox=Olen varma, kytke korkea verkon 
tietoturvataso p??lle, lis??n joitakin yst?vi? mahdollisimman pian.
+SecurityLevels.physicalThreatLevelShort=Suojaa, mik?li tietokoneesi kaapataan 
tai varastetaan
+SecurityLevels.title=Tietoturvatasot
+SecurityLevels.userAlertFriendsThreatLevel=Suojaa, jos yst?v?si hy?kk??v?t 
anonyymiytt?si vastaan: ${level}
+SecurityLevels.userAlertNetworkThreatLevel=Suojaa muukalaisten hy?kk?yksilt? 
Internetin yli: ${level}
 SimpleToadletServer.advancedMode=K?yt? edistynytt? tilaa?
 SimpleToadletServer.cssName=K?ytt?liittym?n teema
 SimpleToadletServer.cssNameLong=Valitse teema Freenetin webbik?ytt?liittym?lle
@@ -556,15 +573,22 @@
 Toadlet.nodeHomepage=Solmun kotisivu
 Toadlet.notSupportedTitle=Ei tuettu
 Toadlet.yes=Kyll?
+TranslationToadlet.bracketRemoveOverride=(poista k??nn?s)
+TranslationToadlet.bracketUpdateTranslation=(muokkaa k??nn?st?)
 TranslationToadlet.contributingToLabelWithLang=Muokkaat parhaillaan kielen 
${lang} k??nn?st?:
 TranslationToadlet.currentTranslationLabel=Nykyinen k??nn?s
 TranslationToadlet.downloadTranslationsFile=Lataa nykyinen k??nn?stiedosto
+TranslationToadlet.gotoNext=Mene seuraavaan k??nt?m?tt?m??n riviin?
 TranslationToadlet.hideAlreadyTranslated=Piilota jo k??nnetyt rivit
+TranslationToadlet.noCustomTranslations=Mukautettua k??nn?st? ei ole 
saatavilla.
+TranslationToadlet.originalVersionLabel=Alkuper?inen (englanninkielinen versio)
 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
+TranslationToadlet.translationUpdateTitle=K??nn?sp?ivitys
+TranslationToadlet.translationUpdatedTitle=K??nn?s p?ivitetty!
 UpdatedVersionAvailableUserAlert.clickToUpdateNow=Klikkaa t?st? p?ivitt??ksesi 
solmusi heti.
 UpdatedVersionAvailableUserAlert.title=Uusi vakaa versio Freenetist? on 
julkaista, sinun kannattaisi p?ivitt?? mahdollisimman nopeasti
 UpdatedVersionAvailableUserAlert.updateASAPButton=P?ivit? mahdollisimman 
nopeasti
@@ -573,8 +597,14 @@
 UserAlert.apply=Hyv?ksy
 UserAlert.hide=Piilota
 UserAlert.reset=Nollaa
+UserAlertManager.alertsOnAlertsPage=| Katso ne ${link}h?lytyssivulla${/link}.
 UserAlertManager.alertsTitle=Ohittamattomat huomautukset
 UserAlertManager.clickForMore=Klikkaa kohdetta p??st??ksesi siit? eroon.
+UserAlertManager.criticalErrorCountLabel=Kriittisi? virheit?:
+UserAlertManager.errorCountLabel=Virheit?:
+UserAlertManager.minorCountLabel=V?h?p?t?isi?:
+UserAlertManager.totalLabel=Yhteens?:
+UserAlertManager.warningCountLabel=Varoituksia:
 UserAlertsToadlet.titleWithName=Tilah?lytykset ${name}:lle
 WelcomeToadlet.activityTitle=Freenetin t?m?nhetkinen aktiivisuus
 WelcomeToadlet.alertsSummary=H?lytysten yhteenveto

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties   
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties   
2008-09-26 16:35:23 UTC (rev 22845)
@@ -14,7 +14,7 @@
 BookmarkEditorToadlet.addCategory=Aggiungi Categoria
 BookmarkEditorToadlet.addDefaultBookmarks=Ri-aggiungi segnalibri originali
 BookmarkEditorToadlet.addNewBookmark=Aggiungi nuovo segnalibro
-BookmarkEditorToadlet.addNewCategory=Aggiungi nuova categoria
+BookmarkEditorToadlet.addNewCategory=Aggiungi categoria
 BookmarkEditorToadlet.addedNewBookmark=Aggiunto alla lista dei preferiti.
 BookmarkEditorToadlet.addedNewBookmarkTitle=Aggiunto a Preferiti
 BookmarkEditorToadlet.bookmarkDoesNotExist=Il segnalibro "${bookmark}" non 
esiste.
@@ -50,7 +50,7 @@
 BookmarkEditorToadlet.pasteTitle=Taglia/Incolla
 BookmarkEditorToadlet.save=Salva
 BookmarkEditorToadlet.title=Modifica Preferiti
-BookmarkEditorToadlet.urlDecodeError=Errore nella decodifica della URL
+BookmarkEditorToadlet.urlDecodeError=Errore nella decodificazione della URL
 BookmarkItem.bookmarkUpdated=Il sito ${name} ? stato aggiornato all'edizione 
${edition}.
 BookmarkItem.bookmarkUpdatedShort=Freesite aggiornato: ${name}
 BookmarkItem.bookmarkUpdatedTitle=${name}: link aggiornato
@@ -72,7 +72,7 @@
 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.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!
@@ -90,12 +90,12 @@
 ConfigToadlet.homepage=Homepage del Nodo
 ConfigToadlet.logger=log
 ConfigToadlet.needRestart=Config necessita riavvio per attivarsi. Si prega di 
riavviare il nodo immediatamente.
-ConfigToadlet.needRestartShort=Config necessita riavvio per attivarsi. Si 
prega di riavviare il nodo immediatamente.
+ConfigToadlet.needRestartShort=Uno o pi? cambiamenti di configurazione 
richiedono il riavviamento per poter essere attivati. Si prega di riavviare il 
nodo immediatamente.
 ConfigToadlet.needRestartTitle=E' necessario riavviare il nodo
 ConfigToadlet.node=nodo
 ConfigToadlet.pluginmanager=pluginmanager
 ConfigToadlet.pluginmanager2=pluginmanager2
-ConfigToadlet.possibilitiesTitle=Scegli Azione:
+ConfigToadlet.possibilitiesTitle=Continua
 ConfigToadlet.reset=Annulla
 ConfigToadlet.restartNode=Riavvia Adesso
 ConfigToadlet.returnToNodeConfig=Torna alla configurazione del nodo
@@ -134,8 +134,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=Connessione Internet
+ConnectivityToadlet.connectivityTitle=Connessione Internet
 ConnectivityToadlet.firstReceiveLeadTime=Da online a prima ricezione
 ConnectivityToadlet.firstSendLeadTime=Da start a prima trasmissione
 ConnectivityToadlet.local=LOCALE
@@ -144,9 +144,9 @@
 ConnectivityToadlet.remote=REMOTO
 ConnectivityToadlet.sentReceivedTitle=Pacchetti ricevuti/trasmessi
 ConnectivityToadlet.summaryTitle=Connettivit?
-ConnectivityToadlet.title=Connettivit? internet di ${nodeName}
+ConnectivityToadlet.title=Stato della Connessione 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.unknownCharsetTitle=Character set sconosciuto!
 ContentDataFilter.warningUnknownCharsetTitle=Attenzione: charset sconosciuto 
(${charset})
 ContentFilter.applicationPdfReadAdvice=Documento Adobe(R) PDF - MOLTO 
PERICOLOSO!
 ContentFilter.applicationPdfWriteAdvice=Documento Adobe(R) PDF - MOLTO 
PERICOLOSO!
@@ -170,11 +170,11 @@
 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.backedOff=Connesso ma respinto: Il nodo ? connesso a 
questi peer ma ne viene respinto. Pertanto, il nodo non instrada traffico verso 
di essi.
 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 li 
ha impostati su burstOnly.
 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=Occupato: Questi peer sono connessi ma troppo 
occupati per poter accettare ulteriori richieste. Pertanto, il nodo non 
instrada richieste verso di essi.
 DarknetConnectionsToadlet.busyShort=Occupati
 DarknetConnectionsToadlet.cancel=Cancella
 DarknetConnectionsToadlet.cantFetchNoderefURL=Non ? stato possibile richiamare 
la referenza di un nodo da ${url}. Riprovare.
@@ -221,7 +221,7 @@
 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.neverConnectedShort=Mai connesso
+DarknetConnectionsToadlet.neverConnectedShort=Mai connessi
 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.
@@ -262,7 +262,7 @@
 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.extTooOld=Freenet sta utilizzando una veresione obsoleta 
del file freenet-ext.jar: si consiglia vivamente di scaricare la versione pi? 
recente da http://downloads.freenetproject.org/alpha/freenet-ext.jar
 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
@@ -284,10 +284,10 @@
 FProxyToadlet.expectedMimeType=MIME type che ci si aspettava: ${mime}
 FProxyToadlet.explanationTitle=Spiegazione
 FProxyToadlet.fetchLargeFileAnywayAndDisplay=Apri comunque e mostra il file 
nel browser
-FProxyToadlet.fileInformationTitle=Informazioni sul file
+FProxyToadlet.fileInformationTitle=Informazioni file
 FProxyToadlet.filenameLabel=File:
 FProxyToadlet.friends=gestisci connessioni f2f
-FProxyToadlet.friendsTitle=Amici
+FProxyToadlet.friendsTitle=Connessioni ad Amici
 FProxyToadlet.goBack=Indietro
 FProxyToadlet.goBackToPrev=Torna alla pagina precedente
 FProxyToadlet.homepage=Homepage
@@ -313,14 +313,14 @@
 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.openWithKeyExplorer=${link}Cliccare qui${/link} per aprire la 
freenet uri con key explorer
 FProxyToadlet.opennet=gestisci connessioni non affidabili
-FProxyToadlet.opennetTitle=Sconosciuti
+FProxyToadlet.opennetTitle=Connessioni a Sconosciuti
 FProxyToadlet.options=Opzioni disponibili:
 FProxyToadlet.pathNotFound=Il percorso specificato non esiste.
 FProxyToadlet.pathNotFoundTitle=Percorso non trovato
 FProxyToadlet.plugins=configura e gestisci plugin
 FProxyToadlet.pluginsTitle=Plugin
-FProxyToadlet.queue=gestisci coda richieste
-FProxyToadlet.queueTitle=Coda
+FProxyToadlet.queue=gestione richieste
+FProxyToadlet.queueTitle=Download e Upload
 FProxyToadlet.retryNow=Riprova
 FProxyToadlet.sizeLabel=Dimensioni:
 FProxyToadlet.sizeUnknown=Dimensioni: sconosciute
@@ -331,17 +331,17 @@
 FProxyToadlet.unableToRetrieve=Non ? stato possibile richiamare questo file.
 FProxyToadlet.unknownMIMEType=MIME type: sconosciuto
 FProxyToadlet.welcome=homepage
-FProxyToadlet.welcomeTitle=Home
+FProxyToadlet.welcomeTitle=Esplora Freenet
 FcpServer.allowedHosts=Host abilitati (Leggere l'avvertenza)
 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.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.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.bindTo=Indirizzo IP collegato
-FcpServer.bindToLong=Indirizzo IP collegato al server FCP.
+FcpServer.assumeDownloadDDAIsAllowed=Presumi che il download DDA sia permesso
+FcpServer.assumeDownloadDDAIsAllowedLong=Presumere che DDA in download sia 
permesso? Se impostato su 'falso' sar? necessaria una TestDDARequest prima di 
ogni accesso DDA
+FcpServer.assumeUploadDDAIsAllowed=Presumi che DDA in upload sia permesso
+FcpServer.assumeUploadDDAIsAllowedLong=Presumere che DDA in upload sia 
permesso? Se impostato su 'falso', sar? necessaria una TestDDARequest prima di 
ogni accesso DDA.
+FcpServer.bindTo=Indirizzo IP a cui collegarsi
+FcpServer.bindToLong=Indirizzo IP a cui collegare il 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
@@ -350,18 +350,18 @@
 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.enablePersistentDownload=Abilitare download persistenti?
+FcpServer.enablePersistentDownload=Abilita 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.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=Abilita FCP
+FcpServer.isEnabledLong=Abilita il Protocollo Freenet Client (FCP)
 FcpServer.portNumber=Numero della porta FCP
 FcpServer.portNumberLong=Numero della porta FCP.
-FcpServer.ssl=Abilitare ssl?
-FcpServer.sslLong=Abilitare ssl?
+FcpServer.ssl=Abilita SSL
+FcpServer.sslLong=Abilita SSL sul server FCP
 FetchException.longError.1=Troppi livelli di recursione negli archivii
 FetchException.longError.10=File non in archivio
 FetchException.longError.11=Troppe componenti di percorso. Prova a eliminarne 
uno
@@ -412,13 +412,13 @@
 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.28=Non tutti i dati sono stati trovati
 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.4=Metadati non validi
 FetchException.shortError.5=Fallimento archivio
-FetchException.shortError.6=Errore decodifica block
+FetchException.shortError.6=Errore di decodificazione blocco
 FetchException.shortError.7=Troppi livelli di metadati
 FetchException.shortError.8=Troppi riavvii di archivio
 FetchException.shortError.9=Troppa recursione
@@ -469,7 +469,7 @@
 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.opennetYes=Desidero che il nodo trovi automaticamente 
degli sconosciuti ai quali connettersi.
 FirstTimeWizardToadlet.physicalSecurityPageTitle=Configurazione automatica di 
Freenet: Impostazioni Sicurezza Fisica
 FirstTimeWizardToadlet.selectLanguage=Lingua
 FirstTimeWizardToadlet.selectLanguageLong=Selezionare una lingua dalla lista 
qui sotto:
@@ -504,7 +504,7 @@
 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}
+GenericReadFilterCallback.protocolNotEscaped=Non si tratta di 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
@@ -512,24 +512,24 @@
 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.direct=Il computer appare connesso ad internet 
direttamente. Freenet dovrebbe riuscire connettersi con qualsiasi nodo.
 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.forwardPortMaybeForwarded=Il nodo sembra trovarsi 
dietro una NAT (vedi pagina Connessione Internet per i dettaglil). Se 
possibile,configurare il forward per la porta ${port} UDP (non TCP) per 
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 ulteriori informazioni.
+IPDetectorPluginManager.forwardPortNotForwarded=Il nodo sembra trovarsi dietro 
una NAT (controllare la pagina Connessione Internet per i dettagli). Se 
possibile, configurare il forward per le porte ${port1} e ${port2} UDP (non 
TCP) per migliorare la connettivit?. Al momento pare che il port forward non 
sia stato configurato, ma Freenet non ? in grado di determinarlo con certezza. 
Clicca ${link}qui${/link} per ulteriori informazioni. Il tempo necessario 
perch? Freenet rilevi il forward delle porte pu? arrivare fino a 24 ore.
 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.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.forwardTwoPortsMaybeForwarded=Il nodo sembra trovarsi 
dietro una  NAT (controllare la pagina Connessione Internet per i dettagli). Se 
possibile, configurare il forward per le porte ${port1} e ${port2} UDP (non 
TCP) per migliorare la connettivit?. Il forward delle porte potrebbe non essere 
attivo, ma Freenet non pu? determinarlo con certezza. Clicca ${link}qui${/link} 
per ulteriori informazioni.
+IPDetectorPluginManager.forwardTwoPortsNotForwarded=Il nodo sembra trovarsi 
dietro una  NAT (controllare la pagina Connessione Internet per i dettagli). Se 
possibile, configurare il forward per le porte ${port1} e ${port2} UDP (non 
TCP) per migliorare la connettivit?. Il forward delle porte potrebbe non essere 
attivo, ma Freenet non pu? determinarlo con certezza. Clicca ${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=Si prega di 
configurare il forward  delle 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.noConnectivity=La connessione Internet non appare 
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
@@ -540,9 +540,9 @@
 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.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.suggestForwardTwoPorts=Sarebbe opportuno configurare 
manualmente il port forward sul router per le porte ${port1} e ${port2} (UDP). 
vedi http://wiki.freenetproject.org/FirewallAndRouterIssues (documentazione 
completa in lingua inglese: la versione italiana non ? ancora stata completata).
+IPDetectorPluginManager.suggestForwardTwoPortsWithLink=Potrebbe essere 
necessario configurare manualmente ${link}il forward delle porte${/link} 
${port1} e ${port2} UDP. (questo messaggio pu? in alcuni casi continuare ad 
apparire per qualche tempo anche dopo aver configurato il forward)
+IPDetectorPluginManager.symmetric=Dai rilevamenti appare che il nodo potrebbe 
trovarsi dietro una NAT simmetrica o un firewall. Freenet potr? connettersi 
soltanto ad utenti connessi ad internet direttamente 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.
@@ -659,13 +659,13 @@
 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.acceptSeedConnectionsShort=Abilita seednode
-Node.alwaysAllowLocalAddresses=Permettere sempre la connessione a nodi via 
indirizzi locali?
+Node.alwaysAllowLocalAddresses=Permetti 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.assumeNATed=Presumere che la porta non sia forwardata.
+Node.assumeNATed=Presumi 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.bandwidthLimitMustBePositiveOrMinusOne=Il valore dell'ampiezza di banda 
deve essere positivo o -1
-Node.bindTo=Indirizzo IP
-Node.bindToLong=Indirizzo IP
+Node.bindTo=Indirizzo IP a cui collegarsi
+Node.bindToLong=Indirizzo IP a cui collegarsi
 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'
@@ -678,26 +678,26 @@
 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
-Node.disablePHTLSLong=Disabilita HTL probabilistico (non toccare a meno che 
non si sappia cosa si sta facendo)
+Node.disablePHTLSLong=Disabilita HTL probabilistico (in caso di dubbio, non 
modificare)
 Node.dropPacketEvery=Frequenza di rilascio dei pacchetti per motivi di collaudo
-Node.dropPacketEveryLong=Frequenza di rilascio dei pacchetti. Opzione di 
collaudo usata dagli sviluppatori per simulare la perdita di pacchetti. 0 
significa non rilasciare pacchetti artificialmente. Non toccare!
-Node.enableARKs=Abilita ARK? (NON DISABILITARE!)
-Node.enableARKsLong=Abilita ARK? (NON DISABILITARE!).
+Node.dropPacketEveryLong=Frequenza di rilascio dei pacchetti. Opzione di 
collaudo usata dagli sviluppatori per simulare la perdita di pacchetti. 0 
significa non rilasciare pacchetti artificialmente. Non modificare!
+Node.enableARKs=Abilita ARK (NON MODIFICARE!)
+Node.enableARKsLong=Abilitare ARK? (NON MODIFICARE!)
 Node.enableOpennetFailed=Non ? stato possibile abilitare Opennet e pertanto il 
nodo non potr? connettersi a Sconosiuti. Bisognerebbe risolvere il problema, 
rioprtare un bug, o continuare a connettersi esclusivamente ad Amici. Dettagli: 
${message}
 Node.enableOpennetFailedTitle=Abilitazione opennet fallita
-Node.enablePacketCoalescing=Abilita coalescenza pacchetti?
+Node.enablePacketCoalescing=Abilita coalescenza pacchetti
 Node.enablePacketCoalescingLong=Ablilita coalescenza pacchetti? La coalescenza 
dei pacchetti aumenta l'efficienza della banda, ruduce l'uso di CPU e aumenta 
leggermente la resistenza all'analisi di traffico, al costo di una leggera 
latenza dei messaggi. Si consiglia di non disabilitare questa opzione.
-Node.enablePerNodeFailureTables=Abilita tabelle operazioni fallite per nodi?
+Node.enablePerNodeFailureTables=Abilita tabelle operazioni fallite per-nodo
 Node.enablePerNodeFailureTablesLong=Abilita il reinstradamento automatico 
intorno a nodi che abbiano fallito richieste negli gli ultimi 10 minuti
-Node.enableSwapQueueing=Abilita messa in coda di richieste di scambio? (NON 
DISABILITARE!)
-Node.enableSwapQueueingLong=Abilita lista d'attesa per richieste di swap? (NON 
DISABILITARE!)
+Node.enableSwapQueueing=Abilita la messa in coda di richieste di scambio (NON 
MODIFICARE!)
+Node.enableSwapQueueingLong=Abilita lista d'attesa per richieste di swap? (NON 
MODIFICARE!)
 Node.enableSwapping=Abilita scambio di locazione (NON DISABILITARE)
-Node.enableSwappingLong=Abilita scambio di locazione? (NON DISABILITARE! Utile 
solo in alcune simulazioni).
-Node.enableULPRDataPropagation=Abilita propagazione dati ULPR?
+Node.enableSwappingLong=Abilita scambio di locazione? (NON MODIFICARE! 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.extraPeerDir=Directory dei dati extra peer
-Node.extraPeerDirLong=Directory dove conservare dati extra
+Node.extraPeerDirLong=Nome della directory dove immagazzinare dati 
supplementari relativi ai peer
 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.inBWLimit=Limite ampiezza di banda in entrata (bytes per secondo)
@@ -708,7 +708,7 @@
 Node.maxHTL=HTL massimo
 Node.maxHTLLong=HTL massimo (PER USO ESCLUSIVO DEGLI SVILUPPATORI!)
 Node.maxOpennetPeers=Numero massimo di peer Opennet
-Node.maxOpennetPeersLong=Numero massimo di peer Opennet (il  valore 
specificato minore o uguale a venti; le connessioni darknet verranno sottratte 
dal limite totale)
+Node.maxOpennetPeersLong=Numero massimo di peer Opennet (il  valore 
specificato deve essere minore o uguale a venti; le connessioni darknet 
verranno sottratte dal limite totale)
 Node.maxOpennetPeersMustBeTwentyOrLess=Il valore deve essere uguale o 
inferiore a 20
 Node.mustBePositive=Il valore deve essere positivo!
 Node.nodeDir=Directory del nodo
@@ -721,52 +721,52 @@
 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.oneConnectionPerIP=Limita ad una connessione per indirizzo
+Node.oneConnectionPerIPLong=Permettere una sola 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 o facilitare la 
raccolta di dati. Questa opzione impedisce che uno stesso peer sia connesso 
allo stesso tempo su darknet e su opennet.
+Node.opennetEnabled=Abilita modalit? insicura (connessioni automatiche a nodi 
non fid?ti)
 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.outBWLimit=Limite 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.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.publishOurPeersLocation=Trasmetti ad ogni 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.routeAccordingToOurPeersLocation=Tenere conto nel routing della locazione 
dei peer dei nostri peer?
+Node.routeAccordingToOurPeersLocation=Utilizza la locazione dei peer dei 
nostri peer per il routing
 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.storeBloomFilterCounting=Usare filtro 'counting bloom'?
-Node.storeBloomFilterCountingLong=Usare filtro 'counting bloom' a 2 bit? (in 
caso di dubbio, non modificare)
+Node.storeBloomFilterCounting=Usa filtro 'counting bloom'
+Node.storeBloomFilterCountingLong=Usare un filtro 'counting bloom' a 2 bit? 
(in caso di dubbio, non modificare)
 Node.storeBloomFilterSize=Dimensione del bloom filter size (totale) in bytes
-Node.storeBloomFilterSizeLong=Dimensioni del filtro bloom in bytes. Di solito 
1/2048 della dimensione del  datastore ? pi? che abbastanza. Impostare su zero 
per disabilitare il bloom filter.
+Node.storeBloomFilterSizeLong=Dimensioni del filtro bloom in bytes. Di solito 
1/2048mo della dimensione del  datastore ? pi? che abbastanza. Impostare su 
zero per disabilitare il bloom filter. Impostare su -1 per tornare al default.
 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.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.storeType=Tipo di magazzino dati (store). NON MODIFICARE!!
+Node.storeTypeLong=Al momento sono disponibili i seguenti tipi di datastore: 
salt-hash (SPERIMENTALE, usa salted hashtable su dico con bloom filter); 
bdb-index (STABILE, usa BerkeleyDBFreenetStore per immagazzinare l'indice e 
tiene i dati su disco) o ram (SOLO PER TESTING, tiene sia indice che dati su 
RAM). Usare ram solo se competenti e se ? disponibile memoria sufficiente per 
immagazzinare tutti i dati (NOTA: i dati NON verranno salvati quando il nodo 
viene spento). I cambiamenti verranno attivati al riavvio di Freenet.
 Node.swapRInterval=Intervallo tra le richieste di scambio (swap) in 
millisecondi
-Node.swapRIntervalLong=Intervallo tra richieste di scambio (swap) in 
millisecondi. Non toccare!
+Node.swapRIntervalLong=Intervallo tra richieste di scambio (swap) in 
millisecondi. Non modificare!
 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.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.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.withAnnouncement=Permetti l'auto-inserimento del nodo 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.
 NodeClientCore.downloadDir=Directory predefinita per i download
 NodeClientCore.downloadDirLong=Directory predefinita dove salvare i file 
scaricati
-NodeClientCore.encryptPersistentTempBuckets=Codificare i bucket di dati 
temporanei? NON MODIFICARE!
-NodeClientCore.encryptPersistentTempBucketsLong=Codificare bucket di dati 
temporanei persistenti? In alcuni casi ci? non ? strettamente necessario (p.es. 
se di fa uso di hard-drive e swap encryption). IN CASO DI DUBBIO, NON MODIFCARE
-NodeClientCore.encryptTempBuckets=Codificare i buckets di dati temporanei? NON 
MODIFICARE!
-NodeClientCore.encryptTempBucketsLong=Codificare bucket di dati temporanei? In 
alcuni casi ci? non ? strettamente necessario (p.es. se di fa uso di hard-drive 
encryption). IN CASO DI DUBBIO, NON MODIFCARE
+NodeClientCore.encryptPersistentTempBuckets=Abilita cifratura dei bucket di 
dati temporanei persistenti (NON MODIFICARE!)
+NodeClientCore.encryptPersistentTempBucketsLong=Cifrare i bucket di dati 
temporanei persistenti? In alcuni casi ci? non ? strettamente necessario (p.es. 
se di fa uso di hard-drive e swap encryption). IN CASO DI DUBBIO, NON MODIFCARE
+NodeClientCore.encryptTempBuckets=Abilita cifratura dei buckets di dati 
temporanei (NON MODIFICARE!)
+NodeClientCore.encryptTempBucketsLong=Cifrare i  bucket di dati temporanei? In 
alcuni casi ci? non ? strettamente necessario (p.es. se di fa uso di hard-drive 
encryption). IN CASO DI DUBBIO, NON MODIFCARE
 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.lazyResume=Completa operazioni di carico richieste persistenti 
dopo l'avvio (usa pi? memoria)
 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=Dimensioni massime di ogni archivio
 NodeClientCore.maxArchiveSizeLong=Dimensione massima di ogni archivio
@@ -786,9 +786,9 @@
 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 ATTENZIONE!; 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 'Connessioni ad 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.tempAddressHint=Suggerimento temporaneo indirizzo IP
@@ -803,7 +803,7 @@
 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.ignoreLocalVsRemoteBandwidthLiability=Tratta richieste locali come 
fossero remote riducendo la passivit? sulla 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)
@@ -838,9 +838,9 @@
 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.warning=Freenet sta attualmente operando in modalit? 
insicura. E' facile per chiunque determinare che l'Utente sta operando un nodo 
Freenet e connettersi ad esso per poterlo attaccare. Si raccomanda di 
contattare utenti Freenet che si conoscono personalmente e dei quali sia 
possibile fidarsi, e connettersi ad essi tramite a pagina delle Connessioni ad 
Amici. In questo modo il nodo sar? molto meno vulnerabile. Una volta aggiunte 
almeno 10 Connessioni ad Amici, disabilitare la modalit? insicura per rendere 
l'esistenza del nodo invisibile all'esterno della rete Freenet. Aggiungere 
degli sconosciuti alle Connessioni ad Amici e' una pessima idea! Se non ? 
possibile connettersi a persone fid?te, meglio usare la modalit? insicura!
 OpennetUserAlert.warningShort=Modalit? insicura abilitata.
-OpennetUserAlert.warningTitle=Avvertenza: Modo Promiscuo Attivato: Il nodo si 
connetter? a degli sconosciuti
+OpennetUserAlert.warningTitle=Avvertenza: Modalit? insicura abilitata: 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
@@ -1013,12 +1013,12 @@
 QueueToadlet.fileName=File
 QueueToadlet.files=File
 QueueToadlet.follow=Segui Redirect
-QueueToadlet.globalQueueIsEmpty=La coda globale ? vuota
+QueueToadlet.globalQueueIsEmpty=Nessuna operazione in corso
 QueueToadlet.high=alta
 QueueToadlet.identifier=Identificazione
 QueueToadlet.insertAs=Inserisci come:
 QueueToadlet.insertFile=Inserisci File
-QueueToadlet.insertFileBrowseLabel=Sfoglia
+QueueToadlet.insertFileBrowseLabel=Esplora file su disco
 QueueToadlet.insertFileCompressLabel=Comprimi
 QueueToadlet.insertFileInsertFileLabel=Inserisci File
 QueueToadlet.insertFileLabel=File
@@ -1055,7 +1055,7 @@
 QueueToadlet.requestNavigation=Esplora Richieste
 QueueToadlet.restart=Riavvia
 QueueToadlet.siteUploadSucceeded=E' stato completato l'upload del freesite 
${filename} (${files} files, dimensioni totali ${size}). ${link}Clicca 
qui${/link} per aprire la homepage del sito.
-QueueToadlet.siteUploadSucceededTitle=Inserimento freesite completato: 
${filename}
+QueueToadlet.siteUploadSucceededTitle=Inserzione freesite completata: 
${filename}
 QueueToadlet.size=Dimensioni
 QueueToadlet.starting=AVVIAMENTO IN CORSO
 QueueToadlet.title=Coda globale del nodo: ${nodeName}
@@ -1080,8 +1080,8 @@
 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.enable=Attiva supporto SSL
+SSL.enableLong=Attivare il supporto SSL?
 SSL.keyPass=Password di private key access
 SSL.keyPassLong=Password di private key access
 SSL.keyStore=Nome e percorso di key store file
@@ -1096,15 +1096,15 @@
 SaltedHashFreenetStore.shortRebuildProgress=Manutenzione del 
datastore(${name}) in corso: ${processed}/${total}
 SaltedHashFreenetStore.shortResizeProgress=Ridimensionamento del 
datastore(${name}) in corso: ${processed}/${total}
 SecurityLevels.fewConnectedFriendsCheckbox=Si sono sicuro, aggiunger? altri 
Amici e/o accetto il costo in prestazioni e il fatto che Freenet potrebbe 
disconnettersi quando gli Amici non sono on-line.
-SecurityLevels.fewConnectedFriendsWarning=Soltanto ${connected} Amici sono 
attualmente connessi, su un totale di ${added}. Impostando il livello di 
sucurezza in rete MASSIMO, Freenet si connetter? esclusivamente agli Amici, 
cio? peer affidabili aggiunti manualmente. Ci? potrebbe provocare un 
abbassamento nelle prestazioni generali dovuto alla riduzione del numero di 
connessioni. Se tutti gli Amici si trovassero ad essere 'off line' allo stesso 
tempo, il nodo si ritroverebbe completamente disconnesso dalla rete. E' bene 
ricordare che gli Amici devono essere persone conosciute e delle quali ci si 
fida almeno parzialmente; in mancanza di questa condizione, l'uso esclusivo di 
connessioni ad Amici non produce alcun vantaggio. Inoltre, per un corretto 
funzionamento di Freenet ? necessario che il nodo possa in qualsiasi momento 
connettersi ad almeno 5-10 peer. Prima di procedere, verificare l'esistenza di 
tutte le condizioni di cui sopra.
-SecurityLevels.friendsThreatLevel=Quanto sarebbe preoccupante, se le persone i 
cui nodi sono connessi come Amici spiassero la nostra attivit?, deliberatamente 
o come risultato di una compromissione? (Questa ? una configurazione di default 
che pu? essre impostata separatamente per ognuno degli Amici). Impostando il 
livello di sicurezza in rete su ALTO, le prestazioni sartanno determinate dai 
livelli di sicurezza degli Amici, oltre che dal numero degli Amici stessi.
-SecurityLevels.friendsThreatLevelConfirmTitle=ATTENZIONE: Il livello di 
sicurezza per gli Amici verr? impostato su: ${mode}
-SecurityLevels.friendsThreatLevelShort=Protezione contro attacchi all' 
anonimato da parte di amici
-SecurityLevels.highFriendsThreatLevelCheckbox=Si sono sicuro; ho bisogno di un 
alto livello di protezione contro i nodi di amici doppiogiochisti o i cui nodi 
sono stati compromessi.
-SecurityLevels.highFriendsThreatLevelWarning=Il livello di sicurezza ver? 
impostato su ALTO. Questa impostazione causa una diminuzione delle prestazioni 
di Freenet, e il pi? delle volte non ? necessario farne uso. Se il motivo 
dietro il cambiamento ? la preoccupazione causata dall' avere aggiunto degli 
sconosciuti alla lista di Amici (peer affidabili), sarebbe bene prendere in 
considerazione l'idea di disconnetterli e riportare il livello di sicurezza su 
NORMALE. D'altro canto se ci si aspetta degli attachi o ci si aspetta che i 
computer di alcuni Amici potrebbero venire compromessi, innalzare il livello di 
sicurezza come precauzione non ? una cattiva idea.
-SecurityLevels.maxSecurityYouNeedFriends=${bold}E' necessario conoscere almeno 
una persona che gi? usa Freenett${/bold}, possibilmente 3, e tra 5 e 10 per 
ottenere buone prestazioni. Tali utenti vanno aggiunti alla pagine degli Amici, 
ma solo se si tratta di persone conosciute ed almeno parzialmente affidabili.
-SecurityLevels.maximumNetworkThreatLevelCheckbox=Si voglio abilitare il 
livello di sicurezza in rete MASSIMO. Mi rendo conto che Freenet ? un programma 
sperimentale e che nonostante le precauzioni potrebbe essere possibile essere 
rintracciati, e del fatto che questa impostazione ridurr? sensibilmente le 
prestazioni di Freenet.
-SecurityLevels.maximumNetworkThreatLevelWarning=${bold}ATTENZIONE:${/bold} Il 
livello di sicurezza in rete sta per essere impostato su MASSIMO. Ci? ridurr? 
${bold}notevolmente${/bold} la velocit? di trasferimento di file da e per 
questo nodo! Si prega di non utilizzare questa impostazione se non in caso di 
effettiva necessit?.
+SecurityLevels.fewConnectedFriendsWarning=Soltanto ${connected} Connessioni ad 
Amici sono attualmente attive, su un totale di ${added}. Impostando il livello 
di sucurezza in rete MASSIMO, Freenet si connetter? esclusivamente agli Amici, 
cio? peer affidabili aggiunti manualmente. Ci? potrebbe provocare un 
abbassamento nelle prestazioni generali dovuto alla riduzione del numero di 
connessioni. Se tutti gli Amici si trovassero ad essere 'off line' allo stesso 
tempo, il nodo si ritroverebbe completamente disconnesso dalla rete. E' bene 
ricordare che gli Amici devono essere persone conosciute e delle quali ci si 
fida almeno parzialmente; in mancanza di questa condizione, l'uso esclusivo di 
connessioni ad Amici non produce alcun vantaggio. Inoltre, per un corretto 
funzionamento di Freenet ? necessario che il nodo possa in qualsiasi momento 
connettersi ad almeno 5-10 peer. Prima di procedere, verificare l'esistenza di 
tutte le condizioni di cui sopra.
+SecurityLevels.friendsThreatLevel=Quanto sarebbe preoccupante, se le persone i 
cui nodi sono connessi come Amici spiassero la nostra attivit?, deliberatamente 
o come risultato di una compromissione? (Questa ? una configurazione di default 
che pu? essre impostata separatamente per ognuno degli Amici). Impostando il 
livello di Sicurezza Rete su ALTO, le prestazioni di Freenet verrano 
influenzate dai livelli di Sicurezza Amici, oltre che dal numero di Connessioni 
ad Amici.
+SecurityLevels.friendsThreatLevelConfirmTitle=ATTENZIONE: Il livello di 
Sicurezza Amici verr? impostato su: ${mode}
+SecurityLevels.friendsThreatLevelShort=Protezione contro attacchi all' 
anonimato da parte di Amici
+SecurityLevels.highFriendsThreatLevelCheckbox=Si sono sicuro; ho bisogno di un 
alto livello di protezione contro i nodi di Amici doppiogiochisti o i cui nodi 
sono stati compromessi.
+SecurityLevels.highFriendsThreatLevelWarning=Il livello di sicurezza ver? 
impostato su ALTO. Questa impostazione causa una diminuzione delle prestazioni 
di Freenet, e il pi? delle volte non ? necessario farne uso. Se il motivo 
dietro il cambiamento ? la preoccupazione causata dall' avere aggiunto degli 
sconosciuti alle Connessioni ad Amici (peer affidabili), sarebbe bene prendere 
in considerazione l'idea di disconnetterli e riportare il livello di sicurezza 
su NORMALE. D'altro canto se ci si aspetta degli attachi o ci si aspetta che i 
computer di alcuni Amici potrebbero venire compromessi, innalzare il livello di 
sicurezza come precauzione non ? una cattiva idea.
+SecurityLevels.maxSecurityYouNeedFriends=${bold}E' necessario conoscere almeno 
una persona che gi? usa Freenett${/bold}, possibilmente 3, e tra 5 e 10 per 
ottenere buone prestazioni. Tali utenti vanno aggiunti alle 'Connessioni ad 
Amici', ma solo se si tratta di persone conosciute ed almeno parzialmente 
affidabili.
+SecurityLevels.maximumNetworkThreatLevelCheckbox=Si voglio abilitare il 
livello MASSIMO di Sicurezza Rete MASSIMO. Mi rendo conto che Freenet ? un 
programma sperimentale e che nonostante le precauzioni potrebbe essere 
possibile essere rintracciati, e del fatto che questa impostazione ridurr? 
sensibilmente le prestazioni di Freenet.
+SecurityLevels.maximumNetworkThreatLevelWarning=${bold}ATTENZIONE:${/bold} Il 
livello di Sicurezza Rete sta per essere impostato su MASSIMO. Ci? ridurr? 
${bold}notevolmente${/bold} la velocit? di trasferimento di file da e per 
questo nodo! Si prega di non utilizzare questa impostazione se non in caso di 
effettiva necessit?.
 SecurityLevels.networkThreatLevel=Quanto ? necessario difendersi da Internet 
Service Providers, corporazioni, governi, ragazzini annoiati ecc. che cercano 
di monitorare l'utilizzo di Freenet da parte dell' Utente?
 SecurityLevels.networkThreatLevelConfirmTitle=ATTENZIONE: Il livello di 
sicurezza in rete verr? impostato su ${mode}
 SecurityLevels.networkThreatLevelLowCheckbox=Si sono sicuro, voglio 
prestazioni migliori e non mi importa di chi pu? vedere quello che faccio con 
Freenet
@@ -1112,17 +1112,17 @@
 SecurityLevels.networkThreatLevelShort=Protezione contro attacchi da parte di 
sconosciuti attraverso internet
 SecurityLevels.noConnectedFriendsCheckbox=Si sono sicuro, aggiunger? altri 
Amici e/o accetto che Freenet sar? on-line soltanto quando gli Amici 
attualmente in lista sono connessi.
 SecurityLevels.noConnectedFriendsWarning=Nonostante ${added} Amici siano stati 
aggiunti alla lista, nessuno di essi risulta attualmente collegato. Impostando 
il livello di sicurezza in rete su ALTO o MASSIMO, non sar? possibile 
connettersi ad altri che ai nodi gestiti da Amici, dei quali nessuno reperibile 
in questo momento. Le possibilit? a diposizione sono: aggiungere altri Amici, 
usare Freenet solo quando gli Amici sono connessi, o evitare di usare alti 
livelli di sicurezza. Per ottenere un vantaggio reale, gli Amici devono essere 
persone conosiute ed affidabili; per ottenere buone prestazioni ? necessario 
che in ogni dato momento siano connessi almeno 5-10 Amici. Conferma il cambio 
impostazioni di sicurezza?
-SecurityLevels.noFriendsCheckbox=Si sono sicuro, desidero abilitare livello 
ALTO di sicurezza in rete; aggiunger? degli Amici al pi? presto possibile.
+SecurityLevels.noFriendsCheckbox=Si sono sicuro, desidero abilitare livello 
ALTO di Sicurezza Rete; aggiunger? delle Connessioni ad Amici appena possibile.
 SecurityLevels.noFriendsWarning=Nessun nodo ? stato aggiunto agli Amici. 
Configurando il livello di sicurezza in rete su ALTO o MASSIMO, non sar? 
possibile connettersi a Freenet finch? non sar? aperta almeno una connessione 
ad Amici. Perch? ci? comporti un effettivo vantaggio, ? necessario che le 
persone in questione siano conosciute ed almeno parzialmente affidabili; per 
ottenere delle buone prestazioni, ? necessario che almeno 5-10 connessioni 
siano aperte in ogni momento. Conferma la modifica delle impostazioni di 
sicurezza?
-SecurityLevels.physicalThreatLevel=Se il computer fosse rubato o sottoposto a 
sequestro giudiziario ed esaminato, quanto grave sarebbe questo fatto?
+SecurityLevels.physicalThreatLevel=Ci sarebbe da preoccuparsi se il computer 
venisse rubato o sottoposto a sequestro giudiziario ed esaminato?
 SecurityLevels.physicalThreatLevelShort=Protezione in caso di furto o 
sequestro giudiziario del computer
-SecurityLevels.title=Livelli di sicurezza
+SecurityLevels.title=Livelli di Sicurezza
 SecurityLevels.tooltip=Configurazione del livello di sicurezza del nodo
 SecurityLevels.userAlertExtro=E' possibile modificare queste impostazioni alla 
${link}Pagina della Configurazione${/link}.
-SecurityLevels.userAlertFriendsThreatLevel=Protezione in caso di attacco all' 
anonimato da parte di amici: ${level}
+SecurityLevels.userAlertFriendsThreatLevel=Protezione in caso di attacco all' 
anonimato da parte di Amici: ${level}
 SecurityLevels.userAlertNetworkThreatLevel=Protezione contro attacchi da parte 
di sconosciuti attraverso internet: ${level}
-SecurityLevels.userAlertPhysicalThreatLevel=Protezione nel caso di furto o 
sequestro giudiziario del computer: ${level}
-SecurityLevels.userAlertShortText=Livelli di Sicurezza: Rete: ${network}, 
Amici: ${friends}, Fisico: ${physical}
+SecurityLevels.userAlertPhysicalThreatLevel=Protezione in caso di furto o 
sequestro giudiziario del computer: ${level}
+SecurityLevels.userAlertShortText=Sicurezza Rete: Livello ${network} - 
Sicurezza Amici: Livello ${friends} - Sicurezza Fisica: Livello ${physical}.
 SecurityLevels.friendsThreatLevel.choice.HIGH=Desidero che Freenet preda 
precauzioni supplementari per evitare gli attacchi da parte di Amici.
 SecurityLevels.friendsThreatLevel.choice.LOW=Gli attacchi da parte di Amici 
non mi preoccupano: posso fidarmi di loro e della loro abilit? nel campo della 
sicurezza informatica.
 SecurityLevels.friendsThreatLevel.choice.NORMAL=Gli attacchi da parte di Amici 
non mi preoccupano pi? di tanto ma vorrei comunque che Freenet prendesse 
precauzioni ragionevoli.
@@ -1138,7 +1138,7 @@
 SecurityLevels.networkThreatLevel.choice.NORMAL=Vivo in un paese relativamente 
libero ma vorrei comunque rendere pi? difficile il monitoraggio delle mie 
comunicazioni.
 SecurityLevels.networkThreatLevel.desc.HIGH=Freenet si connetter? 
esclusivamente agli Amici, quindi ${bold}per poter utilizzare questa modalit? ? 
necessario avere almeno un amico che usi Freenet ${/bold}. Freenet risulter? 
piuttosto lento se non si aggiungono almeno 5-10 Amici, e non funzioner? per 
niente se non se ne ha almeno uno.
 SecurityLevels.networkThreatLevel.desc.LOW=Potrebbe essere facile scoprire la 
vera identit? dell' Utente!
-SecurityLevels.networkThreatLevel.desc.MAXIMUM=Freenet sar? 
${bold}notevolmente${/bold} pi? lento rispetto al livello ALTO.Per poter fare 
usare questa modalit?  ${bold}? necessario avere amici che siano utenti 
Freenet${/bold}.
+SecurityLevels.networkThreatLevel.desc.MAXIMUM=Freenet sar? 
${bold}notevolmente${/bold} pi? lento rispetto al livello ALTO.Per poter usare 
questa modalit?  ${bold}? necessario avere degli amici che siano gi? utenti 
Freenet${/bold}.
 SecurityLevels.networkThreatLevel.desc.NORMAL=Freenet prender? ragionevoli 
precauzioni per difendere l'anonimato dell'Utente ad un lieve costo in 
prestazioni. Freenet si connetter? automaticamente a nodi gestiti da 
Sconosciuti. Si raccomanda di aggiungere Amici che usano Freenet ed impostare 
il livello di sicurezza su ALTO.
 SecurityLevels.networkThreatLevel.name.HIGH=ALTO
 SecurityLevels.networkThreatLevel.name.LOW=BASSO
@@ -1146,8 +1146,8 @@
 SecurityLevels.networkThreatLevel.name.NORMAL=NORMALE
 SecurityLevels.physicalThreatLevel.choice.LOW=Non preoccupante.
 SecurityLevels.physicalThreatLevel.choice.NORMAL=Preoccupante.
-SecurityLevels.physicalThreatLevel.desc.LOW=Freenet non user? 'encrypting' 
(codifica) del disco e lascer? tracce dell' attivit? dell' Utente sul disco 
rigido. Ci? migliorerr? le prestazioni di Freenet pagando un prezzo in termini 
di minore sicurezza nel caso che il computer venisse rubato o sottoposto a 
sequesto guidiziario.
-SecurityLevels.physicalThreatLevel.desc.NORMAL=Freenet provveder? alla 
codifica di file temporanei etc, ad un piccolo prezzo in prestazioni, ma 
sarebbe bene perndere ulteriori precauzioni come per esempio disabilitare la 
cache del web browser quando si usa L'interfaccia web. Se si fa uso di download 
persistenti (la maggioranza delle utilit? Freenet li usa), ? buona norma 
provvedere all 'encrypting' (codifica) del drive di Freenet.
+SecurityLevels.physicalThreatLevel.desc.LOW=Freenet non user? la cifratura del 
disco e lascer? tracce dell' attivit? dell' Utente sul disco rigido. Ci? 
migliorerr? le prestazioni di Freenet pagando un prezzo in termini di minore 
sicurezza nel caso che il computer venisse rubato o sottoposto a sequesto 
guidiziario.
+SecurityLevels.physicalThreatLevel.desc.NORMAL=Freenet provveder? alla 
cifratura dei file temporanei  ad un piccolo prezzo in prestazioni, ma sarebbe 
bene perndere ulteriori precauzioni come per esempio disabilitare la cache del 
web browser quando si usa L'interfaccia web. Se si fa uso di download 
persistenti (la maggioranza delle utilit? Freenet li usa), ? buona norma 
provvedere alla cifratura del drive di Freenet.
 SecurityLevels.physicalThreatLevel.name.LOW=BASSO
 SecurityLevels.physicalThreatLevel.name.NORMAL=NORMALE
 ShortOption.parseError=Il valore specificato non pu? essere interpretato come 
16-bit integer : ${val}
@@ -1157,23 +1157,23 @@
 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.bindTo=Indirizzo IP collegato
-SimpleToadletServer.bindToLong=Indirizzo IP collegato
+SimpleToadletServer.bindTo=Indirizzo IP a cui collegarsi
+SimpleToadletServer.bindToLong=Indirizzo IP a cui collegarsi
 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.cssOverride=Usa un CSS personalizzato (ATTENZIONE!)
 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.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.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.enablePersistentConnections=Abilita connessioni 
persistenti HTTP? (Leggere la descrizione)
+SimpleToadletServer.enablePersistentConnections=Abilita connessioni HTTP 
persistenti(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
@@ -1184,9 +1184,9 @@
 SimpleToadletServer.passthroughMaxSizeLong=Dimensione massima di un 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.
+SimpleToadletServer.ssl=Abilita SSL
+SimpleToadletServer.sslLong=Abilitare SSL su FProxy?
+StartupToadlet.entropyErrorContent=Non c'? abbastanza entropia disponibile nel 
sistema, Freenet non potr? avviarsi finch? non ne avr?  messa insieme 
abbastanza (soluzione: creare attivit? lanciando una ricerca su tutti i file: 
trova *.* su Win o find / su Mac, Linux, altri *nix)
 StartupToadlet.entropyErrorTitle=Entropia insufficiente!
 StartupToadlet.isStartingUp=Avviamento del nodo Freenet in corso, si prega di 
attendere.
 StartupToadlet.title=Avvio di Freenet in corso
@@ -1204,7 +1204,7 @@
 StatisticsToadlet.cpus=Numero CPU: ${count}
 StatisticsToadlet.debuggingBytes=Debugging bytes: ${netColoring} colorazione 
rete, ${ping} ping, ${probe} richieste probe, ${routed} messaggi di testo 
instradati.
 StatisticsToadlet.fullTitle=Statistiche del nodo: ${name}
-StatisticsToadlet.getLogs=Scarica l'ultimo logfile del nodo
+StatisticsToadlet.getLogs=Scarica il pi? recente logfile del nodo
 StatisticsToadlet.inputRate=Input: ${rate}/second (of ${max}/second)
 StatisticsToadlet.insertOutput=Output inserzioni (carico utile escluso): CHK 
${chk} SSK ${ssk}.
 StatisticsToadlet.javaVersion=Versione Java: ${version}
@@ -1226,8 +1226,8 @@
 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.routingDisabledShort=Indirizzamento Traffico Sospeso
+StatisticsToadlet.routingDisabled=Non instrada traffico: il nodo ? attualmente 
connesso ma una delle due parti rifiuta l'indirizzamento di traffico (routing)
+StatisticsToadlet.routingDisabledShort=Non instrada traffico
 StatisticsToadlet.running=In funzione
 StatisticsToadlet.statisticGatheringTitle=Raccolta Statistiche
 StatisticsToadlet.swapOutput=Output Scambio: ${total}.
@@ -1250,16 +1250,16 @@
 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.allowedHosts=Host autorizzati
 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.bindTo=Indirizzo IP a cui collegarsi
+TextModeClientInterfaceServer.bindToLong=Indirizzo IP a cui collegarsi
 TextModeClientInterfaceServer.enableInputOutput=Abilita stdout/stdin
 TextModeClientInterfaceServer.enableInputOutputLong=Abilita interfaccia 
testuale client su input/output standard? (un server tipo telnet che gira su un 
socket)
 TextModeClientInterfaceServer.enabled=Abilita TMCI
 TextModeClientInterfaceServer.enabledLong=Abilita TMCI
-TextModeClientInterfaceServer.ssl=Abilitare ssl?
-TextModeClientInterfaceServer.sslLong=Abilitare ssl?
+TextModeClientInterfaceServer.ssl=Abilita SSL
+TextModeClientInterfaceServer.sslLong=Abilitare SSL sul server TMCI?
 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!
@@ -1279,7 +1279,7 @@
 Toadlet.returnToHomepage=Torna alla homepage del nodo
 Toadlet.returnToNodeHomepage=Torna alla homepage del nodo
 Toadlet.returnToPrevPage=Torna alla pagina precedente
-Toadlet.returnToQueuepage=Torna alla pagina della coda
+Toadlet.returnToQueuepage=Torna a Download e Upload
 Toadlet.tempRedirectWithReason=Redirect temporaneo: ${reason}
 Toadlet.unauthorized=L'accesso a questa pagina ? interdetto.
 Toadlet.unauthorizedTitle=Non Autorizzato
@@ -1396,7 +1396,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 di Freenet. Grazie di aver scelto Freenet.
 WelcomeToadlet.restartingTitle=Riavvio del nodo Freenet in corso.
 WelcomeToadlet.shutdown=Arresta
 WelcomeToadlet.shutdownConfirm=Conferma: Arresta nodo Freenet?

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -1,5 +1,5 @@
 Persistence=forever. ??????????????????????; ???????????, ???????????????.
-Announcer.announceAlertIntro=Freenet ??????? - ???????????. ????????, 
????????. ??????? Freenet ????????, ????????, ????? 24 ??????.
+Announcer.announceAlertIntro=Freenet ??????? - ???????????. ????????, 
????????. ????? Freenet ?????????????????, ????????, ????? 24 ??????.
 Announcer.announceAlertNoSeednodes=??? seednodes.fref ??, 
????????????????(opennet)?. ?????????, ??? 
http://downloads.freenetproject.org/alpha/opennet/ ???????.
 Announcer.announceAlertShort=???????????, ????????.
 Announcer.announceAlertTitle=?????
@@ -9,6 +9,7 @@
 Announcer.announceDisabledTooOldTitle=???????(????)
 Announcer.announceLoading=Freenet ?????????, ?????????????. ??????????????.
 Announcer.coolingOff=????? ${time} ???, ??????????????????????, ?????????????, 
??????????.
+Announcer.dontKnowAddress=Freenet ????????????, ?????????????.
 Bookmark.noName=??
 BookmarkEditorToadlet.addBookmark=????
 BookmarkEditorToadlet.addCategory=????
@@ -76,17 +77,17 @@
 ClockProblemDetectedUserAlert.title=???????.
 ConfigToadlet.appliedFailureExceptions=?????????, ?????????:
 ConfigToadlet.appliedFailureTitle=??????
-ConfigToadlet.appliedSuccess=??????????.
+ConfigToadlet.appliedSuccess=?????????.
 ConfigToadlet.appliedTitle=???????
 ConfigToadlet.apply=??
-ConfigToadlet.configNavTitle=????
+ConfigToadlet.configNavTitle=????
 ConfigToadlet.console=????
 ConfigToadlet.contributeTranslation=????????
 ConfigToadlet.defaultIs=???: '${default}'.
 ConfigToadlet.false=?
 ConfigToadlet.fcp=????
 ConfigToadlet.fproxy=????
-ConfigToadlet.fullTitle=${name} ? Freenet ????
+ConfigToadlet.fullTitle=${name} ? Freenet ????
 ConfigToadlet.logger=???
 ConfigToadlet.modeAdvanced=??????
 ConfigToadlet.modeSimple=??????
@@ -99,10 +100,10 @@
 ConfigToadlet.possibilitiesTitle=??
 ConfigToadlet.reset=??
 ConfigToadlet.restartNode=????
-ConfigToadlet.returnToNodeConfig=??????
+ConfigToadlet.returnToNodeConfig=??????
 ConfigToadlet.shortTitle=??
 ConfigToadlet.ssl=SSL (????)
-ConfigToadlet.title=Freenet ????
+ConfigToadlet.title=Freenet ????
 ConfigToadlet.toadletsymlinker=toadlet?????
 ConfigToadlet.true=?
 ConfigToadlet.wrapper=????
@@ -129,12 +130,12 @@
 ConnectionsToadlet.nodeStatus.ROUTING DISABLED=?????
 ConnectionsToadlet.nodeStatus.TOO NEW=??
 ConnectionsToadlet.nodeStatus.TOO OLD=??
-ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=????
+ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=????
 ConnectivityToadlet.addressTitle=??
 ConnectivityToadlet.byIPTitle=${ip} ?????????? - ${status} (??????? 
${tunnelLength})
 ConnectivityToadlet.byPortTitle=${port} ?????????? - ${status} (??????? 
${tunnelLength})
 ConnectivityToadlet.connectivity=?????
-ConnectivityToadlet.connectivityTitle=??
+ConnectivityToadlet.connectivityTitle=?????
 ConnectivityToadlet.firstReceiveLeadTime=?????????
 ConnectivityToadlet.firstSendLeadTime=?????????
 ConnectivityToadlet.local=??
@@ -143,7 +144,7 @@
 ConnectivityToadlet.remote=??
 ConnectivityToadlet.sentReceivedTitle=??/?????
 ConnectivityToadlet.summaryTitle=??
-ConnectivityToadlet.title=${nodeName} ??????
+ConnectivityToadlet.title=${nodeName} ????????
 ContentDataFilter.unknownCharset=?????????????????. ????????????????, 
????????????.
 ContentDataFilter.unknownCharsetTitle=?????!
 ContentDataFilter.warningUnknownCharsetTitle=??: ?????? (${charset})
@@ -199,7 +200,7 @@
 DarknetConnectionsToadlet.failedToAddNodeTitle=??????
 DarknetConnectionsToadlet.fcpDisabled=FCP ???? (? Freenet ?????, ?? Frost ? 
Thaw ??)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (? Frost, Thaw ? Freenet 
???????)
-DarknetConnectionsToadlet.fileReference=???????????????:
+DarknetConnectionsToadlet.fileReference=????????????????:
 DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp (???????;??????????????)
 DarknetConnectionsToadlet.forceRemove=????
 DarknetConnectionsToadlet.fproxyDisabled=FProxy???????)?????
@@ -229,7 +230,7 @@
 DarknetConnectionsToadlet.notConnected=???: ?????, ??????????????
 DarknetConnectionsToadlet.notConnectedShort=???
 DarknetConnectionsToadlet.opennetFnpPort=????(Opennet) FNP: ${port}/UDP 
(??????????, ???"???", ????; ??????????????)
-DarknetConnectionsToadlet.pasteReference=???????????:
+DarknetConnectionsToadlet.pasteReference=?????????:
 DarknetConnectionsToadlet.privateNote=???????????
 DarknetConnectionsToadlet.privateNoteTitle=????
 
DarknetConnectionsToadlet.referenceCopyWarning=???????${bold}????${/bold}??.??????${bold}????${/bold}.
@@ -245,7 +246,7 @@
 DarknetConnectionsToadlet.sendMessageTitle=?????????
 DarknetConnectionsToadlet.sendMessageToPeers=???????????????
 DarknetConnectionsToadlet.separator=? ? ?
-DarknetConnectionsToadlet.statusTitle=??
+DarknetConnectionsToadlet.statusTitle=??
 DarknetConnectionsToadlet.tmciDisabled=TMCI ???? (?? telnet ????????)
 DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (?? telnet ????????)
 DarknetConnectionsToadlet.tooNew=???????: ????????????????????.
@@ -256,19 +257,19 @@
 DarknetConnectionsToadlet.triedToAddSelf=????????????????.
 DarknetConnectionsToadlet.unknownAddress=(????)
 DarknetConnectionsToadlet.updateChangedPrivnotes=??????????
-DarknetConnectionsToadlet.urlReference=????????URL:
+DarknetConnectionsToadlet.urlReference=????????????URL:
 DarknetConnectionsToadlet.versionTitle=??
 ExtOldAgeUserAlert.extTooOld=?? freenet-ext.jar ?????????, 
???????????????????: http://downloads.freenetproject.org/alpha/freenet-ext.jar.
 ExtOldAgeUserAlert.extTooOldShort=?? freenet-ext.jar ?????. ?????.
 ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext ??
 FProxyToadlet.abortToHomepage=?????? FProxy ??
-FProxyToadlet.alerts=???????
-FProxyToadlet.alertsTitle=??
+FProxyToadlet.alerts=????????????????
+FProxyToadlet.alertsTitle=????
 FProxyToadlet.backToFProxy=${link}???${/link}?? FProxy ??.
 FProxyToadlet.backToReferrer=${link}???${/link}??????.
 FProxyToadlet.cantBindPort=Fproxy ????????????!
-FProxyToadlet.config=??/??????
-FProxyToadlet.configTitle=??
+FProxyToadlet.config=??????
+FProxyToadlet.configTitle=??
 FProxyToadlet.dangerousContentTitle=????????
 FProxyToadlet.dangerousRSS=Freenet ??????????????? RSS ??. Freenet ?????? RSS 
??, ?? RSS ?????????(?????????, ??????????????????, ????????). Firefox 2.0 ? 
Internet Explorer 7.0 ???????? RSS ????, ??????????? "${type}".
 FProxyToadlet.dangerousRSSSubtitle=RSS ??????????
@@ -282,8 +283,8 @@
 FProxyToadlet.fetchLargeFileAnywayAndDisplay=?????, ???????????????
 FProxyToadlet.fileInformationTitle=????
 FProxyToadlet.filenameLabel=??:
-FProxyToadlet.friends=??????
-FProxyToadlet.friendsTitle=??
+FProxyToadlet.friends=???????
+FProxyToadlet.friendsTitle=????
 FProxyToadlet.goBack=?????
 FProxyToadlet.goBackToPrev=?????
 FProxyToadlet.homepage=??
@@ -305,14 +306,14 @@
 FProxyToadlet.openRSSForce=${link}????${/link}?? ${mime} ??????(? IE7 ?? FF2 
?${bold}??????${/bold}).
 FProxyToadlet.openWithKeyExplorer=${link}???${/link}????????? Freenet URI.
 FProxyToadlet.opennet=????????
-FProxyToadlet.opennetTitle=???
+FProxyToadlet.opennetTitle=?????
 FProxyToadlet.options=?????:
 FProxyToadlet.pathNotFound=???????.
 FProxyToadlet.pathNotFoundTitle=???????
 FProxyToadlet.plugins=???????
 FProxyToadlet.pluginsTitle=??
 FProxyToadlet.queue=????????
-FProxyToadlet.queueTitle=??
+FProxyToadlet.queueTitle=?????
 FProxyToadlet.retryNow=????
 FProxyToadlet.sizeLabel=??:
 FProxyToadlet.sizeUnknown=??????
@@ -321,8 +322,8 @@
 FProxyToadlet.translationTitle=??
 FProxyToadlet.unableToRetrieve=Freenet ????????.
 FProxyToadlet.unknownMIMEType=MIME ??????
-FProxyToadlet.welcome=??
-FProxyToadlet.welcomeTitle=??
+FProxyToadlet.welcome=?? Freenet
+FProxyToadlet.welcomeTitle=?? Freenet
 FcpServer.allowedHosts=??????(????????)
 FcpServer.allowedHostsFullAccess=???????????
 FcpServer.allowedHostsFullAccessLong=???????????????. ??????????????????, 
??????. ??, ?????????????????!
@@ -437,27 +438,32 @@
 FirstTimeWizardToadlet.chooseNodeNameLong=?????????????(???????, 
????????????). ?????????(???????????????)???????????. 
???(???????????????)???????. ???, ???????????????????????????, ????????????, 
??????????????????.
 FirstTimeWizardToadlet.clickContinue=??????
 FirstTimeWizardToadlet.congratz=????????
-FirstTimeWizardToadlet.congratzLong=??, ??????????? Freenet ???. 
????"??"???????????????, ????????????????. ???, Freenet ?????????, ???????. 
?????????????? Freenet. ?????? Freenet ??????.
+FirstTimeWizardToadlet.congratzLong=???, ?? Freenet ????????????. 
????"??"??????????????, ????????????????. ???, Freenet ?????????, ???????. 
?????????????? Freenet. ?????? Freenet ??????.
 FirstTimeWizardToadlet.connectToStrangers=???????
-FirstTimeWizardToadlet.connectToStrangersLong=??????? Freenet 
???????????????????????????????????? Freenet??????????????? Freenet 
????????????????????????????????????
+FirstTimeWizardToadlet.connectToStrangersLong=?? Freenet ??, ??????????????. 
???????????????????????. ?????????? Freenet ???????, ?????????????????. ??, 
????????????????? Freenet, ?????????????. ????????? Freenet, ????????????.
 FirstTimeWizardToadlet.continue=??
 FirstTimeWizardToadlet.continueEnd=???????Freenet?
 FirstTimeWizardToadlet.datastoreSize=??????
 
FirstTimeWizardToadlet.datastoreSizeLong=????????????????????????????????????????????????????????????????????????????????????
-FirstTimeWizardToadlet.enableOpennet=????????? Freenet ??
+FirstTimeWizardToadlet.enableOpennet=????????????, ?????????????, 
??????????????????. Freenet ???????, ???????????????.
 FirstTimeWizardToadlet.fivePercentDisk=(? 5% ???????)
+FirstTimeWizardToadlet.friendsSecurityPageTitle=Freenet ????! - ??????
+FirstTimeWizardToadlet.highNetworkThreatLevelCheckbox=????????? Freenet ??(??? 
3 ?, ????????, ?? 5-10 ?). ????/?????????. ?????????? Freenet ????.
+FirstTimeWizardToadlet.highNetworkThreatLevelWarning=${bold}??${/bold}: 
???????????????. ????${bold}????????${/bold}?????? Freenet. ??????????, 
?????/???????. ??????????? Freenet ??, ???????, Freenet ???????. 
???????????????????, ????????. ????, ????????????, ???????????????.(???????? 
5-10 ???)
 FirstTimeWizardToadlet.homepageTitle=Freenet ???????
 FirstTimeWizardToadlet.iDoTrust=???????? ${interface} (${ip}) ????
 FirstTimeWizardToadlet.isNetworkTrusted=???????????
-FirstTimeWizardToadlet.isNetworkTrustedLong=????????????? ??????, 
?????????????????????????????. ??????????, ????????????????????.
+FirstTimeWizardToadlet.isNetworkTrustedLong=????????????? ??????, 
?????????????????????????????. ??????????, ????????????????????.
 FirstTimeWizardToadlet.memoryLimit=?????
 FirstTimeWizardToadlet.memoryLimitLong=???? Freenet 
??????????????????/???Freenet ??????????????????????????????????? 128MB ??????? 
1GB ??????????? 256MB??????????? Freenet ?????
+FirstTimeWizardToadlet.networkSecurityPageTitle=Freenet ????! - ??????
 FirstTimeWizardToadlet.noNetworkIF=?????????
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet ??????????????????????? Freenet?
-FirstTimeWizardToadlet.opennetNo=???????????????? Freenet ???????????????????
+FirstTimeWizardToadlet.opennetNo=????????????? Freenet ?, ????????????????.
 FirstTimeWizardToadlet.opennetWarning=?? Freenet ?????????????????? Freenet 
?????????????????????????????????????????????Freenet ??????????????????????
-FirstTimeWizardToadlet.opennetYes=???????????????????
-FirstTimeWizardToadlet.skipWizard=??????????????
+FirstTimeWizardToadlet.opennetYes=??????????????????
+FirstTimeWizardToadlet.physicalSecurityPageTitle=Freenet ????! - ??????
+FirstTimeWizardToadlet.skipWizard=????????(??????).
 FirstTimeWizardToadlet.step1Title=Freenet ??????? - ??????
 FirstTimeWizardToadlet.step2Title=Freenet ??????! - ??????
 FirstTimeWizardToadlet.step3Title=Freenet ?????? - ????
@@ -498,9 +504,9 @@
 IPDetectorPluginManager.direct=???????????????. ??, ????????????? Freenet ??.
 IPDetectorPluginManager.directTitle=??????????
 IPDetectorPluginManager.forwardPortMaybeForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ???? ${port}, ???????. ??????????; 
Freenet ??????????????. ????????${link}??${/link}.
-IPDetectorPluginManager.forwardPortNotForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ???? ${port}, ???????. 
?????????????, ?? Freenet ????. ????????${link}??${/link}.
+IPDetectorPluginManager.forwardPortNotForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ???? ${port}, ???????. 
???????????????, ?? Freenet ????. ????????${link}??${/link}. Freenet ?????? 24 
??????????????????????.
 IPDetectorPluginManager.forwardPortShortMaybeForwarded=?? UDP ? ${port} ???? 
(?????????).
-IPDetectorPluginManager.forwardPortShortNotForwarded=?? UDP ? ${port} ???? 
(???????).
+IPDetectorPluginManager.forwardPortShortNotForwarded=?? UDP ? ${port} ???? 
(????????).
 IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ???? ${port1} ? ${port2}, ???????. 
??????????; Freenet ??????????????. ????????${link}??${/link}.
 IPDetectorPluginManager.forwardTwoPortsNotForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ???? ${port1} ? ${port2}, ???????. 
?????????????, ?? Freenet ????. ????????${link}??${/link}.
 IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=?? UDP ? ${port1} ? 
${port2} ???? (?????????).
@@ -623,7 +629,7 @@
 N2NTMToadlet.returnToFriends=??????
 N2NTMToadlet.sendMessage=?????????
 N2NTMToadlet.sendMessageShort=????
-N2NTMToadlet.sendStatus=??????
+N2NTMToadlet.sendStatus=??????
 N2NTMToadlet.sent=????????
 N2NTMToadlet.sentTitle=???
 N2NTMToadlet.tooLong=?????????? 1024 ?????
@@ -659,6 +665,8 @@
 Node.dropPacketEveryLong=???????. ???????????, ????????. 0 ??????????. ???????!
 Node.enableARKs=?? ARKs? (????!)
 Node.enableARKsLong=???? ARKs? (??????!).
+Node.enableOpennetFailed=????????(opennet)??, ??????????. ??????, 
?????,??????????. ???: ${message}
+Node.enableOpennetFailedTitle=????????
 Node.enablePacketCoalescing=???????
 Node.enablePacketCoalescingLong=?????????? ??????????????, ?? CPU ???, 
?????????????, ??????????????. ???????????, ??????.
 Node.enablePerNodeFailureTables=??????????????
@@ -672,8 +680,8 @@
 Node.errorApplyingConfig=??????????? : ${error}
 Node.extraPeerDir=????????
 Node.extraPeerDirLong=??????????????
-Node.forceBigShrink=????????
-Node.forceBigShrinkLong=?????????(?? 10%)???????(????????????). 
??????????????????, ?????????; ?????????????????.
+Node.forceBigShrink=????????(?????? bdbje-index ??)
+Node.forceBigShrinkLong=?????????(?? 10%)???????(????????????). 
??????????????????, ?????????; ?????????????????. ?????? bdbje-index ?????.
 Node.inBWLimit=????????????
 Node.inBWLimitLong=???????????????; ??????????????; ?? -1 ?????????
 Node.invalidStoreSize=????????? 32MB
@@ -709,13 +717,17 @@
 Node.publishOurPeersLocationLong=??????????????? ??????????, ?????????????????.
 Node.routeAccordingToOurPeersLocation=???????????????????????????
 Node.routeAccordingToOurPeersLocationLong=??????????????????????????? 
??????????, ???????????.
+Node.storeBloomFilterCounting=???????????
+Node.storeBloomFilterCountingLong=???????????????? (???????????, ??????)
+Node.storeBloomFilterSize=?????(??)????
+Node.storeBloomFilterSizeLong=?????(??)????. ???????????? 2048 ?? 1 ??????. 
??? 0 ?????. ??? -1 ???????.
 Node.storeDirectory=????
 Node.storeDirectoryLong=???????????
 Node.storeMaxMemTooHigh=????????? 80% ???? BDB ???!
 Node.storeSize=?????????
 Node.storeSizeLong=?????????
 Node.storeType=????(????)
-Node.storeTypeLong=??????. ????? bdb-index ?? ram (bdb-index ? 
BerkeleyDBFreenetStore ?????, ??????????????; ram ??????????????). 
?????????????, ?????????????????, ??? ram (??????????????)!
+Node.storeTypeLong=??????. ????? salt-hash (???! ???????????????, ?????????), 
bdb-index (????! ???? BerkeleyDBFreenetStore ??????, ?????????????), ?? ram 
(????! ????????????). ?????????????, ?????????????????, ??? ram 
(??????????????)! ????? Freenet ???, ??????.
 Node.swapRInterval=???????????(??)
 Node.swapRIntervalLong=?????????????, ?????. ????!
 Node.throttleLocalTraffic=???????
@@ -805,18 +817,18 @@
 NotEnoughNiceLevelsUserAlert.short=???????????! ?????????????? Freenet.
 NotEnoughNiceLevelsUserAlert.title=???????????!
 OpennetConnectionsToadlet.fullTitle=${name} ? ${counts} ????(??????)
-OpennetConnectionsToadlet.peersListTitle=??????????(??????????????????)
+OpennetConnectionsToadlet.peersListTitle=??????????(???????????????????)
 OpennetConnectionsToadlet.successTime=?????????????? CHK ???
 OpennetConnectionsToadlet.successTimeTitle=??????
-OpennetUserAlert.warning=Freenet ????????????. ????????????? Freenet, 
?????????????. ???????????????, ????????????????????, ????????????. ????? 10 
???????(??????????????, ???????????????), ???????????, ?? Freenet 
????????????????.
+OpennetUserAlert.warning=Freenet ????????????. ????????????? Freenet, 
?????????????. ???????????????, ????????????????????, ????????????. ????? 5 ? 
10 ???????(??????????????, ???????????????), ???????????, ?? Freenet 
????????????????.
 OpennetUserAlert.warningShort=????????.
 OpennetUserAlert.warningTitle=??: ????????: ??????????
 PNGFilter.invalidHeader=????????????? PNG ?, ?????????? PNG ??. ???????????, 
?????????????????, ?????????.
 PNGFilter.invalidHeaderTitle=??? PNG - ??????
-PageMaker.modeAdvanced=??????
-PageMaker.modeAdvancedTooltip=????? Freenet ???????????????????
-PageMaker.modeSimple=??????
-PageMaker.modeSimpleTooltip=?????????????
+PageMaker.modeAdvanced=??????
+PageMaker.modeAdvancedTooltip=????? Freenet ???????????????????
+PageMaker.modeSimple=??????
+PageMaker.modeSimpleTooltip=?????????????
 PeerManagerUserAlert.clockProblem=??? ${count} ???????, ??????????????? 24 
????. ??????????????. ??????????????????????????.
 PeerManagerUserAlert.clockProblemTitle=????
 PeerManagerUserAlert.connError=? ${count} ??????????????, ???????????, 
???????????.
@@ -924,7 +936,7 @@
 PproxyToadlet.returnToPluginPage=??????
 PproxyToadlet.startedAtTitle=????
 PproxyToadlet.startingPluginName=????
-PproxyToadlet.startingPluginStatus=????
+PproxyToadlet.startingPluginStatus=????
 PproxyToadlet.startingPluginTime=????
 PproxyToadlet.startingPluginsTitle=?????
 PproxyToadlet.unauthorized=??????????.
@@ -982,10 +994,10 @@
 QueueToadlet.fileName=??
 QueueToadlet.files=??
 QueueToadlet.follow=????
-QueueToadlet.globalQueueIsEmpty=?????????
+QueueToadlet.globalQueueIsEmpty=??????????????????
 QueueToadlet.identifier=???
 QueueToadlet.insertAs=???:
-QueueToadlet.insertFile=????
+QueueToadlet.insertFile=????? Freenet
 QueueToadlet.insertFileBrowseLabel=?????????
 QueueToadlet.insertFileCompressLabel=??
 QueueToadlet.insertFileInsertFileLabel=????
@@ -1025,7 +1037,7 @@
 QueueToadlet.siteUploadSucceededTitle=Freesite ????: ${filename}
 QueueToadlet.size=??
 QueueToadlet.starting=???
-QueueToadlet.title=${nodeName}?????
+QueueToadlet.title=${nodeName}????????
 QueueToadlet.totalSize=????
 QueueToadlet.unknown=??
 QueueToadlet.uploadProgressbarNotAccurate=????????????????????????
@@ -1054,6 +1066,66 @@
 SSL.keyStorePassLong=????????
 SSL.version=SSL ??
 SSL.versionLong=SSL ??, ????? SSLv3 ?? TLSv1 (???? SSLv3)
+SaltedHashFreenetStore.cleanerAlertTitle=????????????
+SaltedHashFreenetStore.longRebuildProgress=????(${name})???????: 
${processed}/${total}. ????????????????. ????????????.
+SaltedHashFreenetStore.longResizeProgress=????(${name})???????: 
${processed}/${total}. ????????????????. ????????????.
+SaltedHashFreenetStore.shortRebuildProgress=????(${name})???????: 
${processed}/${total}
+SaltedHashFreenetStore.shortResizeProgress=????(${name})???????: 
${processed}/${total}
+SecurityLevels.fewConnectedFriendsCheckbox=???, ????????, ??/??????????, 
???????????????? Freenet ???.
+SecurityLevels.fewConnectedFriendsWarning=????? ${connected} ??????, ????? 
${added} ???????. ????????????????????, Freenet ??????????, ?????????. 
??????????????, ????????? Freenet. ???, ?????????????, ???????/??????, 
??????????. ????????? 5-10 ??????, ????????. ?????????
+SecurityLevels.friendsThreatLevel=???????????????????????, 
???????????????????? (?????????????, ????????????????.) ?????????????????, 
???????????????????????.
+SecurityLevels.friendsThreatLevelConfirmTitle=??: ?????????${mode}
+SecurityLevels.friendsThreatLevelShort=???????????????
+SecurityLevels.highFriendsThreatLevelCheckbox=???????????????????.
+SecurityLevels.highFriendsThreatLevelWarning=???????????????. ???? Freenet 
???, ????????????. ????????????, ???????????????????, ???????????, 
??????????????????. ????, ????????????????????, ???????????????, ??????????????.
+SecurityLevels.maxSecurityYouNeedFriends=${bold}????????????? Freenet 
??${/bold}, ???? 3 ?, ????????, ?? 5-10 ?. ?????????????. ?/??????????, 
??????????.
+SecurityLevels.maximumNetworkThreatLevelCheckbox=??, ???????????. ??? Freenet 
??????, ?????????????, ???????????? Freenet ???!
+SecurityLevels.maximumNetworkThreatLevelWarning=${bold}??:${/bold} 
???????????????! ????? Freenet ${bold}??????${/bold}! ????????, ????????!
+SecurityLevels.networkThreatLevel=??????????, ???????????, ??, ??, 
????????????????? Freenet ?????
+SecurityLevels.networkThreatLevelConfirmTitle=??: ?????????${mode}
+SecurityLevels.networkThreatLevelLowCheckbox=???, ???????, ???????????? 
Freenet ????!
+SecurityLevels.networkThreatLevelLowWarning=??????????????????. 
???????????????????. ?????????
+SecurityLevels.networkThreatLevelShort=??????????????
+SecurityLevels.noConnectedFriendsCheckbox=???, ????????, 
??/??????????????????, ????? Freenet.
+SecurityLevels.noConnectedFriendsWarning=??????????, ?????????? ${added} ??. 
????????????????????, ??????????????? Freenet, ????????. ????????????, 
???????????? Freenet, ?????????????. ???, ??????????, ?????/???????, 
???????????. ???????????? 5-10 ??????, ????????. ?????????
+SecurityLevels.noFriendsCheckbox=???, ???????????, ???????????.
+SecurityLevels.noFriendsWarning=??????????. ???????????????????, 
?????????????, ?????? Freenet! ???, ??????????, ?????/???????, ???????????. 
???????????? 5-10 ??????, ????????. ?????????
+SecurityLevels.physicalThreatLevel=????????????????????
+SecurityLevels.physicalThreatLevelShort=??????????????????
+SecurityLevels.title=????
+SecurityLevels.tooltip=?????????
+SecurityLevels.userAlertExtro=????${link}????${/link}??????.
+SecurityLevels.userAlertFriendsThreatLevel=??????????????: ${level}
+SecurityLevels.userAlertNetworkThreatLevel=????????????????: ${level}
+SecurityLevels.userAlertPhysicalThreatLevel=???????????????: ${level}
+SecurityLevels.userAlertShortText=????: ??: ${network}, ??: ${friends}, ??: 
${physical}
+SecurityLevels.friendsThreatLevel.choice.HIGH=??? Freenet ???????????.
+SecurityLevels.friendsThreatLevel.choice.LOW=??????????. ?????????/??????????.
+SecurityLevels.friendsThreatLevel.choice.NORMAL=????????????, ???? Freenet 
?????????.
+SecurityLevels.friendsThreatLevel.desc.HIGH=Freenet ??????????, 
????????????????.
+SecurityLevels.friendsThreatLevel.desc.LOW=Freenet ???????????????????.
+SecurityLevels.friendsThreatLevel.desc.NORMAL=Freenet ???????????, 
?????????????.
+SecurityLevels.friendsThreatLevel.name.HIGH=??
+SecurityLevels.friendsThreatLevel.name.LOW=??
+SecurityLevels.friendsThreatLevel.name.NORMAL=???
+SecurityLevels.networkThreatLevel.choice.HIGH=?????????????, ??????????????? 
Freenet.
+SecurityLevels.networkThreatLevel.choice.LOW=???????????????.
+SecurityLevels.networkThreatLevel.choice.MAXIMUM=?????????????, ??, ?????????. 
??? Freenet ??????, ??????????????????, ??????????????????.
+SecurityLevels.networkThreatLevel.choice.NORMAL=???????????, ???????????????.
+SecurityLevels.networkThreatLevel.desc.HIGH=Freenet ??????????????, 
??${bold}?????? Freenet ???????????${/bold}. ??????? 5-10 ???, ?? Freenet 
??????; ?????????????, ???????.
+SecurityLevels.networkThreatLevel.desc.LOW=???????????????!
+SecurityLevels.networkThreatLevel.desc.MAXIMUM=?????? Freenet 
?????????${bold}?????${/bold}, ??${bold}?????? Freenet ???????????${/bold}.
+SecurityLevels.networkThreatLevel.desc.NORMAL=Freenet ??????????, ???????. 
Freenet ???????????. ?????????? Freenet ???????, ???????????.
+SecurityLevels.networkThreatLevel.name.HIGH=??
+SecurityLevels.networkThreatLevel.name.LOW=??
+SecurityLevels.networkThreatLevel.name.MAXIMUM=???
+SecurityLevels.networkThreatLevel.name.NORMAL=???
+SecurityLevels.physicalThreatLevel.choice.LOW=????.
+SecurityLevels.physicalThreatLevel.choice.NORMAL=????.
+SecurityLevels.physicalThreatLevel.desc.LOW=Freenet ??????????, 
??????????????, ??????????????????????.
+SecurityLevels.physicalThreatLevel.desc.NORMAL=Freenet ???????, ????????; 
??????????????, ???????????, ???????????. ????????????(???????????), ?????? 
Freenet ???????????????.
+SecurityLevels.physicalThreatLevel.name.LOW=??
+SecurityLevels.physicalThreatLevel.name.NORMAL=???
 ShortOption.parseError=????????????????: ${error}
 SimpleToadletServer.advancedMode=?????????
 SimpleToadletServer.advancedModeLong=????????????????????. ???????????.
@@ -1100,7 +1172,7 @@
 StatisticsToadlet.ackOnlyBytes=???????: ${total}
 StatisticsToadlet.activityInserts=??: ?? ${totalSenders} ????, ${CHKhandlers} 
? CHK ???, ${SSKhandlers} ? SSK ???
 StatisticsToadlet.activityRequests=??: ?? ${totalSenders} ????, ${CHKhandlers} 
? CHK ???, ${SSKhandlers} ? SSK ???
-StatisticsToadlet.adminBytes=????: ${initial} ?????, ${changedIP} ?????????, 
${disconn} ?????, ${routingStatus} ???????
+StatisticsToadlet.adminBytes=????: ${initial} ?????, ${changedIP} ?????????, 
${disconn} ?????, ${routingStatus} ???????
 StatisticsToadlet.allocMemory=Java ??????: ${memory}
 StatisticsToadlet.announceBytes=????: ${total}
 StatisticsToadlet.authBytes=????: ?? ${total}
@@ -1202,7 +1274,7 @@
 TranslationToadlet.contributingToLabelWithLang=????${lang}?????:
 TranslationToadlet.currentTranslationLabel=????
 TranslationToadlet.downloadTranslationsFile=????????
-TranslationToadlet.gotoNext=?????????????
+TranslationToadlet.gotoNext=??????????????
 TranslationToadlet.hideAlreadyTranslated=???????????
 TranslationToadlet.noCustomTranslations=????????.
 TranslationToadlet.originalVersionLabel=?????(????)
@@ -1254,9 +1326,9 @@
 UserAlertManager.minorCountLabel=??:
 UserAlertManager.totalLabel=??:
 UserAlertManager.warningCountLabel=??:
-UserAlertsToadlet.titleWithName=${name} ?????
+UserAlertsToadlet.titleWithName=${name} ?????
 WelcomeToadlet.activityTitle=????
-WelcomeToadlet.alertsSummary=??????
+WelcomeToadlet.alertsSummary=??????(?????????????)
 WelcomeToadlet.arkFetchCount=ARK???: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=??????
 WelcomeToadlet.confirmAddBookmarkTitle=????

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -1,4 +1,4 @@
-Announcer.announceAlertIntro=Freenet ??????? - ???????????. ????????, 
????????. ??????? Freenet ????????, ????????, ????? 24 ??????.
+Announcer.announceAlertIntro=Freenet ??????? - ???????????. ????????, 
????????. ????? Freenet ?????????????????, ????????, ????? 24 ??????.
 Announcer.announceAlertNoSeednodes=??? seednodes.fref ??, 
????????????????(opennet)?. ?????????, ??? 
http://downloads.freenetproject.org/alpha/opennet/ ???????.
 Announcer.announceAlertShort=???????????, ????????.
 Announcer.announceAlertTitle=?????
@@ -8,6 +8,7 @@
 Announcer.announceDisabledTooOldTitle=???????(????)
 Announcer.announceLoading=Freenet ?????????, ?????????????. ??????????????.
 Announcer.coolingOff=????? ${time} ???, ??????????????????????, ?????????????, 
??????????.
+Announcer.dontKnowAddress=Freenet ????????????, ?????????????.
 Bookmark.noName=??
 BookmarkEditorToadlet.addBookmark=????
 BookmarkEditorToadlet.addCategory=????
@@ -75,17 +76,17 @@
 ClockProblemDetectedUserAlert.title=??????.
 ConfigToadlet.appliedFailureExceptions=?????????, ?????????:
 ConfigToadlet.appliedFailureTitle=??????
-ConfigToadlet.appliedSuccess=??????????.
+ConfigToadlet.appliedSuccess=?????????.
 ConfigToadlet.appliedTitle=???????
 ConfigToadlet.apply=??
-ConfigToadlet.configNavTitle=????
+ConfigToadlet.configNavTitle=????
 ConfigToadlet.console=????
 ConfigToadlet.contributeTranslation=????????
 ConfigToadlet.defaultIs=???: '${default}'.
 ConfigToadlet.false=?
 ConfigToadlet.fcp=????
 ConfigToadlet.fproxy=????
-ConfigToadlet.fullTitle=${name} ? Freenet ????
+ConfigToadlet.fullTitle=${name} ? Freenet ????
 ConfigToadlet.logger=???
 ConfigToadlet.modeAdvanced=??????
 ConfigToadlet.modeSimple=??????
@@ -98,10 +99,10 @@
 ConfigToadlet.possibilitiesTitle=??
 ConfigToadlet.reset=??
 ConfigToadlet.restartNode=????
-ConfigToadlet.returnToNodeConfig=??????
+ConfigToadlet.returnToNodeConfig=??????
 ConfigToadlet.shortTitle=??
 ConfigToadlet.ssl=SSL (????)
-ConfigToadlet.title=Freenet ????
+ConfigToadlet.title=Freenet ????
 ConfigToadlet.toadletsymlinker=toadlet?????
 ConfigToadlet.true=?
 ConfigToadlet.wrapper=????
@@ -128,12 +129,12 @@
 ConnectionsToadlet.nodeStatus.ROUTING DISABLED=?????
 ConnectionsToadlet.nodeStatus.TOO NEW=??
 ConnectionsToadlet.nodeStatus.TOO OLD=??
-ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=????
+ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=????
 ConnectivityToadlet.addressTitle=??
 ConnectivityToadlet.byIPTitle=${ip} ?????????? - ${status} (??????? 
${tunnelLength})
 ConnectivityToadlet.byPortTitle=${port} ????????? - ${status} (??????? 
${tunnelLength})
 ConnectivityToadlet.connectivity=??????
-ConnectivityToadlet.connectivityTitle=??
+ConnectivityToadlet.connectivityTitle=??????
 ConnectivityToadlet.firstReceiveLeadTime=?????????
 ConnectivityToadlet.firstSendLeadTime=?????????
 ConnectivityToadlet.local=??
@@ -142,7 +143,7 @@
 ConnectivityToadlet.remote=??
 ConnectivityToadlet.sentReceivedTitle=??/?????
 ConnectivityToadlet.summaryTitle=??
-ConnectivityToadlet.title=${nodeName} ???????
+ConnectivityToadlet.title=${nodeName} ?????????
 ContentDataFilter.unknownCharset=?????????????????. ????????????????, 
????????????.
 ContentDataFilter.unknownCharsetTitle=?????!
 ContentDataFilter.warningUnknownCharsetTitle=??: ?????? (${charset})
@@ -198,7 +199,7 @@
 DarknetConnectionsToadlet.failedToAddNodeTitle=??????
 DarknetConnectionsToadlet.fcpDisabled=FCP ???? (? Freenet ?????, ?? Frost ? 
Thaw ??)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (? Frost, Thaw ? Freenet 
???????)
-DarknetConnectionsToadlet.fileReference=???????????????:
+DarknetConnectionsToadlet.fileReference=????????????????:
 DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp (???????;??????????????)
 DarknetConnectionsToadlet.forceRemove=????
 DarknetConnectionsToadlet.fproxyDisabled=FProxy???????)?????
@@ -228,7 +229,7 @@
 DarknetConnectionsToadlet.notConnected=???: ?????, ??????????????
 DarknetConnectionsToadlet.notConnectedShort=???
 DarknetConnectionsToadlet.opennetFnpPort=????(Opennet) FNP: ${port}/UDP 
(??????????, ???"???", ????; ??????????????)
-DarknetConnectionsToadlet.pasteReference=???????????:
+DarknetConnectionsToadlet.pasteReference=?????????:
 DarknetConnectionsToadlet.privateNote=???????????
 DarknetConnectionsToadlet.privateNoteTitle=????
 
DarknetConnectionsToadlet.referenceCopyWarning=???????${bold}????${/bold}??.??????${bold}????${/bold}.
@@ -244,7 +245,7 @@
 DarknetConnectionsToadlet.sendMessageTitle=?????????
 DarknetConnectionsToadlet.sendMessageToPeers=???????????????
 DarknetConnectionsToadlet.separator=? ? ?
-DarknetConnectionsToadlet.statusTitle=??
+DarknetConnectionsToadlet.statusTitle=??
 DarknetConnectionsToadlet.tmciDisabled=TMCI ???? (?? telnet ????????)
 DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (?? telnet ????????)
 DarknetConnectionsToadlet.tooNew=???????: ????????????????????.
@@ -255,19 +256,19 @@
 DarknetConnectionsToadlet.triedToAddSelf=????????????????.
 DarknetConnectionsToadlet.unknownAddress=(????)
 DarknetConnectionsToadlet.updateChangedPrivnotes=??????????
-DarknetConnectionsToadlet.urlReference=????????URL:
+DarknetConnectionsToadlet.urlReference=????????????URL:
 DarknetConnectionsToadlet.versionTitle=??
 ExtOldAgeUserAlert.extTooOld=?? freenet-ext.jar ?????????, 
???????????????????: http://downloads.freenetproject.org/alpha/freenet-ext.jar.
 ExtOldAgeUserAlert.extTooOldShort=?? freenet-ext.jar ?????. ?????.
 ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext ??
 FProxyToadlet.abortToHomepage=?????? FProxy ??
-FProxyToadlet.alerts=???????
-FProxyToadlet.alertsTitle=??
+FProxyToadlet.alerts=????????????????
+FProxyToadlet.alertsTitle=????
 FProxyToadlet.backToFProxy=${link}???${/link}?? FProxy ??.
 FProxyToadlet.backToReferrer=${link}???${/link}??????.
 FProxyToadlet.cantBindPort=Fproxy ???????????!
-FProxyToadlet.config=??/??????
-FProxyToadlet.configTitle=??
+FProxyToadlet.config=??????
+FProxyToadlet.configTitle=??
 FProxyToadlet.dangerousContentTitle=????????
 FProxyToadlet.dangerousRSS=Freenet ??????????????? RSS ??. Freenet ?????? RSS 
??, ?? RSS ?????????(?????????, ??????????????????, ????????). Firefox 2.0 ? 
Internet Explorer 7.0 ???????? RSS ????, ??????????? "${type}".
 FProxyToadlet.dangerousRSSSubtitle=RSS ??????????
@@ -281,8 +282,8 @@
 FProxyToadlet.fetchLargeFileAnywayAndDisplay=?????, ??????????????
 FProxyToadlet.fileInformationTitle=????
 FProxyToadlet.filenameLabel=??:
-FProxyToadlet.friends=??????
-FProxyToadlet.friendsTitle=??
+FProxyToadlet.friends=???????
+FProxyToadlet.friendsTitle=????
 FProxyToadlet.goBack=?????
 FProxyToadlet.goBackToPrev=?????
 FProxyToadlet.homepage=??
@@ -304,14 +305,14 @@
 FProxyToadlet.openRSSForce=${link}????${/link}?? ${mime} ??????(? IE7 ?? FF2 
?${bold}??????${/bold}).
 FProxyToadlet.openWithKeyExplorer=${link}???${/link}????????? Freenet URI.
 FProxyToadlet.opennet=????????
-FProxyToadlet.opennetTitle=???
+FProxyToadlet.opennetTitle=?????
 FProxyToadlet.options=?????:
 FProxyToadlet.pathNotFound=???????.
 FProxyToadlet.pathNotFoundTitle=???????
 FProxyToadlet.plugins=???????
 FProxyToadlet.pluginsTitle=????
 FProxyToadlet.queue=????????
-FProxyToadlet.queueTitle=??
+FProxyToadlet.queueTitle=?????
 FProxyToadlet.retryNow=????
 FProxyToadlet.sizeLabel=??:
 FProxyToadlet.sizeUnknown=??????
@@ -320,8 +321,8 @@
 FProxyToadlet.translationTitle=??
 FProxyToadlet.unableToRetrieve=Freenet ????????.
 FProxyToadlet.unknownMIMEType=MIME ??????
-FProxyToadlet.welcome=??
-FProxyToadlet.welcomeTitle=??
+FProxyToadlet.welcome=?? Freenet
+FProxyToadlet.welcomeTitle=?? Freenet
 FcpServer.allowedHosts=??????(????????)
 FcpServer.allowedHostsFullAccess=???????????
 FcpServer.allowedHostsFullAccessLong=???????????????. ??????????????????, 
??????. ??, ?????????????????!
@@ -436,27 +437,32 @@
 FirstTimeWizardToadlet.chooseNodeNameLong=?????????????(???????, 
????????????). ?????????(???????????????)???????????. 
???(???????????????)???????. ???, ????????????????????????????, ????????????, 
??????????????????.
 FirstTimeWizardToadlet.clickContinue=??????
 FirstTimeWizardToadlet.congratz=????????
-FirstTimeWizardToadlet.congratzLong=??, ??????????? Freenet ???. 
????"??"???????????????, ????????????????. ???, Freenet ?????????, ???????. 
?????????????? Freenet. ?????? Freenet ??????.
+FirstTimeWizardToadlet.congratzLong=???, ?? Freenet ????????????. 
????"??"??????????????, ????????????????. ???, Freenet ?????????, ???????. 
?????????????? Freenet. ?????? Freenet ??????.
 FirstTimeWizardToadlet.connectToStrangers=???????
-FirstTimeWizardToadlet.connectToStrangersLong=??????? Freenet 
???????????????????????????????????? Freenet??????????????? Freenet 
????????????????????????????????????
+FirstTimeWizardToadlet.connectToStrangersLong=?? Freenet ??, ??????????????. 
???????????????????????. ?????????? Freenet ???????, ?????????????????. ??, 
????????????????? Freenet, ?????????????. ????????? Freenet, ????????????.
 FirstTimeWizardToadlet.continue=??
 FirstTimeWizardToadlet.continueEnd=???????Freenet?
 FirstTimeWizardToadlet.datastoreSize=??????
 
FirstTimeWizardToadlet.datastoreSizeLong=???????????????????????????????????????????????????????????????????????????????????
-FirstTimeWizardToadlet.enableOpennet=????????? Freenet ??
+FirstTimeWizardToadlet.enableOpennet=????????????, ?????????????, 
??????????????????. Freenet ???????, ???????????????.
 FirstTimeWizardToadlet.fivePercentDisk=(? 5% ???????)
+FirstTimeWizardToadlet.friendsSecurityPageTitle=Freenet ????! - ??????
+FirstTimeWizardToadlet.highNetworkThreatLevelCheckbox=????????? Freenet ??(??? 
3 ?, ????????, ?? 5-10 ?). ????/?????????. ?????????? Freenet ????.
+FirstTimeWizardToadlet.highNetworkThreatLevelWarning=${bold}??${/bold}: 
???????????????. ????${bold}????????${/bold}?????? Freenet. ??????????, 
?????/???????. ??????????? Freenet ??, ???????, Freenet ???????. 
???????????????????, ????????. ????, ????????????, ???????????????.(???????? 
5-10 ???)
 FirstTimeWizardToadlet.homepageTitle=Freenet ???????
 FirstTimeWizardToadlet.iDoTrust=???????? ${interface} (${ip}) ????
 FirstTimeWizardToadlet.isNetworkTrusted=???????????
-FirstTimeWizardToadlet.isNetworkTrustedLong=????????????? ??????, 
??????????????????????????????. ??????????, ????????????????????.
+FirstTimeWizardToadlet.isNetworkTrustedLong=????????????? ??????, 
??????????????????????????????. ??????????, ????????????????????.
 FirstTimeWizardToadlet.memoryLimit=??????
 FirstTimeWizardToadlet.memoryLimitLong=???? Freenet 
????????????????????/???Freenet ??????????????????????????????????????? 128MB 
??????? 1GB ????????????? 256MB??????????? Freenet ?????
+FirstTimeWizardToadlet.networkSecurityPageTitle=Freenet ????! - ??????
 FirstTimeWizardToadlet.noNetworkIF=?????????
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet ??????????????????????? Freenet?
-FirstTimeWizardToadlet.opennetNo=???????????????? Freenet ???????????????????
+FirstTimeWizardToadlet.opennetNo=????????????? Freenet ?, ????????????????.
 FirstTimeWizardToadlet.opennetWarning=?? Freenet ?????????????????? Freenet 
?????????????????????????????????????????????Freenet ??????????????????????
-FirstTimeWizardToadlet.opennetYes=???????????????????
-FirstTimeWizardToadlet.skipWizard=??????????????
+FirstTimeWizardToadlet.opennetYes=??????????????????
+FirstTimeWizardToadlet.physicalSecurityPageTitle=Freenet ????! - ??????
+FirstTimeWizardToadlet.skipWizard=????????(??????).
 FirstTimeWizardToadlet.step1Title=Freenet ??????? - ??????
 FirstTimeWizardToadlet.step2Title=Freenet ??????! - ??????
 FirstTimeWizardToadlet.step3Title=Freenet ?????? - ????
@@ -497,9 +503,9 @@
 IPDetectorPluginManager.direct=????????????????. ??, ????????????? Freenet ??.
 IPDetectorPluginManager.directTitle=???????????
 IPDetectorPluginManager.forwardPortMaybeForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ??? ${port}, ???????. ??????????; 
Freenet ?????????????. ????????${link}??${/link}.
-IPDetectorPluginManager.forwardPortNotForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ??? ${port}, ???????. ????????????, 
?? Freenet ????. ????????${link}??${/link}.
+IPDetectorPluginManager.forwardPortNotForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ??? ${port}, ???????. 
??????????????, ?? Freenet ????. ????????${link}??${/link}. Freenet ?????? 24 
?????????????????????.
 IPDetectorPluginManager.forwardPortShortMaybeForwarded=?? UDP ? ${port} ???? 
(?????????).
-IPDetectorPluginManager.forwardPortShortNotForwarded=?? UDP ? ${port} ???? 
(???????).
+IPDetectorPluginManager.forwardPortShortNotForwarded=?? UDP ? ${port} ???? 
(????????).
 IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ??? ${port1} ? ${port2}, ???????. 
??????????; Freenet ?????????????. ????????${link}??${/link}.
 IPDetectorPluginManager.forwardTwoPortsNotForwarded=?????????????????(NAT, 
????????)??. ??????, ???????? UDP (?? TCP) ??? ${port1} ? ${port2}, ???????. 
????????????, ?? Freenet ????. ????????${link}??${/link}.
 IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=?? UDP ? ${port1} ? 
${port2} ???? (?????????).
@@ -622,7 +628,7 @@
 N2NTMToadlet.returnToFriends=??????
 N2NTMToadlet.sendMessage=?????????
 N2NTMToadlet.sendMessageShort=????
-N2NTMToadlet.sendStatus=??????
+N2NTMToadlet.sendStatus=??????
 N2NTMToadlet.sent=????????
 N2NTMToadlet.sentTitle=???
 N2NTMToadlet.tooLong=?????????? 1024 ?????
@@ -658,6 +664,8 @@
 Node.dropPacketEveryLong=???????. ???????????, ????????. 0 ??????????. ???????!
 Node.enableARKs=?? ARKs? (????!)
 Node.enableARKsLong=???? ARKs? (??????!).
+Node.enableOpennetFailed=????????(opennet)??, ??????????. ??????, 
?????,??????????. ???: ${message}
+Node.enableOpennetFailedTitle=????????
 Node.enablePacketCoalescing=???????
 Node.enablePacketCoalescingLong=?????????? ??????????????, ?? CPU ???, 
?????????????, ??????????????. ???????????, ??????.
 Node.enablePerNodeFailureTables=??????????????
@@ -671,8 +679,8 @@
 Node.errorApplyingConfig=??????????? : ${error}
 Node.extraPeerDir=????????
 Node.extraPeerDirLong=??????????????
-Node.forceBigShrink=????????
-Node.forceBigShrinkLong=?????????(?? 10%)???????(????????????). 
??????????????????, ?????????; ?????????????????.
+Node.forceBigShrink=????????(?????? bdbje-index ??)
+Node.forceBigShrinkLong=?????????(?? 10%)???????(????????????). 
??????????????????, ?????????; ?????????????????. ?????? bdbje-index ?????.
 Node.inBWLimit=?????????????
 Node.inBWLimitLong=????????????????; ??????????????; ?? -1 ?????????
 Node.invalidStoreSize=????????? 32MB
@@ -708,13 +716,17 @@
 Node.publishOurPeersLocationLong=??????????????? ??????????, ?????????????????.
 Node.routeAccordingToOurPeersLocation=???????????????????????????
 Node.routeAccordingToOurPeersLocationLong=??????????????????????????? 
??????????, ???????????.
+Node.storeBloomFilterCounting=???????????
+Node.storeBloomFilterCountingLong=????????????????? (???????????, ??????)
+Node.storeBloomFilterSize=?????(??)?????
+Node.storeBloomFilterSizeLong=?????(??)?????. ???????????? 2048 ?? 1 ??????. 
??? 0 ?????. ??? -1 ???????.
 Node.storeDirectory=????
 Node.storeDirectoryLong=???????????
 Node.storeMaxMemTooHigh=????????? 80% ????? BDB ???!
 Node.storeSize=?????????
 Node.storeSizeLong=?????????
 Node.storeType=????(????)
-Node.storeTypeLong=??????. ????? bdb-index ?? ram (bdb-index ? 
BerkeleyDBFreenetStore ?????, ??????????????; ram ???????????????). 
?????????????, ??????????????????, ??? ram (??????????????)!
+Node.storeTypeLong=??????. ????? salt-hash (???! ???????????????, ?????????), 
bdb-index (????! ???? BerkeleyDBFreenetStore ??????, ?????????????), ?? ram 
(????! ?????????????). ?????????????, ??????????????????, ??? ram 
(??????????????)! ????? Freenet ???, ??????.
 Node.swapRInterval=???????????(??)
 Node.swapRIntervalLong=?????????????, ?????. ????!
 Node.throttleLocalTraffic=???????
@@ -804,18 +816,18 @@
 NotEnoughNiceLevelsUserAlert.short=???????????! ?????????????? Freenet.
 NotEnoughNiceLevelsUserAlert.title=???????????!
 OpennetConnectionsToadlet.fullTitle=${name} ? ${counts} ????(??????)
-OpennetConnectionsToadlet.peersListTitle=??????????(??????????????????)
+OpennetConnectionsToadlet.peersListTitle=??????????(???????????????????)
 OpennetConnectionsToadlet.successTime=?????????????? CHK ???
 OpennetConnectionsToadlet.successTimeTitle=??????
-OpennetUserAlert.warning=Freenet ????????????. ????????????? Freenet, 
?????????????. ???????????????, ????????????????????, ????????????. ????? 10 
???????(??????????????, ???????????????), ???????????, ?? Freenet 
????????????????.
+OpennetUserAlert.warning=Freenet ????????????. ????????????? Freenet, 
?????????????. ???????????????, ????????????????????, ????????????. ????? 5 ? 
10 ???????(??????????????, ???????????????), ???????????, ?? Freenet 
????????????????.
 OpennetUserAlert.warningShort=????????.
 OpennetUserAlert.warningTitle=??: ????????: ??????????
 PNGFilter.invalidHeader=????????????? PNG ?, ?????????? PNG ??. ???????????, 
?????????????????, ?????????.
 PNGFilter.invalidHeaderTitle=??? PNG - ??????
-PageMaker.modeAdvanced=??????
-PageMaker.modeAdvancedTooltip=????? Freenet ???????????????????
-PageMaker.modeSimple=??????
-PageMaker.modeSimpleTooltip=??????????????
+PageMaker.modeAdvanced=??????
+PageMaker.modeAdvancedTooltip=????? Freenet ???????????????????
+PageMaker.modeSimple=??????
+PageMaker.modeSimpleTooltip=??????????????
 PeerManagerUserAlert.clockProblem=??? ${count} ???????, ??????????????? 24 
????. ?????????????. ??????????????????????????.
 PeerManagerUserAlert.clockProblemTitle=????
 PeerManagerUserAlert.connError=? ${count} ??????????????, ???????????, 
???????????.
@@ -923,7 +935,7 @@
 PproxyToadlet.returnToPluginPage=????????
 PproxyToadlet.startedAtTitle=????
 PproxyToadlet.startingPluginName=????
-PproxyToadlet.startingPluginStatus=????
+PproxyToadlet.startingPluginStatus=????
 PproxyToadlet.startingPluginTime=????
 PproxyToadlet.startingPluginsTitle=?????
 PproxyToadlet.unauthorized=??????????.
@@ -981,10 +993,10 @@
 QueueToadlet.fileName=??
 QueueToadlet.files=??
 QueueToadlet.follow=????
-QueueToadlet.globalQueueIsEmpty=?????????
+QueueToadlet.globalQueueIsEmpty=??????????????????
 QueueToadlet.identifier=???
 QueueToadlet.insertAs=???:
-QueueToadlet.insertFile=????
+QueueToadlet.insertFile=????? Freenet
 QueueToadlet.insertFileBrowseLabel=?????????
 QueueToadlet.insertFileCompressLabel=??
 QueueToadlet.insertFileInsertFileLabel=????
@@ -1024,7 +1036,7 @@
 QueueToadlet.siteUploadSucceededTitle=Freesite ????: ${filename}
 QueueToadlet.size=??
 QueueToadlet.starting=???
-QueueToadlet.title=${nodeName}?????
+QueueToadlet.title=${nodeName}????????
 QueueToadlet.totalSize=????
 QueueToadlet.unknown=??
 QueueToadlet.uploadProgressbarNotAccurate=????????????????????????
@@ -1053,6 +1065,66 @@
 SSL.keyStorePassLong=????????
 SSL.version=SSL ??
 SSL.versionLong=SSL ??, ????? SSLv3 ?? TLSv1 (???? SSLv3)
+SaltedHashFreenetStore.cleanerAlertTitle=????????????
+SaltedHashFreenetStore.longRebuildProgress=????(${name})???????: 
${processed}/${total}. ????????????????. ????????????.
+SaltedHashFreenetStore.longResizeProgress=????(${name})???????: 
${processed}/${total}. ????????????????. ????????????.
+SaltedHashFreenetStore.shortRebuildProgress=????(${name})???????: 
${processed}/${total}
+SaltedHashFreenetStore.shortResizeProgress=????(${name})???????: 
${processed}/${total}
+SecurityLevels.fewConnectedFriendsCheckbox=???, ????????, ??/??????????, 
???????????????? Freenet ???.
+SecurityLevels.fewConnectedFriendsWarning=????? ${connected} ??????, ????? 
${added} ???????. ????????????????????, Freenet ??????????, ?????????. 
??????????????, ????????? Freenet. ???, ?????????????, ???????/??????, 
??????????. ????????? 5-10 ??????, ????????. ?????????
+SecurityLevels.friendsThreatLevel=???????????????????????, 
???????????????????? (?????????????, ????????????????.) ?????????????????, 
???????????????????????.
+SecurityLevels.friendsThreatLevelConfirmTitle=??: ?????????${mode}
+SecurityLevels.friendsThreatLevelShort=???????????????
+SecurityLevels.highFriendsThreatLevelCheckbox=???????????????????.
+SecurityLevels.highFriendsThreatLevelWarning=???????????????. ???? Freenet 
???, ????????????. ????????????, ???????????????????, ???????????, 
??????????????????. ????, ???????????????????, ???????????????, ??????????????.
+SecurityLevels.maxSecurityYouNeedFriends=${bold}????????????? Freenet 
??${/bold}, ???? 3 ?, ????????, ?? 5-10 ?. ?????????????. ?/??????????, 
??????????.
+SecurityLevels.maximumNetworkThreatLevelCheckbox=??, ???????????. ??? Freenet 
??????, ?????????????, ???????????? Freenet ???!
+SecurityLevels.maximumNetworkThreatLevelWarning=${bold}??:${/bold} 
???????????????! ????? Freenet ${bold}??????${/bold}! ????????, ????????!
+SecurityLevels.networkThreatLevel=??????????, ???????????, ??, ??, 
????????????????? Freenet ?????
+SecurityLevels.networkThreatLevelConfirmTitle=??: ?????????${mode}
+SecurityLevels.networkThreatLevelLowCheckbox=???, ???????, ???????????? 
Freenet ????!
+SecurityLevels.networkThreatLevelLowWarning=??????????????????. 
???????????????????. ?????????
+SecurityLevels.networkThreatLevelShort=??????????????
+SecurityLevels.noConnectedFriendsCheckbox=???, ????????, 
??/??????????????????, ????? Freenet.
+SecurityLevels.noConnectedFriendsWarning=??????????, ?????????? ${added} ??. 
????????????????????, ??????????????? Freenet, ????????. ????????????, 
???????????? Freenet, ?????????????. ???, ??????????, ?????/???????, 
???????????. ???????????? 5-10 ??????, ????????. ?????????
+SecurityLevels.noFriendsCheckbox=???, ???????????, ???????????.
+SecurityLevels.noFriendsWarning=??????????. ???????????????????, 
?????????????, ?????? Freenet! ???, ??????????, ?????/???????, ???????????. 
???????????? 5-10 ??????, ????????. ?????????
+SecurityLevels.physicalThreatLevel=???????????????????
+SecurityLevels.physicalThreatLevelShort=?????????????????
+SecurityLevels.title=????
+SecurityLevels.tooltip=?????????
+SecurityLevels.userAlertExtro=????${link}????${/link}??????.
+SecurityLevels.userAlertFriendsThreatLevel=??????????????: ${level}
+SecurityLevels.userAlertNetworkThreatLevel=????????????????: ${level}
+SecurityLevels.userAlertPhysicalThreatLevel=??????????????: ${level}
+SecurityLevels.userAlertShortText=????: ??: ${network}, ??: ${friends}, ??: 
${physical}
+SecurityLevels.friendsThreatLevel.choice.HIGH=??? Freenet ???????????.
+SecurityLevels.friendsThreatLevel.choice.LOW=??????????. ?????????/?????????.
+SecurityLevels.friendsThreatLevel.choice.NORMAL=????????????, ???? Freenet 
?????????.
+SecurityLevels.friendsThreatLevel.desc.HIGH=Freenet ??????????, 
????????????????.
+SecurityLevels.friendsThreatLevel.desc.LOW=Freenet ???????????????????.
+SecurityLevels.friendsThreatLevel.desc.NORMAL=Freenet ???????????, 
?????????????.
+SecurityLevels.friendsThreatLevel.name.HIGH=??
+SecurityLevels.friendsThreatLevel.name.LOW=??
+SecurityLevels.friendsThreatLevel.name.NORMAL=???
+SecurityLevels.networkThreatLevel.choice.HIGH=?????????????, ??????????????? 
Freenet.
+SecurityLevels.networkThreatLevel.choice.LOW=???????????????.
+SecurityLevels.networkThreatLevel.choice.MAXIMUM=?????????????, ??, ?????????. 
??? Freenet ??????, ??????????????????, ??????????????????.
+SecurityLevels.networkThreatLevel.choice.NORMAL=???????????, ???????????????.
+SecurityLevels.networkThreatLevel.desc.HIGH=Freenet ??????????????, 
??${bold}?????? Freenet ???????????${/bold}. ??????? 5-10 ???, ?? Freenet 
??????; ?????????????, ???????.
+SecurityLevels.networkThreatLevel.desc.LOW=???????????????!
+SecurityLevels.networkThreatLevel.desc.MAXIMUM=?????? Freenet 
?????????${bold}?????${/bold}, ??${bold}?????? Freenet ???????????${/bold}.
+SecurityLevels.networkThreatLevel.desc.NORMAL=Freenet ??????????, ???????. 
Freenet ???????????. ?????????? Freenet ???????, ???????????.
+SecurityLevels.networkThreatLevel.name.HIGH=??
+SecurityLevels.networkThreatLevel.name.LOW=??
+SecurityLevels.networkThreatLevel.name.MAXIMUM=???
+SecurityLevels.networkThreatLevel.name.NORMAL=???
+SecurityLevels.physicalThreatLevel.choice.LOW=????.
+SecurityLevels.physicalThreatLevel.choice.NORMAL=????.
+SecurityLevels.physicalThreatLevel.desc.LOW=Freenet ??????????, 
??????????????, ?????????????????????.
+SecurityLevels.physicalThreatLevel.desc.NORMAL=Freenet ???????, ????????; 
??????????????, ???????????, ???????????. ????????????(???????????), ?????? 
Freenet ?????????????.
+SecurityLevels.physicalThreatLevel.name.LOW=??
+SecurityLevels.physicalThreatLevel.name.NORMAL=???
 ShortOption.parseError=???????????????: ${error}
 SimpleToadletServer.advancedMode=?????????
 SimpleToadletServer.advancedModeLong=????????????????????. ???????????.
@@ -1099,7 +1171,7 @@
 StatisticsToadlet.ackOnlyBytes=???????: ${total}
 StatisticsToadlet.activityInserts=??: ?? ${totalSenders} ????, ${CHKhandlers} 
? CHK ???, ${SSKhandlers} ? SSK ???
 StatisticsToadlet.activityRequests=??: ?? ${totalSenders} ????, ${CHKhandlers} 
? CHK ???, ${SSKhandlers} ? SSK ???
-StatisticsToadlet.adminBytes=?????: ${initial} ?????, ${changedIP} ?????????, 
${disconn} ?????, ${routingStatus} ???????
+StatisticsToadlet.adminBytes=?????: ${initial} ?????, ${changedIP} ?????????, 
${disconn} ?????, ${routingStatus} ???????
 StatisticsToadlet.allocMemory=Java ???????: ${memory}
 StatisticsToadlet.announceBytes=????: ${total}
 StatisticsToadlet.authBytes=????: ?? ${total}
@@ -1253,9 +1325,9 @@
 UserAlertManager.minorCountLabel=??:
 UserAlertManager.totalLabel=??:
 UserAlertManager.warningCountLabel=??:
-UserAlertsToadlet.titleWithName=${name} ?????
+UserAlertsToadlet.titleWithName=${name} ?????
 WelcomeToadlet.activityTitle=????
-WelcomeToadlet.alertsSummary=??????
+WelcomeToadlet.alertsSummary=??????(??????????????)
 WelcomeToadlet.arkFetchCount=ARK???: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=??????
 WelcomeToadlet.confirmAddBookmarkTitle=????

Modified: branches/db4o/freenet/src/freenet/node/AnnounceSender.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/AnnounceSender.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/AnnounceSender.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -83,7 +83,7 @@
                boolean hasForwarded = false;
                if(source != null) {
                        try {
-                               source.sendAsync(DMT.createFNPAccepted(uid), 
null, 0, this);
+                               source.sendAsync(DMT.createFNPAccepted(uid), 
null, this);
                        } catch (NotConnectedException e) {
                                return;
                        }
@@ -92,7 +92,7 @@

                // Now route it.

-        HashSet nodesRoutedTo = new HashSet();
+        HashSet<PeerNode> nodesRoutedTo = new HashSet<PeerNode>();
        PeerNode next = null;
         while(true) {
             if(logMINOR) Logger.minor(this, "htl="+htl);
@@ -414,7 +414,7 @@
                Message msg = DMT.createFNPRejectedOverload(uid, true);
                if(source != null) {
                        try {
-                               source.sendAsync(msg, null, 0, this);
+                               source.sendAsync(msg, null, this);
                        } catch (NotConnectedException e) {
                                // Ok
                        }
@@ -426,7 +426,7 @@
                Message msg = DMT.createFNPRouteNotFound(uid, htl);
                if(source != null) {
                        try {
-                               source.sendAsync(msg, null, 0, this);
+                               source.sendAsync(msg, null, this);
                        } catch (NotConnectedException e) {
                                // Ok
                        }
@@ -441,7 +441,7 @@
                Message msg = DMT.createFNPOpennetAnnounceCompleted(uid);
                if(source != null) {
                        try {
-                               source.sendAsync(msg, null, 0, this);
+                               source.sendAsync(msg, null, this);
                        } catch (NotConnectedException e) {
                                // Oh well.
                        }
@@ -495,7 +495,7 @@

        private void sendNotWanted() throws NotConnectedException {
                Message msg = DMT.createFNPOpennetAnnounceNodeNotWanted(uid);
-               source.sendAsync(msg, null, 0, this);
+               source.sendAsync(msg, null, this);
        }

        private void sendOurRef(PeerNode next, byte[] ref) throws 
NotConnectedException {

Modified: branches/db4o/freenet/src/freenet/node/Announcer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Announcer.java       2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/Announcer.java       2008-09-26 
16:35:23 UTC (rev 22845)
@@ -51,16 +51,16 @@
        /** After we have sent 3 announcements, wait for 30 seconds before 
sending 3 more if we still have no connections. */
        static final int COOLING_OFF_PERIOD = 30*1000;
        /** Identities of nodes we have announced to */
-       private final HashSet announcedToIdentities;
+       private final HashSet<ByteArrayWrapper> announcedToIdentities;
        /** IPs of nodes we have announced to. Maybe this should be 
first-two-bytes, but I'm not sure how to do that with IPv6. */
-       private final HashSet announcedToIPs;
+       private final HashSet<InetAddress> announcedToIPs;
        /** How many nodes to connect to at once? */
        static final int CONNECT_AT_ONCE = 15;
        /** Do not announce if there are more than this many opennet peers 
connected */
        private static final int MIN_OPENNET_CONNECTED_PEERS = 10;
        private static final long NOT_ALL_CONNECTED_DELAY = 60*1000;
        /** Identities of nodes we have tried to connect to */
-       private final HashSet connectedToIdentities;
+       private final HashSet<ByteArrayWrapper> connectedToIdentities;
        /** Total nodes added by announcement so far */
        private int announcementAddedNodes;
        /** Total nodes that didn't want us so far */
@@ -69,9 +69,9 @@
        Announcer(OpennetManager om) {
                this.om = om;
                this.node = om.node;
-               announcedToIdentities = new HashSet();
-               announcedToIPs = new HashSet();
-               connectedToIdentities = new HashSet();
+               announcedToIdentities = new HashSet<ByteArrayWrapper>();
+               announcedToIPs = new HashSet<InetAddress>();
+               connectedToIdentities = new HashSet<ByteArrayWrapper>();
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
        }

@@ -222,7 +222,7 @@

        public static Vector readSeednodes(File nodeDir) {
                File file = new File(nodeDir, "seednodes.fref");
-               Vector list = new Vector();
+               Vector<SimpleFieldSet> list = new Vector<SimpleFieldSet>();
                FileInputStream fis = null;
                try {
                        fis = new FileInputStream(file);

Modified: branches/db4o/freenet/src/freenet/node/CHKInsertHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/CHKInsertHandler.java        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/CHKInsertHandler.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -113,9 +113,9 @@
                        if(source.isConnected() && (startTime > 
(source.timeLastConnectionCompleted()+Node.HANDSHAKE_TIMEOUT*4)))
                                Logger.error(this, "Did not receive DataInsert 
on "+uid+" from "+source+" !");
                        Message tooSlow = DMT.createFNPRejectedTimeout(uid);
-                       source.sendAsync(tooSlow, null, 0, this);
+                       source.sendAsync(tooSlow, null, this);
                        Message m = DMT.createFNPInsertTransfersCompleted(uid, 
true);
-                       source.sendAsync(m, null, 0, this);
+                       source.sendAsync(m, null, this);
                        prb = new PartiallyReceivedBlock(Node.PACKETS_IN_BLOCK, 
Node.PACKET_SIZE);
                        br = new BlockReceiver(node.usm, source, uid, prb, 
this);
                        prb.abort(RetrievalException.NO_DATAINSERT, "No 
DataInsert");
@@ -384,7 +384,7 @@
         }
         if(toSend != null) {
             try {
-                source.sendAsync(toSend, null, 0, this);
+                source.sendAsync(toSend, null, this);
             } catch (NotConnectedException e) {
                 // :(
                if(logMINOR) Logger.minor(this, "Lost connection in "+this+" 
when sending FNPDataInsertRejected");

Modified: branches/db4o/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/CHKInsertSender.java 2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/CHKInsertSender.java 2008-09-26 
16:35:23 UTC (rev 22845)
@@ -179,7 +179,7 @@
         this.prb = prb;
         this.fromStore = fromStore;
         this.startTime = System.currentTimeMillis();
-        this.backgroundTransfers = new Vector();
+        this.backgroundTransfers = new Vector<BackgroundTransfer>();
         logMINOR = Logger.shouldLog(Logger.MINOR, this);
     }

@@ -210,7 +210,7 @@

     /** List of nodes we are waiting for either a transfer completion
      * notice or a transfer completion from. Also used as a sync object for 
waiting for transfer completion. */
-    private Vector backgroundTransfers;
+    private Vector<BackgroundTransfer> backgroundTransfers;

     /** Have all transfers completed and all nodes reported completion status? 
*/
     private boolean allTransfersCompleted;
@@ -268,7 +268,7 @@
     }

     private void realRun() {
-        HashSet nodesRoutedTo = new HashSet();
+        HashSet<PeerNode> nodesRoutedTo = new HashSet<PeerNode>();

         PeerNode next = null;
         while(true) {
@@ -339,7 +339,7 @@
                                   ACCEPTED_TIMEOUT, using sendAsync() will 
skip them before they get the request. This would be a need for retuning
                                   ACCEPTED_TIMEOUT.
                                 */
-                               next.sendAsync(req, null, 0, this);
+                               next.sendAsync(req, null, this);
                        } catch (NotConnectedException e1) {
                                if(logMINOR) Logger.minor(this, "Not connected 
to "+next);
                                continue;

Modified: branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java 2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/DarknetPeerNode.java 2008-09-26 
16:35:23 UTC (rev 22845)
@@ -68,7 +68,7 @@
        private boolean allowLocalAddresses;

        /** Extra peer data file numbers */
-       private LinkedHashSet extraPeerDataFileNumbers;
+       private LinkedHashSet<Integer> extraPeerDataFileNumbers;

        /** Private comment on the peer for /friends/ page */
        private String privateDarknetComment;
@@ -77,7 +77,7 @@
        private int privateDarknetCommentFileNumber;

        /** Queued-to-send N2NM extra peer data file numbers */
-       private LinkedHashSet queuedToSendN2NMExtraPeerDataFileNumbers;
+       private LinkedHashSet<Integer> queuedToSendN2NMExtraPeerDataFileNumbers;

        private static boolean logMINOR;

@@ -111,10 +111,10 @@
                privateDarknetCommentFileNumber = -1;

                // Setup the extraPeerDataFileNumbers
-               extraPeerDataFileNumbers = new LinkedHashSet();
+               extraPeerDataFileNumbers = new LinkedHashSet<Integer>();

                // Setup the queuedToSendN2NMExtraPeerDataFileNumbers
-               queuedToSendN2NMExtraPeerDataFileNumbers = new LinkedHashSet();
+               queuedToSendN2NMExtraPeerDataFileNumbers = new 
LinkedHashSet<Integer>();

        }

@@ -303,7 +303,7 @@
                if(localRequest) {
                        Message msg = DMT.createRoutingStatus(shouldRoute);
                        try {
-                               sendAsync(msg, null, 0, 
node.nodeStats.setRoutingStatusCtr);
+                               sendAsync(msg, null, 
node.nodeStats.setRoutingStatusCtr);
                        } catch(NotConnectedException e) {
                        // ok
                        }
@@ -1333,7 +1333,7 @@
                                        Node.N2N_MESSAGE_TYPE_FPROXY, fs
                                                        
.toString().getBytes("UTF-8"));
                        try {
-                               sendAsync(n2ntm, null, 0, 
node.nodeStats.nodeToNodeCounter);
+                               sendAsync(n2ntm, null, 
node.nodeStats.nodeToNodeCounter);
                        } catch (NotConnectedException e) {
                                fs.removeValue("sentTime");
                                queueN2NM(fs);
@@ -1367,7 +1367,7 @@
                                        Node.N2N_MESSAGE_TYPE_FPROXY, fs
                                                        
.toString().getBytes("UTF-8"));
                        try {
-                               sendAsync(n2ntm, null, 0, 
node.nodeStats.nodeToNodeCounter);
+                               sendAsync(n2ntm, null, 
node.nodeStats.nodeToNodeCounter);
                        } catch (NotConnectedException e) {
                                fs.removeValue("sentTime");
                                queueN2NM(fs);
@@ -1410,7 +1410,7 @@
                                        Node.N2N_MESSAGE_TYPE_FPROXY, fs
                                                        
.toString().getBytes("UTF-8"));
                        try {
-                               sendAsync(n2ntm, null, 0, 
node.nodeStats.nodeToNodeCounter);
+                               sendAsync(n2ntm, null, 
node.nodeStats.nodeToNodeCounter);
                        } catch (NotConnectedException e) {
                                fs.removeValue("sentTime");
                                queueN2NM(fs);
@@ -1506,7 +1506,7 @@
                if(fo == null) {
                        Logger.error(this, "No such offer: "+uid);
                        try {
-                               sendAsync(DMT.createFNPBulkSendAborted(uid), 
null, 0, node.nodeStats.nodeToNodeCounter);
+                               sendAsync(DMT.createFNPBulkSendAborted(uid), 
null, node.nodeStats.nodeToNodeCounter);
                        } catch (NotConnectedException e) {
                                // Fine by me!
                        }

Modified: branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -1133,7 +1133,7 @@

                // construct the peernode
                if(unknownInitiator) {
-                       pn = getPeerNodeFromUnknownInitiator(hisRef, setupType, 
pn);
+                       pn = getPeerNodeFromUnknownInitiator(hisRef, setupType, 
pn, replyTo);
                }
                if(pn == null) {
                        if(unknownInitiator)
@@ -1189,7 +1189,7 @@
                        Logger.error(this,"Message3 Processing packet 
for"+pn.getPeer()+" took "+TimeUtil.formatTime(t2-t1, 3, true));
        }

-       private PeerNode getPeerNodeFromUnknownInitiator(byte[] hisRef, int 
setupType, PeerNode pn) {
+       private PeerNode getPeerNodeFromUnknownInitiator(byte[] hisRef, int 
setupType, PeerNode pn, Peer from) {
                if(setupType == SETUP_OPENNET_SEEDNODE) {
                        OpennetManager om = node.getOpennet();
                        if(om == null) {
@@ -1207,13 +1207,13 @@
                        try {
                                seed = new SeedClientPeerNode(ref, node, 
crypto, node.peers, false, true, crypto.packetMangler);
                        } catch (FSParseException e) {
-                               Logger.error(this, "Invalid seed client 
noderef: "+e, e);
+                               Logger.error(this, "Invalid seed client 
noderef: "+e+" from "+from, e);
                                return null;
                        } catch (PeerParseException e) {
-                               Logger.error(this, "Invalid seed client 
noderef: "+e, e);
+                               Logger.error(this, "Invalid seed client 
noderef: "+e+" from "+from, e);
                                return null;
                        } catch (ReferenceSignatureVerificationException e) {
-                               Logger.error(this, "Invalid seed client 
noderef: "+e, e);
+                               Logger.error(this, "Invalid seed client 
noderef: "+e+" from "+from, e);
                                return null;
                        }
                        if(seed.equals(pn)) {
@@ -1667,13 +1667,13 @@
                System.arraycopy(random, 0, data, 
hash.length+iv.length+2+output.length, random.length);
                node.nodeStats.reportAuthBytes(data.length + 
sock.getHeadersLength());
                try {
-                       sendPacket(data, replyTo, pn, 0);
+                       sendPacket(data, replyTo, pn);
                } catch (LocalAddressException e) {
                        Logger.error(this, "Tried to send auth packet to local 
address: "+replyTo+" for "+pn+" - maybe you should set allowLocalAddresses for 
this peer??");
                }
        }

-       private void sendPacket(byte[] data, Peer replyTo, PeerNode pn, int 
alreadyReportedBytes) throws LocalAddressException {
+       private void sendPacket(byte[] data, Peer replyTo, PeerNode pn) throws 
LocalAddressException {
                if(pn != null) {
                        if(pn.isIgnoreSource()) {
                                Peer p = pn.getPeer();
@@ -1684,13 +1684,7 @@
                if(pn != null)
                        pn.reportOutgoingPacket(data, 0, data.length, 
System.currentTimeMillis());
                if(PeerNode.shouldThrottle(replyTo, node)) {
-                       int reportableBytes = data.length - 
alreadyReportedBytes;
-                       if(reportableBytes <= 0) {
-                               Logger.error(this, "alreadyReportedBytes 
("+alreadyReportedBytes+")> data.length ("+data.length+")");
-                               reportableBytes = 0;
-                       }
-                       if(reportableBytes > 0)
-                               node.outputThrottle.forceGrab(reportableBytes);
+                       node.outputThrottle.forceGrab(data.length);
                }
        }

@@ -2000,14 +1994,13 @@
        /* (non-Javadoc)
         * @see 
freenet.node.OutgoingPacketMangler#processOutgoingOrRequeue(freenet.node.MessageItem[],
 freenet.node.PeerNode, boolean, boolean)
         */
-       public void processOutgoingOrRequeue(MessageItem[] messages, PeerNode 
pn, boolean neverWaitForPacketNumber, boolean dontRequeue) {
+       public void processOutgoingOrRequeue(MessageItem[] messages, PeerNode 
pn, boolean neverWaitForPacketNumber, boolean dontRequeue, boolean onePacket) {
                String requeueLogString = "";
                if(!dontRequeue) {
                        requeueLogString = ", requeueing";
                }
                if(logMINOR) Logger.minor(this, "processOutgoingOrRequeue 
"+messages.length+" messages for "+pn+" ("+neverWaitForPacketNumber+ ')');
                byte[][] messageData = new byte[messages.length][];
-               int[] alreadyReported = new int[messages.length];
                MessageItem[] newMsgs = new MessageItem[messages.length];
                KeyTracker kt = pn.getCurrentKeyTracker();
                if(kt == null) {
@@ -2022,13 +2015,13 @@
                for(int i=0;i<messageData.length;i++) {
                        MessageItem mi = messages[i];
                        if(logMINOR) Logger.minor(this, "Handling 
"+(mi.formatted ? "formatted " : "") + 
-                                       "MessageItem "+mi+" : 
"+mi.getData(pn).length);
+                                       "MessageItem "+mi+" : "+mi.getLength());
                        mi_name = (mi.msg == null ? "(not a Message)" : 
mi.msg.getSpec().getName());
                        if(mi.formatted) {
                                try {
-                                       byte[] buf = mi.getData(pn);
+                                       byte[] buf = mi.getData();
                                        int packetNumber = 
kt.allocateOutgoingPacketNumberNeverBlock();
-                                       int size = 
processOutgoingPreformatted(buf, 0, buf.length, kt, packetNumber, mi.cb, 
mi.alreadyReportedBytes, mi.getPriority());
+                                       int size = 
processOutgoingPreformatted(buf, 0, buf.length, kt, packetNumber, mi.cb, 
mi.getPriority());
                                        //MARK: onSent()
                                        mi.onSent(size);
                                } catch (NotConnectedException e) {
@@ -2065,17 +2058,16 @@
                                        return;
                                }
                        } else {
-                               byte[] data = mi.getData(pn);
+                               byte[] data = mi.getData();
                                messageData[x] = data;
                                if(data.length > sock.getMaxPacketSize()) {
                                        Logger.error(this, "Message exceeds 
packet size: "+messages[i]+" size "+data.length+" message "+mi.msg);
                                        // Will be handled later
                                }
                                newMsgs[x] = mi;
-                               alreadyReported[x] = mi.alreadyReportedBytes;
                                x++;
                                if(mi.cb != null) callbacksCount += 
mi.cb.length;
-                               if(logMINOR) Logger.minor(this, "Sending: 
"+mi+" length "+data.length+" cb "+ Arrays.toString(mi.cb)+" reported 
"+mi.alreadyReportedBytes);
+                               if(logMINOR) Logger.minor(this, "Sending: 
"+mi+" length "+data.length+" cb "+ Arrays.toString(mi.cb));
                                length += (data.length + 2);
                        }
                }
@@ -2090,12 +2082,10 @@
                }
                AsyncMessageCallback callbacks[] = new 
AsyncMessageCallback[callbacksCount];
                x=0;
-               int alreadyReportedBytes = 0;
                short priority = DMT.PRIORITY_BULK_DATA;
                for(int i=0;i<messages.length;i++) {
                        if(messages[i].formatted) continue;
                        if(messages[i].cb != null) {
-                               alreadyReportedBytes += 
messages[i].alreadyReportedBytes;
                                System.arraycopy(messages[i].cb, 0, callbacks, 
x, messages[i].cb.length);
                                x += messages[i].cb.length;
                        }
@@ -2108,7 +2098,7 @@
                                (messageData.length < 256)) {
                        mi_name = null;
                        try {
-                               int size = innerProcessOutgoing(messageData, 0, 
messageData.length, length, pn, neverWaitForPacketNumber, callbacks, 
alreadyReportedBytes, priority);
+                               int size = innerProcessOutgoing(messageData, 0, 
messageData.length, length, pn, neverWaitForPacketNumber, callbacks, priority);
                                int totalMessageSize = 0;
                                for(int i=0;i<messageData.length;i++) 
totalMessageSize += messageData[i].length;
                                int overhead = size - totalMessageSize;
@@ -2146,8 +2136,11 @@
                        length += kt.countAcks() + kt.countAckRequests() + 
kt.countResendRequests();
                        int count = 0;
                        int lastIndex = 0;
-                       alreadyReportedBytes = 0;
+                       if(logMINOR)
+                               Logger.minor(this, "Sending 
"+messageData.length+" messages");
                        for(int i=0;i<=messageData.length;i++) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Sending message 
"+i);
                                int thisLength;
                                if(i == messages.length) thisLength = 0;
                                else thisLength = (messageData[i].length + 2);
@@ -2160,7 +2153,7 @@
                                                mi_name = null;
                                                try {
                                                        // FIXME regenerate 
callbacks and priority!
-                                                       int size = 
innerProcessOutgoing(messageData, lastIndex, i-lastIndex, length, pn, 
neverWaitForPacketNumber, callbacks, alreadyReportedBytes, priority);
+                                                       int size = 
innerProcessOutgoing(messageData, lastIndex, i-lastIndex, length, pn, 
neverWaitForPacketNumber, callbacks, priority);
                                                        int totalMessageSize = 
0;
                                                        for(int 
j=lastIndex;j<i;j++) totalMessageSize += messageData[j].length;
                                                        int overhead = size - 
totalMessageSize;
@@ -2188,16 +2181,18 @@
                                                                
pn.requeueMessageItems(messages, lastIndex, messages.length - lastIndex, false, 
"Throwable(3)");
                                                        return;
                                                }
+                                               if(onePacket) {
+                                                       
pn.requeueMessageItems(messages, i, messageData.length - i, true, "Didn't fit 
in single packet");
+                                                       return;
+                                               }
                                        }
                                        lastIndex = i;
                                        if(i != messageData.length) {
                                                length = 1 + 
(messageData[i].length + 2);
-                                               alreadyReportedBytes = 
alreadyReported[i];
                                        }
                                        count = 0;
                                } else {
                                        length = newLength;
-                                       alreadyReportedBytes += 
alreadyReported[i];
                                }
                        }
                }
@@ -2213,8 +2208,8 @@
         * @throws PacketSequenceException 
         */
        private int innerProcessOutgoing(byte[][] messageData, int start, int 
length, int bufferLength, 
-                       PeerNode pn, boolean neverWaitForPacketNumber, 
AsyncMessageCallback[] callbacks, int alreadyReportedBytes, short priority) 
throws NotConnectedException, WouldBlockException, PacketSequenceException {
-               if(logMINOR) Logger.minor(this, 
"innerProcessOutgoing(...,"+start+ ',' +length+ ',' +bufferLength+ 
','+callbacks.length+','+alreadyReportedBytes+')');
+                       PeerNode pn, boolean neverWaitForPacketNumber, 
AsyncMessageCallback[] callbacks, short priority) throws NotConnectedException, 
WouldBlockException, PacketSequenceException {
+               if(logMINOR) Logger.minor(this, 
"innerProcessOutgoing(...,"+start+ ',' +length+ ',' +bufferLength+ 
','+callbacks.length+')');
                byte[] buf = new byte[bufferLength];
                buf[0] = (byte)length;
                int loc = 1;
@@ -2226,15 +2221,15 @@
                        System.arraycopy(data, 0, buf, loc, len);
                        loc += len;
                }
-               return processOutgoingPreformatted(buf, 0, loc, pn, 
neverWaitForPacketNumber, callbacks, alreadyReportedBytes, priority);
+               return processOutgoingPreformatted(buf, 0, loc, pn, 
neverWaitForPacketNumber, callbacks, priority);
        }

        /* (non-Javadoc)
         * @see freenet.node.OutgoingPacketMangler#processOutgoing(byte[], int, 
int, freenet.node.KeyTracker, int)
         */
-       public int processOutgoing(byte[] buf, int offset, int length, 
KeyTracker tracker, int alreadyReportedBytes, short priority) throws 
KeyChangedException, NotConnectedException, PacketSequenceException, 
WouldBlockException {
+       public int processOutgoing(byte[] buf, int offset, int length, 
KeyTracker tracker, short priority) throws KeyChangedException, 
NotConnectedException, PacketSequenceException, WouldBlockException {
                byte[] newBuf = preformat(buf, offset, length);
-               return processOutgoingPreformatted(newBuf, 0, newBuf.length, 
tracker, -1, null, alreadyReportedBytes, priority);
+               return processOutgoingPreformatted(newBuf, 0, newBuf.length, 
tracker, -1, null, priority);
        }

        /**
@@ -2242,7 +2237,7 @@
         * the key changes.
         * @throws PacketSequenceException 
         */
-       int processOutgoingPreformatted(byte[] buf, int offset, int length, 
PeerNode peer, boolean neverWaitForPacketNumber, AsyncMessageCallback[] 
callbacks, int alreadyReportedBytes, short priority) throws 
NotConnectedException, WouldBlockException, PacketSequenceException {
+       int processOutgoingPreformatted(byte[] buf, int offset, int length, 
PeerNode peer, boolean neverWaitForPacketNumber, AsyncMessageCallback[] 
callbacks, short priority) throws NotConnectedException, WouldBlockException, 
PacketSequenceException {
                KeyTracker last = null;
                while(true) {
                        try {
@@ -2256,7 +2251,7 @@
                                }
                                int seqNo = neverWaitForPacketNumber ? 
tracker.allocateOutgoingPacketNumberNeverBlock() :
                                        tracker.allocateOutgoingPacketNumber();
-                               return processOutgoingPreformatted(buf, offset, 
length, tracker, seqNo, callbacks, alreadyReportedBytes, priority);
+                               return processOutgoingPreformatted(buf, offset, 
length, tracker, seqNo, callbacks, priority);
                        } catch (KeyChangedException e) {
                                Logger.normal(this, "Key changed(2) for 
"+peer.getPeer());
                                if(last == peer.getCurrentKeyTracker()) {
@@ -2288,7 +2283,7 @@
        /* (non-Javadoc)
         * @see 
freenet.node.OutgoingPacketMangler#processOutgoingPreformatted(byte[], int, 
int, freenet.node.KeyTracker, int, freenet.node.AsyncMessageCallback[], int)
         */
-       public int processOutgoingPreformatted(byte[] buf, int offset, int 
length, KeyTracker tracker, int packetNumber, AsyncMessageCallback[] callbacks, 
int alreadyReportedBytes, short priority) throws KeyChangedException, 
NotConnectedException, PacketSequenceException, WouldBlockException {
+       public int processOutgoingPreformatted(byte[] buf, int offset, int 
length, KeyTracker tracker, int packetNumber, AsyncMessageCallback[] callbacks, 
short priority) throws KeyChangedException, NotConnectedException, 
PacketSequenceException, WouldBlockException {
                if(logMINOR) {
                        String log = 
"processOutgoingPreformatted("+Fields.hashCode(buf)+", "+offset+ ',' +length+ 
',' +tracker+ ',' +packetNumber+ ',';
                        if(callbacks == null) log += "null";
@@ -2519,7 +2514,7 @@

                if(logMINOR) Logger.minor(this, "Sending... "+seqNumber);

-               int ret = processOutgoingFullyFormatted(plaintext, tracker, 
alreadyReportedBytes);
+               int ret = processOutgoingFullyFormatted(plaintext, tracker);
                if(logMINOR) Logger.minor(this, "Sent packet "+seqNumber);
                return ret;
        }
@@ -2529,7 +2524,7 @@
         * @param plaintext The packet's plaintext, including all formatting,
         * including acks and resend requests. Is clobbered.
         */
-       private int processOutgoingFullyFormatted(byte[] plaintext, KeyTracker 
kt, int alreadyReportedBytes) {
+       private int processOutgoingFullyFormatted(byte[] plaintext, KeyTracker 
kt) {
                BlockCipher sessionCipher = kt.sessionCipher;
                if(logMINOR) Logger.minor(this, "Encrypting with 
"+HexUtil.bytesToHex(kt.sessionKey));
                if(sessionCipher == null) {
@@ -2584,7 +2579,7 @@

                // pn.getPeer() cannot be null
                try {
-                       sendPacket(output, kt.pn.getPeer(), kt.pn, 
alreadyReportedBytes);
+                       sendPacket(output, kt.pn.getPeer(), kt.pn);
 //                     System.err.println(kt.pn.getIdentityString()+" : sent 
packet length "+output.length);
                } catch (LocalAddressException e) {
                        Logger.error(this, "Tried to send data packet to local 
address: "+kt.pn.getPeer()+" for "+kt.pn.allowLocalAddresses());
@@ -2626,7 +2621,7 @@
        }

        public void resend(ResendPacketItem item) throws 
PacketSequenceException, WouldBlockException, KeyChangedException, 
NotConnectedException {
-               int size = processOutgoingPreformatted(item.buf, 0, 
item.buf.length, item.kt, item.packetNumber, item.callbacks, 0, item.priority);
+               int size = processOutgoingPreformatted(item.buf, 0, 
item.buf.length, item.kt, item.packetNumber, item.callbacks, item.priority);
                item.pn.resendByteCounter.sentBytes(size);
        }


Modified: branches/db4o/freenet/src/freenet/node/FailureTable.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/FailureTable.java    2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/FailureTable.java    2008-09-26 
16:35:23 UTC (rev 22845)
@@ -43,9 +43,9 @@
 public class FailureTable implements OOMHook {

        /** FailureTableEntry's by key. Note that we push an entry only when 
sentTime changes. */
-       private final LRUHashtable entriesByKey;
+       private final LRUHashtable<Key,FailureTableEntry> entriesByKey;
        /** BlockOfferList by key */
-       private final LRUHashtable blockOfferListByKey;
+       private final LRUHashtable<Key,BlockOfferList> blockOfferListByKey;
        private final Node node;

        /** Maximum number of keys to track */
@@ -67,8 +67,8 @@
        static boolean logDEBUG;

        FailureTable(Node node) {
-               entriesByKey = new LRUHashtable();
-               blockOfferListByKey = new LRUHashtable();
+               entriesByKey = new LRUHashtable<Key,FailureTableEntry>();
+               blockOfferListByKey = new LRUHashtable<Key,BlockOfferList>();
                this.node = node;
                offerAuthenticatorKey = new byte[32];
                node.random.nextBytes(offerAuthenticatorKey);
@@ -387,7 +387,11 @@
                                try {
                                        innerSendOfferedKey(key, isSSK, 
needPubKey, uid, source);
                                } catch (NotConnectedException e) {
+                                       node.unlockUID(uid, isSSK, false, 
false, true, false);
                                        // Too bad.
+                               } catch (Throwable t) {
+                                       node.unlockUID(uid, isSSK, false, 
false, true, false);
+                                       Logger.error(this, "Caught "+t+" 
sending offered key");
                                }
                        }
                }, "sendOfferedKey");
@@ -403,7 +407,8 @@
                        SSKBlock block = node.fetch((NodeSSK)key, false);
                        if(block == null) {
                                // Don't have the key
-                               
source.sendAsync(DMT.createFNPGetOfferedKeyInvalid(uid, 
DMT.GET_OFFERED_KEY_REJECTED_NO_KEY), null, 0, senderCounter);
+                               
source.sendAsync(DMT.createFNPGetOfferedKeyInvalid(uid, 
DMT.GET_OFFERED_KEY_REJECTED_NO_KEY), null, senderCounter);
+                               node.unlockUID(uid, isSSK, false, false, true, 
false);
                                return;
                        }

@@ -411,7 +416,7 @@
                        Message headers = DMT.createFNPSSKDataFoundHeaders(uid, 
block.getRawHeaders());
                        final int dataLength = block.getRawData().length;

-                       source.sendAsync(headers, null, 0, senderCounter);
+                       source.sendAsync(headers, null, senderCounter);

                        node.executor.execute(new PrioRunnable() {

@@ -438,21 +443,22 @@

                        if(RequestHandler.SEND_OLD_FORMAT_SSK) {
                                Message df = DMT.createFNPSSKDataFound(uid, 
block.getRawHeaders(), block.getRawData());
-                               source.sendAsync(df, null, 0, senderCounter);
+                               source.sendAsync(df, null, senderCounter);
                        }
                        if(needPubKey) {
                                Message pk = DMT.createFNPSSKPubKey(uid, 
block.getPubKey());
-                               source.sendAsync(pk, null, 0, senderCounter);
+                               source.sendAsync(pk, null, senderCounter);
                        }
                } else {
                        CHKBlock block = node.fetch((NodeCHK)key, false);
                        if(block == null) {
                                // Don't have the key
-                               
source.sendAsync(DMT.createFNPGetOfferedKeyInvalid(uid, 
DMT.GET_OFFERED_KEY_REJECTED_NO_KEY), null, 0, senderCounter);
+                               
source.sendAsync(DMT.createFNPGetOfferedKeyInvalid(uid, 
DMT.GET_OFFERED_KEY_REJECTED_NO_KEY), null, senderCounter);
+                               node.unlockUID(uid, isSSK, false, false, true, 
false);
                                return;
                        }
                        Message df = DMT.createFNPCHKDataFound(uid, 
block.getRawHeaders());
-                       source.sendAsync(df, null, 0, senderCounter);
+                       source.sendAsync(df, null, senderCounter);
                PartiallyReceivedBlock prb =
                        new PartiallyReceivedBlock(Node.PACKETS_IN_BLOCK, 
Node.PACKET_SIZE, block.getRawData());
                final BlockTransmitter bt =
@@ -500,8 +506,8 @@

                OfferList(BlockOfferList offerList) {
                        this.offerList = offerList;
-                       recentOffers = new Vector();
-                       expiredOffers = new Vector();
+                       recentOffers = new Vector<BlockOffer>();
+                       expiredOffers = new Vector<BlockOffer>();
                        long now = System.currentTimeMillis();
                        BlockOffer[] offers = offerList.offers;
                        for(int i=0;i<offers.length;i++) {
@@ -516,8 +522,8 @@

                private final BlockOfferList offerList;

-               private final Vector recentOffers;
-               private final Vector expiredOffers;
+               private final Vector<BlockOffer> recentOffers;
+               private final Vector<BlockOffer> expiredOffers;

                /** The last offer we returned */
                private BlockOffer lastOffer;

Modified: branches/db4o/freenet/src/freenet/node/FailureTableEntry.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/FailureTableEntry.java       
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/FailureTableEntry.java       
2008-09-26 16:35:23 UTC (rev 22845)
@@ -297,7 +297,7 @@
        /** Offer this key to all the nodes that have requested it, and all the 
nodes it has been requested from.
         * Called after a) the data has been stored, and b) this entry has been 
removed from the FT */
        public synchronized void offer() {
-               HashSet set = new HashSet();
+               HashSet<PeerNode> set = new HashSet<PeerNode>();
                if(logMINOR) Logger.minor(this, "Sending offers to nodes which 
requested the key from us:");
                for(int i=0;i<requestorNodes.length;i++) {
                        WeakReference ref = requestorNodes[i];

Modified: branches/db4o/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/KeyTracker.java      2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/KeyTracker.java      2008-09-26 
16:35:23 UTC (rev 22845)
@@ -702,6 +702,8 @@
                while(true) {
                        try {
                                sentPacketsContents.lock(packetNumber);
+                               if(logMINOR)
+                                       Logger.minor(this, "Locked 
"+packetNumber);
                                return packetNumber;
                        } catch(InterruptedException e) {
                                synchronized(this) {
@@ -983,7 +985,7 @@
                        // Ignore packet#
                        if(logMINOR)
                                Logger.minor(this, "Queueing resend of what was 
once " + element.packetNumber);
-                       messages[i] = new MessageItem(buf, callbacks, true, 0, 
pn.resendByteCounter, element.priority);
+                       messages[i] = new MessageItem(buf, callbacks, true, 
pn.resendByteCounter, element.priority);
                }
                pn.requeueMessageItems(messages, 0, messages.length, true);

@@ -1052,6 +1054,12 @@
                        return null;
                return numbers;
        }
+       
+       public boolean hasPacketsToResend() {
+               synchronized(packetsToResend) {
+                       return !packetsToResend.isEmpty();
+               }
+       }

        public boolean isDeprecated() {
                return this.isDeprecated;

Modified: branches/db4o/freenet/src/freenet/node/LocationManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/LocationManager.java 2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/LocationManager.java 2008-09-26 
16:35:23 UTC (rev 22845)
@@ -861,7 +861,7 @@
             // Reject
             Message reject = DMT.createFNPSwapRejected(oldID);
             try {
-                pn.sendAsync(reject, null, 0, this);
+                pn.sendAsync(reject, null, this);
             } catch (NotConnectedException e1) {
                if(logMINOR) Logger.minor(this, "Lost connection rejecting 
SwapRequest (locked) from "+pn);
             }
@@ -889,7 +889,7 @@
             // Reject
             Message reject = DMT.createFNPSwapRejected(oldID);
             try {
-                pn.sendAsync(reject, null, 0, this);
+                pn.sendAsync(reject, null, this);
             } catch (NotConnectedException e) {
                if(logMINOR) Logger.minor(this, "Lost connection to "+pn+" 
rejecting SwapRequest");
             }
@@ -901,7 +901,7 @@
             // Reject
             Message reject = DMT.createFNPSwapRejected(oldID);
             try {
-                pn.sendAsync(reject, null, 0, this);
+                pn.sendAsync(reject, null, this);
             } catch (NotConnectedException e) {
                if(logMINOR) Logger.minor(this, "Lost connection rejecting 
SwapRequest from "+pn);
             }
@@ -919,7 +919,7 @@
             // Reject
             Message reject = DMT.createFNPSwapRejected(oldID);
             try {
-                pn.sendAsync(reject, null, 0, this);
+                pn.sendAsync(reject, null, this);
             } catch (NotConnectedException e1) {
                if(logMINOR) Logger.minor(this, "Lost connection rejecting 
SwapRequest (locked) from "+pn);
             }
@@ -942,7 +942,7 @@
                        if(logMINOR) Logger.minor(this, "Late reject "+oldID);
                     Message reject = DMT.createFNPSwapRejected(oldID);
                     try {
-                        pn.sendAsync(reject, null, 0, this);
+                        pn.sendAsync(reject, null, this);
                     } catch (NotConnectedException e1) {
                         Logger.normal(this, "Late reject but disconnected from 
sender: "+pn);
                     }
@@ -956,7 +956,7 @@
                     // Forward the request.
                     // Note that we MUST NOT send this blocking as we are on 
the
                     // receiver thread.
-                    randomPeer.sendAsync(m, new 
MyCallback(DMT.createFNPSwapRejected(oldID), pn, item), 0, 
LocationManager.this);
+                    randomPeer.sendAsync(m, new 
MyCallback(DMT.createFNPSwapRejected(oldID), pn, item), LocationManager.this);
                 } catch (NotConnectedException e) {
                        if(logMINOR) Logger.minor(this, "Not connected");
                     // Try a different node
@@ -1001,7 +1001,7 @@
                if(logMINOR) Logger.minor(this, "Rejecting "+msg);
             Message rejected = DMT.createFNPSwapRejected(oldID);
             try {
-                pn.sendAsync(rejected, null, 0, this);
+                pn.sendAsync(rejected, null, this);
             } catch (NotConnectedException e1) {
                if(logMINOR) Logger.minor(this, "Lost connection rejecting 
SwapRequest (locked) from "+pn);
             }
@@ -1065,7 +1065,7 @@
         m.set(DMT.UID, item.incomingID);
         if(logMINOR) Logger.minor(this, "Forwarding SwapReply "+uid+" from 
"+source+" to "+item.requestSender);
         try {
-            item.requestSender.sendAsync(m, null, 0, this);
+            item.requestSender.sendAsync(m, null, this);
         } catch (NotConnectedException e) {
                if(logMINOR) Logger.minor(this, "Lost connection forwarding 
SwapReply "+uid+" to "+item.requestSender);
         }
@@ -1099,7 +1099,7 @@
         // Returning to source - use incomingID
         m.set(DMT.UID, item.incomingID);
         try {
-            item.requestSender.sendAsync(m, null, 0, this);
+            item.requestSender.sendAsync(m, null, this);
         } catch (NotConnectedException e) {
                if(logMINOR) Logger.minor(this, "Lost connection forwarding 
SwapRejected "+uid+" to "+item.requestSender);
         }
@@ -1125,7 +1125,7 @@
         // Sending onwards - use outgoing ID
         m.set(DMT.UID, item.outgoingID);
         try {
-            item.routedTo.sendAsync(m, new 
SendMessageOnErrorCallback(DMT.createFNPSwapRejected(item.incomingID), 
item.requestSender, this), 0, this);
+            item.routedTo.sendAsync(m, new 
SendMessageOnErrorCallback(DMT.createFNPSwapRejected(item.incomingID), 
item.requestSender, this), this);
         } catch (NotConnectedException e) {
                if(logMINOR) Logger.minor(this, "Lost connection forwarding 
SwapCommit "+uid+" to "+item.routedTo);
         }
@@ -1162,7 +1162,7 @@
         // Returning to source - use incomingID
         m.set(DMT.UID, item.incomingID);
         try {
-            item.requestSender.sendAsync(m, null, 0, this);
+            item.requestSender.sendAsync(m, null, this);
         } catch (NotConnectedException e) {
             Logger.normal(this, "Lost connection forwarding SwapComplete 
"+uid+" to "+item.requestSender);
         }
@@ -1278,7 +1278,7 @@
             Message msg = DMT.createFNPSwapRejected(item.incomingID);
             if(logMINOR) Logger.minor(this, "Rejecting in lostOrRestartedNode: 
"+item.incomingID+ " from "+item.requestSender);
             try {
-                item.requestSender.sendAsync(msg, null, 0, this);
+                item.requestSender.sendAsync(msg, null, this);
             } catch (NotConnectedException e1) {
                 Logger.normal(this, "Both sender and receiver disconnected for 
"+item);
             }

Modified: branches/db4o/freenet/src/freenet/node/MessageItem.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/MessageItem.java     2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/MessageItem.java     2008-09-26 
16:35:23 UTC (rev 22845)
@@ -8,14 +8,15 @@
 import freenet.io.comm.Message;
 import freenet.support.Logger;

-/** A queued Message or byte[], and a callback, which may be null. */
+/** A queued byte[], maybe including a Message, and a callback, which may be 
null.
+ * Note that we always create the byte[] on construction, as almost everywhere 
+ * which uses a MessageItem needs to know its length immediately. */
 public class MessageItem {

     final Message msg;
-    byte[] buf;
+    final byte[] buf;
     final AsyncMessageCallback[] cb;
     final long submitted;
-    final int alreadyReportedBytes;
     /** If true, the buffer may contain several messages, and is formatted
      * for sending as a single packet.
      */
@@ -23,19 +24,17 @@
     final ByteCounter ctrCallback;
     private final short priority;

-    public MessageItem(Message msg2, AsyncMessageCallback[] cb2, int 
alreadyReportedBytes, ByteCounter ctr) {
-       this.alreadyReportedBytes = alreadyReportedBytes;
+    public MessageItem(Message msg2, AsyncMessageCallback[] cb2, ByteCounter 
ctr, PeerNode pn) {
         this.msg = msg2;
         this.cb = cb2;
-        buf = null;
         formatted = false;
         this.ctrCallback = ctr;
         this.submitted = System.currentTimeMillis();
         priority = msg2.getSpec().getPriority();
+        buf = msg.encodeToPacket(pn);
     }

-    public MessageItem(byte[] data, AsyncMessageCallback[] cb2, boolean 
formatted, int alreadyReportedBytes, ByteCounter ctr, short priority) {
-       this.alreadyReportedBytes = alreadyReportedBytes;
+    public MessageItem(byte[] data, AsyncMessageCallback[] cb2, boolean 
formatted, ByteCounter ctr, short priority) {
         this.cb = cb2;
         this.msg = null;
         this.buf = data;
@@ -50,14 +49,13 @@
     /**
      * Return the data contents of this MessageItem.
      */
-    public byte[] getData(PeerNode pn) {
-        if(buf == null)
-            buf = msg.encodeToPacket(pn);
-        if(buf.length <= alreadyReportedBytes) {
-               Logger.error(this, "buf.length = "+buf.length+" but 
alreadyReportedBytes = "+alreadyReportedBytes+" on "+this);
-        }
+    public byte[] getData() {
         return buf;
     }
+    
+    public int getLength() {
+       return buf.length;
+    }

     /**
      * @param length The actual number of bytes sent to send this message, 
including our share of the packet overheads,
@@ -89,7 +87,7 @@

        @Override
        public String toString() {
-               return 
super.toString()+":formatted="+formatted+",msg="+msg+",alreadyReported="+alreadyReportedBytes;
+               return super.toString()+":formatted="+formatted+",msg="+msg;
        }

        public void onDisconnect() {

Modified: branches/db4o/freenet/src/freenet/node/NetworkIDManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NetworkIDManager.java        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/NetworkIDManager.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -101,7 +101,7 @@
                if (logMINOR) Logger.minor(this, "Storing secret: "+s);
                addOrReplaceSecret(s); // FIXME - what if the message contain a 
bogus UID?
                try {
-                       pn.sendAsync(DMT.createFNPAccepted(uid), null, 0, ctr);
+                       pn.sendAsync(DMT.createFNPAccepted(uid), null, ctr);
                } catch (NotConnectedException e) {
                        Logger.error(this, "peer disconnected before 
storeSecret ack?", e);
                }
@@ -133,7 +133,7 @@

                if (disableSecretPings || node.recentlyCompleted(uid)) {
                        if (logMINOR) Logger.minor(this, "recently 
complete/loop: "+uid);
-                       source.sendAsync(DMT.createFNPRejectedLoop(uid), null, 
0, ctr);
+                       source.sendAsync(DMT.createFNPRejectedLoop(uid), null, 
ctr);
                } else {
                        byte[] nodeIdentity = ((ShortBuffer) 
m.getObject(DMT.NODE_IDENTITY)).getData();
                        StoredSecret match;
@@ -145,10 +145,10 @@
                                //This is the node that the ping intends to 
reach, we will *not* forward it; but we might not respond positively either.
                                //don't set the completed flag, we might reject 
it from one peer (too short a path) and accept it from another.
                                if (htl > dawnHtl) {
-                                       
source.sendAsync(DMT.createFNPRejectedLoop(uid), null, 0, ctr);
+                                       
source.sendAsync(DMT.createFNPRejectedLoop(uid), null, ctr);
                                } else {
                                        if (logMINOR) Logger.minor(this, 
"Responding to "+source+" with "+match+" from "+match.peer);
-                                       
source.sendAsync(match.getSecretPong(counter+1), null, 0, ctr);
+                                       
source.sendAsync(match.getSecretPong(counter+1), null, ctr);
                                }
                        } else {
                                //Set the completed flag immediately for 
determining reject loops rather than locking the uid.
@@ -169,7 +169,7 @@

                                        if (next==null) {
                                                //would be rnf... but this is a 
more exhaustive and lightweight search I suppose.
-                                               
source.sendAsync(DMT.createFNPRejectedLoop(uid), null, 0, ctr);
+                                               
source.sendAsync(DMT.createFNPRejectedLoop(uid), null, ctr);
                                                break;
                                        }

@@ -177,7 +177,7 @@

                                        if (htl<=0) {
                                                //would be dnf if we were 
looking for data.
-                                               
source.sendAsync(DMT.createFNPRejectedLoop(uid), null, 0, ctr);
+                                               
source.sendAsync(DMT.createFNPRejectedLoop(uid), null, ctr);
                                                break;
                                        }

@@ -188,7 +188,7 @@
                                        counter++;
                                        routedTo.add(next);
                                        try {
-                                               
next.sendAsync(DMT.createFNPSecretPing(uid, target, htl, dawnHtl, counter, 
nodeIdentity), null, 0, ctr);
+                                               
next.sendAsync(DMT.createFNPSecretPing(uid, target, htl, dawnHtl, counter, 
nodeIdentity), null, ctr);
                                        } catch (NotConnectedException e) {
                                                Logger.normal(this, next+" 
disconnected before secret-ping-forward");
                                                continue;
@@ -218,7 +218,7 @@
                                                        counter=suppliedCounter;
                                                long 
secret=msg.getLong(DMT.SECRET);
                                                if (logMINOR) 
Logger.minor(this, node+" forwarding apparently-successful secretpong response: 
"+counter+"/"+secret+" from "+next+" to "+source);
-                                               
source.sendAsync(DMT.createFNPSecretPong(uid, counter, secret), null, 0, ctr);
+                                               
source.sendAsync(DMT.createFNPSecretPong(uid, counter, secret), null, ctr);
                                                break;
                                        }


Modified: branches/db4o/freenet/src/freenet/node/Node.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Node.java    2008-09-26 14:55:48 UTC 
(rev 22844)
+++ branches/db4o/freenet/src/freenet/node/Node.java    2008-09-26 16:35:23 UTC 
(rev 22845)
@@ -86,6 +86,7 @@
 import freenet.node.NodeDispatcher.NodeDispatcherCallback;
 import freenet.node.SecurityLevels.FRIENDS_THREAT_LEVEL;
 import freenet.node.SecurityLevels.NETWORK_THREAT_LEVEL;
+import freenet.node.SecurityLevels.PHYSICAL_THREAT_LEVEL;
 import freenet.node.updater.NodeUpdateManager;
 import freenet.node.useralerts.AbstractUserAlert;
 import freenet.node.useralerts.BuildOldAgeUserAlert;
@@ -100,14 +101,13 @@
 import freenet.pluginmanager.PluginManager;
 import freenet.store.BerkeleyDBFreenetStore;
 import freenet.store.CHKStore;
-import freenet.store.FreenetStore;
 import freenet.store.KeyCollisionException;
 import freenet.store.PubkeyStore;
 import freenet.store.RAMFreenetStore;
 import freenet.store.SSKStore;
+import freenet.store.FreenetStore.StoreType;
 import freenet.store.saltedhash.SaltedHashFreenetStore;
 import freenet.support.ByteArrayWrapper;
-import freenet.support.DoubleTokenBucket;
 import freenet.support.Executor;
 import freenet.support.Fields;
 import freenet.support.FileLoggerHook;
@@ -122,6 +122,7 @@
 import freenet.support.PooledExecutor;
 import freenet.support.ShortBuffer;
 import freenet.support.SimpleFieldSet;
+import freenet.support.TokenBucket;
 import freenet.support.api.BooleanCallback;
 import freenet.support.api.IntCallback;
 import freenet.support.api.LongCallback;
@@ -245,12 +246,12 @@
        }

        /** db4o database for node and client layer.
-        * Other databases can be created for the datastore (since its usage 
-        * patterns and content are completely different), or for plugins (for 
+        * Other databases can be created for the datastore (since its usage
+        * patterns and content are completely different), or for plugins (for
         * security reasons).
         * 
         * This is an internal server, specific parts of the code can create
-        * ObjectContainer's from it. Be careful to refresh objects on any 
+        * ObjectContainer's from it. Be careful to refresh objects on any
         * long-lived container! */
        public final ObjectContainer db;
        /** A fixed random number which identifies the top-level objects 
belonging to
@@ -347,8 +348,8 @@
        private boolean storeForceBigShrinks;

        /* These are private because must be protected by synchronized(this) */
-       private final Environment storeEnvironment;
-       private final EnvironmentMutableConfig envMutableConfig;
+       private Environment storeEnvironment;
+       private EnvironmentMutableConfig envMutableConfig;
        private final SemiOrderedShutdownHook shutdownHook;
        private long databaseMaxMemory;
        /** The CHK datastore. Long term storage; data should only be inserted 
here if
@@ -356,20 +357,20 @@
         * insert (because inserts will always reach the most specialized node; 
if we
         * allow requests to store here, then we get pollution by inserts for 
keys not
         * close to our specialization). These conclusions derived from Oskar's 
simulations. */
-       private final CHKStore chkDatastore;
+       private CHKStore chkDatastore;
        /** The SSK datastore. See description for chkDatastore. */
-       private final SSKStore sskDatastore;
+       private SSKStore sskDatastore;
        /** The store of DSAPublicKeys (by hash). See description for 
chkDatastore. */
-       private final PubkeyStore pubKeyDatastore;
+       private PubkeyStore pubKeyDatastore;
        /** The CHK datacache. Short term cache which stores everything that 
passes
         * through this node. */
-       private final CHKStore chkDatacache;
+       private CHKStore chkDatacache;
        /** The SSK datacache. Short term cache which stores everything that 
passes
         * through this node. */
-       private final SSKStore sskDatacache;
+       private SSKStore sskDatacache;
        /** The public key datacache (by hash). Short term cache which stores 
         * everything that passes through this node. */
-       private final PubkeyStore pubKeyDatacache;
+       private PubkeyStore pubKeyDatacache;
        /** RequestSender's currently running, by KeyHTLPair */
        private final HashMap<KeyHTLPair, RequestSender> requestSenders;
        /** RequestSender's currently transferring, by key */
@@ -444,7 +445,7 @@
        final LRUHashtable<ByteArrayWrapper, DSAPublicKey> cachedPubKeys;
        final boolean testnetEnabled;
        final TestnetHandler testnetHandler;
-       public final DoubleTokenBucket outputThrottle;
+       public final TokenBucket outputThrottle;
        public boolean throttleLocalData;
        private int outputBandwidthLimit;
        private int inputBandwidthLimit;
@@ -528,6 +529,8 @@
        private static final int MIN_UPTIME_STORE_KEY = 40;

        private volatile boolean isPRNGReady = false;
+
+       private boolean storePreallocate;

        /**
         * Read all storable settings (identity etc) from the node file.
@@ -672,7 +675,7 @@
                startupTime = System.currentTimeMillis();
                SimpleFieldSet oldConfig = config.getSimpleFieldSet();
                // Setup node-specific configuration
-               SubConfig nodeConfig = new SubConfig("node", config);
+               final SubConfig nodeConfig = new SubConfig("node", config);

                int sortOrder = 0;

@@ -815,8 +818,8 @@
                // init shutdown hook
                shutdownHook = new SemiOrderedShutdownHook();
                Runtime.getRuntime().addShutdownHook(shutdownHook);
-
-               /* FIXME: this may throw if e.g. we ran out of disk space last 
time. 
+               
+               /* FIXME: this may throw if e.g. we ran out of disk space last 
time.
                 * We need to back it up and auto-recover. */
                /* Client-server mode. Refresh objects if you have a long-lived 
container! */
                /* On my db4o test node with lots of downloads, and several 
days old, com.db4o.internal.freespace.FreeSlotNode
@@ -850,9 +853,9 @@
                Db4o.configure().messageLevel(1);
                Db4o.configure().activationDepth(1);
                /* TURN OFF SHUTDOWN HOOK.
-                * The shutdown hook does auto-commit. We do NOT want 
auto-commit: if a 
+                * The shutdown hook does auto-commit. We do NOT want 
auto-commit: if a
                 * transaction hasn't commit()ed, it's not safe to commit it. 
For example,
-                * a splitfile is started, gets half way through, then we shut 
down. 
+                * a splitfile is started, gets half way through, then we shut 
down.
                 * The shutdown hook commits the half-finished transaction. 
When we start
                 * back up, we assume the whole transaction has been committed, 
and end
                 * up only registering the proportion of segments for which a 
RegisterMe
@@ -860,7 +863,7 @@
                 * Add our own hook to rollback and close... */
                Db4o.configure().automaticShutDown(false);
                Db4o.configure().diagnostic().addListener(new 
DiagnosticListener() {
-
+                       
                        public void onDiagnostic(Diagnostic arg0) {
                                if(arg0 instanceof ClassHasNoFields)
                                        return; // Ignore
@@ -870,7 +873,6 @@
                                } else
                                        Logger.error(this, "Diagnostic: 
"+arg0+" : "+arg0.getClass(), new Exception("debug"));
                        }
-                       
                });

                shutdownHook.addLateJob(new Thread() {
@@ -889,7 +891,7 @@
                db = Db4o.openFile(new File(nodeDir, "node.db4o").toString());

                System.err.println("Opened database");
-               
+
                // Boot ID
                bootID = random.nextLong();
                // Fixed length file containing boot ID. Accessed with random 
access file. So hopefully it will always be
@@ -1215,7 +1217,11 @@
                // Add them at a rate determined by the obwLimit.
                // Maximum forced bytes 80%, in other words, 20% of the 
bandwidth is reserved for 
                // block transfers, so we will use that 20% for block transfers 
even if more than 80% of the limit is used for non-limited data (resends etc).
-               outputThrottle = new DoubleTokenBucket(obwLimit/2, 
(1000L*1000L*1000L) / obwLimit, obwLimit/2, 0.8);
+               int bucketSize = obwLimit/2;
+               // Must have at least space for ONE PACKET.
+               // FIXME: make compatible with alternate transports.
+               bucketSize = Math.max(bucketSize, 2048);
+               outputThrottle = new TokenBucket(bucketSize, 
(1000L*1000L*1000L) / obwLimit, obwLimit/2);

                nodeConfig.register("inputBandwidthLimit", "-1", sortOrder++, 
false, true, "Node.inBWLimit", "Node.inBWLimitLong",      new IntCallback() {
                                        @Override
@@ -1293,11 +1299,8 @@
                        }
                } else {
                        String s = "Testnet mode DISABLED. You may have some 
level of anonymity. :)\n"+
-                               "Note that Freenet 0.7 is still under intense 
development, and is by no means feature complete, especially "+
-                               "in the area of security: There are known 
design flaws and there are bugs we haven't found out about yet. "+
-                               "Smart attackers can probably compromise your 
anonymity! This is easiest if they are directly connected to " +
-                               "you, but (especially on opennet) they can 
probably find you given time even if they are not.\n\n"+
-                               "USE FREENET AT YOUR OWN RISK. THERE IS 
ABSOLUTELY NO WARRANTY FOR FREENET.";
+                               "Note that this version of Freenet is still a 
very early alpha, and may well have numerous bugs and design flaws.\n"+
+                               "In particular: YOU ARE WIDE OPEN TO YOUR 
IMMEDIATE PEERS! They can eavesdrop on your requests with relatively little 
difficulty at present (correlation attacks etc).";
                        Logger.normal(this, s);
                        System.err.println(s);
                        testnetEnabled = false;
@@ -1361,21 +1364,15 @@
                                return isAllowedToConnectToSeednodes;
                        }
                        @Override
-                       public void set(Boolean val) throws 
InvalidConfigValueException {
+                       public void set(Boolean val) throws 
InvalidConfigValueException, NodeNeedRestartException {
                                if (get().equals(val))
                                                return;
                                synchronized(Node.this) {
+                                       isAllowedToConnectToSeednodes = val;
                                        if(opennet != null)
-                                               throw new 
InvalidConfigValueException("Can't change that setting on the fly when opennet 
is already active!");
-                                       else
-                                               isAllowedToConnectToSeednodes = 
val;
+                                               throw new 
NodeNeedRestartException(l10n("connectToSeednodesCannotBeChangedMustDisableOpennetOrReboot"));
                                }
                        }
-
-                       @Override
-                       public boolean isReadOnly() {
-                                       return opennet != null;
-                               }
                });
                isAllowedToConnectToSeednodes = 
opennetConfig.getBoolean("connectToSeednodes");

@@ -1568,7 +1565,7 @@

                });

-               nodeConfig.register("storeType", "bdb-index", sortOrder++, 
true, false, "Node.storeType", "Node.storeTypeLong", new StoreTypeCallback());
+               nodeConfig.register("storeType", "bdb-index", sortOrder++, 
true, true, "Node.storeType", "Node.storeTypeLong", new StoreTypeCallback());

                storeType = nodeConfig.getString("storeType");

@@ -1705,88 +1702,263 @@
                maxStoreKeys = maxTotalKeys / 2;
                maxCacheKeys = maxTotalKeys - maxStoreKeys;

+               /*
+                * On Windows, setting the file length normally involves 
writing lots of zeros.
+                * So it's an uninterruptible system call that takes a loooong 
time. On OS/X,
+                * presumably the same is true. If the RNG is fast enough, this 
means that
+                * setting the length and writing random data take exactly the 
same amount
+                * of time. On most versions of Unix, holes can be created. 
However on all
+                * systems, predictable disk usage is a good thing. So lets 
turn it on by
+                * default for now, on all systems. The datastore can be read 
but mostly not 
+                * written while the random data is being written.
+                */
+               nodeConfig.register("storePreallocate", true, sortOrder++, 
true, false, "Node.storePreallocate", "Node.storePreallocateLong", 
+                               new BooleanCallback() {
+                                       @Override
+                    public Boolean get() {
+                           return storePreallocate;
+                    }
+
+                                       @Override
+                    public void set(Boolean val) throws 
InvalidConfigValueException, NodeNeedRestartException {
+                                               storePreallocate = val;
+                                               if 
(storeType.equals("salt-hash")) {
+                                                       
((SaltedHashFreenetStore) chkDatastore.getStore()).setPreallocate(val);
+                                                       
((SaltedHashFreenetStore) chkDatacache.getStore()).setPreallocate(val);
+                                                       
((SaltedHashFreenetStore) pubKeyDatastore.getStore()).setPreallocate(val);
+                                                       
((SaltedHashFreenetStore) pubKeyDatacache.getStore()).setPreallocate(val);
+                                                       
((SaltedHashFreenetStore) sskDatastore.getStore()).setPreallocate(val);
+                                                       
((SaltedHashFreenetStore) sskDatacache.getStore()).setPreallocate(val);
+                                               }
+                    }}
+               );
+               storePreallocate = nodeConfig.getBoolean("storePreallocate");
+               
+               if(File.separatorChar == '/' && 
System.getProperty("os.name").toLowerCase().indexOf("mac os") < 0) {
+                       securityLevels.addPhysicalThreatLevelListener(new 
SecurityLevelListener<SecurityLevels.PHYSICAL_THREAT_LEVEL>() {
+
+                               public void onChange(PHYSICAL_THREAT_LEVEL 
oldLevel, PHYSICAL_THREAT_LEVEL newLevel) {
+                                       try {
+                                               if(newLevel == 
PHYSICAL_THREAT_LEVEL.LOW)
+                                                       
nodeConfig.set("storePreallocate", false);
+                                               else
+                                                       
nodeConfig.set("storePreallocate", true);
+                                       } catch (NodeNeedRestartException e) {
+                                               // Ignore
+                                       } catch (InvalidConfigValueException e) 
{
+                                               // Ignore
+                                       }
+                               }
+                               
+                       });
+               }
+               
                if (storeType.equals("salt-hash")) {
-                       storeEnvironment = null;
+                       initSaltHashFS(suffix);
+               } else if (storeType.equals("bdb-index")) {
+                       nodeConfig.register("databaseMaxMemory", "20M", 
sortOrder++, true, false, "Node.databaseMemory", "Node.databaseMemoryLong", 
+                                       new LongCallback() {
+
+                               @Override
+                               public Long get() {
+                                       return databaseMaxMemory;
+                               }
+
+                               @Override
+                               public void set(Long val) throws 
InvalidConfigValueException {
+                                       if(val < 0)
+                                               throw new 
InvalidConfigValueException(l10n("mustBePositive"));
+                                       else {
+                                               long maxHeapMemory = 
Runtime.getRuntime().maxMemory();
+                                               /* There are some JVMs (for 
example libgcj 4.1.1) whose Runtime.maxMemory() does not work. */
+                                               if(maxHeapMemory < 
Long.MAX_VALUE && val > (80 * maxHeapMemory / 100))
+                                                       throw new 
InvalidConfigValueException(l10n("storeMaxMemTooHigh"));
+                                       }
+                                       
+                                       envMutableConfig.setCacheSize(val);
+                                       try{
+                                               
storeEnvironment.setMutableConfig(envMutableConfig);
+                                       } catch (DatabaseException e) {
+                                               throw new 
InvalidConfigValueException(l10n("errorApplyingConfig", "error", 
e.getLocalizedMessage()));
+                                       }
+                                       databaseMaxMemory = val;
+                               }
+                               
+                       });
+
+                       /* There are some JVMs (for example libgcj 4.1.1) whose 
Runtime.maxMemory() does not work. */
+                       long maxHeapMemory = Runtime.getRuntime().maxMemory();
+                       databaseMaxMemory = 
nodeConfig.getLong("databaseMaxMemory");
+                       // see #1202
+                       if(maxHeapMemory < Long.MAX_VALUE && databaseMaxMemory 
> (80 * maxHeapMemory / 100)){
+                               Logger.error(this, "The databaseMemory setting 
is set too high " + databaseMaxMemory +
+                                               " ... let's assume it's not 
what the user wants to do and restore the default.");
+                               databaseMaxMemory = Long.valueOf(((LongOption) 
nodeConfig.getOption("databaseMaxMemory")).getDefault()).longValue();
+                       }
+                       initBDBFS(suffix);
+               } else {
+                       chkDatastore = new CHKStore();
+                       new RAMFreenetStore(chkDatastore, (int) 
Math.min(Integer.MAX_VALUE, maxStoreKeys));
+                       chkDatacache = new CHKStore();
+                       new RAMFreenetStore(chkDatacache, (int) 
Math.min(Integer.MAX_VALUE, maxCacheKeys));
+                       pubKeyDatastore = new PubkeyStore();
+                       new RAMFreenetStore(pubKeyDatastore, (int) 
Math.min(Integer.MAX_VALUE, maxStoreKeys));
+                       pubKeyDatacache = new PubkeyStore();
+                       new RAMFreenetStore(pubKeyDatacache, (int) 
Math.min(Integer.MAX_VALUE, maxCacheKeys));
+                       sskDatastore = new SSKStore(this);
+                       new RAMFreenetStore(sskDatastore, (int) 
Math.min(Integer.MAX_VALUE, maxStoreKeys));
+                       sskDatacache = new SSKStore(this);
+                       new RAMFreenetStore(sskDatacache, (int) 
Math.min(Integer.MAX_VALUE, maxCacheKeys));
                        envMutableConfig = null;
-                       try {
-                               int bloomFilterSizeInM = 
storeBloomFilterCounting ? storeBloomFilterSize / 6 * 4
-                                       : (storeBloomFilterSize + 6) / 6 * 8; 
// + 6 to make size different, trigger rebuild 
+                       this.storeEnvironment = null;
+               }
+               
+               nodeStats = new NodeStats(this, sortOrder, new 
SubConfig("node.load", config), obwLimit, ibwLimit, nodeDir);
+               
+               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, getDarknetPortNumber(), sortOrder, oldConfig, fproxyConfig, toadlets, 
db);
+
+               netid = new NetworkIDManager(this);
+               
+               if (storeType.equals("salt-hash")) {
+                       ((SaltedHashFreenetStore) 
chkDatastore.getStore()).setUserAlertManager(clientCore.alerts);
+                       ((SaltedHashFreenetStore) 
chkDatacache.getStore()).setUserAlertManager(clientCore.alerts);
+                       ((SaltedHashFreenetStore) 
pubKeyDatastore.getStore()).setUserAlertManager(clientCore.alerts);
+                       ((SaltedHashFreenetStore) 
pubKeyDatacache.getStore()).setUserAlertManager(clientCore.alerts);
+                       ((SaltedHashFreenetStore) 
sskDatastore.getStore()).setUserAlertManager(clientCore.alerts);
+                       ((SaltedHashFreenetStore) 
sskDatacache.getStore()).setUserAlertManager(clientCore.alerts);
+               }
+               
+               securityLevels.registerUserAlert(clientCore.alerts);
+               
+               nodeConfig.register("disableHangCheckers", false, sortOrder++, 
true, false, "Node.disableHangCheckers", "Node.disableHangCheckersLong", new 
BooleanCallback() {
+
+                       @Override
+                       public Boolean get() {
+                               return disableHangCheckers;
+                       }
+
+                       @Override
+                       public void set(Boolean val) throws 
InvalidConfigValueException {
+                               disableHangCheckers = val;
+                       }
+               });
+               
+               disableHangCheckers = 
nodeConfig.getBoolean("disableHangCheckers");

-                               Logger.normal(this, "Initializing CHK 
Datastore");
-                               System.out.println("Initializing CHK Datastore 
(" + maxStoreKeys + " keys)");
-                               chkDatastore = new CHKStore();
-                               SaltedHashFreenetStore chkDataFS = 
SaltedHashFreenetStore.construct(storeDir, "CHK-store",
-                                       chkDatastore, random, maxStoreKeys, 
bloomFilterSizeInM, storeBloomFilterCounting,
-                                       shutdownHook);
-                               Logger.normal(this, "Initializing CHK 
Datacache");
-                               System.out.println("Initializing CHK Datacache 
(" + maxCacheKeys + ':' + maxCacheKeys + " keys)");
-                               chkDatacache = new CHKStore();
-                               SaltedHashFreenetStore chkCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "CHK-cache",
-                                       chkDatacache, random, maxCacheKeys, 
bloomFilterSizeInM, storeBloomFilterCounting,
-                                       shutdownHook);
-                               Logger.normal(this, "Initializing pubKey 
Datastore");
-                               System.out.println("Initializing pubKey 
Datastore");
-                               pubKeyDatastore = new PubkeyStore();
-                               SaltedHashFreenetStore pubkeyDataFS = 
SaltedHashFreenetStore.construct(storeDir, "PUBKEY-store",
-                                       pubKeyDatastore, random, maxStoreKeys, 
bloomFilterSizeInM, storeBloomFilterCounting,
-                                       shutdownHook);
-                               Logger.normal(this, "Initializing pubKey 
Datacache");
-                               System.out.println("Initializing pubKey 
Datacache (" + maxCacheKeys + " keys)");
-                               pubKeyDatacache = new PubkeyStore();
-                               SaltedHashFreenetStore pubkeyCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "PUBKEY-cache",
-                                       pubKeyDatacache, random, maxCacheKeys, 
bloomFilterSizeInM, storeBloomFilterCounting,
-                                       shutdownHook);
-                               Logger.normal(this, "Initializing SSK 
Datastore");
-                               System.out.println("Initializing SSK 
Datastore");
-                               sskDatastore = new SSKStore(this);
-                               SaltedHashFreenetStore sskDataFS = 
SaltedHashFreenetStore.construct(storeDir, "SSK-store",
-                                       sskDatastore, random, maxStoreKeys, 
bloomFilterSizeInM, storeBloomFilterCounting,
-                                       shutdownHook);
-                               Logger.normal(this, "Initializing SSK 
Datacache");
-                               System.out.println("Initializing SSK Datacache 
(" + maxCacheKeys + " keys)");
-                               sskDatacache = new SSKStore(this);
-                               SaltedHashFreenetStore sskCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "SSK-cache",
-                                       sskDatacache, random, maxCacheKeys, 
bloomFilterSizeInM, storeBloomFilterCounting,
-                                       shutdownHook);
-                               
-                               File migrationFile = new File(storeDir, 
"migrated");
-                               if (!migrationFile.exists()) {
-                                       chkDataFS.migrationFrom(//
-                                               new File(storeDir, "chk" + 
suffix + ".store"), // 
-                                               new File(storeDir, "chk" + 
suffix + ".store.keys"));
-                                       chkCacheFS.migrationFrom(//
-                                               new File(storeDir, "chk" + 
suffix + ".cache"), // 
-                                               new File(storeDir, "chk" + 
suffix + ".cache.keys"));
+               nodeConfig.finishedInitialization();
+               writeNodeFile();
+               
+               // Initialize the plugin manager
+               Logger.normal(this, "Initializing Plugin Manager");
+               System.out.println("Initializing Plugin Manager");
+               pluginManager = new PluginManager(this);

-                                       pubkeyDataFS.migrationFrom(//
-                                               new File(storeDir, "pubkey" + 
suffix + ".store"), // 
-                                               new File(storeDir, "pubkey" + 
suffix + ".store.keys"));
-                                       pubkeyCacheFS.migrationFrom(//
-                                               new File(storeDir, "pubkey" + 
suffix + ".cache"), // 
-                                               new File(storeDir, "pubkey" + 
suffix + ".cache.keys"));
+               FetchContext ctx = clientCore.makeClient((short)0, 
true).getFetchContext();
+               
+               ctx.allowSplitfiles = false;
+               ctx.dontEnterImplicitArchives = true;
+               ctx.maxArchiveRestarts = 0;
+               ctx.maxMetadataSize = 256;
+               ctx.maxNonSplitfileRetries = 10;
+               ctx.maxOutputLength = 4096;
+               ctx.maxRecursionLevel = 2;
+               ctx.maxTempLength = 4096;
+               
+               this.arkFetcherContext = ctx;
+               
+               // Node updater support
+               
+               try {
+                       nodeUpdater = NodeUpdateManager.maybeCreate(this, 
config);
+               } catch (InvalidConfigValueException e) {
+                       e.printStackTrace();
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_UPDATER, "Could not 
create Updater: "+e);
+               }
+               
+               registerNodeToNodeMessageListener(N2N_MESSAGE_TYPE_FPROXY, 
fproxyN2NMListener);
+               
registerNodeToNodeMessageListener(Node.N2N_MESSAGE_TYPE_DIFFNODEREF, 
diffNoderefListener);
+               
+               Logger.normal(this, "Node constructor completed");
+               System.out.println("Node constructor completed");
+       }

-                                       sskDataFS.migrationFrom(//
-                                               new File(storeDir, "ssk" + 
suffix + ".store"), // 
-                                               new File(storeDir, "ssk" + 
suffix + ".store.keys"));
-                                       sskCacheFS.migrationFrom(//
-                                               new File(storeDir, "ssk" + 
suffix + ".cache"), // 
-                                               new File(storeDir, "ssk" + 
suffix + ".cache.keys"));
-                                       migrationFile.createNewFile();
-                               }
-                       } catch (IOException e) {
-                               System.err.println("Could not open store: " + 
e);
-                               e.printStackTrace();
-                               throw new 
NodeInitException(NodeInitException.EXIT_STORE_OTHER, e.getMessage());
+       private void initSaltHashFS(final String suffix) throws 
NodeInitException {
+           storeEnvironment = null;
+               envMutableConfig = null;
+               try {
+                       int bloomFilterSizeInM = storeBloomFilterCounting ? 
storeBloomFilterSize / 6 * 4
+                               : (storeBloomFilterSize + 6) / 6 * 8; // + 6 to 
make size different, trigger rebuild 
+
+                       Logger.normal(this, "Initializing CHK Datastore");
+                       System.out.println("Initializing CHK Datastore (" + 
maxStoreKeys + " keys)");
+                       chkDatastore = new CHKStore();
+                       SaltedHashFreenetStore chkDataFS = 
SaltedHashFreenetStore.construct(storeDir, "CHK-store", chkDatastore,
+                               random, maxStoreKeys, bloomFilterSizeInM, 
storeBloomFilterCounting, shutdownHook, storePreallocate);
+                       Logger.normal(this, "Initializing CHK Datacache");
+                       System.out.println("Initializing CHK Datacache (" + 
maxCacheKeys + ':' + maxCacheKeys + " keys)");
+                       chkDatacache = new CHKStore();
+                       SaltedHashFreenetStore chkCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "CHK-cache", chkDatacache,
+                               random, maxCacheKeys, bloomFilterSizeInM, 
storeBloomFilterCounting, shutdownHook, storePreallocate);
+                       Logger.normal(this, "Initializing pubKey Datastore");
+                       System.out.println("Initializing pubKey Datastore");
+                       pubKeyDatastore = new PubkeyStore();
+                       SaltedHashFreenetStore pubkeyDataFS = 
SaltedHashFreenetStore.construct(storeDir, "PUBKEY-store",
+                               pubKeyDatastore, random, maxStoreKeys, 
bloomFilterSizeInM, storeBloomFilterCounting, shutdownHook, storePreallocate);
+                       Logger.normal(this, "Initializing pubKey Datacache");
+                       System.out.println("Initializing pubKey Datacache (" + 
maxCacheKeys + " keys)");
+                       pubKeyDatacache = new PubkeyStore();
+                       SaltedHashFreenetStore pubkeyCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "PUBKEY-cache",
+                               pubKeyDatacache, random, maxCacheKeys, 
bloomFilterSizeInM, storeBloomFilterCounting, shutdownHook, storePreallocate);
+                       Logger.normal(this, "Initializing SSK Datastore");
+                       System.out.println("Initializing SSK Datastore");
+                       sskDatastore = new SSKStore(this);
+                       SaltedHashFreenetStore sskDataFS = 
SaltedHashFreenetStore.construct(storeDir, "SSK-store", sskDatastore,
+                               random, maxStoreKeys, bloomFilterSizeInM, 
storeBloomFilterCounting, shutdownHook, storePreallocate);
+                       Logger.normal(this, "Initializing SSK Datacache");
+                       System.out.println("Initializing SSK Datacache (" + 
maxCacheKeys + " keys)");
+                       sskDatacache = new SSKStore(this);
+                       SaltedHashFreenetStore sskCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "SSK-cache", sskDatacache,
+                               random, maxCacheKeys, bloomFilterSizeInM, 
storeBloomFilterCounting, shutdownHook, storePreallocate);
+
+                       File migrationFile = new File(storeDir, "migrated");
+                       if (!migrationFile.exists()) {
+                               chkDataFS.migrationFrom(//
+                                       new File(storeDir, "chk" + suffix + 
".store"), // 
+                                       new File(storeDir, "chk" + suffix + 
".store.keys"));
+                               chkCacheFS.migrationFrom(//
+                                       new File(storeDir, "chk" + suffix + 
".cache"), // 
+                                       new File(storeDir, "chk" + suffix + 
".cache.keys"));
+
+                               pubkeyDataFS.migrationFrom(//
+                                       new File(storeDir, "pubkey" + suffix + 
".store"), // 
+                                       new File(storeDir, "pubkey" + suffix + 
".store.keys"));
+                               pubkeyCacheFS.migrationFrom(//
+                                       new File(storeDir, "pubkey" + suffix + 
".cache"), // 
+                                       new File(storeDir, "pubkey" + suffix + 
".cache.keys"));
+
+                               sskDataFS.migrationFrom(//
+                                       new File(storeDir, "ssk" + suffix + 
".store"), // 
+                                       new File(storeDir, "ssk" + suffix + 
".store.keys"));
+                               sskCacheFS.migrationFrom(//
+                                       new File(storeDir, "ssk" + suffix + 
".cache"), // 
+                                       new File(storeDir, "ssk" + suffix + 
".cache.keys"));
+                               migrationFile.createNewFile();
                        }
-               } else if (storeType.equals("bdb-index")) {
-               // Setup datastores
+               } catch (IOException e) {
+                       System.err.println("Could not open store: " + e);
+                       e.printStackTrace();
+                       throw new 
NodeInitException(NodeInitException.EXIT_STORE_OTHER, e.getMessage());
+               }
+    }
+       
+       private void initBDBFS(final String suffix) throws NodeInitException {
+               // Setup datastores             
+               final EnvironmentConfig envConfig = 
BerkeleyDBFreenetStore.getBDBConfig();

-               EnvironmentConfig envConfig = 
BerkeleyDBFreenetStore.getBDBConfig();
-               
-               File dbDir = new File(storeDir, 
"database-"+getDarknetPortNumber());
+               final File dbDir = new File(storeDir, 
"database-"+getDarknetPortNumber());
                dbDir.mkdirs();

-               File reconstructFile = new File(dbDir, "reconstruct");
+               final File reconstructFile = new File(dbDir, "reconstruct");

                Environment env = null;
                EnvironmentMutableConfig mutableConfig;
@@ -1802,13 +1974,13 @@
                        WrapperManager.signalStarting(60*60*1000);
                        env = new Environment(dbDir, envConfig);
                        mutableConfig = env.getConfig();
-               } catch (DatabaseException e) {
+               } catch (final DatabaseException e) {

                        // Close the database
                        if(env != null) {
                                try {
                                        env.close();
-                               } catch (Throwable t) {
+                               } catch (final Throwable t) {
                                        System.err.println("Error closing 
database: "+t+" after "+e);
                                        t.printStackTrace();
                                }
@@ -1818,9 +1990,9 @@

                        System.err.println("Deleting old database log 
files...");

-                       File[] files = dbDir.listFiles();
+                       final File[] files = dbDir.listFiles();
                        for(int i=0;i<files.length;i++) {
-                               String name = files[i].getName().toLowerCase();
+                               final String name = 
files[i].getName().toLowerCase();
                                if(name.endsWith(".jdb") || 
name.equals("je.lck"))
                                        if(!files[i].delete())
                                                System.err.println("Failed to 
delete old database log file "+files[i]);
@@ -1832,7 +2004,7 @@
                        try {
                                env = new Environment(dbDir, envConfig);
                                mutableConfig = env.getConfig();
-                       } catch (DatabaseException e1) {
+                       } catch (final DatabaseException e1) {
                                System.err.println("Could not open store: "+e1);
                                e1.printStackTrace();
                                System.err.println("Previous error was (tried 
deleting database and retrying): "+e);
@@ -1849,59 +2021,18 @@
                                try {
                                        storeEnvironment.close();
                                        System.err.println("Successfully closed 
all datastores.");
-                               } catch (Throwable t) {
+                               } catch (final Throwable t) {
                                        System.err.println("Caught "+t+" 
closing environment");
                                        t.printStackTrace();
                                }
                        }
                });
-               
-               
-               nodeConfig.register("databaseMaxMemory", "20M", sortOrder++, 
true, false, "Node.databaseMemory", "Node.databaseMemoryLong", 
-                               new LongCallback() {
-
-                       @Override
-                       public Long get() {
-                               return databaseMaxMemory;
-                       }
-
-                       @Override
-                       public void set(Long val) throws 
InvalidConfigValueException {
-                               if(val < 0)
-                                       throw new 
InvalidConfigValueException(l10n("mustBePositive"));
-                               else {
-                                       long maxHeapMemory = 
Runtime.getRuntime().maxMemory();
-                                       /* There are some JVMs (for example 
libgcj 4.1.1) whose Runtime.maxMemory() does not work. */
-                                       if(maxHeapMemory < Long.MAX_VALUE && 
val > (80 * maxHeapMemory / 100))
-                                               throw new 
InvalidConfigValueException(l10n("storeMaxMemTooHigh"));
-                               }
-                               
-                               envMutableConfig.setCacheSize(val);
-                               try{
-                                       
storeEnvironment.setMutableConfig(envMutableConfig);
-                               } catch (DatabaseException e) {
-                                       throw new 
InvalidConfigValueException(l10n("errorApplyingConfig", "error", 
e.getLocalizedMessage()));
-                               }
-                               databaseMaxMemory = val;
-                       }
-                       
-               });
-
-               /* There are some JVMs (for example libgcj 4.1.1) whose 
Runtime.maxMemory() does not work. */
-               long maxHeapMemory = Runtime.getRuntime().maxMemory();
-               databaseMaxMemory = nodeConfig.getLong("databaseMaxMemory");
-               // see #1202
-               if(maxHeapMemory < Long.MAX_VALUE && databaseMaxMemory > (80 * 
maxHeapMemory / 100)){
-                       Logger.error(this, "The databaseMemory setting is set 
too high " + databaseMaxMemory +
-                                       " ... let's assume it's not what the 
user wants to do and restore the default.");
-                       databaseMaxMemory = Long.valueOf(((LongOption) 
nodeConfig.getOption("databaseMaxMemory")).getDefault()).longValue();
-               }
                envMutableConfig.setCacheSize(databaseMaxMemory);
                // 
http://www.oracle.com/technology/products/berkeley-db/faq/je_faq.html#35

                try {
                        storeEnvironment.setMutableConfig(envMutableConfig);
-               } catch (DatabaseException e) {
+               } catch (final DatabaseException e) {
                        System.err.println("Could not set the database 
configuration: "+e);
                        e.printStackTrace();
                        throw new 
NodeInitException(NodeInitException.EXIT_STORE_OTHER, e.getMessage());          
              
@@ -1911,143 +2042,57 @@
                        Logger.normal(this, "Initializing CHK Datastore");
                        System.out.println("Initializing CHK Datastore 
("+maxStoreKeys+" keys)");
                        chkDatastore = new CHKStore();
-                       BerkeleyDBFreenetStore.construct(storeDir, true, 
suffix, maxStoreKeys, FreenetStore.TYPE_CHK, 
+                       BerkeleyDBFreenetStore.construct(storeDir, true, 
suffix, maxStoreKeys, StoreType.CHK, 
                                        storeEnvironment, shutdownHook, 
reconstructFile, chkDatastore, random);
                        Logger.normal(this, "Initializing CHK Datacache");
                        System.out.println("Initializing CHK Datacache 
("+maxCacheKeys+ ':' +maxCacheKeys+" keys)");
                        chkDatacache = new CHKStore();
-                       BerkeleyDBFreenetStore.construct(storeDir, false, 
suffix, maxCacheKeys, FreenetStore.TYPE_CHK, 
+                       BerkeleyDBFreenetStore.construct(storeDir, false, 
suffix, maxCacheKeys, StoreType.CHK, 
                                        storeEnvironment, shutdownHook, 
reconstructFile, chkDatacache, random);
                        Logger.normal(this, "Initializing pubKey Datastore");
                        System.out.println("Initializing pubKey Datastore");
                        pubKeyDatastore = new PubkeyStore();
-                       BerkeleyDBFreenetStore.construct(storeDir, true, 
suffix, maxStoreKeys, FreenetStore.TYPE_PUBKEY, 
+                       BerkeleyDBFreenetStore.construct(storeDir, true, 
suffix, maxStoreKeys, StoreType.PUBKEY, 
                                        storeEnvironment, shutdownHook, 
reconstructFile, pubKeyDatastore, random);
                        Logger.normal(this, "Initializing pubKey Datacache");
                        System.out.println("Initializing pubKey Datacache 
("+maxCacheKeys+" keys)");
                        pubKeyDatacache = new PubkeyStore();
-                       BerkeleyDBFreenetStore.construct(storeDir, false, 
suffix, maxCacheKeys, FreenetStore.TYPE_PUBKEY, 
+                       BerkeleyDBFreenetStore.construct(storeDir, false, 
suffix, maxCacheKeys, StoreType.PUBKEY, 
                                        storeEnvironment, shutdownHook, 
reconstructFile, pubKeyDatacache, random);
-                       // FIXME can't auto-fix SSK stores.
                        Logger.normal(this, "Initializing SSK Datastore");
                        System.out.println("Initializing SSK Datastore");
                        sskDatastore = new SSKStore(this);
-                       BerkeleyDBFreenetStore.construct(storeDir, true, 
suffix, maxStoreKeys, FreenetStore.TYPE_SSK, 
+                       BerkeleyDBFreenetStore.construct(storeDir, true, 
suffix, maxStoreKeys, StoreType.SSK, 
                                        storeEnvironment, shutdownHook, 
reconstructFile, sskDatastore, random);
                        Logger.normal(this, "Initializing SSK Datacache");
                        System.out.println("Initializing SSK Datacache 
("+maxCacheKeys+" keys)");
                        sskDatacache = new SSKStore(this);
-                       BerkeleyDBFreenetStore.construct(storeDir, false, 
suffix, maxStoreKeys, FreenetStore.TYPE_SSK, 
+                       BerkeleyDBFreenetStore.construct(storeDir, false, 
suffix, maxStoreKeys, StoreType.SSK, 
                                        storeEnvironment, shutdownHook, 
reconstructFile, sskDatacache, random);
-               } catch (FileNotFoundException e1) {
-                       String msg = "Could not open datastore: "+e1;
+               } catch (final FileNotFoundException e1) {
+                       final String msg = "Could not open datastore: "+e1;
                        Logger.error(this, msg, e1);
                        System.err.println(msg);
                        throw new 
NodeInitException(NodeInitException.EXIT_STORE_FILE_NOT_FOUND, msg);
-               } catch (IOException e1) {
-                       String msg = "Could not open datastore: "+e1;
+               } catch (final IOException e1) {
+                       final String msg = "Could not open datastore: "+e1;
                        Logger.error(this, msg, e1);
                        System.err.println(msg);
                        e1.printStackTrace();
                        throw new 
NodeInitException(NodeInitException.EXIT_STORE_IOEXCEPTION, msg);
-               } catch (DatabaseException e1) {
+               } catch (final DatabaseException e1) {
                        try {
                                reconstructFile.createNewFile();
-                       } catch (IOException e) {
+                       } catch (final IOException e) {
                                System.err.println("Cannot create reconstruct 
file "+reconstructFile+" : "+e+" - store will not be reconstructed !!!!");
                                e.printStackTrace();
                        }
-                       String msg = "Could not open datastore due to 
corruption, will attempt to reconstruct on next startup: "+e1;
+                       final String msg = "Could not open datastore due to 
corruption, will attempt to reconstruct on next startup: "+e1;
                        Logger.error(this, msg, e1);
                        System.err.println(msg);
                        e1.printStackTrace();
                        throw new 
NodeInitException(NodeInitException.EXIT_STORE_RECONSTRUCT, msg);
                }
-
-               } else {
-                       chkDatastore = new CHKStore();
-                       new RAMFreenetStore(chkDatastore, (int) 
Math.min(Integer.MAX_VALUE, maxStoreKeys));
-                       chkDatacache = new CHKStore();
-                       new RAMFreenetStore(chkDatacache, (int) 
Math.min(Integer.MAX_VALUE, maxCacheKeys));
-                       pubKeyDatastore = new PubkeyStore();
-                       new RAMFreenetStore(pubKeyDatastore, (int) 
Math.min(Integer.MAX_VALUE, maxStoreKeys));
-                       pubKeyDatacache = new PubkeyStore();
-                       new RAMFreenetStore(pubKeyDatacache, (int) 
Math.min(Integer.MAX_VALUE, maxCacheKeys));
-                       sskDatastore = new SSKStore(this);
-                       new RAMFreenetStore(sskDatastore, (int) 
Math.min(Integer.MAX_VALUE, maxStoreKeys));
-                       sskDatacache = new SSKStore(this);
-                       new RAMFreenetStore(sskDatacache, (int) 
Math.min(Integer.MAX_VALUE, maxCacheKeys));
-                       envMutableConfig = null;
-                       this.storeEnvironment = null;
-               }
-               
-               nodeStats = new NodeStats(this, sortOrder, new 
SubConfig("node.load", config), obwLimit, ibwLimit, nodeDir);
-               
-               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, getDarknetPortNumber(), sortOrder, oldConfig, fproxyConfig, toadlets, 
db);
-
-               netid = new NetworkIDManager(this);
-               
-               if (storeType.equals("salt-hash")) {
-                       ((SaltedHashFreenetStore) 
chkDatastore.getStore()).setUserAlertManager(clientCore.alerts);
-                       ((SaltedHashFreenetStore) 
chkDatacache.getStore()).setUserAlertManager(clientCore.alerts);
-                       ((SaltedHashFreenetStore) 
pubKeyDatastore.getStore()).setUserAlertManager(clientCore.alerts);
-                       ((SaltedHashFreenetStore) 
pubKeyDatacache.getStore()).setUserAlertManager(clientCore.alerts);
-                       ((SaltedHashFreenetStore) 
sskDatastore.getStore()).setUserAlertManager(clientCore.alerts);
-                       ((SaltedHashFreenetStore) 
sskDatacache.getStore()).setUserAlertManager(clientCore.alerts);
-               }
-               
-               securityLevels.registerUserAlert(clientCore.alerts);
-               
-               nodeConfig.register("disableHangCheckers", false, sortOrder++, 
true, false, "Node.disableHangCheckers", "Node.disableHangCheckersLong", new 
BooleanCallback() {
-
-                       @Override
-                       public Boolean get() {
-                               return disableHangCheckers;
-                       }
-
-                       @Override
-                       public void set(Boolean val) throws 
InvalidConfigValueException {
-                               disableHangCheckers = val;
-                       }
-               });
-               
-               disableHangCheckers = 
nodeConfig.getBoolean("disableHangCheckers");
-                               
-               nodeConfig.finishedInitialization();
-               writeNodeFile();
-               
-               // Initialize the plugin manager
-               Logger.normal(this, "Initializing Plugin Manager");
-               System.out.println("Initializing Plugin Manager");
-               pluginManager = new PluginManager(this);
-
-               FetchContext ctx = clientCore.makeClient((short)0, 
true).getFetchContext();
-               
-               ctx.allowSplitfiles = false;
-               ctx.dontEnterImplicitArchives = true;
-               ctx.maxArchiveRestarts = 0;
-               ctx.maxMetadataSize = 256;
-               ctx.maxNonSplitfileRetries = 10;
-               ctx.maxOutputLength = 4096;
-               ctx.maxRecursionLevel = 2;
-               ctx.maxTempLength = 4096;
-               
-               this.arkFetcherContext = ctx;
-               
-               // Node updater support
-               
-               try {
-                       nodeUpdater = NodeUpdateManager.maybeCreate(this, 
config);
-               } catch (InvalidConfigValueException e) {
-                       e.printStackTrace();
-                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_UPDATER, "Could not 
create Updater: "+e);
-               }
-               
-               registerNodeToNodeMessageListener(N2N_MESSAGE_TYPE_FPROXY, 
fproxyN2NMListener);
-               
registerNodeToNodeMessageListener(Node.N2N_MESSAGE_TYPE_DIFFNODEREF, 
diffNoderefListener);
-               
-               Logger.normal(this, "Node constructor completed");
-               System.out.println("Node constructor completed");
        }

        public void start(boolean noSwaps) throws NodeInitException {
@@ -2581,8 +2626,6 @@
                        }
                        chkDatacache.put(block);
                        nodeStats.avgCacheLocation.report(loc);
-                       if(clientCore != null && clientCore.requestStarters != 
null)
-                               
clientCore.requestStarters.chkFetchScheduler.tripPendingKey(block);
                        failureTable.onFound(block);
                } catch (IOException e) {
                        Logger.error(this, "Cannot store data: "+e, e);
@@ -2593,6 +2636,8 @@
                        t.printStackTrace();
                        Logger.error(this, "Caught "+t+" storing data", t);
                }
+               if(clientCore != null && clientCore.requestStarters != null)
+                       
clientCore.requestStarters.chkFetchScheduler.tripPendingKey(block);
        }

        /** Store the block if this is a sink. Call for inserts. */
@@ -2615,8 +2660,6 @@
                                sskDatastore.put(block, false);
                        }
                        sskDatacache.put(block, false);
-                       if(clientCore != null && clientCore.requestStarters != 
null)
-                               
clientCore.requestStarters.sskFetchScheduler.tripPendingKey(block);
                        failureTable.onFound(block);
                } catch (IOException e) {
                        Logger.error(this, "Cannot store data: "+e, e);
@@ -2629,6 +2672,8 @@
                        t.printStackTrace();
                        Logger.error(this, "Caught "+t+" storing data", t);
                }
+               if(clientCore != null && clientCore.requestStarters != null)
+                       
clientCore.requestStarters.sskFetchScheduler.tripPendingKey(block);
        }

        /**
@@ -3784,7 +3829,7 @@
        }

        private SimpleUserAlert alertMTUTooSmall;
-
+       
        public final RequestClient nonPersistentClient = new RequestClient() {
                public boolean persistent() {
                        return false;

Modified: branches/db4o/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeCrypto.java      2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/NodeCrypto.java      2008-09-26 
16:35:23 UTC (rev 22845)
@@ -9,7 +9,7 @@
 import java.math.BigInteger;
 import java.net.MalformedURLException;
 import java.security.MessageDigest;
-import java.util.Vector;
+import java.util.ArrayList;
 import java.util.zip.DeflaterOutputStream;

 import com.db4o.ObjectContainer;
@@ -492,14 +492,14 @@
        }

        public PeerNode[] getAnonSetupPeerNodes() {
-               Vector v = new Vector();
+               ArrayList<PeerNode> v = new ArrayList<PeerNode>();
                PeerNode[] peers = node.peers.myPeers;
                for(int i=0;i<peers.length;i++) {
                        PeerNode pn = peers[i];
                        if(pn.handshakeUnknownInitiator() && 
pn.getOutgoingMangler() == packetMangler)
                                v.add(pn);
                }
-               return (PeerNode[]) v.toArray(new PeerNode[v.size()]);
+               return v.toArray(new PeerNode[v.size()]);
        }

        void setPortForwardingBroken() {

Modified: branches/db4o/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeDispatcher.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/NodeDispatcher.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -93,7 +93,7 @@
                        // Send an FNPPong
                        Message reply = 
DMT.createFNPPong(m.getInt(DMT.PING_SEQNO));
                        try {
-                               source.sendAsync(reply, null, 0, pingCounter); 
// nothing we can do if can't contact source
+                               source.sendAsync(reply, null, pingCounter); // 
nothing we can do if can't contact source
                        } catch (NotConnectedException e) {
                                if(logMINOR) Logger.minor(this, "Lost 
connection replying to "+m);
                        }
@@ -247,7 +247,7 @@
                
if(!HMAC.verifyWithSHA256(node.failureTable.offerAuthenticatorKey, 
key.getFullKey(), authenticator)) {
                        Logger.error(this, "Invalid offer request from 
"+source+" : authenticator did not verify");
                        try {
-                               
source.sendAsync(DMT.createFNPGetOfferedKeyInvalid(uid, 
DMT.GET_OFFERED_KEY_REJECTED_BAD_AUTHENTICATOR), null, 0, 
node.failureTable.senderCounter);
+                               
source.sendAsync(DMT.createFNPGetOfferedKeyInvalid(uid, 
DMT.GET_OFFERED_KEY_REJECTED_BAD_AUTHENTICATOR), null, 
node.failureTable.senderCounter);
                        } catch (NotConnectedException e) {
                                // Too bad.
                        }
@@ -267,7 +267,7 @@
                        Logger.normal(this, "Rejecting FNPGetOfferedKey from 
"+source+" for "+key+" : "+reject);
                        Message rejected = DMT.createFNPRejectedOverload(uid, 
true);
                        try {
-                               source.sendAsync(rejected, null, 0, 
node.failureTable.senderCounter);
+                               source.sendAsync(rejected, null, 
node.failureTable.senderCounter);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting (overload) data 
request from "+source.getPeer()+": "+e);
                        }
@@ -346,7 +346,7 @@
                if(node.recentlyCompleted(id)) {
                        Message rejected = DMT.createFNPRejectedLoop(id);
                        try {
-                               source.sendAsync(rejected, null, 0, ctr);
+                               source.sendAsync(rejected, null, ctr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting data request 
(loop, finished): "+e);
                        }
@@ -358,7 +358,7 @@
                        if(logMINOR) Logger.minor(this, "Could not lock ID 
"+id+" -> rejecting (already running)");
                        Message rejected = DMT.createFNPRejectedLoop(id);
                        try {
-                               source.sendAsync(rejected, null, 0, ctr);
+                               source.sendAsync(rejected, null, ctr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting request from 
"+source.getPeer()+": "+e);
                        }
@@ -373,7 +373,7 @@
                        Logger.normal(this, "Rejecting "+(isSSK ? "SSK" : 
"CHK")+" request from "+source.getPeer()+" preemptively because "+rejectReason);
                        Message rejected = DMT.createFNPRejectedOverload(id, 
true);
                        try {
-                               source.sendAsync(rejected, null, 0, ctr);
+                               source.sendAsync(rejected, null, ctr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting (overload) data 
request from "+source.getPeer()+": "+e);
                        }
@@ -396,7 +396,7 @@
                if(node.recentlyCompleted(id)) {
                        Message rejected = DMT.createFNPRejectedLoop(id);
                        try {
-                               source.sendAsync(rejected, null, 0, ctr);
+                               source.sendAsync(rejected, null, ctr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting insert request 
from "+source.getPeer()+": "+e);
                        }
@@ -406,7 +406,7 @@
                        if(logMINOR) Logger.minor(this, "Could not lock ID 
"+id+" -> rejecting (already running)");
                        Message rejected = DMT.createFNPRejectedLoop(id);
                        try {
-                               source.sendAsync(rejected, null, 0, ctr);
+                               source.sendAsync(rejected, null, ctr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting insert request 
from "+source.getPeer()+": "+e);
                        }
@@ -418,7 +418,7 @@
                        Logger.normal(this, "Rejecting insert from 
"+source.getPeer()+" preemptively because "+rejectReason);
                        Message rejected = DMT.createFNPRejectedOverload(id, 
true);
                        try {
-                               source.sendAsync(rejected, null, 0, ctr);
+                               source.sendAsync(rejected, null, ctr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting (overload) 
insert request from "+source.getPeer()+": "+e);
                        }
@@ -453,7 +453,7 @@
                if(node.recentlyCompleted(id)) {
                        Message rejected = DMT.createFNPRejectedLoop(id);
                        try {
-                               source.sendAsync(rejected, null, 0, 
node.nodeStats.probeRequestCtr);
+                               source.sendAsync(rejected, null, 
node.nodeStats.probeRequestCtr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting probe request 
from "+source.getPeer()+": "+e);
                        }
@@ -466,7 +466,7 @@
                        Logger.normal(this, "Rejecting probe request from 
"+source.getPeer());
                        Message rejected = DMT.createFNPRejectedOverload(id, 
true);
                        try {
-                               source.sendAsync(rejected, null, 0, 
node.nodeStats.probeRequestCtr);
+                               source.sendAsync(rejected, null, 
node.nodeStats.probeRequestCtr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting (overload) 
insert request from "+source.getPeer()+": "+e);
                        }
@@ -477,7 +477,7 @@
                        Logger.normal(this, "Rejecting invalid 
(target="+target+") probe request from "+source.getPeer());
                        Message rejected = DMT.createFNPRejectedOverload(id, 
true);
                        try {
-                               source.sendAsync(rejected, null, 0, 
node.nodeStats.probeRequestCtr);
+                               source.sendAsync(rejected, null, 
node.nodeStats.probeRequestCtr);
                        } catch (NotConnectedException e) {
                                Logger.normal(this, "Rejecting (invalid) insert 
request from "+source.getPeer()+": "+e);
                        }
@@ -493,7 +493,7 @@
                if(om == null || !source.canAcceptAnnouncements()) {
                        Message msg = DMT.createFNPOpennetDisabled(uid);
                        try {
-                               source.sendAsync(msg, null, 0, 
node.nodeStats.announceByteCounter);
+                               source.sendAsync(msg, null, 
node.nodeStats.announceByteCounter);
                        } catch (NotConnectedException e) {
                                // Ok
                        }
@@ -502,7 +502,7 @@
                if(node.recentlyCompleted(uid)) {
                        Message msg = DMT.createFNPRejectedLoop(uid);
                        try {
-                               source.sendAsync(msg, null, 0, 
node.nodeStats.announceByteCounter);
+                               source.sendAsync(msg, null, 
node.nodeStats.announceByteCounter);
                        } catch (NotConnectedException e) {
                                // Ok
                        }
@@ -516,7 +516,7 @@
                        if(!source.shouldAcceptAnnounce(uid)) {
                                Message msg = 
DMT.createFNPRejectedOverload(uid, true);
                                try {
-                                       source.sendAsync(msg, null, 0, 
node.nodeStats.announceByteCounter);
+                                       source.sendAsync(msg, null, 
node.nodeStats.announceByteCounter);
                                } catch (NotConnectedException e) {
                                        // Ok
                                }
@@ -596,7 +596,7 @@
                        // Relay.
                        if(rc.source != null) {
                                try {
-                                       
rc.source.sendAsync(DMT.createFNPRoutedRejected(id, (short)0), null, 0, 
nodeStats.routedMessageCtr);
+                                       
rc.source.sendAsync(DMT.createFNPRoutedRejected(id, (short)0), null, 
nodeStats.routedMessageCtr);
                                } catch (NotConnectedException e) {
                                        // Ouch.
                                        Logger.error(this, "Unable to relay 
probe DNF: peer disconnected: "+rc.source);
@@ -626,7 +626,7 @@
                ctx = routedContexts.get(lid);
                if(ctx != null) {
                        try {
-                               
source.sendAsync(DMT.createFNPRoutedRejected(id, htl), null, 0, 
nodeStats.routedMessageCtr);
+                               
source.sendAsync(DMT.createFNPRoutedRejected(id, htl), null, 
nodeStats.routedMessageCtr);
                        } catch (NotConnectedException e) {
                                if(logMINOR) Logger.minor(this, "Lost 
connection rejecting "+m);
                        }
@@ -648,7 +648,7 @@
                } else if(htl == 0) {
                        Message reject = DMT.createFNPRoutedRejected(id, 
(short)0);
                        if(source != null) try {
-                               source.sendAsync(reject, null, 0, 
nodeStats.routedMessageCtr);
+                               source.sendAsync(reject, null, 
nodeStats.routedMessageCtr);
                        } catch (NotConnectedException e) {
                                if(logMINOR) Logger.minor(this, "Lost 
connection rejecting "+m);
                        }
@@ -670,7 +670,7 @@
                PeerNode pn = ctx.source;
                if(pn == null) return false;
                try {
-                       pn.sendAsync(m, null, 0, nodeStats.routedMessageCtr);
+                       pn.sendAsync(m, null, nodeStats.routedMessageCtr);
                } catch (NotConnectedException e) {
                        if(logMINOR) Logger.minor(this, "Lost connection 
forwarding "+m+" to "+pn);
                }
@@ -696,7 +696,7 @@
                                if(logMINOR) Logger.minor(this, "Forwarding 
"+m.getSpec()+" to "+next.getPeer().getPort());
                                ctx.addSent(next);
                                try {
-                                       next.sendAsync(m, null, 0, 
nodeStats.routedMessageCtr);
+                                       next.sendAsync(m, null, 
nodeStats.routedMessageCtr);
                                } catch (NotConnectedException e) {
                                        continue;
                                }
@@ -705,7 +705,7 @@
                                // Reached a dead end...
                                Message reject = 
DMT.createFNPRoutedRejected(id, htl);
                                if(pn != null) try {
-                                       pn.sendAsync(reject, null, 0, 
nodeStats.routedMessageCtr);
+                                       pn.sendAsync(reject, null, 
nodeStats.routedMessageCtr);
                                } catch (NotConnectedException e) {
                                        Logger.error(this, "Cannot send reject 
message back to source "+pn);
                                        return true;
@@ -741,7 +741,7 @@
                        Message reply = DMT.createFNPRoutedPong(id, x);
                        if(logMINOR) Logger.minor(this, "Replying - counter = 
"+x+" for "+id);
                        try {
-                               src.sendAsync(reply, null, 0, 
nodeStats.routedMessageCtr);
+                               src.sendAsync(reply, null, 
nodeStats.routedMessageCtr);
                        } catch (NotConnectedException e) {
                                if(logMINOR) Logger.minor(this, "Lost 
connection replying to "+m+" in dispatchRoutedMessage");
                        }

Modified: branches/db4o/freenet/src/freenet/node/NodeIPDetector.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeIPDetector.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/NodeIPDetector.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -6,7 +6,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Vector;
+import java.util.List;

 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
@@ -24,7 +24,6 @@
 import freenet.pluginmanager.FredPluginPortForward;
 import freenet.support.HTMLNode;
 import freenet.support.Logger;
-import freenet.support.api.BooleanCallback;
 import freenet.support.api.StringCallback;
 import freenet.support.transport.ip.HostnameSyntaxException;
 import freenet.support.transport.ip.IPAddressDetector;
@@ -99,7 +98,7 @@
        FreenetInetAddress[] detectPrimaryIPAddress(boolean dumpLocalAddresses) 
{
                boolean addedValidIP = false;
                Logger.minor(this, "Redetecting IPs...");
-               Vector addresses = new Vector();
+               ArrayList<FreenetInetAddress> addresses = new 
ArrayList<FreenetInetAddress>();
                if(overrideIPAddress != null) {
                        // If the IP is overridden and the override is valid, 
the override has to be the first element.
                        // overrideIPAddress will be null if the override is 
invalid
@@ -131,11 +130,14 @@
                }
                lastIPAddress = (FreenetInetAddress[]) addresses.toArray(new 
FreenetInetAddress[addresses.size()]);
                if(dumpLocalAddresses) {
-                       ArrayList filtered = new 
ArrayList(lastIPAddress.length);
+                       ArrayList<FreenetInetAddress> filtered = new 
ArrayList<FreenetInetAddress>(lastIPAddress.length);
                        for(int i=0;i<lastIPAddress.length;i++) {
                                if(lastIPAddress[i] == null) continue;
-                               
if(IPUtil.isValidAddress(lastIPAddress[i].getAddress(), false))
+                               if(lastIPAddress[i] == overrideIPAddress && 
lastIPAddress[i].hasHostnameNoIP())
                                        filtered.add(lastIPAddress[i]);
+                               else if(lastIPAddress[i].hasHostnameNoIP()) 
continue;
+                               else 
if(IPUtil.isValidAddress(lastIPAddress[i].getAddress(), false))
+                                       filtered.add(lastIPAddress[i]);
                        }
                        return (FreenetInetAddress[]) filtered.toArray(new 
FreenetInetAddress[filtered.size()]);
                }
@@ -163,7 +165,7 @@
         * @param addedValidIP
         * @return
         */
-       private boolean innerDetect(Vector addresses) {
+       private boolean innerDetect(List<FreenetInetAddress> addresses) {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                boolean addedValidIP = false;
                InetAddress[] detectedAddrs = ipDetector.getAddress();
@@ -204,7 +206,7 @@
                // Try to pick it up from our connections
                if(node.peers != null) {
                        PeerNode[] peerList = node.peers.myPeers;
-                       HashMap countsByPeer = new HashMap();
+                       HashMap<FreenetInetAddress,Integer> countsByPeer = new 
HashMap<FreenetInetAddress,Integer>();
                        // FIXME use a standard mutable int object, we have one 
somewhere
                        for(int i=0;i<peerList.length;i++) {
                                if(!peerList[i].isConnected()) continue;
@@ -221,11 +223,9 @@
                                if(logMINOR)
                                        Logger.minor(this, "Peer 
"+peerList[i].getPeer()+" thinks we are "+addr);
                                if(countsByPeer.containsKey(addr)) {
-                                       Integer count = (Integer) 
countsByPeer.get(addr);
-                                       Integer newCount = new 
Integer(count.intValue()+1);
-                                       countsByPeer.put(addr, newCount);
+                                       countsByPeer.put(addr, 
countsByPeer.get(addr) + 1);
                                } else {
-                                       countsByPeer.put(addr, new Integer(1));
+                                       countsByPeer.put(addr, 1);
                                }
                        }
                        if(countsByPeer.size() == 1) {

Modified: branches/db4o/freenet/src/freenet/node/NodeIPPortDetector.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeIPPortDetector.java      
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/NodeIPPortDetector.java      
2008-09-26 16:35:23 UTC (rev 22845)
@@ -3,10 +3,10 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.node;

+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Vector;

 import freenet.io.comm.FreenetInetAddress;
 import freenet.io.comm.Peer;
@@ -61,7 +61,7 @@
         */
        Peer[] detectPrimaryPeers() {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
-               Vector addresses = new Vector();
+               ArrayList<Peer> addresses = new ArrayList<Peer>();
                FreenetInetAddress[] addrs = detectPrimaryIPAddress();
                for(int i=0;i<addrs.length;i++) {
                        addresses.add(new Peer(addrs[i], crypto.portNumber));
@@ -74,7 +74,7 @@
                PeerNode[] peerList = crypto.getPeerNodes();

                if(peerList != null) {
-                       HashMap countsByPeer = new HashMap();
+                       HashMap<Peer,Integer> countsByPeer = new 
HashMap<Peer,Integer>();
                        // FIXME use a standard mutable int object, we have one 
somewhere
                        for(int i=0;i<peerList.length;i++) {
                                Peer p = peerList[i].getRemoteDetectedPeer();
@@ -84,11 +84,9 @@
                                if(Logger.shouldLog(Logger.MINOR, this))
                                        Logger.minor(this, "Peer 
"+peerList[i].getPeer()+" thinks we are "+p);
                                if(countsByPeer.containsKey(p)) {
-                                       Integer count = (Integer) 
countsByPeer.get(p);
-                                       Integer newCount = new 
Integer(count.intValue()+1);
-                                       countsByPeer.put(p, newCount);
+                                       countsByPeer.put(p, countsByPeer.get(p) 
+ 1);
                                } else {
-                                       countsByPeer.put(p, new Integer(1));
+                                       countsByPeer.put(p, 1);
                                }
                        }
                        if(countsByPeer.size() == 1) {

Modified: branches/db4o/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/OpennetManager.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/OpennetManager.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -11,9 +11,9 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.Vector;

 import freenet.io.comm.ByteCounter;
 import freenet.io.comm.DMT;
@@ -128,11 +128,8 @@
                oldPeers = new LRUQueue();
                node.peers.tryReadPeers(new File(node.nodeDir, 
"openpeers-"+crypto.portNumber).toString(), crypto, this, true, false);
                OpennetPeerNode[] nodes = node.peers.getOpennetPeers();
-               Arrays.sort(nodes, new Comparator() {
-                       public int compare(Object arg0, Object arg1) {
-                               OpennetPeerNode pn1 = (OpennetPeerNode) arg0;
-                               OpennetPeerNode pn2 = (OpennetPeerNode) arg1;
-                               
+               Arrays.sort(nodes, new Comparator<OpennetPeerNode>() {
+                       public int compare(OpennetPeerNode pn1, OpennetPeerNode 
pn2) {
                                long lastSuccess1 = pn1.timeLastSuccess();
                                long lastSuccess2 = pn2.timeLastSuccess();

@@ -310,7 +307,7 @@
                        return true;
                }
                boolean canAdd = true;
-               Vector dropList = new Vector();
+               ArrayList<OpennetPeerNode> dropList = new 
ArrayList<OpennetPeerNode>();
                synchronized(this) {
                        int maxPeers = getNumberOfConnectedPeersToAim();
                        // If we have dropped a disconnected peer, then the 
inter-peer offer cooldown doesn't apply: we can accept immediately.
@@ -320,7 +317,7 @@
                                if(toDrop != null)
                                        hasDisconnected = !toDrop.isConnected();
                        } else while(peersLRU.size() > maxPeers - (nodeToAddNow 
== null ? 0 : 1)) {
-                               PeerNode toDrop;
+                               OpennetPeerNode toDrop;
                                // can drop peers which are over the limit
                                toDrop = peerToDrop(noDisconnect || 
nodeToAddNow == null);
                                if(toDrop == null) {
@@ -370,8 +367,7 @@
                        // Just because it's in the global peers list doesn't 
mean its in the LRU, it may be an old-opennet-peers reconnection.
                        // In which case we add it to the global peers list 
*before* adding it here.
                }
-               for(int i=0;i<dropList.size();i++) {
-                       OpennetPeerNode pn = (OpennetPeerNode) dropList.get(i);
+               for(OpennetPeerNode pn : dropList) {
                        if(logMINOR) Logger.minor(this, "Dropping LRU opennet 
peer: "+pn);
                        node.peers.disconnect(pn, true, true);
                }
@@ -392,7 +388,7 @@
                }
        }

-       synchronized PeerNode peerToDrop(boolean noDisconnect) {
+       synchronized OpennetPeerNode peerToDrop(boolean noDisconnect) {
                if(peersLRU.size() < getNumberOfConnectedPeersToAim()) {
                        // Don't drop any peers
                        return null;
@@ -520,7 +516,7 @@
                long xferUID = node.random.nextLong();
                Message msg2 = isReply ? 
DMT.createFNPOpennetConnectReplyNew(uid, xferUID, noderef.length, 
padded.length) :
                        DMT.createFNPOpennetConnectDestinationNew(uid, xferUID, 
noderef.length, padded.length);
-               peer.sendAsync(msg2, null, 0, ctr);
+               peer.sendAsync(msg2, null, ctr);
                innerSendOpennetRef(xferUID, padded, peer, ctr);
        }

@@ -551,7 +547,7 @@
                long xferUID = node.random.nextLong();
                Message msg = DMT.createFNPOpennetAnnounceRequest(uid, xferUID, 
noderef.length, 
                                paddedSize(noderef.length), target, htl);
-               peer.sendAsync(msg, null, 0, ctr);
+               peer.sendAsync(msg, null, ctr);
                return xferUID;
        }

@@ -582,7 +578,7 @@
                long xferUID = node.random.nextLong();
                Message msg = DMT.createFNPOpennetAnnounceReply(uid, xferUID, 
noderef.length, 
                                padded.length);
-               peer.sendAsync(msg, null, 0, ctr);
+               peer.sendAsync(msg, null, ctr);
                innerSendOpennetRef(xferUID, padded, peer, ctr);
        }

@@ -664,7 +660,7 @@
        public void rejectRef(long uid, PeerNode source, int reason, 
ByteCounter ctr) {
                Message msg = DMT.createFNPOpennetNoderefRejected(uid, reason);
                try {
-                       source.sendAsync(msg, null, 0, ctr);
+                       source.sendAsync(msg, null, ctr);
                } catch (NotConnectedException e) {
                        // Ignore
                }

Modified: branches/db4o/freenet/src/freenet/node/OutgoingPacketMangler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/OutgoingPacketMangler.java   
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/OutgoingPacketMangler.java   
2008-09-26 16:35:23 UTC (rev 22845)
@@ -24,9 +24,11 @@
         * Build one or more packets and send them, from a whole bunch of 
messages.
         * If any MessageItem's are formatted already, they will be sent as 
single packets.
         * Any packets which cannot be sent will be requeued on the PeerNode.
+        * @param onePacketOnly If true, we will only send one packet, and will 
requeue any
+        * messages that don't fit in that single packet.
         */
        public void processOutgoingOrRequeue(MessageItem[] messages, PeerNode 
pn,
-                       boolean neverWaitForPacketNumber, boolean dontRequeue);
+                       boolean neverWaitForPacketNumber, boolean dontRequeue, 
boolean onePacketOnly);

        /**
         * Resend a single packet.
@@ -41,7 +43,7 @@
         * @return Total size including UDP headers of the sent packet.
         */
        public int processOutgoing(byte[] buf, int offset, int length,
-                       KeyTracker tracker, int alreadyReportedBytes, short 
priority)
+                       KeyTracker tracker, short priority)
                        throws KeyChangedException, NotConnectedException,
                        PacketSequenceException, WouldBlockException;

@@ -64,7 +66,7 @@
         */
        public int processOutgoingPreformatted(byte[] buf, int offset, int 
length,
                        KeyTracker tracker, int packetNumber,
-                       AsyncMessageCallback[] callbacks, int 
alreadyReportedBytes, short priority)
+                       AsyncMessageCallback[] callbacks, short priority)
                        throws KeyChangedException, NotConnectedException,
                        PacketSequenceException, WouldBlockException;


Modified: branches/db4o/freenet/src/freenet/node/PacketSender.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/PacketSender.java    2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/PacketSender.java    2008-09-26 
16:35:23 UTC (rev 22845)
@@ -8,28 +8,22 @@

 import org.tanukisoftware.wrapper.WrapperManager;

-import freenet.io.comm.DMT;
-import freenet.io.comm.Message;
-import freenet.io.comm.NotConnectedException;
-import freenet.io.comm.PacketSocketHandler;
 import freenet.support.FileLoggerHook;
 import freenet.support.Logger;
 import freenet.support.OOMHandler;
-import freenet.support.WouldBlockException;
 import freenet.support.io.NativeThread;

 /**
  * @author amphibian
  * 
- * Thread that sends a packet whenever:
- * - A packet needs to be resent immediately
- * - Acknowledgements or resend requests need to be sent urgently.
+ *         Thread that sends a packet whenever: - A packet needs to be resent 
immediately -
+ *         Acknowledgments or resend requests need to be sent urgently.
  */
 public class PacketSender implements Runnable, Ticker {

        private static boolean logMINOR;
        private static boolean logDEBUG;
-       /** Maximum time we will queue a message for in millseconds */
+       /** Maximum time we will queue a message for in milliseconds */
        static final int MAX_COALESCING_DELAY = 100;
        /** If opennet is enabled, and there are fewer than this many 
connections,
         * we MAY attempt to contact old opennet peers (opennet peers we have 
@@ -162,11 +156,16 @@
        public void run() {
                if(logMINOR) Logger.minor(this, "In PacketSender.run()");
                freenet.support.Logger.OSThread.logPID(this);
+               /*
+                * Index of the point in the nodes list at which we sent a 
packet and then
+                * ran out of bandwidth. We start the loop from here next time.
+                */
+               int brokeAt = 0;
                while(true) {
                        lastReceivedPacketFromAnyNode = lastReportedNoPackets;
                        try {
                                logMINOR = Logger.shouldLog(Logger.MINOR, this);
-                               realRun();
+                               brokeAt = realRun(brokeAt);
                        } catch(OutOfMemoryError e) {
                                OOMHandler.handleOOM(e);
                                System.err.println("Will retry above failed 
operation...");
@@ -178,7 +177,7 @@
                }
        }

-       private void realRun() {
+       private int realRun(int brokeAt) {
                long now = System.currentTimeMillis();
                lastTimeInSeconds = (int) (now / 1000);
                PeerManager pm = node.peers;
@@ -200,9 +199,27 @@
                long oldTempNow = now;
                // Needs to be run very frequently. Maybe change to a regular 
once per second schedule job?
                // Maybe not worth it as it is fairly lightweight.
+               // FIXME given the lock contention, maybe it's worth it? What 
about 
+               // running it on the UdpSocketHandler thread? That would surely 
be better...?
                node.lm.removeTooOldQueuedItems();
+               
+               boolean canSendThrottled = false;
+               
+               int MAX_PACKET_SIZE = 
node.darknetCrypto.socket.getMaxPacketSize();
+               long count = node.outputThrottle.getCount();
+               if(count > MAX_PACKET_SIZE)
+                       canSendThrottled = true;
+               else {
+                       long canSendAt = node.outputThrottle.getNanosPerTick() 
* (MAX_PACKET_SIZE - count);
+                       canSendAt = (canSendAt / (1000*1000)) + (canSendAt % 
(1000*1000) == 0 ? 0 : 1);
+                       if(logMINOR)
+                               Logger.minor(this, "Can send throttled packets 
in "+canSendAt+"ms");
+                       nextActionTime = Math.min(nextActionTime, now + 
canSendAt);
+               }
+               
+               int newBrokeAt = 0;
                for(int i = 0; i < nodes.length; i++) {
-                       PeerNode pn = nodes[i];
+                       PeerNode pn = nodes[(i + brokeAt + 1) % nodes.length];
                        lastReceivedPacketFromAnyNode =
                                Math.max(pn.lastReceivedPacketTime(), 
lastReceivedPacketFromAnyNode);
                        pn.maybeOnConnect();
@@ -210,6 +227,8 @@
                                // Might as well do it properly.
                                node.peers.disconnect(pn, true, true);
                        }
+                       if(pn.shouldThrottle() && !canSendThrottled)
+                               continue;

                        if(pn.isConnected()) {
                                // Is the node dead?
@@ -230,109 +249,26 @@
                                        continue;
                                }

-                               boolean mustSend = false;
-
-                               // Any urgent notifications to send?
-                               long urgentTime = pn.getNextUrgentTime();
-                               // Should spam the logs, unless there is a 
deadlock
-                               if(urgentTime < Long.MAX_VALUE && logMINOR)
-                                       Logger.minor(this, "Next urgent time: " 
+ urgentTime + " for " + pn.getPeer());
-                               if(urgentTime <= now)
-                                       mustSend = true;
-                               else
-                                       nextActionTime = 
Math.min(nextActionTime, urgentTime);
-
-                               pn.checkTrackerTimeout();
-                               
-                               // Any packets to resend?
-                               for(int j = 0; j < 2; j++) {
-                                       KeyTracker kt;
-                                       if(j == 0)
-                                               kt = pn.getCurrentKeyTracker();
-                                       else if(j == 1)
-                                               kt = pn.getPreviousKeyTracker();
-                                       else
-                                               break; // impossible
-                                       if(kt == null)
-                                               continue;
-                                       int[] tmp = 
kt.grabResendPackets(rpiTemp, rpiIntTemp);
-                                       if(tmp == null)
-                                               continue;
-                                       rpiIntTemp = tmp;
-                                       for(int k = 0; k < rpiTemp.size(); k++) 
{
-                                               ResendPacketItem item = 
(ResendPacketItem) rpiTemp.get(k);
-                                               if(item == null)
-                                                       continue;
-                                               try {
-                                                       if(logMINOR)
-                                                               
Logger.minor(this, "Resending " + item.packetNumber + " to " + item.kt);
-                                                       
pn.getOutgoingMangler().resend(item);
-                                                       mustSend = false;
-                                               } catch(KeyChangedException e) {
-                                                       Logger.error(this, 
"Caught " + e + " resending packets to " + kt);
-                                                       
pn.requeueResendItems(rpiTemp);
-                                                       break;
-                                               } catch(NotConnectedException 
e) {
-                                                       Logger.normal(this, 
"Caught " + e + " resending packets to " + kt);
-                                                       
pn.requeueResendItems(rpiTemp);
-                                                       break;
-                                               } catch(PacketSequenceException 
e) {
-                                                       Logger.error(this, 
"Caught " + e + " - disconnecting", e);
-                                                       // PSE is fairly 
drastic, something is broken between us, but maybe we can resync
-                                                       
pn.forceDisconnect(false); 
-                                               } catch(WouldBlockException e) {
-                                                       Logger.error(this, 
"Impossible: " + e, e);
-                                               }
+                               if(pn.maybeSendPacket(now, rpiTemp, rpiIntTemp) 
&& canSendThrottled) {
+                                       canSendThrottled = false;
+                                       count = node.outputThrottle.getCount();
+                                       if(count > MAX_PACKET_SIZE)
+                                               canSendThrottled = true;
+                                       else {
+                                               long canSendAt = 
node.outputThrottle.getNanosPerTick() * (MAX_PACKET_SIZE - count);
+                                               canSendAt = (canSendAt / 
(1000*1000)) + (canSendAt % (1000*1000) == 0 ? 0 : 1);
+                                               if(logMINOR)
+                                                       Logger.minor(this, "Can 
send throttled packets in "+canSendAt+"ms");
+                                               nextActionTime = 
Math.min(nextActionTime, now + canSendAt);
+                                               newBrokeAt = i;
                                        }
-
                                }
-
-                               // Any messages to send?
-                               MessageItem[] messages = null;
-                               messages = pn.grabQueuedMessageItems();
-                               if((messages != null) && (messages.length > 0)) 
{
-                                       long l = Long.MAX_VALUE;
-                                       int sz = 
pn.getOutgoingMangler().fullHeadersLengthOneMessage(); // includes UDP headers 
-                                       for(int j = 0; j < messages.length; 
j++) {
-                                               if(l > messages[j].submitted)
-                                                       l = 
messages[j].submitted;
-                                               sz += 2 + /* FIXME only 2? */ 
messages[j].getData(pn).length;
-                                       }
-                                       if(node.enablePacketCoalescing && (l + 
MAX_COALESCING_DELAY > now) &&
-                                               (sz < ((PacketSocketHandler) 
pn.getSocketHandler()).getPacketSendThreshold())) {
-                                               // Don't send immediately
-                                               if(nextActionTime > (l + 
MAX_COALESCING_DELAY))
-                                                       nextActionTime = l + 
MAX_COALESCING_DELAY;
-                                               
pn.requeueMessageItems(messages, 0, messages.length, true, "TrafficCoalescing");
-                                       } else {
-                                               for(int j = 0; j < 
messages.length; j++)
-                                                       if(logMINOR)
-                                                               
Logger.minor(this, "PS Sending: " + (messages[j].msg == null ? "(not a 
Message)" : messages[j].msg.getSpec().getName())+" to "+pn);
-                                               // Send packets, right now, 
blocking, including any active notifications
-                                               
pn.getOutgoingMangler().processOutgoingOrRequeue(messages, pn, true, false);
-                                               continue;
-                                       }
-                               }
-
-                               if(mustSend)
-                                       // Send them
-
-                                       try {
-                                               
pn.sendAnyUrgentNotifications(false);
-                                       } catch(PacketSequenceException e) {
-                                               Logger.error(this, "Caught " + 
e + " - while sending urgent notifications : disconnecting", e);
-                                               pn.forceDisconnect(false);
-                                       }
-
-                               // Need to send a keepalive packet?
-                               if(now - pn.lastSentPacketTime() > 
Node.KEEPALIVE_INTERVAL) {
-                                       if(logMINOR)
-                                               Logger.minor(this, "Sending 
keepalive");
-                                       // Force packet to have a sequence 
number.
-                                       Message m = DMT.createFNPVoid();
-                                       
pn.addToLocalNodeSentMessagesToStatistic(m);
-                                       
pn.getOutgoingMangler().processOutgoingOrRequeue(new MessageItem[]{new 
MessageItem(m, null, 0, null)}, pn, true, true);
-                               }
+                               
+                               long urgentTime = pn.getNextUrgentTime(now);
+                               // Should spam the logs, unless there is a 
deadlock
+                               if(urgentTime < Long.MAX_VALUE && logMINOR)
+                                       Logger.minor(this, "Next urgent time: " 
+ urgentTime + "(in "+(urgentTime - now)+") for " + pn.getPeer());
+                               nextActionTime = Math.min(nextActionTime, 
urgentTime);
                        } else
                                // Not connected

@@ -352,6 +288,7 @@
                                Logger.error(this, "tempNow is more than 5 
seconds past oldTempNow (" + (tempNow - oldTempNow) + ") in PacketSender 
working with " + pn.userToString());
                        oldTempNow = tempNow;
                }
+               brokeAt = newBrokeAt;

                // Consider sending connect requests to our opennet old-peers.
                // No point if they are NATed, of course... but we don't know 
whether they are.
@@ -468,6 +405,7 @@
                        // because a new packet came in.
                        }
                }
+               return brokeAt;
        }

        /** Wake up, and send any queued packets. */

Modified: branches/db4o/freenet/src/freenet/node/PeerManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/PeerManager.java     2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/PeerManager.java     2008-09-26 
16:35:23 UTC (rev 22845)
@@ -517,7 +517,7 @@
                                                if(removePeer(pn))
                                                        writePeers();
                                        }
-                               }, 0, ctrDisconn);
+                               }, ctrDisconn);
                        } catch(NotConnectedException e) {
                                if(pn.isDisconnecting() && removePeer(pn))
                                        writePeers();
@@ -723,7 +723,7 @@
                        if(onlyRealConnections && !peers[i].isRealConnection())
                                continue;
                        try {
-                               peers[i].sendAsync(msg, null, 0, ctr);
+                               peers[i].sendAsync(msg, null, ctr);
                        } catch(NotConnectedException e) {
                                // Ignore
                        }

Copied: branches/db4o/freenet/src/freenet/node/PeerMessageQueue.java (from rev 
22843, trunk/freenet/src/freenet/node/PeerMessageQueue.java)
===================================================================
--- branches/db4o/freenet/src/freenet/node/PeerMessageQueue.java                
                (rev 0)
+++ branches/db4o/freenet/src/freenet/node/PeerMessageQueue.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -0,0 +1,476 @@
+package freenet.node;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+import freenet.io.comm.DMT;
+
+/**
+ * Queue of messages to send to a node. Ordered first by priority then by time.
+ * Will soon be round-robin between different transfers/UIDs/clients too.
+ * @author Matthew Toseland <toad at amphibian.dyndns.org> (0xE43DA450)
+ */
+public class PeerMessageQueue {
+
+       private final PrioQueue[] queuesByPriority;
+
+       private class PrioQueue {
+               LinkedList<MessageItem> itemsNoID;
+               ArrayList<LinkedList<MessageItem>> itemsWithID;
+               ArrayList<Long> itemsIDs;
+               Map<Long, LinkedList<MessageItem>> itemsByID;
+               // Construct structures lazily, we're protected by the overall 
synchronized.
+               
+               /** 0 = itemsNoID, else 1-N = in itemsWithID[0-(N-1)].
+                * Set when a packet is sent. */
+               private int roundRobinCounter;
+               
+               public void addLast(MessageItem item) {
+                       if(item.msg == null) {
+                               if(itemsNoID == null) itemsNoID = new 
LinkedList<MessageItem>();
+                               itemsNoID.addLast(item);
+                               return;
+                       }
+                       Object o = item.msg.getObject(DMT.UID);
+                       if(o == null || !(o instanceof Long)) {
+                               if(itemsNoID == null) itemsNoID = new 
LinkedList<MessageItem>();
+                               itemsNoID.addLast(item);
+                               return;
+                       }
+                       Long id = (Long) o;
+                       LinkedList<MessageItem> list;
+                       if(itemsByID == null) {
+                               itemsByID = new HashMap<Long, 
LinkedList<MessageItem>>();
+                               itemsWithID = new 
ArrayList<LinkedList<MessageItem>>();
+                               itemsIDs = new ArrayList<Long>();
+                               list = new LinkedList<MessageItem>();
+                               itemsWithID.add(list);
+                               itemsIDs.add(id);
+                               itemsByID.put(id, list);
+                       } else {
+                               list = itemsByID.get(id);
+                               if(list == null) {
+                                       list = new LinkedList<MessageItem>();
+                                       itemsWithID.add(list);
+                                       itemsByID.put(id, list);
+                                       itemsIDs.add(id);
+                               }
+                       }
+                       list.addLast(item);
+               }
+               
+               public void addFirst(MessageItem item) {
+                       if(item.msg == null) {
+                               if(itemsNoID == null) itemsNoID = new 
LinkedList<MessageItem>();
+                               itemsNoID.addFirst(item);
+                               return;
+                       }
+                       Object o = item.msg.getObject(DMT.UID);
+                       if(o == null || !(o instanceof Long)) {
+                               if(itemsNoID == null) itemsNoID = new 
LinkedList<MessageItem>();
+                               itemsNoID.addFirst(item);
+                               return;
+                       }
+                       Long id = (Long) o;
+                       LinkedList<MessageItem> list;
+                       if(itemsByID == null) {
+                               itemsByID = new HashMap<Long, 
LinkedList<MessageItem>>();
+                               itemsWithID = new 
ArrayList<LinkedList<MessageItem>>();
+                               itemsIDs = new ArrayList<Long>();
+                               list = new LinkedList<MessageItem>();
+                               itemsWithID.add(list);
+                               itemsIDs.add(id);
+                               itemsByID.put(id, list);
+                       } else {
+                               list = itemsByID.get(id);
+                               if(list == null) {
+                                       list = new LinkedList<MessageItem>();
+                                       itemsWithID.add(list);
+                                       itemsIDs.add(id);
+                                       itemsByID.put(id, list);
+                               }
+                       }
+                       list.addFirst(item);
+               }
+
+               public int size() {
+                       int size = 0;
+                       if(itemsNoID != null)
+                               size += itemsNoID.size();
+                       if(itemsWithID != null)
+                               for(LinkedList<MessageItem> list : itemsWithID)
+                                       size += list.size();
+                       return size;
+               }
+
+               public int addTo(MessageItem[] output, int ptr) {
+                       if(itemsNoID != null)
+                               for(MessageItem item : itemsNoID)
+                                       output[ptr++] = item;
+                       if(itemsWithID != null)
+                               for(LinkedList<MessageItem> list : itemsWithID)
+                                       for(MessageItem item : list)
+                                               output[ptr++] = item;
+                       return ptr;
+               }
+
+               public long getNextUrgentTime(long t, long now) {
+                       if(itemsNoID != null) {
+                               t = Math.min(t, itemsNoID.getFirst().submitted 
+ PacketSender.MAX_COALESCING_DELAY);
+                               if(t <= now) return t;
+                       }
+                       if(itemsWithID != null) {
+                               for(LinkedList<MessageItem> items : 
itemsWithID) {
+                                       t = Math.min(t, 
items.getFirst().submitted + PacketSender.MAX_COALESCING_DELAY);
+                                       if(t <= now) return t;
+                               }
+                       }
+                       return t;
+               }
+
+               public int addSize(int length, int maxSize) {
+                       if(itemsNoID != null) {
+                               for(MessageItem item : itemsNoID) {
+                                       int thisLen = item.getLength();
+                                       length += thisLen;
+                                       if(length > maxSize) return length;
+                               }
+                       }
+                       if(itemsWithID != null) {
+                               for(LinkedList<MessageItem> list : itemsWithID) 
{
+                                       for(MessageItem item : list) {
+                                               int thisLen = item.getLength();
+                                               length += thisLen;
+                                               if(length > maxSize) return 
length;
+                                       }
+                               }
+                       }
+                       return length;
+               }
+
+               /**
+                * @param size
+                * @param minSize
+                * @param maxSize
+                * @param now
+                * @param messages
+                * @return The new size of the packet, multiplied by -1 iff 
there are more
+                * messages but they don't fit.
+                */
+               public int addUrgentMessages(int size, int minSize, int 
maxSize, long now, ArrayList<MessageItem> messages) {
+                       int lists = 0;
+                       if(itemsNoID != null)
+                               lists++;
+                       if(itemsWithID != null)
+                               lists += itemsWithID.size();
+                       for(int i=0;i<lists;i++) {
+                               LinkedList<MessageItem> list;
+                               int l = (i + roundRobinCounter + 1) % lists;
+                               int listNum = -1;
+                               if(itemsNoID != null) {
+                                       if(l == 0) list = itemsNoID;
+                                       else {
+                                               listNum = l-1;
+                                               list = itemsWithID.get(listNum);
+                                       }
+                               } else {
+                                       listNum = l;
+                                       list = itemsWithID.get(l);
+                               }
+                               
+                               while(true) {
+                                       if(list.isEmpty()) break;
+                                       MessageItem item = list.getFirst();
+                                       if(item.submitted + 
PacketSender.MAX_COALESCING_DELAY <= now) {
+                                               int thisSize = item.getLength();
+                                               if(size + 2 + thisSize > 
maxSize) {
+                                                       if(size == minSize) {
+                                                               // Send it 
anyway, nothing else to send.
+                                                               size += 2 + 
thisSize;
+                                                               
list.removeFirst();
+                                                               
if(list.isEmpty()) {
+                                                                       if(list 
== itemsNoID) {
+                                                                               
itemsNoID = null;
+                                                                               
lists--;
+                                                                       }
+                                                                       else {
+                                                                               
Long id = itemsIDs.get(listNum);
+                                                                               
itemsWithID.remove(listNum);
+                                                                               
itemsIDs.remove(listNum);
+                                                                               
itemsByID.remove(id);
+                                                                               
lists--;
+                                                                       }
+                                                               }
+                                                               
messages.add(item);
+                                                               
roundRobinCounter = i;
+                                                               return size;
+                                                       }
+                                                       return -size;
+                                               }
+                                               size += 2 + thisSize;
+                                               list.removeFirst();
+                                               if(list.isEmpty()) {
+                                                       if(list == itemsNoID) {
+                                                               itemsNoID = 
null;
+                                                               lists--;
+                                                       } else {
+                                                               Long id = 
itemsIDs.get(listNum);
+                                                               
itemsWithID.remove(listNum);
+                                                               
itemsIDs.remove(listNum);
+                                                               
itemsByID.remove(id);
+                                                               lists--;
+                                                       }
+                                               }
+                                               messages.add(item);
+                                               roundRobinCounter = i;
+                                       } else {
+                                               break;
+                                       }
+                               }
+                       }
+                       return size;
+               }
+               
+               /**
+                * @param size
+                * @param minSize
+                * @param maxSize
+                * @param now
+                * @param messages
+                * @return The new size of the packet, multiplied by -1 iff 
there are more
+                * messages but they don't fit.
+                */
+               public int addMessages(int size, int minSize, int maxSize, long 
now, ArrayList<MessageItem> messages) {
+                       int lists = 0;
+                       if(itemsNoID != null)
+                               lists++;
+                       if(itemsWithID != null)
+                               lists += itemsWithID.size();
+                       for(int i=0;i<lists;i++) {
+                               LinkedList<MessageItem> list;
+                               int l = (i + roundRobinCounter + 1) % lists;
+                               int listNum = -1;
+                               if(itemsNoID != null) {
+                                       if(l == 0) list = itemsNoID;
+                                       else {
+                                               listNum = l-1;
+                                               list = itemsWithID.get(listNum);
+                                       }
+                               } else {
+                                       listNum = l;
+                                       list = itemsWithID.get(l);
+                               }
+                               
+                               while(true) {
+                                       if(list.isEmpty()) break;
+                                       MessageItem item = list.getFirst();
+                                       int thisSize = item.getLength();
+                                       if(size + 2 + thisSize > maxSize) {
+                                               if(size == minSize) {
+                                                       // Send it anyway, 
nothing else to send.
+                                                       size += 2 + thisSize;
+                                                       list.removeFirst();
+                                                       if(list.isEmpty()) {
+                                                               if(list == 
itemsNoID) {
+                                                                       
itemsNoID = null;
+                                                                       lists--;
+                                                               } else {
+                                                                       Long id 
= itemsIDs.get(listNum);
+                                                                       
itemsWithID.remove(listNum);
+                                                                       
itemsIDs.remove(listNum);
+                                                                       
itemsByID.remove(id);
+                                                                       lists--;
+                                                               }
+                                                       }
+                                                       messages.add(item);
+                                                       roundRobinCounter = i;
+                                                       return size;
+                                               }
+                                               return -size;
+                                       }
+                                       size += 2 + thisSize;
+                                       list.removeFirst();
+                                       if(list.isEmpty()) {
+                                               if(list == itemsNoID) {
+                                                       itemsNoID = null;
+                                                       lists--;
+                                               } else {
+                                                       Long id = 
itemsIDs.get(listNum);
+                                                       
itemsWithID.remove(listNum);
+                                                       
itemsIDs.remove(listNum);
+                                                       itemsByID.remove(id);
+                                                       lists--;
+                                               }
+                                       }
+                                       messages.add(item);
+                                       roundRobinCounter = i;
+                               }
+                       }
+                       return size;
+               }
+
+               public void clear() {
+                       itemsNoID = null;
+                       itemsWithID = null;
+                       itemsIDs = null;
+                       itemsByID = null;
+               }
+               
+               
+               
+       }
+       
+       PeerMessageQueue() {
+               queuesByPriority = new PrioQueue[DMT.NUM_PRIORITIES];
+               for(int i=0;i<queuesByPriority.length;i++)
+                       queuesByPriority[i] = new PrioQueue();
+       }
+
+       public synchronized int queueAndEstimateSize(MessageItem item) {
+               enqueuePrioritizedMessageItem(item);
+               int x = 0;
+               for(PrioQueue pq : queuesByPriority) {
+                       if(pq.itemsNoID != null)
+                               for(MessageItem it : pq.itemsNoID) {
+                                       x += it.getLength() + 2;
+                                       if(x > 1024)
+                                               break;
+                               }
+                       if(pq.itemsWithID != null) {
+                               for(LinkedList<MessageItem> q : pq.itemsWithID)
+                                       for(MessageItem it : q) {
+                                               x += it.getLength() + 2;
+                                               if(x > 1024)
+                                                       break;
+                                       }
+                       }
+               }
+               return x;
+       }
+
+       public synchronized long getMessageQueueLengthBytes() {
+               long x = 0;
+               for(PrioQueue pq : queuesByPriority) {
+                       if(pq.itemsNoID != null)
+                               for(MessageItem it : pq.itemsNoID)
+                                       x += it.getLength() + 2;
+                       if(pq.itemsWithID != null)
+                               for(LinkedList<MessageItem> q : pq.itemsWithID)
+                                       for(MessageItem it : q)
+                                               x += it.getLength() + 2;
+               }
+               return x;
+       }
+       
+       private synchronized void enqueuePrioritizedMessageItem(MessageItem 
addMe) {
+               //Assume it goes on the end, both the common case
+               short prio = addMe.getPriority();
+               queuesByPriority[prio].addLast(addMe);
+       }
+       
+       /**
+        * like enqueuePrioritizedMessageItem, but adds it to the front of 
those in the same priority.
+        */
+       synchronized void pushfrontPrioritizedMessageItem(MessageItem addMe) {
+               //Assume it goes on the front
+               short prio = addMe.getPriority();
+               queuesByPriority[prio].addFirst(addMe);
+       }
+
+       public synchronized MessageItem[] grabQueuedMessageItems() {
+               int size = 0;
+               for(int i=0;i<queuesByPriority.length;i++)
+                       size += queuesByPriority[i].size();
+               MessageItem[] output = new MessageItem[size];
+               int ptr = 0;
+               for(PrioQueue queue : queuesByPriority) {
+                       ptr = queue.addTo(output, ptr);
+                       queue.clear();
+               }
+               return output;
+       }
+
+       /**
+        * Get the time at which the next message must be sent. If any message 
is 
+        * overdue, we will return a value less than now, which may not be 
completely 
+        * accurate.
+        * @param t
+        * @param now
+        * @return
+        */
+       public synchronized long getNextUrgentTime(long t, long now) {
+               for(PrioQueue queue : queuesByPriority) {
+                       t = Math.min(t, queue.getNextUrgentTime(t, now));
+                       if(t <= now) return t; // How much in the past doesn't 
matter, as long as it's in the past.
+               }
+               return t;
+       }
+
+       public boolean mustSendNow(long now) {
+               return getNextUrgentTime(Long.MAX_VALUE, now) <= now;
+       }
+
+       public synchronized boolean mustSendSize(int minSize, int maxSize) {
+               int length = minSize;
+               for(PrioQueue items : queuesByPriority) {
+                       length = items.addSize(length, maxSize);
+                       if(length > maxSize) return true;
+               }
+               return false;
+       }
+
+       /**
+        * Add urgent messages to the queue.
+        * @param size
+        * @param now
+        * @param minSize
+        * @param maxSize
+        * @param messages
+        * @return The new size of the packet, multiplied by -1 iff there are 
more
+        * messages but they don't fit.
+        */
+       public synchronized int addUrgentMessages(int size, long now, int 
minSize, int maxSize, ArrayList<MessageItem> messages) {
+               boolean gotEnough = false;
+               for(PrioQueue queue : queuesByPriority) {
+                       size = queue.addUrgentMessages(size, minSize, maxSize, 
now, messages);
+                       if(size < 0) {
+                               size = -size;
+                               gotEnough = true;
+                       }
+               }
+               if(gotEnough)
+                       return -size;
+               else
+                       return size;
+       }
+
+       /**
+        * Add non-urgent messages to the queue.
+        * @param size
+        * @param now
+        * @param minSize
+        * @param maxSize
+        * @param messages
+        * @return The new size of the packet, multiplied by -1 iff there are 
more
+        * messages but they don't fit.
+        */
+       public synchronized int addNonUrgentMessages(int size, long now, int 
minSize, int maxSize, ArrayList<MessageItem> messages) {
+               boolean gotEnough = false;
+               for(PrioQueue queue : queuesByPriority) {
+                       size = queue.addMessages(size, minSize, maxSize, now, 
messages);
+                       if(size < 0) {
+                               size = -size;
+                               gotEnough = true;
+                       }
+               }
+               if(gotEnough)
+                       return -size;
+               else
+                       return size;
+       }       
+       
+       
+}
+

Modified: branches/db4o/freenet/src/freenet/node/PeerNode.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/PeerNode.java        2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/PeerNode.java        2008-09-26 
16:35:23 UTC (rev 22845)
@@ -11,6 +11,7 @@
 import java.net.MalformedURLException;
 import java.net.UnknownHostException;
 import java.security.MessageDigest;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -46,6 +47,7 @@
 import freenet.io.comm.Message;
 import freenet.io.comm.MessageFilter;
 import freenet.io.comm.NotConnectedException;
+import freenet.io.comm.PacketSocketHandler;
 import freenet.io.comm.Peer;
 import freenet.io.comm.PeerContext;
 import freenet.io.comm.PeerParseException;
@@ -117,7 +119,7 @@
        /** My OutgoingPacketMangler i.e. the object which encrypts packets 
sent to this node */
        private final OutgoingPacketMangler outgoingMangler;
        /** Advertised addresses */
-       protected Vector nominalPeer;
+       protected Vector<Peer> nominalPeer;
        /** The PeerNode's report of our IP address */
        private Peer remoteDetectedPeer;
        /** Is this a testnet node? */
@@ -206,7 +208,7 @@
        final PeerManager peers;
        /** MessageItem's to send ASAP. 
         * LOCKING: Lock on self, always take that lock last. Sometimes used 
inside PeerNode.this lock. */
-       private final LinkedList messagesToSendNow;
+       private final PeerMessageQueue messageQueue;
        /** When did we last receive a SwapRequest? */
        private long timeLastReceivedSwapRequest;
        /** Average interval between SwapRequest's */
@@ -282,9 +284,9 @@
        }

        /** Holds a String-Long pair that shows which message types (as name) 
have been send to this peer. */
-       private final Hashtable localNodeSentMessageTypes = new Hashtable();
+       private final Hashtable<String, Long> localNodeSentMessageTypes = new 
Hashtable<String, Long>();
        /** Holds a String-Long pair that shows which message types (as name) 
have been received by this peer. */
-       private final Hashtable localNodeReceivedMessageTypes = new Hashtable();
+       private final Hashtable<String, Long> localNodeReceivedMessageTypes = 
new Hashtable<String, Long>();

        /** Hold collected IP addresses for handshake attempts, populated by 
DNSRequestor */
        private Peer[] handshakeIPs;
@@ -317,7 +319,7 @@
        private static final long CLEAR_MESSAGE_QUEUE_AFTER = 60 * 60 * 1000L;
        /** A WeakReference to this object. Can be taken whenever a node object 
needs to refer to this object for a 
         * long time, but without preventing it from being GC'ed. */
-       final WeakReference myRef;
+       final WeakReference<PeerNode> myRef;
        /** The node is being disconnected, but it may take a while. */
        private boolean disconnecting;
        /** When did we last disconnect? Not Disconnected because a discrete 
event */
@@ -347,7 +349,7 @@
         *  The initiator has to ensure that nonces send back by the
         *  responder in message2 match what was chosen in message 1
         */
-       protected final HashMap jfkNoncesSent = new HashMap();
+       protected final HashMap<Peer,byte[]> jfkNoncesSent = new 
HashMap<Peer,byte[]>();
        private static boolean logMINOR;

        /**
@@ -379,7 +381,7 @@
                boolean noSig = false;
                if(fromLocal || fromAnonymousInitiator) noSig = true;
                logMINOR = Logger.shouldLog(Logger.MINOR, PeerNode.class);
-               myRef = new WeakReference(this);
+               myRef = new WeakReference<PeerNode>(this);
                this.outgoingMangler = mangler;
                this.node = node2;
                this.crypto = crypto;
@@ -539,7 +541,7 @@
                        throw new Error(e1);
                }

-               nominalPeer = new Vector();
+               nominalPeer = new Vector<Peer>();
                try {
                        String physical[] = fs.getAll("physical.udp");
                        if(physical == null) {
@@ -587,8 +589,8 @@
                // Not connected yet; need to handshake
                isConnected = false;

-               messagesToSendNow = new LinkedList();
-
+               messageQueue = new PeerMessageQueue();
+               
                decrementHTLAtMaximum = node.random.nextFloat() < 
Node.DECREMENT_AT_MAX_PROB;
                decrementHTLAtMinimum = node.random.nextFloat() < 
Node.DECREMENT_AT_MIN_PROB;

@@ -815,7 +817,7 @@
                        }
                }
                // De-dupe
-               HashSet ret = new HashSet();
+               HashSet<Peer> ret = new HashSet<Peer>();
                for(int i = 0; i < localHandshakeIPs.length; i++)
                        ret.add(localHandshakeIPs[i]);
                return (Peer[]) ret.toArray(new Peer[ret.size()]);
@@ -871,9 +873,9 @@
                FreenetInetAddress localhost = node.fLocalhostAddress;
                Peer[] nodePeers = outgoingMangler.getPrimaryIPAddress();

-               Vector peers = null;
+               Vector<Peer> peers = null;
                synchronized(this) {
-                       peers = new Vector(nominalPeer);
+                       peers = new Vector<Peer>(nominalPeer);
                }

                boolean addedLocalhost = false;
@@ -1020,7 +1022,7 @@
        * relating to this packet (normally set when we have delayed a packet 
in order to
        * throttle it).
        */
-       public void sendAsync(Message msg, AsyncMessageCallback cb, int 
alreadyReportedBytes, ByteCounter ctr) throws NotConnectedException {
+       public void sendAsync(Message msg, AsyncMessageCallback cb, ByteCounter 
ctr) throws NotConnectedException {
                if(ctr == null)
                        Logger.error(this, "Bytes not logged", new 
Exception("debug"));
                if(logMINOR)
@@ -1028,21 +1030,10 @@
                if(!isConnected())
                        throw new NotConnectedException();
                addToLocalNodeSentMessagesToStatistic(msg);
-               MessageItem item = new MessageItem(msg, cb == null ? null : new 
AsyncMessageCallback[]{cb}, alreadyReportedBytes, ctr);
-               item.getData(this);
+               MessageItem item = new MessageItem(msg, cb == null ? null : new 
AsyncMessageCallback[]{cb}, ctr, this);
                long now = System.currentTimeMillis();
                reportBackoffStatus(now);
-               int x = 0;
-               synchronized(messagesToSendNow) {
-                       enqueuePrioritizedMessageItem(item);
-                       Iterator i = messagesToSendNow.iterator();
-                       for(; i.hasNext();) {
-                               MessageItem it = (MessageItem) (i.next());
-                               x += it.getData(this).length + 2;
-                               if(x > 1024)
-                                       break;
-                       }
-               }
+               int x = messageQueue.queueAndEstimateSize(item);
                if(x > 1024 || !node.enablePacketCoalescing) {
                        // If there is a packet's worth to send, wake up the 
packetsender.
                        node.ps.wakeUp();
@@ -1053,53 +1044,10 @@
        }

        public long getMessageQueueLengthBytes() {
-               long x = 0;
-               synchronized(messagesToSendNow) {
-                       Iterator i = messagesToSendNow.iterator();
-                       for(; i.hasNext();) {
-                               MessageItem it = (MessageItem) (i.next());
-                               x += it.getData(this).length + 2;
-                       }
-               }
-               return x;
+               return messageQueue.getMessageQueueLengthBytes();
        }

-       private void enqueuePrioritizedMessageItem(MessageItem addMe) {
-               synchronized (messagesToSendNow) {
-                       //Assume it goes on the end, both the common case
-                       ListIterator 
i=messagesToSendNow.listIterator(messagesToSendNow.size());
-                       while (i.hasPrevious()) {
-                               MessageItem here=(MessageItem)i.previous();
-                               //While the item we are adding is a HIGHER 
priority, move on (backwards...)
-                               if (!(addMe.getPriority() < 
here.getPriority())) {
-                                       i.next();
-                                       break;
-                               }
-                       }
-                       i.add(addMe);
-               }
-       }
-       
        /**
-        * like enqueuePrioritizedMessageItem, but adds it to the front of 
those in the same priority.
-        */
-       private void pushfrontPrioritizedMessageItem(MessageItem addMe) {
-               synchronized (messagesToSendNow) {
-                       //Assume it goes on the front
-                       ListIterator i=messagesToSendNow.listIterator();
-                       while (i.hasNext()) {
-                               MessageItem here=(MessageItem)i.next();
-                               //While the item we are adding is a LOWER 
priority, move on (forwards...)
-                               if (addMe.getPriority() <= here.getPriority()) {
-                                       i.previous();
-                                       break;
-                               }
-                       }
-                       i.add(addMe);
-               }
-       }       
-       
-       /**
         * Returns the number of milliseconds that it is estimated to take to 
transmit the currently queued packets.
         */
        public long getProbableSendQueueTime() {
@@ -1211,15 +1159,12 @@
                                timeLastDisconnect = now;
                        }
                        if(dumpMessageQueue) {
-                               synchronized(messagesToSendNow) {
-                                       messagesTellDisconnected = 
(MessageItem[]) messagesToSendNow.toArray(new 
MessageItem[messagesToSendNow.size()]);
-                                       messagesToSendNow.clear();
-                               }
+                               messagesTellDisconnected = 
grabQueuedMessageItems();
                        }
                }
                if(messagesTellDisconnected != null) {
-                       for(int i=0;i<messagesTellDisconnected.length;i++) {
-                               messagesTellDisconnected[i].onDisconnect();
+                       for(MessageItem mi : messagesTellDisconnected) {
+                               mi.onDisconnect();
                        }
                }
                if(cur != null) cur.disconnected();
@@ -1234,14 +1179,12 @@
                                public void run() {
                                        if((!PeerNode.this.isConnected()) &&
                                                        timeLastDisconnect == 
now) {
-                                               MessageItem[] 
messagesTellDisconnected;
-                                               
synchronized(PeerNode.this.messagesToSendNow) {
-                                                       
messagesTellDisconnected = (MessageItem[]) messagesToSendNow.toArray(new 
MessageItem[messagesToSendNow.size()]);
-                                                       
PeerNode.this.messagesToSendNow.clear();
+                                               MessageItem[] 
messagesTellDisconnected = grabQueuedMessageItems();
+                                               if(messagesTellDisconnected != 
null) {
+                                                       for(MessageItem mi : 
messagesTellDisconnected) {
+                                                               
mi.onDisconnect();
+                                                       }
                                                }
-                                               for(int 
i=0;i<messagesTellDisconnected.length;i++) {
-                                                       
messagesTellDisconnected[i].onDisconnect();
-                                               }
                                        }

                                }
@@ -1270,14 +1213,7 @@
        * Message's.
        */
        public MessageItem[] grabQueuedMessageItems() {
-               synchronized(messagesToSendNow) {
-                       if(messagesToSendNow.size() == 0)
-                               return null;
-                       MessageItem[] messages = new 
MessageItem[messagesToSendNow.size()];
-                       messages = (MessageItem[]) 
messagesToSendNow.toArray(messages);
-                       messagesToSendNow.clear();
-                       return messages;
-               }
+               return messageQueue.grabQueuedMessageItems();
        }

        public void requeueMessageItems(MessageItem[] messages, int offset, int 
length, boolean dontLog) {
@@ -1306,10 +1242,10 @@
                                Logger.normal(this, "Requeueing " + 
messages.length + " messages" + reasonWrapper + " on " + this + 
rateLimitWrapper);
                        }
                }
-               synchronized(messagesToSendNow) {
+               synchronized(messageQueue) {
                        for(int i = offset+length-1; i >= offset; i--)
                                if(messages[i] != null)
-                                       
pushfrontPrioritizedMessageItem(messages[i]);
+                                       
messageQueue.pushfrontPrioritizedMessageItem(messages[i]);
                }
        }

@@ -1317,18 +1253,45 @@
        * @return The time at which we must send a packet, even if
        * it means it will only contains ack requests etc., or
        * Long.MAX_VALUE if we have no pending ack request/acks/etc.
+       * Note that if this is less than now, it may not be entirely
+       * accurate i.e. we definitely must send a packet, but don't
+       * rely on it to tell you exactly how overdue we are.
        */
-       public synchronized long getNextUrgentTime() {
+       public long getNextUrgentTime(long now) {
                long t = Long.MAX_VALUE;
+               synchronized(this) {
                KeyTracker kt = currentTracker;
-               if(kt != null)
-                       t = Math.min(t, kt.getNextUrgentTime());
+               if(kt != null) {
+                       long next = kt.getNextUrgentTime();
+                       t = Math.min(t, next);
+                       if(next < now && logMINOR)
+                               Logger.minor(this, "Next urgent time from 
curTracker less than now");
+                       if(kt.hasPacketsToResend()) return now;
+               }
                kt = previousTracker;
-               if(kt != null)
-                       t = Math.min(t, kt.getNextUrgentTime());
+               if(kt != null) {
+                       long next = kt.getNextUrgentTime();
+                       t = Math.min(t, next);
+                       if(next < now && logMINOR)
+                               Logger.minor(this, "Next urgent time from 
prevTracker less than now");
+                       if(kt.hasPacketsToResend()) return now;
+               }
+               }
+               t = messageQueue.getNextUrgentTime(t, now);
                return t;
        }
-
+       
+       private synchronized boolean mustSendNotificationsNow(long now) {
+               KeyTracker kt = currentTracker;
+               if(kt != null) {
+                       if(kt.getNextUrgentTime() < now) return true;
+               }
+               kt = previousTracker;
+               if(kt != null)
+                       if(kt.getNextUrgentTime() < now) return true;
+               return false;
+       }
+       
        /**
        * @return The time at which we last sent a packet.
        */
@@ -1547,7 +1510,7 @@
        */
        public void sendSync(Message req, ByteCounter ctr) throws 
NotConnectedException {
                SyncMessageCallback cb = new SyncMessageCallback();
-               sendAsync(req, cb, 0, ctr);
+               sendAsync(req, cb, ctr);
                cb.waitForSend(60 * 1000);
                if (!cb.done) {
                        Logger.error(this, "Waited too long for a blocking send 
for " + req + " to " + PeerNode.this, new Exception("error"));
@@ -1699,7 +1662,7 @@
                                if(!isConnected)
                                        return;
                                // Prevent leak by clearing, *but keep the 
current handshake*
-                               Object o = jfkNoncesSent.get(newPeer);
+                               byte[] o = jfkNoncesSent.get(newPeer);
                                jfkNoncesSent.clear();
                                jfkNoncesSent.put(newPeer, o);
                        } else
@@ -1910,10 +1873,7 @@
                                // Messages do not persist across restarts.
                                // Generally they would be incomprehensible, 
anything that isn't should be sent as
                                // connection initial messages by 
maybeOnConnect().
-                               synchronized(messagesToSendNow) {
-                                       messagesTellDisconnected = 
(MessageItem[]) messagesToSendNow.toArray(new 
MessageItem[messagesToSendNow.size()]);
-                                       messagesToSendNow.clear();
-                               }
+                               messagesTellDisconnected = 
grabQueuedMessageItems();
                                this.offeredMainJarVersion = 0;
                        } // else it's a rekey
                        if(unverified) {
@@ -2107,12 +2067,12 @@

                try {
                        if(isRealConnection())
-                               sendAsync(locMsg, null, 0, 
node.nodeStats.initialMessagesCtr);
-                       sendAsync(ipMsg, null, 0, 
node.nodeStats.initialMessagesCtr);
-                       sendAsync(timeMsg, null, 0, 
node.nodeStats.initialMessagesCtr);
-                       sendAsync(packetsMsg, null, 0, 
node.nodeStats.initialMessagesCtr);
-                       sendAsync(dRoutingMsg, null, 0, 
node.nodeStats.initialMessagesCtr);
-                       sendAsync(uptimeMsg, null, 0, 
node.nodeStats.initialMessagesCtr);
+                               sendAsync(locMsg, null, 
node.nodeStats.initialMessagesCtr);
+                       sendAsync(ipMsg, null, 
node.nodeStats.initialMessagesCtr);
+                       sendAsync(timeMsg, null, 
node.nodeStats.initialMessagesCtr);
+                       sendAsync(packetsMsg, null, 
node.nodeStats.initialMessagesCtr);
+                       sendAsync(dRoutingMsg, null, 
node.nodeStats.initialMessagesCtr);
+                       sendAsync(uptimeMsg, null, 
node.nodeStats.initialMessagesCtr);
                } catch(NotConnectedException e) {
                        Logger.error(this, "Completed handshake with " + 
getPeer() + " but disconnected (" + isConnected + ':' + currentTracker + "!!!: 
" + e, e);
                }
@@ -2151,7 +2111,7 @@
        private void sendIPAddressMessage() {
                Message ipMsg = DMT.createFNPDetectedIPAddress(detectedPeer);
                try {
-                       sendAsync(ipMsg, null, 0, node.nodeStats.changedIPCtr);
+                       sendAsync(ipMsg, null, node.nodeStats.changedIPCtr);
                } catch(NotConnectedException e) {
                        Logger.normal(this, "Sending IP change message to " + 
this + " but disconnected: " + e, e);
                }
@@ -2367,7 +2327,7 @@
                Vector oldNominalPeer = nominalPeer;

                if(nominalPeer == null)
-                       nominalPeer = new Vector();
+                       nominalPeer = new Vector<Peer>();
                nominalPeer.removeAllElements();

                Peer[] oldPeers = (Peer[]) nominalPeer.toArray(new 
Peer[nominalPeer.size()]);
@@ -2450,7 +2410,8 @@
        * @throws PacketSequenceException If there is an error sending the 
packet
        * caused by a sequence inconsistency. 
        */
-       public void sendAnyUrgentNotifications(boolean forceSendPrimary) throws 
PacketSequenceException {
+       public boolean sendAnyUrgentNotifications(boolean forceSendPrimary) 
throws PacketSequenceException {
+               boolean sent = false;
                if(logMINOR)
                        Logger.minor(this, "sendAnyUrgentNotifications");
                long now = System.currentTimeMillis();
@@ -2466,8 +2427,9 @@
                        if(t < now || forceSendPrimary) {
                                try {
                                        if(logMINOR) Logger.minor(this, 
"Sending urgent notifications for current tracker on "+shortToString());
-                                       int size = 
outgoingMangler.processOutgoing(null, 0, 0, tracker, 0, DMT.PRIORITY_NOW);
+                                       int size = 
outgoingMangler.processOutgoing(null, 0, 0, tracker, DMT.PRIORITY_NOW);
                                        
node.nodeStats.reportNotificationOnlyPacketSent(size);
+                                       sent = true;
                                } catch(NotConnectedException e) {
                                // Ignore
                                } catch(KeyChangedException e) {
@@ -2483,8 +2445,9 @@
                        if(t < now)
                                try {
                                        if(logMINOR) Logger.minor(this, 
"Sending urgent notifications for previous tracker on "+shortToString());
-                                       int size = 
outgoingMangler.processOutgoing(null, 0, 0, tracker, 0, DMT.PRIORITY_NOW);
+                                       int size = 
outgoingMangler.processOutgoing(null, 0, 0, tracker, DMT.PRIORITY_NOW);
                                        
node.nodeStats.reportNotificationOnlyPacketSent(size);
+                                       sent = true;
                                } catch(NotConnectedException e) {
                                // Ignore
                                } catch(KeyChangedException e) {
@@ -2493,6 +2456,7 @@
                                        Logger.error(this, "Impossible: " + e, 
e);
                                }
                }
+               return sent;
        }

        void checkTrackerTimeout() {
@@ -2700,7 +2664,7 @@
                                Logger.error(this, "No tracker to resend packet 
" + item.packetNumber + " on");
                                continue;
                        }
-                       MessageItem mi = new MessageItem(item.buf, 
item.callbacks, true, 0, resendByteCounter, item.priority);
+                       MessageItem mi = new MessageItem(item.buf, 
item.callbacks, true, resendByteCounter, item.priority);
                        requeueMessageItems(new MessageItem[]{mi}, 0, 1, true);
                }
        }
@@ -2995,14 +2959,14 @@
                }
        }

-       public synchronized Hashtable getLocalNodeSentMessagesToStatistic() {
-               return new Hashtable(localNodeSentMessageTypes);
+       public synchronized Hashtable<String,Long> 
getLocalNodeSentMessagesToStatistic() {
+               return new Hashtable<String,Long>(localNodeSentMessageTypes);
        }

-       public Hashtable getLocalNodeReceivedMessagesFromStatistic() {
+       public Hashtable<String,Long> 
getLocalNodeReceivedMessagesFromStatistic() {
                // Must be synchronized *during the copy*
                synchronized (localNodeReceivedMessageTypes) {
-                       return new Hashtable(localNodeReceivedMessageTypes);
+                       return new 
Hashtable<String,Long>(localNodeReceivedMessageTypes);
                }
        }

@@ -3419,7 +3383,7 @@
                byte[] authenticator = 
HMAC.macWithSHA256(node.failureTable.offerAuthenticatorKey, keyBytes, 32);
                Message msg = DMT.createFNPOfferKey(key, authenticator);
                try {
-                       sendAsync(msg, null, 0, node.nodeStats.sendOffersCtr);
+                       sendAsync(msg, null, node.nodeStats.sendOffersCtr);
                } catch(NotConnectedException e) {
                // Ignore
                }
@@ -3812,7 +3776,7 @@
                        return null;
                }
                long loopTime1 = System.currentTimeMillis();
-               Vector validIPs = new Vector();
+               Vector<Peer> validIPs = new Vector<Peer>();
                for(int i=0;i<handshakeIPs.length;i++){
                        Peer peer = handshakeIPs[i];
                        FreenetInetAddress addr = peer.getFreenetAddress();
@@ -3861,7 +3825,7 @@
                        n2nm = DMT.createNodeToNodeMessage(
                                        n2nType, 
fs.toString().getBytes("UTF-8"));
                        try {
-                               sendAsync(n2nm, null, 0, 
node.nodeStats.nodeToNodeCounter);
+                               sendAsync(n2nm, null, 
node.nodeStats.nodeToNodeCounter);
                        } catch (NotConnectedException e) {
                                if(includeSentTime) {
                                        fs.removeValue("sentTime");
@@ -3938,7 +3902,7 @@

        void sendFNPNetworkID(ByteCounter ctr) throws NotConnectedException {
                if (assignedNetworkID!=0)
-                       sendAsync(DMT.createFNPNetworkID(assignedNetworkID), 
null, 0, ctr);
+                       sendAsync(DMT.createFNPNetworkID(assignedNetworkID), 
null, ctr);
        }

        public boolean shouldThrottle() {
@@ -3985,7 +3949,7 @@
                if(logMINOR) Logger.minor(this, "Sending throttled message with 
timeout "+timeout+" packet size "+packetSize+" to "+shortToString());
                for(int i=0;i<100;i++) {
                        try {
-                               getThrottle().sendThrottledMessage(msg, this, 
node.outputThrottle, packetSize, ctr, deadline, blockForSend);
+                               getThrottle().sendThrottledMessage(msg, this, 
packetSize, ctr, deadline, blockForSend);
                                return;
                        } catch (ThrottleDeprecatedException e) {
                                // Try with the new throttle. We don't need it, 
we'll get it from getThrottle().
@@ -4037,4 +4001,146 @@
        public long getMainJarOfferedVersion() {
                return offeredMainJarVersion;
        }
+
+       /**
+        * Maybe send something. A SINGLE PACKET.
+        * Don't send everything at once, for two reasons:
+        * 1. It is possible for a node to have a very long backlog.
+        * 2. Sometimes sending a packet can take a long time.
+        * 3. In the near future PacketSender will be responsible for output 
bandwidth
+        * throttling.
+        * So it makes sense to send a single packet and round-robin.
+        * @param now
+        * @param rpiTemp
+        * @param rpiTemp
+        */
+       public boolean maybeSendPacket(long now, Vector rpiTemp, int[] 
rpiIntTemp) {
+               // If there are any urgent notifications, we must send a packet.
+               boolean mustSend = false;
+               if(mustSendNotificationsNow(now)) {
+                       if(logMINOR)
+                               Logger.minor(this, "Sending notification");
+                       mustSend = true;
+               }
+               // Any packets to resend? If so, resend ONE packet and then 
return.
+               for(int j = 0; j < 2; j++) {
+                       KeyTracker kt;
+                       if(j == 0)
+                               kt = getCurrentKeyTracker();
+                       else if(j == 1)
+                               kt = getPreviousKeyTracker();
+                       else
+                               break; // impossible
+                       if(kt == null)
+                               continue;
+                       int[] tmp = kt.grabResendPackets(rpiTemp, rpiIntTemp);
+                       if(tmp == null)
+                               continue;
+                       rpiIntTemp = tmp;
+                       for(int k = 0; k < rpiTemp.size(); k++) {
+                               ResendPacketItem item = (ResendPacketItem) 
rpiTemp.get(k);
+                               if(item == null)
+                                       continue;
+                               try {
+                                       if(logMINOR)
+                                               Logger.minor(this, "Resending " 
+ item.packetNumber + " to " + item.kt);
+                                       getOutgoingMangler().resend(item);
+                                       return true;
+                               } catch(KeyChangedException e) {
+                                       Logger.error(this, "Caught " + e + " 
resending packets to " + kt);
+                                       requeueResendItems(rpiTemp);
+                                       return false;
+                               } catch(NotConnectedException e) {
+                                       Logger.normal(this, "Caught " + e + " 
resending packets to " + kt);
+                                       requeueResendItems(rpiTemp);
+                                       return false;
+                               } catch(PacketSequenceException e) {
+                                       Logger.error(this, "Caught " + e + " - 
disconnecting", e);
+                                       // PSE is fairly drastic, something is 
broken between us, but maybe we can resync
+                                       forceDisconnect(false); 
+                                       return false;
+                               } catch(WouldBlockException e) {
+                                       Logger.error(this, "Impossible: " + e, 
e);
+                                       return false;
+                               }
+                       }
+
+               }
+               int minSize = 
getOutgoingMangler().fullHeadersLengthOneMessage(); // includes UDP headers
+               int maxSize = ((PacketSocketHandler) 
getSocketHandler()).getPacketSendThreshold();
+               
+               // If it's a keepalive, we must add an FNPVoid to ensure it has 
a packet number.
+               boolean keepalive = false;
+               
+               if(now - lastSentPacketTime() > Node.KEEPALIVE_INTERVAL) {
+                       if(logMINOR)
+                               Logger.minor(this, "Sending keepalive");
+                       keepalive = true;
+                       mustSend = true;
+               }
+               
+               ArrayList<MessageItem> messages = new 
ArrayList<MessageItem>(10);
+               
+               synchronized(messageQueue) {
+                       
+                       // Any urgent messages to send now?
+                       
+                       if(!mustSend) {
+                               if(messageQueue.mustSendNow(now))
+                                       mustSend = true;
+                       }
+                       
+                       if(!mustSend) {
+                               // What about total length?
+                               if(messageQueue.mustSendSize(minSize, maxSize))
+                                       mustSend = true;
+                       }
+                       
+                       if(mustSend) {
+                               int size = minSize;
+                               boolean gotEnough = false;
+                               size = messageQueue.addUrgentMessages(size, 
now, minSize, maxSize, messages);
+                               if(size < 0) {
+                                       gotEnough = true;
+                                       size = -size;
+                               }
+
+                               // Now the not-so-urgent messages.
+                               if(!gotEnough) {
+                                       size = 
messageQueue.addNonUrgentMessages(size, now, minSize, maxSize, messages);
+                                       if(size < 0) size = -size;
+                               }
+                       }
+                       
+               }
+               
+               if(messages.isEmpty() && keepalive) {
+                       // Force packet to have a sequence number.
+                       Message m = DMT.createFNPVoid();
+                       addToLocalNodeSentMessagesToStatistic(m);
+                       messages.add(new MessageItem(m, null, null, this));
+               }
+               
+               if(!messages.isEmpty()) {
+                       // Send packets, right now, blocking, including any 
active notifications
+                       // Note that processOutgoingOrRequeue will drop 
messages from the end
+                       // if necessary to fit the messages into a single 
packet.
+                       
getOutgoingMangler().processOutgoingOrRequeue(messages.toArray(new 
MessageItem[messages.size()]), this, true, false, true);
+                       return true;
+               } else {
+                       if(mustSend) {
+                               try {
+                                       if(sendAnyUrgentNotifications(false))
+                                               return true;
+                               } catch (PacketSequenceException e) {
+                                       Logger.error(this, "Caught "+e, e);
+                                       return false;
+                               }
+                               // Can happen occasionally as a race 
condition...
+                               Logger.normal(this, "No notifications sent 
despite no messages and mustSend=true for "+this);
+                       }
+               }
+               
+               return false;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestHandler.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/RequestHandler.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -136,7 +136,7 @@
                        Logger.minor(this, "Handling a request: " + uid);

                Message accepted = DMT.createFNPAccepted(uid);
-               source.sendAsync(accepted, null, 0, this);
+               source.sendAsync(accepted, null, this);

                Object o = node.makeRequestSender(key, htl, uid, source, false, 
true, false, false);
                if(o instanceof KeyBlock) {
@@ -168,7 +168,7 @@
                                // Forward RejectedOverload
                                //Note: This message is only decernable from 
the terminal messages by the IS_LOCAL flag being false. (!IS_LOCAL)->!Terminal
                                Message msg = 
DMT.createFNPRejectedOverload(uid, false);
-                               source.sendAsync(msg, null, 0, this);
+                               source.sendAsync(msg, null, this);
                                //If the status changes (e.g. to SUCCESS), 
there is little need to send yet another reject overload.
                                sentRejectedOverload = true;
                        }
@@ -182,7 +182,7 @@
                try {
                        // Is a CHK.
                        Message df = DMT.createFNPCHKDataFound(uid, 
rs.getHeaders());
-                       source.sendAsync(df, null, 0, this);
+                       source.sendAsync(df, null, this);

                        PartiallyReceivedBlock prb = rs.getPRB();
                        bt =
@@ -339,7 +339,7 @@
                // SUCCESS requires that BOTH the pubkey AND the data/headers 
have been received.
                // The pubKey will have been set on the SSK key, and the 
SSKBlock will have been constructed.
                Message headersMsg = DMT.createFNPSSKDataFoundHeaders(uid, 
headers);
-               source.sendAsync(headersMsg, null, 0, this);
+               source.sendAsync(headersMsg, null, this);
                final Message dataMsg = DMT.createFNPSSKDataFoundData(uid, 
data);
                node.executor.execute(new PrioRunnable() {

@@ -366,13 +366,13 @@

                if(SEND_OLD_FORMAT_SSK) {
                        Message df = DMT.createFNPSSKDataFound(uid, headers, 
data);
-                       source.sendAsync(df, null, 0, this);
+                       source.sendAsync(df, null, this);
                        // Not throttled, so report payload here.
                        sentPayload(data.length);
                }
                if(needsPubKey) {
                        Message pk = DMT.createFNPSSKPubKey(uid, pubKey);
-                       source.sendAsync(pk, null, 0, this);
+                       source.sendAsync(pk, null, this);
                }
        }

@@ -380,7 +380,7 @@
                // SUCCESS requires that BOTH the pubkey AND the data/headers 
have been received.
                // The pubKey will have been set on the SSK key, and the 
SSKBlock will have been constructed.
                Message headersMsg = DMT.createFNPSSKDataFoundHeaders(uid, 
headers);
-               source.sendAsync(headersMsg, null, 0, ctr);
+               source.sendAsync(headersMsg, null, ctr);
                final Message dataMsg = DMT.createFNPSSKDataFoundData(uid, 
data);
                try {
                        source.sendThrottledMessage(dataMsg, data.length, ctr, 
60 * 1000, false);
@@ -391,13 +391,13 @@

                if(SEND_OLD_FORMAT_SSK) {
                        Message df = DMT.createFNPSSKDataFound(uid, headers, 
data);
-                       source.sendAsync(df, null, 0, ctr);
+                       source.sendAsync(df, null, ctr);
                        // Not throttled, so report payload here.
                        ctr.sentPayload(data.length);
                }
                if(needsPubKey) {
                        Message pk = DMT.createFNPSSKPubKey(uid, pubKey);
-                       source.sendAsync(pk, null, 0, ctr);
+                       source.sendAsync(pk, null, ctr);
                }
        }

@@ -417,7 +417,7 @@
                        BlockTransmitter bt =
                                new BlockTransmitter(node.usm, source, uid, 
prb, this);
                        node.addTransferringRequestHandler(uid);
-                       source.sendAsync(df, null, 0, this);
+                       source.sendAsync(df, null, this);
                        if(bt.send(node.executor)) {
                                // for byte logging
                                status = RequestSender.SUCCESS;
@@ -451,7 +451,7 @@
                else
                        sendTerminalCalled = true;

-               source.sendAsync(msg, new TerminalMessageByteCountCollector(), 
0, this);
+               source.sendAsync(msg, new TerminalMessageByteCountCollector(), 
this);
        }
        boolean sendTerminalCalled = false;


Modified: branches/db4o/freenet/src/freenet/node/RequestSender.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestSender.java   2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/RequestSender.java   2008-09-26 
16:35:23 UTC (rev 22845)
@@ -210,7 +210,7 @@
                }
                Message msg = DMT.createFNPGetOfferedKey(key, 
offer.authenticator, pubKey == null, uid);
                try {
-                               pn.sendAsync(msg, null, 0, this);
+                               pn.sendAsync(msg, null, this);
                        } catch (NotConnectedException e2) {
                                if(logMINOR)
                                        Logger.minor(this, "Disconnected: 
"+pn+" getting offer for "+key);

Modified: 
branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestHandler.java 
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestHandler.java 
2008-09-26 16:35:23 UTC (rev 22845)
@@ -43,8 +43,8 @@
                Message accepted = DMT.createFNPAccepted(uid);
                Message trace = DMT.createFNPRHProbeTrace(uid, 
sender.getNearestLoc(), sender.getBest(), htl, (short)1, (short)1, 
n.getLocation(), n.swapIdentifier, LocationManager.extractLocs(peers, true), 
LocationManager.extractUIDs(peers), (short)0, (short)1, "", 
source.swapIdentifier);
                try {
-                       source.sendAsync(accepted, null, 0, sender);
-                       source.sendAsync(trace, null, 0, sender);
+                       source.sendAsync(accepted, null, sender);
+                       source.sendAsync(trace, null, sender);
                } catch (NotConnectedException e) {
                        // We completed(id), rather than locking it, so we 
don't need to unlock.
                        return; // So all we need to do is not start the sender.
@@ -53,33 +53,33 @@
        }

        public void onCompletion(double nearest, double best, short counter, 
short uniqueCounter, short linearCounter) throws NotConnectedException {
-               source.sendAsync(DMT.createFNPRHProbeReply(uid, nearest, best, 
counter, uniqueCounter, linearCounter), null, 0, sender);
+               source.sendAsync(DMT.createFNPRHProbeReply(uid, nearest, best, 
counter, uniqueCounter, linearCounter), null, sender);
        }

        public void onRNF(short htl, double nearest, double best, short 
counter, short uniqueCounter, short linearCounter) throws NotConnectedException 
{
                Message rnf = DMT.createFNPRouteNotFound(uid, htl);
                Message sub = DMT.createFNPRHReturnSubMessage(nearest, best, 
counter, uniqueCounter, linearCounter, "rnf");
                rnf.addSubMessage(sub);
-               source.sendAsync(rnf, null, 0, sender);
+               source.sendAsync(rnf, null, sender);
        }

        public void onReceivedRejectOverload(double nearest, double best, short 
counter, short uniqueCounter, short linearCounter, String reason) throws 
NotConnectedException {
                Message ro = DMT.createFNPRejectedOverload(uid, false);
                Message sub = DMT.createFNPRHReturnSubMessage(nearest, best, 
counter, uniqueCounter, linearCounter, reason);
                ro.addSubMessage(sub);
-               source.sendAsync(ro, null, 0, sender);
+               source.sendAsync(ro, null, sender);
        }

        public void onTimeout(double nearest, double best, short counter, short 
uniqueCounter, short linearCounter, String reason) throws NotConnectedException 
{
                Message ro = DMT.createFNPRejectedOverload(uid, true);
                Message sub = DMT.createFNPRHReturnSubMessage(nearest, best, 
counter, uniqueCounter, linearCounter, reason);
                ro.addSubMessage(sub);
-               source.sendAsync(ro, null, 0, sender);
+               source.sendAsync(ro, null, sender);
        }

        public void onTrace(long uid, double nearest, double best, short htl, 
short counter, short uniqueCounter, double location, long myUID, ShortBuffer 
peerLocs, ShortBuffer peerUIDs, short forkCount, short linearCounter, String 
reason, long prevUID) throws NotConnectedException {
                Message trace = DMT.createFNPRHProbeTrace(uid, nearest, best, 
htl, counter, uniqueCounter, location, myUID, peerLocs, peerUIDs, forkCount, 
linearCounter, reason, prevUID);
-               source.sendAsync(trace, null, 0, sender);
+               source.sendAsync(trace, null, sender);
        }

 }

Modified: branches/db4o/freenet/src/freenet/node/SSKInsertHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SSKInsertHandler.java        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/SSKInsertHandler.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -86,7 +86,7 @@
         Message accepted = DMT.createFNPSSKAccepted(uid, pubKey == null);

         try {
-                       source.sendAsync(accepted, null, 0, this);
+                       source.sendAsync(accepted, null, this);
                } catch (NotConnectedException e1) {
                        if(logMINOR) Logger.minor(this, "Lost connection to 
source");
                        return;
@@ -141,7 +141,7 @@
                                        if(logMINOR) Logger.minor(this, "Got 
pubkey on "+uid+" : "+pubKey);
                                        Message confirm = 
DMT.createFNPSSKPubKeyAccepted(uid);
                                        try {
-                                               source.sendAsync(confirm, null, 
0, this);
+                                               source.sendAsync(confirm, null, 
this);
                                        } catch (NotConnectedException e) {
                                                if(logMINOR) Logger.minor(this, 
"Lost connection to source on "+uid);
                                                return;

Modified: branches/db4o/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SSKInsertSender.java 2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/SSKInsertSender.java 2008-09-26 
16:35:23 UTC (rev 22845)
@@ -170,9 +170,9 @@
             // Send to next node

             try {
-                               next.sendAsync(request, null, 0, this);
+                               next.sendAsync(request, null, this);
                                if(RequestHandler.SEND_OLD_FORMAT_SSK) {
-                                       next.sendAsync(req, null, 0, this);
+                                       next.sendAsync(req, null, this);
                                        // Not throttled, so report here.
                                        sentPayload(data.length);
                                }
@@ -248,7 +248,7 @@
             Message dataMsg = DMT.createFNPSSKInsertRequestData(uid, data);

             try {
-                               next.sendAsync(headersMsg, null, 0, this);
+                               next.sendAsync(headersMsg, null, this);
                                next.sendThrottledMessage(dataMsg, data.length, 
this, SSKInsertHandler.DATA_INSERT_TIMEOUT, false);
                        } catch (NotConnectedException e1) {
                                if(logMINOR) Logger.minor(this, "Not connected 
to "+next);
@@ -265,7 +265,7 @@
             if(msg.getBoolean(DMT.NEED_PUB_KEY)) {
                Message pkMsg = DMT.createFNPSSKPubKey(uid, pubKey);
                try {
-                       next.sendAsync(pkMsg, null, 0, this);
+                       next.sendAsync(pkMsg, null, this);
                } catch (NotConnectedException e) {
                        if(logMINOR) Logger.minor(this, "Node disconnected 
while sending pubkey: "+next);
                        continue;

Modified: branches/db4o/freenet/src/freenet/node/SendMessageOnErrorCallback.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SendMessageOnErrorCallback.java      
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/SendMessageOnErrorCallback.java      
2008-09-26 16:35:23 UTC (rev 22845)
@@ -44,7 +44,7 @@
        if(Logger.shouldLog(Logger.MINOR, this))
                Logger.minor(this, "Disconnect trigger: "+this);
         try {
-            dest.sendAsync(msg, null, 0, ctr);
+            dest.sendAsync(msg, null, ctr);
         } catch (NotConnectedException e) {
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "Both source and destination 
disconnected: "+msg+" for "+this);

Modified: branches/db4o/freenet/src/freenet/node/UptimeEstimator.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/UptimeEstimator.java 2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/UptimeEstimator.java 2008-09-26 
16:35:23 UTC (rev 22845)
@@ -65,7 +65,7 @@
                readData(prevFile, base);
                readData(logFile, base);
                schedule(System.currentTimeMillis());
-               System.out.println("Created uptime estimator, time offset is 
"+timeOffset+" uptime at startup is "+new 
DecimalFormat("0.00").format(getUptime())+'%');
+               System.out.println("Created uptime estimator, time offset is 
"+timeOffset+" uptime at startup is "+new 
DecimalFormat("0.00").format(getUptime()));
        }

        private void readData(File file, int base) {

Modified: branches/db4o/freenet/src/freenet/node/Version.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Version.java 2008-09-26 14:55:48 UTC 
(rev 22844)
+++ branches/db4o/freenet/src/freenet/node/Version.java 2008-09-26 16:35:23 UTC 
(rev 22845)
@@ -24,17 +24,17 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 1164;
+       private static final int buildNumber = 1165;

        /** Oldest build of Fred we will talk to */
-       private static final int oldLastGoodBuild = 1163;
-       private static final int newLastGoodBuild = 1164;
+       private static final int oldLastGoodBuild = 1164;
+       private static final int newLastGoodBuild = 1165;
        static final long transitionTime;

        static {
                final Calendar _cal = 
Calendar.getInstance(TimeZone.getTimeZone("GMT"));
                // year, month - 1 (or constant), day, hour, minute, second
-               _cal.set( 2008, Calendar.SEPTEMBER, 22, 0, 0, 0 );
+               _cal.set( 2008, Calendar.OCTOBER, 3, 0, 0, 0 );
                transitionTime = _cal.getTimeInMillis();
        }


Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -343,11 +343,6 @@
                return generatedURI;
        }

-       public boolean isDirect() {
-               // TODO Auto-generated method stub
-               return false;
-       }
-
        public int getNumberOfFiles() {
                return numberOfFiles;
        }

Modified: branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java       
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java       
2008-09-26 16:35:23 UTC (rev 22845)
@@ -192,7 +192,7 @@
                        if((!hasBeenBlown) && (mainUpdater == null || 
mainUpdater.getFetchedVersion() <= 0)) return;
                }
                try {
-                       peer.sendAsync(getUOMAnnouncement(), null, 0, ctr);
+                       peer.sendAsync(getUOMAnnouncement(), null, ctr);
                } catch (NotConnectedException e) {
                        // Sad, but ignore it
                }

Modified: 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java  
    2008-09-26 14:55:48 UTC (rev 22844)
+++ 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java  
    2008-09-26 16:35:23 UTC (rev 22845)
@@ -184,7 +184,7 @@
                                                public void sent() {
                                                        // Cool
                                                }
-                                       }, 0, updateManager.ctr);
+                                       }, updateManager.ctr);

                                        // The reply message will start the 
transfer. It includes the revocation URI
                                        // so we can tell if anything wierd is 
happening.
@@ -343,7 +343,7 @@
                                                }
                                        }, REQUEST_MAIN_JAR_TIMEOUT);
                                }
-                       }, 0, updateManager.ctr);
+                       }, updateManager.ctr);
                } catch (NotConnectedException e) {
                        synchronized(this) {
                                nodesAskedSendMainJar.remove(source);
@@ -619,7 +619,7 @@
                                        return super.toString() + 
"("+uid+":"+source.getPeer()+")";
                                }

-                       }, 0, updateManager.ctr);
+                       }, updateManager.ctr);
                } catch (NotConnectedException e) {
                        Logger.error(this, "Peer "+source+" asked us for the 
blob file for the revocation key, then disconnected when we tried to send the 
UOMSendingRevocation: "+e, e);
                        return true;
@@ -901,7 +901,7 @@
        private void cancelSend(PeerNode source, long uid) {
                Message msg = DMT.createFNPBulkReceiveAborted(uid);
                try {
-                       source.sendAsync(msg, null, 0, updateManager.ctr);
+                       source.sendAsync(msg, null, updateManager.ctr);
                } catch (NotConnectedException e1) {
                        // Ignore
                }
@@ -994,7 +994,7 @@
                                        return super.toString() + 
"("+uid+":"+source.getPeer()+")";
                                }

-                       }, 0, updateManager.ctr);
+                       }, updateManager.ctr);
                } catch (NotConnectedException e) {
                        Logger.error(this, "Peer "+source+" asked us for the 
blob file for the main jar, then disconnected when we tried to send the 
UOMSendingMain: "+e, e);
                        return true;

Modified: branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java  
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java  
2008-09-26 16:35:23 UTC (rev 22845)
@@ -197,12 +197,9 @@
                        // not a freenet key
                }

-               File[] roots = File.listRoots();
-               for(File f : roots) {
-                       if(pluginname.startsWith(f.getName())) {
-                               startPluginFile(pluginname, store);
-                               return;
-                       }
+               if(new File(pluginname).exists()) {
+                       startPluginFile(pluginname, store);
+                       return;
                }

                startPluginURL(pluginname, store);

Modified: branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 
2008-09-26 16:35:23 UTC (rev 22845)
@@ -96,20 +96,19 @@
        private boolean closed;
        private boolean reallyClosed;

-       public static String getName(boolean isStore, short type) {
+       public static String getName(boolean isStore, StoreType type) {
                String newDBPrefix = typeName(type)+ '-' +(isStore ? "store" : 
"cache")+ '-';
                return newDBPrefix + "CHK";
        }

-       public static File getFile(boolean isStore, short type, File 
baseStoreDir, String suffix) {
+       public static File getFile(boolean isStore, StoreType type, File 
baseStoreDir, String suffix) {
                String newStoreFileName = typeName(type) + suffix + '.' + 
(isStore ? "store" : "cache");
                return new File(baseStoreDir, newStoreFileName);
        }

-       public static FreenetStore construct(File baseStoreDir, boolean 
isStore, String suffix,
-                       long maxStoreKeys, short type, 
-                       Environment storeEnvironment, SemiOrderedShutdownHook 
storeShutdownHook, File reconstructFile, 
-                       StoreCallback callback, RandomSource random) throws 
DatabaseException, IOException {
+       public static FreenetStore construct(File baseStoreDir, boolean 
isStore, String suffix, long maxStoreKeys,
+               StoreType type, Environment storeEnvironment, 
SemiOrderedShutdownHook storeShutdownHook,
+               File reconstructFile, StoreCallback callback, RandomSource 
random) throws DatabaseException, IOException {
                // Location of new store file
                String newStoreFileName = typeName(type) + suffix + '.' + 
(isStore ? "store" : "cache");
                File newStoreFile = new File(baseStoreDir, newStoreFileName);
@@ -155,15 +154,8 @@
                }
        }

-       private static String typeName(short type) {
-               if(type == TYPE_CHK)
-                       return "chk";
-               else if(type == TYPE_SSK)
-                       return "ssk";
-               else if(type == TYPE_PUBKEY)
-                       return "pubkey";
-               else
-                       throw new RuntimeException("No such type: " + type);
+       private static String typeName(StoreType type) {
+               return type.toString().toLowerCase();
        }

        /**

Modified: branches/db4o/freenet/src/freenet/store/FreenetStore.java
===================================================================
--- branches/db4o/freenet/src/freenet/store/FreenetStore.java   2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/store/FreenetStore.java   2008-09-26 
16:35:23 UTC (rev 22845)
@@ -8,11 +8,10 @@
  * Datastore interface
  */
 public interface FreenetStore {
+       public enum StoreType {
+               CHK, PUBKEY, SSK
+       };

-       public static final short TYPE_CHK = 0;
-       public static final short TYPE_PUBKEY = 1;
-       public static final short TYPE_SSK = 2;
-
        /**
         * Retrieve a block. Use the StoreCallback to convert it to the 
appropriate type of block.
         * @param routingKey The routing key i.e. the database key under which 
the block is stored.

Modified: 
branches/db4o/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java  
    2008-09-26 14:55:48 UTC (rev 22844)
+++ 
branches/db4o/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java  
    2008-09-26 16:35:23 UTC (rev 22845)
@@ -26,6 +26,7 @@
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;

+import org.spaceroots.mantissa.random.MersenneTwister;
 import org.tanukisoftware.wrapper.WrapperManager;

 import freenet.keys.KeyVerifyException;
@@ -42,6 +43,7 @@
 import freenet.support.HTMLNode;
 import freenet.support.HexUtil;
 import freenet.support.Logger;
+import freenet.support.io.Closer;
 import freenet.support.io.FileUtil;
 import freenet.support.io.NativeThread;

@@ -78,16 +80,18 @@
        private long storeSize;
        private int generation;
        private int flags;
+       
+       private boolean preallocate = true;

        public static SaltedHashFreenetStore construct(File baseDir, String 
name, StoreCallback callback, Random random,
-               long maxKeys, int bloomFilterSize, boolean bloomCounting, 
SemiOrderedShutdownHook shutdownHook)
+               long maxKeys, int bloomFilterSize, boolean bloomCounting, 
SemiOrderedShutdownHook shutdownHook, boolean preallocate)
                throws IOException {
                return new SaltedHashFreenetStore(baseDir, name, callback, 
random, maxKeys, bloomFilterSize, bloomCounting,
-                       shutdownHook);
+                       shutdownHook, preallocate);
        }

        private SaltedHashFreenetStore(File baseDir, String name, StoreCallback 
callback, Random random, long maxKeys,
-               int bloomFilterSize, boolean bloomCounting, 
SemiOrderedShutdownHook shutdownHook) throws IOException {
+               int bloomFilterSize, boolean bloomCounting, 
SemiOrderedShutdownHook shutdownHook, boolean preallocate) throws IOException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                logDEBUG = Logger.shouldLog(Logger.DEBUG, this);

@@ -99,10 +103,14 @@
                headerBlockLength = callback.headerLength();
                fullKeyLength = callback.fullKeyLength();
                dataBlockLength = callback.dataLength();
+               
+               hdPadding = (int) ((headerBlockLength + dataBlockLength) % 512 
== 0 ? 0
+                       : 512 - (headerBlockLength + dataBlockLength) % 512);

                this.random = random;
                storeSize = maxKeys;
                this.bloomFilterSize = bloomFilterSize;
+               this.preallocate = preallocate;

                lockManager = new LockManager();

@@ -171,8 +179,18 @@
                if (logMINOR)
                        Logger.minor(this, "Fetch " + 
HexUtil.bytesToHex(routingKey) + " for " + callback);

-               configLock.readLock().lock();
                try {
+                       int retry = 0;
+                       while (!configLock.readLock().tryLock(2, 
TimeUnit.SECONDS)) {
+                               if (shutdown)
+                                       return null;
+                               if (retry++ > 10)
+                                       throw new IOException("lock timeout 
(20s)");
+                       }
+               } catch(InterruptedException e) {
+                       throw new IOException("interrupted: " +e);
+               }
+               try {
                        Map<Long, Condition> lockMap = lockPlainKey(routingKey, 
true);
                        if (lockMap == null) {
                                if (logDEBUG)
@@ -245,7 +263,7 @@
                                if (entry != null)
                                        return entry;
                        } catch (EOFException e) {
-                               if (prevStoreSize != 0) // may occur on store 
shrinking
+                               if (prevStoreSize == 0) // may occur on store 
shrinking
                                        Logger.error(this, "EOFException on 
probeEntry", e);
                                continue;
                        }
@@ -258,8 +276,18 @@
                if (logMINOR)
                        Logger.minor(this, "Putting " + 
HexUtil.bytesToHex(routingKey) + " (" + name + ")");

-               configLock.readLock().lock();
                try {
+                       int retry = 0;
+                       while (!configLock.readLock().tryLock(2, 
TimeUnit.SECONDS)) {
+                               if (shutdown)
+                                       return;
+                               if (retry++ > 10)
+                                       throw new IOException("lock timeout 
(20s)");
+                       }
+               } catch(InterruptedException e) {
+                       throw new IOException("interrupted: " +e);
+               }
+               try {
                        Map<Long, Condition> lockMap = lockPlainKey(routingKey, 
false);
                        if (lockMap == null) {
                                if (logDEBUG)
@@ -278,7 +306,7 @@
                                        try {
                                                if (!collisionPossible)
                                                        return;
-                                               
oldEntry.setData(readHeader(oldOffset), readData(oldOffset)); // read from disk
+                                               
oldEntry.setHD(readHD(oldOffset)); // read from disk
                                                StorableBlock oldBlock = 
oldEntry.getStorableBlock(routingKey, fullKey);
                                                if (block.equals(oldBlock)) {
                                                        return; // already in 
store
@@ -339,14 +367,11 @@
        private File metaFile;
        private RandomAccessFile metaRAF;
        private FileChannel metaFC;
-       // header file
-       private File headerFile;
-       private RandomAccessFile headerRAF;
-       private FileChannel headerFC;
-       // data file
-       private File dataFile;
-       private RandomAccessFile dataRAF;
-       private FileChannel dataFC;
+       // header+data file
+       private File hdFile;
+       private RandomAccessFile hdRAF;
+       private FileChannel hdFC;
+       private final int hdPadding;

        /**
         * Data entry
@@ -399,7 +424,7 @@
                private Entry() {
                }

-               private Entry(ByteBuffer metaDataBuf, ByteBuffer headerBuf, 
ByteBuffer dataBuf) {
+               private Entry(ByteBuffer metaDataBuf, ByteBuffer hdBuf) {
                        assert metaDataBuf.remaining() == METADATA_LENGTH;

                        digestedRoutingKey = new byte[0x20];
@@ -421,8 +446,8 @@

                        isEncrypted = true;

-                       if (headerBuf != null && dataBuf != null)
-                               setData(headerBuf, dataBuf);
+                       if (hdBuf != null)
+                               setHD(hdBuf);
                }

                /**
@@ -431,16 +456,15 @@
                 * @param storeBuf
                 * @param store
                 */
-               private void setData(ByteBuffer headerBuf, ByteBuffer dataBuf) {
-                       assert headerBuf.remaining() == headerBlockLength;
-                       assert dataBuf.remaining() == dataBlockLength;
+               private void setHD(ByteBuffer hdBuf) {
+                       assert hdBuf.remaining() == headerBlockLength + 
dataBlockLength + hdPadding;
                        assert isEncrypted;

                        header = new byte[headerBlockLength];
-                       headerBuf.get(header);
+                       hdBuf.get(header);

                        data = new byte[dataBlockLength];
-                       dataBuf.get(data);
+                       hdBuf.get(data);
                }

                /**
@@ -492,29 +516,17 @@
                        return out;
                }

-               private ByteBuffer toHeaderBuffer() {
+               private ByteBuffer toHDBuffer() {
                        assert isEncrypted; // should have encrypted to get 
dataEncryptIV in control buffer
+                       assert header.length == headerBlockLength;
+                       assert data.length == dataBlockLength;

-                       if (header == null)
+                       if (header == null || data == null)
                                return null;

-                       ByteBuffer out = ByteBuffer.allocate(headerBlockLength);
+                       ByteBuffer out = ByteBuffer.allocate(headerBlockLength 
+ dataBlockLength + hdPadding);
                        out.put(header);
-                       assert out.remaining() == 0;
-
-                       out.position(0);
-                       return out;
-               }
-
-               private ByteBuffer toDataBuffer() {
-                       assert isEncrypted; // should have encrypted to get 
dataEncryptIV in control buffer
-
-                       if (data == null)
-                               return null;
-
-                       ByteBuffer out = ByteBuffer.allocate(dataBlockLength);
                        out.put(data);
-                       assert out.remaining() == 0;

                        out.position(0);
                        return out;
@@ -568,24 +580,74 @@
         */
        private boolean openStoreFiles(File baseDir, String name) throws 
IOException {
                metaFile = new File(baseDir, name + ".metadata");
-               headerFile = new File(baseDir, name + ".header");
-               dataFile = new File(baseDir, name + ".data");
+               hdFile = new File(baseDir, name + ".hd");

-               boolean newStore = !metaFile.exists() || !headerFile.exists() 
|| !dataFile.exists();
+               boolean newStore = !metaFile.exists() || !hdFile.exists();

                metaRAF = new RandomAccessFile(metaFile, "rw");
                metaFC = metaRAF.getChannel();
                metaFC.lock();

-               headerRAF = new RandomAccessFile(headerFile, "rw");
-               headerFC = headerRAF.getChannel();
-               headerFC.lock();
+               hdRAF = new RandomAccessFile(hdFile, "rw");
+               hdFC = hdRAF.getChannel();
+               hdFC.lock();

-               dataRAF = new RandomAccessFile(dataFile, "rw");
-               dataFC = dataRAF.getChannel();
-               dataFC.lock();

                long storeFileSize = Math.max(storeSize, prevStoreSize);
+               
+               // XXX migrate from old format
+               {
+                       // migrate 
+                       File headerFile = new File(baseDir, name + ".header");
+                       File dataFile = new File(baseDir, name + ".data");
+
+                       if (headerFile.exists() && dataFile.exists()) {
+                               System.out.println("Migrating .header/.data 
-to-> .hd");
+                               WrapperManager.signalStarting(7 * 24 * 60 * 60 
* 1000); 
+                               
+                               RandomAccessFile headerRAF = null;
+                               RandomAccessFile dataRAF = null;
+                               try {
+                                       cleanerGlobalLock.lock();
+                                       headerRAF = new 
RandomAccessFile(headerFile, "rw");
+                                       dataRAF = new 
RandomAccessFile(dataFile, "rw");
+                                       
+                                       byte[] header = new 
byte[headerBlockLength];
+                                       byte[] data = new byte[dataBlockLength];
+                                       byte[] pad = new byte[hdPadding];
+                                       
+                                       long total = dataRAF.length() / 
dataBlockLength;
+                                       newStore = false;
+
+                                       for (long offset = total - 1; offset >= 
0; offset--) {
+                                               if (offset % 1024 == 0)
+                                                       System.out.println(name 
+ ": " + (total - offset) + "/" + total);
+                                               
headerRAF.seek(headerBlockLength * offset);
+                                               headerRAF.readFully(header);
+                                               dataRAF.seek(dataBlockLength * 
offset);
+                                               dataRAF.readFully(data);
+                                               
+                                               hdRAF.seek((headerBlockLength + 
dataBlockLength + hdPadding) * offset);
+                                               hdRAF.write(header);
+                                               hdRAF.write(data);
+                                               hdRAF.write(pad);
+                                               
+                                               
headerRAF.setLength(headerBlockLength * offset);
+                                               
dataRAF.setLength(dataBlockLength * offset);
+                                       }
+                               } catch (IOException e) {
+                                       e.printStackTrace();
+                               } finally {
+                                       cleanerGlobalLock.unlock();
+                                       Closer.close(headerRAF);
+                                       Closer.close(dataRAF);
+                               }
+                               headerFile.delete();
+                               dataFile.delete();
+                               setStoreFileSize(storeFileSize);
+                       }
+               }
+
                WrapperManager.signalStarting(10 * 60 * 1000); // 10minutes, 
for filesystem that support no sparse file.
                setStoreFileSize(storeFileSize);

@@ -608,7 +670,7 @@
                } while (mbf.hasRemaining());
                mbf.flip();

-               Entry entry = new Entry(mbf, null, null);
+               Entry entry = new Entry(mbf, null);
                entry.curOffset = offset;

                if (routingKey != null) {
@@ -618,9 +680,8 @@
                                return null;

                        if (withData) {
-                               ByteBuffer headerBuf = readHeader(offset);
-                               ByteBuffer dataBuf = readData(offset);
-                               entry.setData(headerBuf, dataBuf);
+                               ByteBuffer hdBuf = readHD(offset);
+                               entry.setHD(hdBuf);
                                boolean decrypted = 
cipherManager.decrypt(entry, routingKey);
                                if (!decrypted)
                                        return null;
@@ -631,41 +692,25 @@
        }

        /**
-        * Read header from disk
+        * Read header + data from disk
         * 
         * @param offset
         * @throws IOException
         */
-       private ByteBuffer readHeader(long offset) throws IOException {
-               ByteBuffer buf = ByteBuffer.allocate(headerBlockLength);
+       private ByteBuffer readHD(long offset) throws IOException {
+               ByteBuffer buf = ByteBuffer.allocate(headerBlockLength + 
dataBlockLength + hdPadding);

+               long pos = (headerBlockLength + dataBlockLength + hdPadding) * 
offset;
                do {
-                       int status = headerFC.read(buf, headerBlockLength * 
offset + buf.position());
+                       int status = hdFC.read(buf, pos + buf.position());
                        if (status == -1)
                                throw new EOFException();
                } while (buf.hasRemaining());
                buf.flip();
+               
                return buf;
        }
-
-       /**
-        * Read data from disk
-        * 
-        * @param offset
-        * @throws IOException
-        */
-       private ByteBuffer readData(long offset) throws IOException {
-               ByteBuffer buf = ByteBuffer.allocate(dataBlockLength);
-
-               do {
-                       int status = dataFC.read(buf, dataBlockLength * offset 
+ buf.position());
-                       if (status == -1)
-                               throw new EOFException();
-               } while (buf.hasRemaining());
-               buf.flip();
-               return buf;
-       }
-
+       
        private boolean isFree(long offset) throws IOException {
                Entry entry = readEntry(offset, null, false);
                return entry.isFree();
@@ -695,20 +740,14 @@
                                throw new EOFException();
                } while (bf.hasRemaining());

-               bf = entry.toHeaderBuffer();
+               bf = entry.toHDBuffer();
                if (bf != null) {
+                       long pos = (headerBlockLength + dataBlockLength + 
hdPadding) * offset;
                        do {
-                               int status = headerFC.write(bf, 
headerBlockLength * offset + bf.position());
+                               int status = hdFC.write(bf, pos + 
bf.position());
                                if (status == -1)
                                        throw new EOFException();
                        } while (bf.hasRemaining());
-
-                       bf = entry.toDataBuffer();
-                       do {
-                               int status = dataFC.write(bf, dataBlockLength * 
offset + bf.position());
-                               if (status == -1)
-                                       throw new EOFException();
-                       } while (bf.hasRemaining());
                }

                entry.curOffset = offset;
@@ -722,31 +761,71 @@
                        Logger.error(this, "error flusing store", e);
                }
                try {
-                       headerFC.force(true);
-                       headerFC.close();
+                       hdFC.force(true);
+                       hdFC.close();
                } catch (Exception e) {
                        Logger.error(this, "error flusing store", e);
                }
-               try {
-                       dataFC.force(true);
-                       dataFC.close();
-               } catch (Exception e) {
-                       Logger.error(this, "error flusing store", e);
-               }

                bloomFilter.force();
        }

        /**
+        * Set preallocate storage space
+        * @param preallocate
+        */
+       public void setPreallocate(boolean preallocate) {
+               this.preallocate = preallocate;
+       }
+       
+       /**
         * Change on disk store file size
         * 
         * @param storeFileSize
         */
        private void setStoreFileSize(long storeFileSize) {
                try {
-                       metaRAF.setLength(Entry.METADATA_LENGTH * 
storeFileSize);
-                       headerRAF.setLength(headerBlockLength * storeFileSize);
-                       dataRAF.setLength(dataBlockLength * storeFileSize);
+                       long oldMetaLen = metaRAF.length();
+                       long oldHdLen = hdRAF.length();
+
+                       final long newMetaLen = Entry.METADATA_LENGTH * 
storeFileSize;
+                       final long newHdLen = (headerBlockLength + 
dataBlockLength + hdPadding) * storeFileSize;
+
+                       if (preallocate) {
+                               byte[] b = new byte[4096];
+                               ByteBuffer bf = ByteBuffer.wrap(b); 
+
+                               // start from next 4KB boundary => align to x86 
page size
+                               if (oldMetaLen % 4096 != 0)
+                                       oldMetaLen += 4096 - (oldMetaLen % 
4096);
+                               if (oldHdLen % 4096 != 0)
+                                       oldHdLen += 4096 - (oldHdLen % 4096);
+
+                               // this may write excess the size, the 
setLength() would fix it
+                               while (oldMetaLen < newMetaLen) {
+                                       // never write random byte to meta data!
+                                       // this would screw up the isFree() 
function
+                                       bf.rewind();
+                                       metaFC.write(bf, oldMetaLen);
+                                       oldMetaLen += 4096;
+                               }
+                               byte[] seed = new byte[64];
+                               random.nextBytes(seed);
+                               Random mt = new MersenneTwister(seed);
+                               while (oldHdLen < newHdLen) {
+                                       mt.nextBytes(b);
+                                       bf.rewind();
+                                       hdFC.write(bf, oldHdLen);
+                                       oldHdLen += 4096;
+                                       if(oldHdLen % (1024*1024*1024L) == 0) {
+                                               random.nextBytes(seed);
+                                               mt = new MersenneTwister(seed);
+                                       }
+                               }
+                       }
+
+                       metaRAF.setLength(newMetaLen);
+                       hdRAF.setLength(newHdLen);
                } catch (IOException e) {
                        Logger.error(this, "error resizing store file", e);
                }
@@ -936,7 +1015,7 @@
                                        if (_rebuildBloom && prevStoreSize == 0 
&& cleanerGlobalLock.tryLock()) {
                                                try {
                                                        isRebuilding = true;
-                                                       rebuildBloom(true);
+                                                       rebuildBloom(false);
                                                } finally {
                                                        isRebuilding = false;
                                                        
cleanerGlobalLock.unlock();
@@ -1002,7 +1081,7 @@
                                                // new size, don't have to 
relocate
                                                if (entry.generation != 
generation) {
                                                        // update filter
-                                                       
bloomFilter.addKey(entry.getDigestedRoutingKey());
+                                                       
bloomFilter.addKeyForked(entry.getDigestedRoutingKey());
                                                        return entry;
                                                } else {
                                                        return NOT_MODIFIED;
@@ -1019,7 +1098,7 @@
                                                
bloomFilter.removeKey(entry.getDigestedRoutingKey());
                                        }
                                        try {
-                                               
entry.setData(readHeader(entry.curOffset), readData(entry.curOffset));
+                                               
entry.setHD(readHD(entry.curOffset));
                                                oldEntryList.add(entry);
                                                if (oldEntryList.size() > 
RESIZE_MEMORY_ENTRIES)
                                                        oldEntryList.remove(0);
@@ -1103,7 +1182,7 @@

                                public Entry process(Entry entry) {
                                        if (entry.generation != generation) {
-                                               
bloomFilter.addKey(entry.getDigestedRoutingKey());
+                                               
bloomFilter.addKeyForked(entry.getDigestedRoutingKey());
                                                keyCount.incrementAndGet();

                                                entry.generation = generation;
@@ -1181,7 +1260,7 @@

                                        try {
                                                if (sleep) 
-                                                       Thread.sleep(500);
+                                                       Thread.sleep(100);
                                        } catch (InterruptedException e) {
                                                processor.abort();
                                                return;
@@ -1244,7 +1323,7 @@
                                                ByteBuffer enBuf = buf.slice();
                                                
enBuf.limit(Entry.METADATA_LENGTH);

-                                               Entry entry = new Entry(enBuf, 
null, null);
+                                               Entry entry = new Entry(enBuf, 
null);
                                                entry.curOffset = offset + j;

                                                if (entry.isFree())
@@ -1325,7 +1404,7 @@
                                        try {
                                                if (isFree(offset)) {
                                                        writeEntry(entry, 
offset);
-                                                       
bloomFilter.addKey(entry.getDigestedRoutingKey());
+                                                       
bloomFilter.addKeyForked(entry.getDigestedRoutingKey());
                                                        
keyCount.incrementAndGet();
                                                        return true;
                                                }
@@ -1552,6 +1631,7 @@
                        } finally {
                                configLock.writeLock().unlock();
                        }
+                       System.out.println("Successfully closed store "+name);
                }
        }

@@ -1678,5 +1758,5 @@
                } finally {
                        configLock.readLock().unlock();
                }
-    }
+       }
 }

Modified: branches/db4o/freenet/src/freenet/support/BloomFilter.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/BloomFilter.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/support/BloomFilter.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -5,6 +5,7 @@
 import java.nio.ByteBuffer;
 import java.nio.MappedByteBuffer;
 import java.util.Random;
+import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;

@@ -60,6 +61,12 @@
                        forkedFilter.addKey(key);
        }

+       // add to the forked filter only
+       public void addKeyForked(byte[] key) {
+               if (forkedFilter != null)
+                       forkedFilter.addKey(key);
+       }
+
        public boolean checkFilter(byte[] key) {
                Random hashes = getHashes(key);
                lock.readLock().lock();
@@ -120,14 +127,20 @@
                        if (forkedFilter == null)
                                return;

-                       filter.position(0);
-                       forkedFilter.filter.position(0);
+                       Lock forkedLock = forkedFilter.lock.writeLock();
+                       forkedLock.lock();
+                       try {
+                               filter.position(0);
+                               forkedFilter.filter.position(0);

-                       filter.put(forkedFilter.filter);
+                               filter.put(forkedFilter.filter);

-                       filter.position(0);
-                       forkedFilter.finalize();
-                       forkedFilter = null;
+                               filter.position(0);
+                               forkedFilter.finalize();
+                               forkedFilter = null;
+                       } finally {
+                               forkedLock.unlock();
+                       }
                } finally {
                        lock.writeLock().unlock();
                }

Modified: branches/db4o/freenet/src/freenet/support/SortedLongSet.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/SortedLongSet.java        
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/support/SortedLongSet.java        
2008-09-26 16:35:23 UTC (rev 22845)
@@ -158,7 +158,7 @@
        /**
         * Clear this set
         */
-       public void clear() {
+       public synchronized void clear() {
                data = new long[MIN_SIZE];
                for(int i=0;i<data.length;i++)
                        data[i] = Long.MAX_VALUE;
@@ -170,7 +170,7 @@
         * 
         * @return sorted array of all items
         */
-       public long[] toArray() {
+       public synchronized long[] toArray() {
                long[] output = new long[length];
                System.arraycopy(data, 0, output, 0, length);
                return output;

Modified: branches/db4o/freenet/src/freenet/support/TokenBucket.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/TokenBucket.java  2008-09-26 
14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/support/TokenBucket.java  2008-09-26 
16:35:23 UTC (rev 22845)
@@ -89,10 +89,15 @@
                if(logMINOR) Logger.minor(this, "Removed tokens, balance now 
"+current);
        }

+       public synchronized long count() {
+               return current;
+       }
+       
        /**
         * Get the current number of available tokens.
         */
-       public synchronized long count() {
+       public synchronized long getCount() {
+               addTokens();
                return current;
        }


Modified: 
branches/db4o/freenet/src/freenet/support/UpdatableSortedLinkedList.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/UpdatableSortedLinkedList.java    
2008-09-26 14:55:48 UTC (rev 22844)
+++ branches/db4o/freenet/src/freenet/support/UpdatableSortedLinkedList.java    
2008-09-26 16:35:23 UTC (rev 22845)
@@ -10,7 +10,7 @@
  * value has changed. Allows duplicates.
  */
 public class UpdatableSortedLinkedList {
-
+       boolean debug = false;
        protected boolean killed = false;
        private static boolean logMINOR;

@@ -62,7 +62,7 @@
     protected synchronized void checkList() {
        // If get errors, make this happen all the time.
        ctr++;
-       if(ctr % 256 != 0) return;
+       if(ctr % 256 != 0 && !debug) return;
        int statedLength = list.size();
        int realLength = 0;
        for(Enumeration e = list.elements();e.hasMoreElements();) {

Modified: 
branches/db4o/freenet/test/freenet/support/UpdatableSortedLinkedListTest.java
===================================================================
--- 
branches/db4o/freenet/test/freenet/support/UpdatableSortedLinkedListTest.java   
    2008-09-26 14:55:48 UTC (rev 22844)
+++ 
branches/db4o/freenet/test/freenet/support/UpdatableSortedLinkedListTest.java   
    2008-09-26 16:35:23 UTC (rev 22845)
@@ -44,11 +44,16 @@
                public int hashCode() {
                        return value;
                }
+
+               public String toString() {
+                       return "(" + value + ")";
+               }
        }

        public void testAdd1() throws UpdatableSortedLinkedListKilledException {
                UpdatableSortedLinkedList l = new UpdatableSortedLinkedList();
-               
+               l.debug = true;
+
                assertTrue("isEmpty()", l.isEmpty());
                assertEquals("size()", 0, l.size());
                l.add(new T(2));
@@ -65,6 +70,20 @@
                l.add(new T(-4));
                assertEquals("size()", 11, l.size());

+               UpdatableSortedLinkedListItem[] a = l.toArray();
+               assertEquals(((T)a[0]).value , -5);
+               assertEquals(((T)a[1]).value , -4);
+               assertEquals(((T)a[2]).value , -3);
+               assertEquals(((T)a[3]).value , -2);
+               assertEquals(((T)a[4]).value , -1);
+               assertEquals(((T)a[5]).value , 0);
+               assertEquals(((T)a[6]).value , 1);
+               assertEquals(((T)a[7]).value , 2);
+               assertEquals(((T)a[8]).value , 3);
+               assertEquals(((T)a[9]).value , 4);
+               assertEquals(((T)a[10]).value , 5);
+               
+
                ((T) l.getLowest()).assertV(-5);
                ((T) l.removeLowest()).assertV(-5);
                assertFalse("isEmpty()", l.isEmpty());
@@ -84,4 +103,92 @@
                assertEquals("size()", 0, l.size());
        }

+       public void testUpdate() throws 
UpdatableSortedLinkedListKilledException {
+               UpdatableSortedLinkedList l = new UpdatableSortedLinkedList();
+               l.debug = true;
+               
+               T[] t = new T[] { new T(0), new T(1), new T(2), new T(3), new 
T(4) };
+
+               l.add(t[0]);
+               l.add(t[1]);
+               l.add(t[2]);
+               l.add(t[3]);
+               l.add(t[4]);
+
+               t[1].value = -99;
+               l.update(t[1]);
+               t[0].value = 99;
+               l.update(t[0]);
+               t[4].value = -98;
+               l.update(t[4]);
+               t[2].value = 98;
+               l.update(t[2]);
+
+               l.update(t[0]);
+               l.update(t[1]);
+               l.update(t[4]);
+
+               assertSame(t[1], l.removeLowest());
+               assertSame(t[4], l.removeLowest());
+               assertSame(t[3], l.removeLowest());
+               assertSame(t[2], l.removeLowest());
+               assertSame(t[0], l.removeLowest());
+       }
+       
+       public void testClearKill() throws 
UpdatableSortedLinkedListKilledException {
+               UpdatableSortedLinkedList l = new UpdatableSortedLinkedList();
+               l.debug = true;
+               
+               l.add(new T(2));
+               l.add(new T(5));
+               l.add(new T(-1));
+               l.add(new T(-5));
+               
+               l.clear();
+               assertEquals(l.size(), 0);
+               
+               l.add(new T(3));
+               l.add(new T(0));
+               l.add(new T(1));
+               l.add(new T(-3));
+               l.add(new T(-2));
+               l.add(new T(4));
+               assertEquals(l.size(), 6);
+
+               UpdatableSortedLinkedListItem[] a = l.toArray();
+               assertEquals(((T)a[0]).value , -3);
+               assertEquals(((T)a[1]).value , -2);
+               assertEquals(((T)a[2]).value , 0);
+               assertEquals(((T)a[3]).value , 1);
+               assertEquals(((T)a[4]).value ,3);
+               assertEquals(((T)a[5]).value , 4);
+               
+               l.kill();
+               assertEquals(l.size(), 0);
+               try {
+                       l.add(new T(-4));
+                       fail("no UpdatableSortedLinkedListKilledException on 
add?");
+               } catch (UpdatableSortedLinkedListKilledException usllke) {
+               }
+               try {
+                       l.remove(new T(-4));
+                       fail("no UpdatableSortedLinkedListKilledException on 
remove?");
+               } catch (UpdatableSortedLinkedListKilledException usllke) {
+               }
+               try {
+                       l.update(new T(-4));
+                       fail("no UpdatableSortedLinkedListKilledException on 
update?");
+               } catch (UpdatableSortedLinkedListKilledException usllke) {
+               }
+               try {
+                       l.toArray();
+                       fail("no UpdatableSortedLinkedListKilledException on 
toArray?");
+               } catch (UpdatableSortedLinkedListKilledException usllke) {
+               }
+               try {
+                       l.removeLowest();       // should it throw?
+               } catch (UpdatableSortedLinkedListKilledException usllke) {
+                       fail("UpdatableSortedLinkedListKilledException on 
removeLowest?");
+               }
+       }
 }


Reply via email to