gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r21056 - in gnunet-java: . .idea .idea/inspectionProfiles .


From: gnunet
Subject: [GNUnet-SVN] r21056 - in gnunet-java: . .idea .idea/inspectionProfiles .idea/libraries src/org/gnunet/core src/org/gnunet/dht src/org/gnunet/nse src/org/gnunet/statistics src/org/gnunet/util
Date: Fri, 20 Apr 2012 23:51:38 +0200

Author: dold
Date: 2012-04-20 23:51:38 +0200 (Fri, 20 Apr 2012)
New Revision: 21056

Added:
   gnunet-java/.idea/libraries/commons_io_2_2.xml
   gnunet-java/src/org/gnunet/util/Connection.java
Modified:
   gnunet-java/.idea/inspectionProfiles/Project_Default.xml
   gnunet-java/.idea/workspace.xml
   gnunet-java/ISSUES
   gnunet-java/src/org/gnunet/core/Core.java
   gnunet-java/src/org/gnunet/dht/DistributedHashTable.java
   gnunet-java/src/org/gnunet/nse/NetworkSizeEstimation.java
   gnunet-java/src/org/gnunet/statistics/Statistics.java
   gnunet-java/src/org/gnunet/util/Client.java
   gnunet-java/src/org/gnunet/util/MessageTransmitter.java
   gnunet-java/src/org/gnunet/util/Resolver.java
   gnunet-java/src/org/gnunet/util/Scheduler.java
   gnunet-java/src/org/gnunet/util/Strings.java
Log:
split Client into Client and Connection

Modified: gnunet-java/.idea/inspectionProfiles/Project_Default.xml
===================================================================
--- gnunet-java/.idea/inspectionProfiles/Project_Default.xml    2012-04-20 
17:18:14 UTC (rev 21055)
+++ gnunet-java/.idea/inspectionProfiles/Project_Default.xml    2012-04-20 
21:51:38 UTC (rev 21056)
@@ -137,7 +137,6 @@
       <option name="ignoredTypesString" 
value="java.io.ByteArrayOutputStream,java.io.ByteArrayInputStream,java.io.StringBufferInputStream,java.io.CharArrayWriter,java.io.CharArrayReader,java.io.StringWriter,java.io.StringReader"
 />
       <option name="insideTryAllowed" value="false" />
     </inspection_tool>
-    <inspection_tool class="IfMayBeConditional" enabled="true" level="WARNING" 
enabled_by_default="true" />
     <inspection_tool class="IfStatementWithIdenticalBranches" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="IncrementDecrementUsedAsExpression" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="InnerClassMayBeStatic" enabled="true" 
level="WARNING" enabled_by_default="true" />
@@ -272,12 +271,6 @@
     </inspection_tool>
     <inspection_tool class="ResultOfObjectAllocationIgnored" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="ResultSetIndexZero" enabled="true" level="WARNING" 
enabled_by_default="true" />
-    <inspection_tool class="ReturnNull" enabled="true" level="WARNING" 
enabled_by_default="true">
-      <option name="m_reportObjectMethods" value="true" />
-      <option name="m_reportArrayMethods" value="true" />
-      <option name="m_reportCollectionMethods" value="true" />
-      <option name="m_ignorePrivateMethods" value="false" />
-    </inspection_tool>
     <inspection_tool class="RuntimeExecWithNonConstantString" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SafeLock" enabled="true" level="WARNING" 
enabled_by_default="true" />
     <inspection_tool class="SerialPersistentFieldsWithWrongSignature" 
enabled="true" level="WARNING" enabled_by_default="true" />
@@ -318,7 +311,6 @@
       <option name="m_ignorePrimitives" value="false" />
     </inspection_tool>
     <inspection_tool class="StringBufferField" enabled="true" level="WARNING" 
enabled_by_default="true" />
-    <inspection_tool class="StringBufferReplaceableByString" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="StringConcatenationInFormatCall" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="StringConcatenationInLoops" enabled="true" 
level="WARNING" enabled_by_default="true">
       <option name="m_ignoreUnlessAssigned" value="true" />

Added: gnunet-java/.idea/libraries/commons_io_2_2.xml
===================================================================
--- gnunet-java/.idea/libraries/commons_io_2_2.xml                              
(rev 0)
+++ gnunet-java/.idea/libraries/commons_io_2_2.xml      2012-04-20 21:51:38 UTC 
(rev 21056)
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="commons-io-2.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/lib/commons-io-2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file

Modified: gnunet-java/.idea/workspace.xml
===================================================================
--- gnunet-java/.idea/workspace.xml     2012-04-20 17:18:14 UTC (rev 21055)
+++ gnunet-java/.idea/workspace.xml     2012-04-20 21:51:38 UTC (rev 21056)
@@ -6,11 +6,19 @@
   <component name="ChangeListManager">
     <list default="true" readonly="true" 
id="92cdd5e3-f1ea-4d90-81fc-cf0bd20d2d2e" name="Default" comment="more parts of 
Core implemented, still major problems">
       <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/.idea/libraries/commons_io_2_2.xml" />
+      <change type="NEW" beforePath="" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Connection.java" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" 
afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/.idea/workspace.xml" 
afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/ISSUES" 
afterPath="$PROJECT_DIR$/ISSUES" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/core/Core.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/core/Core.java" />
       <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Client.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Client.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/MessageTransmitter.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/MessageTransmitter.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java" />
+      <change type="MODIFICATION" 
beforePath="$PROJECT_DIR$/src/org/gnunet/util/Strings.java" 
afterPath="$PROJECT_DIR$/src/org/gnunet/util/Strings.java" />
     </list>
     <ignored path="gnunet-java.iws" />
     <ignored path=".idea/workspace.xml" />
@@ -68,103 +76,106 @@
   </component>
   <component name="FileEditorManager">
     <leaf>
-      <file leaf-file-name="ATSInformation.java" pinned="false" 
current="false" current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/ATSInformation.java">
+      <file leaf-file-name="Client.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Client.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="13" column="0" selection-start="222" 
selection-end="222" vertical-scroll-proportion="0.0">
-              <folding />
+            <state line="135" column="36" selection-start="5315" 
selection-end="5315" vertical-scroll-proportion="0.0">
+              <folding>
+                <element signature="e#0#6780#0" expanded="true" />
+                <element signature="e#4898#5537#0" expanded="true" />
+                <element signature="e#5522#5523#0" expanded="true" />
+                <marker date="1334958405000" expanded="true" 
signature="6496:6581" placeholder="/**...*/" />
+                <marker date="1334958405000" expanded="true" 
signature="6619:6659" placeholder="{...}" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="ISSUES" pinned="false" current="true" 
current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/ISSUES">
+      <file leaf-file-name="GnunetMessage.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/GnunetMessage.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="352" column="31" selection-start="12564" 
selection-end="12564" vertical-scroll-proportion="0.67971015">
+            <state line="5" column="19" selection-start="78" 
selection-end="78" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="DistributedHashTable.java" pinned="false" 
current="false" current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java">
+      <file leaf-file-name="Connection.java" pinned="false" current="true" 
current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Connection.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="441" column="0" selection-start="12777" 
selection-end="12777" vertical-scroll-proportion="0.0">
+            <state line="412" column="0" selection-start="14820" 
selection-end="14820" vertical-scroll-proportion="0.3086771">
               <folding>
-                <element signature="e#14218#14658#0" expanded="true" />
-                <element signature="e#14635#14636#0" expanded="true" />
+                <element signature="imports" expanded="true" />
+                <element signature="e#12652#13034#0" expanded="true" />
+                <element signature="e#13019#13020#0" expanded="true" />
+                <element signature="e#17483#17621#0" expanded="true" />
+                <element signature="e#17610#17611#0" expanded="true" />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Statistics.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java">
+      <file leaf-file-name="Server.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Server.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="207" column="21" selection-start="6721" 
selection-end="6721" vertical-scroll-proportion="0.0">
+            <state line="28" column="0" selection-start="593" 
selection-end="593" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="gnunet-exercise.tex" pinned="false" 
current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/doc/gnunet-exercise.tex">
+      <file leaf-file-name="Program.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Program.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="16" column="21" selection-start="488" 
selection-end="488" vertical-scroll-proportion="0.0">
+            <state line="11" column="22" selection-start="282" 
selection-end="282" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Core.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/org/gnunet/core/Core.java">
+      <file leaf-file-name="Resolver.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Resolver.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="376" column="7" selection-start="9067" 
selection-end="9067" vertical-scroll-proportion="0.0">
-              <folding>
-                <element signature="e#12677#13485#0" expanded="true" />
-                <element signature="e#13466#13467#0" expanded="true" />
-                <element signature="e#13533#13791#0" expanded="true" />
-                <element signature="e#13772#13773#0" expanded="true" />
-              </folding>
+            <state line="217" column="13" selection-start="6126" 
selection-end="6126" vertical-scroll-proportion="0.0">
+              <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Service.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Service.java">
+      <file leaf-file-name="DistributedHashTable.java" pinned="false" 
current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="3" column="22" selection-start="49" 
selection-end="49" vertical-scroll-proportion="0.0">
+            <state line="362" column="55" selection-start="10183" 
selection-end="10183" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Server.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Server.java">
+      <file leaf-file-name="NetworkSizeEstimation.java" pinned="false" 
current="false" current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="85" column="5" selection-start="1515" 
selection-end="1515" vertical-scroll-proportion="0.0">
-              <folding>
-                <element signature="e#957#978#0" expanded="true" />
-              </folding>
+            <state line="72" column="18" selection-start="1992" 
selection-end="1992" vertical-scroll-proportion="0.0">
+              <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Construct.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
+      <file leaf-file-name="Core.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/org/gnunet/core/Core.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="348" column="42" selection-start="11249" 
selection-end="11249" vertical-scroll-proportion="0.0">
+            <state line="709" column="79" selection-start="20929" 
selection-end="20929" vertical-scroll-proportion="0.0">
               <folding>
-                <element signature="e#3681#3719#0" expanded="true" />
+                <element signature="e#11559#11999#0" expanded="true" />
+                <element signature="e#11984#11985#0" expanded="true" />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="FillParser.java" pinned="false" current="false" 
current-in-tab="false">
-        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/FillParser.java">
+      <file leaf-file-name="Statistics.java" pinned="false" current="false" 
current-in-tab="false">
+        <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="62" column="9" selection-start="2011" 
selection-end="2011" vertical-scroll-proportion="0.0">
+            <state line="141" column="55" selection-start="4328" 
selection-end="4328" vertical-scroll-proportion="0.0">
               <folding />
             </state>
           </provider>
@@ -180,22 +191,22 @@
   <component name="IdeDocumentHistory">
     <option name="changedFiles">
       <list>
-        <option 
value="$PROJECT_DIR$/test/org/gnunet/construct/QueryMessage.java" />
-        <option 
value="$PROJECT_DIR$/test/org/gnunet/construct/ConstructTest.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/IntegerFill.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/FillIntegerParser.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/IntegerFillParser.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/PeerIdentity.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" />
-        <option 
value="$PROJECT_DIR$/src/org/gnunet/util/RunaboutMessageReceiver.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/parsers/NestedParser.java" />
         <option value="$PROJECT_DIR$/src/org/gnunet/util/Server.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/MessageIdAnnotationProcessor.java"
 />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/construct/MessageLoader.java" />
         <option value="$PROJECT_DIR$/src/org/gnunet/util/Strings.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/construct/Construct.java" 
/>
-        <option value="$PROJECT_DIR$/doc/gnunet-exercise.tex" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/Connectoin.java" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java" />
+        <option value="$PROJECT_DIR$/ISSUES" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/util/MessageTransmitter.java" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/Resolver.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/core/Core.java" />
+        <option 
value="$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java" />
         <option 
value="$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java" />
-        <option value="$PROJECT_DIR$/src/org/gnunet/core/Core.java" />
-        <option value="$PROJECT_DIR$/ISSUES" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/Client.java" />
+        <option value="$PROJECT_DIR$/src/org/gnunet/util/Connection.java" />
       </list>
     </option>
   </component>
@@ -231,6 +242,20 @@
       <sortByType />
     </navigator>
     <panes>
+      <pane id="PackagesPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
       <pane id="ProjectPane">
         <subPane>
           <PATH>
@@ -259,6 +284,38 @@
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
+              <option name="myItemId" value="tools" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="test" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
               <option name="myItemId" value="src" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
@@ -288,6 +345,10 @@
               <option name="myItemId" value="gnunet" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="util" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -310,10 +371,32 @@
               <option name="myItemId" value="gnunet" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+          </PATH>
+          <PATH>
             <PATH_ELEMENT>
-              <option name="myItemId" value="statistics" />
+              <option name="myItemId" value="gnunet-java" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet-java" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="org" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="gnunet" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="core" />
+              <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -337,7 +420,7 @@
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
-              <option name="myItemId" value="core" />
+              <option name="myItemId" value="construct" />
               <option name="myItemType" 
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
@@ -372,7 +455,6 @@
         </subPane>
       </pane>
       <pane id="Scope" />
-      <pane id="PackagesPane" />
     </panes>
   </component>
   <component name="PropertiesComponent">
@@ -607,21 +689,21 @@
     <frame x="-6" y="17" width="1460" height="892" extended-state="6" />
     <editor active="true" />
     <layout>
-      <window_info id="Messages" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.3292011" sideWeight="0.5" order="7" side_tool="false" 
content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.32784638" sideWeight="0.5" order="7" side_tool="false" 
content_ui="tabs" />
       <window_info id="Changes" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Palette" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" 
sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24841213" 
sideWeight="0.6735254" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.6351166" 
sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.24841213" sideWeight="0.5020576" order="1" side_tool="true" 
content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24841213" 
sideWeight="0.67215365" order="0" side_tool="false" content_ui="combo" />
       <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3282967" 
sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.24982257" sideWeight="0.6318681" order="2" side_tool="true" 
content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.32967034" sideWeight="0.5" order="7" side_tool="true" 
content_ui="tabs" />
       <window_info id="Run" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32647464" 
sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.32921812" sideWeight="0.5" order="7" side_tool="false" 
content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" 
sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
       <window_info id="Message" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" 
internal_type="DOCKED" type="DOCKED" visible="false" weight="0.63736266" 
sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Hierarchy" active="false" anchor="right" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
       <window_info id="Inspection" active="false" anchor="bottom" 
auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 
weight="0.3997253" sideWeight="0.5" order="5" side_tool="false" 
content_ui="tabs" />
@@ -631,9 +713,9 @@
     <option name="myLimit" value="2678400000" />
   </component>
   <component name="VcsManagerConfiguration">
-    <option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" 
value="true" />
-    <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="true" />
-    <option name="CHECK_NEW_TODO" value="true" />
+    <option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" 
value="false" />
+    <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
+    <option name="CHECK_NEW_TODO" value="false" />
     <option name="myTodoPanelSettings">
       <value>
         <are-packages-shown value="false" />
@@ -664,7 +746,7 @@
     <option name="SHOW_VCS_ERROR_NOTIFICATIONS" value="true" />
     <option name="FORCE_NON_EMPTY_COMMENT" value="false" />
     <option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="false" />
-    <option name="LAST_COMMIT_MESSAGE" value="updated issues, doc" />
+    <option name="LAST_COMMIT_MESSAGE" value="added mechanism to find new 
MsgMap.txt files" />
     <option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
     <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
     <option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
@@ -680,135 +762,141 @@
     <MESSAGE value="changed GnunetMessage to use unions" />
     <MESSAGE value="more parts of Core implemented, still major problems" />
     <MESSAGE value="updated issues, doc" />
+    <MESSAGE value="still experimenting with core, updated issues" />
+    <MESSAGE value="typo" />
+    <MESSAGE value="core now working, several fixes in construct, started 
implementing the server/service" />
+    <MESSAGE value="added make-jar tool" />
+    <MESSAGE value="added mechanism to find new MsgMap.txt files" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager />
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/MessageUnion.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="161" column="33" selection-start="5773" 
selection-end="5773" vertical-scroll-proportion="0.0">
-          <folding />
-        </state>
+        <state line="5" column="17" selection-start="95" selection-end="95" 
vertical-scroll-proportion="0.0" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/PeerIdentity.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Strings.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="15" column="13" selection-start="390" selection-end="390" 
vertical-scroll-proportion="0.0">
+        <state line="28" column="25" selection-start="886" selection-end="886" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Program.java">
+    <entry 
file="jar:///usr/lib/jvm/java-6-sun/jre/lib/rt.jar!/java/util/EnumSet.class">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="11" column="22" selection-start="282" selection-end="282" 
vertical-scroll-proportion="0.0">
+        <state line="5" column="22" selection-start="156" selection-end="156" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/MessageReceiver.java">
+    <entry file="file://$PROJECT_DIR$/ISSUES">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="27" column="17" selection-start="919" selection-end="919" 
vertical-scroll-proportion="0.0">
+        <state line="526" column="4" selection-start="19423" 
selection-end="19423" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/GnunetMessage.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/util/MessageTransmitter.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="5" column="19" selection-start="78" selection-end="78" 
vertical-scroll-proportion="0.0">
+        <state line="9" column="47" selection-start="351" selection-end="351" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Client.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Scheduler.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="41" column="13" selection-start="1472" 
selection-end="1472" vertical-scroll-proportion="0.0">
-          <folding />
+        <state line="223" column="85" selection-start="7868" 
selection-end="7868" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/ATSInformation.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/core/Core.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="13" column="0" selection-start="222" selection-end="222" 
vertical-scroll-proportion="0.0">
-          <folding />
+        <state line="709" column="79" selection-start="20929" 
selection-end="20929" vertical-scroll-proportion="0.0">
+          <folding>
+            <element signature="e#11559#11999#0" expanded="true" />
+            <element signature="e#11984#11985#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/construct/Construct.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="348" column="42" selection-start="11249" 
selection-end="11249" vertical-scroll-proportion="0.0">
-          <folding>
-            <element signature="e#3681#3719#0" expanded="true" />
-          </folding>
+        <state line="141" column="55" selection-start="4328" 
selection-end="4328" vertical-scroll-proportion="0.0">
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/construct/parsers/FillParser.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="62" column="9" selection-start="2011" 
selection-end="2011" vertical-scroll-proportion="0.0">
+        <state line="362" column="55" selection-start="10183" 
selection-end="10183" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Service.java">
+    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/nse/NetworkSizeEstimation.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="3" column="22" selection-start="49" selection-end="49" 
vertical-scroll-proportion="0.0">
+        <state line="72" column="18" selection-start="1992" 
selection-end="1992" vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Server.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Resolver.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="85" column="5" selection-start="1515" 
selection-end="1515" vertical-scroll-proportion="0.0">
-          <folding>
-            <element signature="e#957#978#0" expanded="true" />
-          </folding>
+        <state line="217" column="13" selection-start="6126" 
selection-end="6126" vertical-scroll-proportion="0.0">
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/statistics/Statistics.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/GnunetMessage.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="207" column="21" selection-start="6721" 
selection-end="6721" vertical-scroll-proportion="0.0">
+        <state line="5" column="19" selection-start="78" selection-end="78" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry 
file="file://$PROJECT_DIR$/src/org/gnunet/dht/DistributedHashTable.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Client.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="441" column="0" selection-start="12777" 
selection-end="12777" vertical-scroll-proportion="0.0">
+        <state line="135" column="36" selection-start="5315" 
selection-end="5315" vertical-scroll-proportion="0.0">
           <folding>
-            <element signature="e#14218#14658#0" expanded="true" />
-            <element signature="e#14635#14636#0" expanded="true" />
+            <element signature="e#0#6780#0" expanded="true" />
+            <element signature="e#4898#5537#0" expanded="true" />
+            <element signature="e#5522#5523#0" expanded="true" />
+            <marker date="1334958405000" expanded="true" signature="6496:6581" 
placeholder="/**...*/" />
+            <marker date="1334958405000" expanded="true" signature="6619:6659" 
placeholder="{...}" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/doc/gnunet-exercise.tex">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Server.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="16" column="21" selection-start="488" selection-end="488" 
vertical-scroll-proportion="0.0">
+        <state line="28" column="0" selection-start="593" selection-end="593" 
vertical-scroll-proportion="0.0" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Program.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="11" column="22" selection-start="282" selection-end="282" 
vertical-scroll-proportion="0.0">
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/org/gnunet/core/Core.java">
+    <entry file="file://$PROJECT_DIR$/src/org/gnunet/util/Connection.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="376" column="7" selection-start="9067" 
selection-end="9067" vertical-scroll-proportion="0.0">
+        <state line="412" column="0" selection-start="14820" 
selection-end="14820" vertical-scroll-proportion="0.3086771">
           <folding>
-            <element signature="e#12677#13485#0" expanded="true" />
-            <element signature="e#13466#13467#0" expanded="true" />
-            <element signature="e#13533#13791#0" expanded="true" />
-            <element signature="e#13772#13773#0" expanded="true" />
+            <element signature="imports" expanded="true" />
+            <element signature="e#12652#13034#0" expanded="true" />
+            <element signature="e#13019#13020#0" expanded="true" />
+            <element signature="e#17483#17621#0" expanded="true" />
+            <element signature="e#17610#17611#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/ISSUES">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="352" column="31" selection-start="12564" 
selection-end="12564" vertical-scroll-proportion="0.67971015">
-          <folding />
-        </state>
-      </provider>
-    </entry>
   </component>
 </project>
 

Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES  2012-04-20 17:18:14 UTC (rev 21055)
+++ gnunet-java/ISSUES  2012-04-20 21:51:38 UTC (rev 21056)
@@ -518,4 +518,10 @@
   * comment about success wrong
  * why is there the client_disconnect function, and receive_done(client, 
false)?
   * convenience/performance
- * comment on client_persist
\ No newline at end of file
+ * comment on client_persist
+
+
+ 
---------------------------------------------------------------------------------
+
+ * revisitid connection: concurrent address probe bad wrt ipv4/ipv6 sockets
+   (client tries to connect twice to the service, one connection always 
dropped)
\ No newline at end of file

Modified: gnunet-java/src/org/gnunet/core/Core.java
===================================================================
--- gnunet-java/src/org/gnunet/core/Core.java   2012-04-20 17:18:14 UTC (rev 
21055)
+++ gnunet-java/src/org/gnunet/core/Core.java   2012-04-20 21:51:38 UTC (rev 
21056)
@@ -50,7 +50,7 @@
     LinkedList<SendMessage> approvedSendMessages = new 
LinkedList<SendMessage>();
 
 
-    private Client.TransmitHandle currentClientTransmitHandle;
+    private Cancelable currentClientTransmitHandle;
 
     enum CoreOption {
         NOTHING(0),
@@ -444,7 +444,7 @@
             sendMessage.peer = transmitHandle.peerIdentity;
             sendMessage.priority = 0;
 
-            transmitHandle.transmitter.transmit(new Client.MessageSink() {
+            transmitHandle.transmitter.transmit(new Connection.MessageSink() {
                 @Override
                 public void send(GnunetMessage.Body m) {
                     if (sendMessage.payloadMessage != null) {
@@ -507,7 +507,7 @@
         cpi.requestsToPeer.put(transmitHandle.smrId, transmitHandle);
 
         if (!maxdelay.isForever()) {
-            transmitHandle.timeoutHandle = Scheduler.add(maxdelay, new 
Scheduler.Task() {
+            transmitHandle.timeoutHandle = Scheduler.addDelayed(maxdelay, new 
Scheduler.Task() {
                 @Override
                 public void run(Scheduler.RunContext ctx) {
                     transmitter.handleError();
@@ -552,7 +552,7 @@
             currentClientTransmitHandle = 
client.notifyTransmitReady(RelativeTime.FOREVER, false,
                     new MessageTransmitter() {
                         @Override
-                        public void transmit(Client.MessageSink sink) {
+                        public void transmit(Connection.MessageSink sink) {
                             logger.info("transmitHandle NTR done");
                             currentClientTransmitHandle = null;
 
@@ -587,7 +587,7 @@
             currentClientTransmitHandle = 
client.notifyTransmitReady(RelativeTime.FOREVER, false,
                     new MessageTransmitter() {
                         @Override
-                        public void transmit(Client.MessageSink sink) {
+                        public void transmit(Connection.MessageSink sink) {
                             currentClientTransmitHandle = null;
                             sink.send(sm);
                             logger.info("transmitted SendMessage!");
@@ -707,7 +707,7 @@
                         core.notifyTransmitReady(0, RelativeTime.SECOND, 
myIdentity, Construct.getSize(myMessage),
                                 new MessageTransmitter() {
                                     @Override
-                                    public void transmit(Client.MessageSink 
sink) {
+                                    public void 
transmit(Connection.MessageSink sink) {
                                         sink.send(myMessage);
                                     }
 

Modified: gnunet-java/src/org/gnunet/dht/DistributedHashTable.java
===================================================================
--- gnunet-java/src/org/gnunet/dht/DistributedHashTable.java    2012-04-20 
17:18:14 UTC (rev 21055)
+++ gnunet-java/src/org/gnunet/dht/DistributedHashTable.java    2012-04-20 
21:51:38 UTC (rev 21056)
@@ -232,7 +232,7 @@
         client.notifyTransmitReady(timeout, true,
                 new MessageTransmitter() {
                     @Override
-                    public void transmit(Client.MessageSink sink) {
+                    public void transmit(Connection.MessageSink sink) {
                         sink.send(cpm);
                         // is there no way to get an ack from the dht service?
                         cont.call(PutResult.OK);
@@ -272,7 +272,7 @@
 
             client.notifyTransmitReady(RelativeTime.FOREVER, false, new 
MessageTransmitter() {
                 @Override
-                public void transmit(Client.MessageSink sink) {
+                public void transmit(Connection.MessageSink sink) {
                     final DHTClientGetStopMessage sm = new 
DHTClientGetStopMessage();
                     sm.key = key;
                     sm.unique_id = uid;
@@ -288,7 +288,7 @@
 
     List<GetRequest> activeRequests = new ArrayList<GetRequest>(5);
 
-    Client.ReceiveHandle receiveHandle = null;
+    Cancelable receiveHandle = null;
 
 
     public class ResponseDispatcher implements MessageReceiver {
@@ -360,7 +360,7 @@
         
         client.notifyTransmitReady(timeout, false, new MessageTransmitter() {
             @Override
-            public void transmit(Client.MessageSink sink) {
+            public void transmit(Connection.MessageSink sink) {
                 sink.send(getMessage);
             }
 
@@ -375,7 +375,7 @@
             }
         });
         
-        Scheduler.add(timeout, new Scheduler.Task() {
+        Scheduler.addDelayed(timeout, new Scheduler.Task() {
             @Override
             public void run(Scheduler.RunContext ctx) {
                 logger.debug("timeout task has been run");

Modified: gnunet-java/src/org/gnunet/nse/NetworkSizeEstimation.java
===================================================================
--- gnunet-java/src/org/gnunet/nse/NetworkSizeEstimation.java   2012-04-20 
17:18:14 UTC (rev 21055)
+++ gnunet-java/src/org/gnunet/nse/NetworkSizeEstimation.java   2012-04-20 
21:51:38 UTC (rev 21056)
@@ -78,7 +78,7 @@
     private class NSE_Transmitter implements MessageTransmitter {
 
         @Override
-        public void transmit(Client.MessageSink sink) {
+        public void transmit(Connection.MessageSink sink) {
             logger.debug("ready to transmit");
             StartMessage m = new StartMessage();
             sink.send(m);
@@ -151,7 +151,7 @@
      */
     public void disconnect() {
         disconnected = true;
-        client.disconnect(false);
+        client.disconnect();
     }
 
     public static void main(String[] args) {

Modified: gnunet-java/src/org/gnunet/statistics/Statistics.java
===================================================================
--- gnunet-java/src/org/gnunet/statistics/Statistics.java       2012-04-20 
17:18:14 UTC (rev 21055)
+++ gnunet-java/src/org/gnunet/statistics/Statistics.java       2012-04-20 
21:51:38 UTC (rev 21056)
@@ -76,7 +76,7 @@
 
         client.notifyTransmitReady(deadline.getRemaining(), true, new 
MessageTransmitter() {
             @Override
-            public void transmit(Client.MessageSink sink) {
+            public void transmit(Connection.MessageSink sink) {
                 if (sink == null) {
                     logger.error("unable to connect to statistics service");
                     return;
@@ -139,7 +139,7 @@
         client.notifyTransmitReady(timeout, true, new MessageTransmitter() {
 
             @Override
-            public void transmit(Client.MessageSink sink) {
+            public void transmit(Connection.MessageSink sink) {
                 if (sink == null) {
                     cb.onTimeout();
                 }

Modified: gnunet-java/src/org/gnunet/util/Client.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Client.java 2012-04-20 17:18:14 UTC (rev 
21055)
+++ gnunet-java/src/org/gnunet/util/Client.java 2012-04-20 21:51:38 UTC (rev 
21056)
@@ -19,23 +19,10 @@
  */
 package org.gnunet.util;
 
-import org.gnunet.construct.*;
 import org.gnunet.exceptions.ConfigurationException;
-import org.gnunet.exceptions.InterfaceViolationException;
-import org.gnunet.exceptions.InternalLogicError;
-import org.gnunet.util.Scheduler.Task;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOError;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.nio.channels.spi.SelectorProvider;
-import java.util.LinkedList;
-
 /**
  * Represents a connection to a service.
  */
@@ -44,34 +31,24 @@
             .getLogger(Client.class);
 
     /**
-     * The underlying socket the client is using to talk with the service.
+     * Underlying connection to the service.
      */
-    private SocketChannel chan = null;
+    private Connection connection;
 
     /**
-     * The host and port this client should be connected to, according to the 
configuration.
+     * Host this client should be connected to.
      */
-    private String connectionHost;
-    private int connectionPort;
+    private int port;
+    private String hostname;
 
-    /**
-     * The list of possible IP addresses the service can be reached by.
-     */
-    private LinkedList<InetAddress> addressList = new 
LinkedList<InetAddress>();
+    private Cancelable connectTimeoutHandle;
 
     /**
-     * The task that is currently used by the resolve mechanism.
-     */
-    private Cancelable resolveHandle = null;
-    private Cancelable connectHandle = null;
-
-
-    /**
      * Initial value for connectBackoff.
      *
-     * @see Client.connectBackoff
+     * @see connectBackoff
      */
-    private final RelativeTime INITAL_BACKOFF = new RelativeTime(5);
+    private final RelativeTime INITAL_BACKOFF = RelativeTime.MILLISECOND;
 
     /**
      * Maximum value for connectBackoff.
@@ -89,272 +66,6 @@
     private RelativeTime connectBackoff = INITAL_BACKOFF;
 
     /**
-     * The ReceiveHelper responsible for receiving a whole message from the 
service
-     * and calling the respective MessageReceiver.
-     */
-    private ReceiveHelper currentReceiveHelper = null;
-
-    /**
-     * The buffer with the (partial) message received from the service.
-     * Initially, this buffer has the size of the smallest possible messages, 
but grows when
-     * receiving larger messages.
-     */
-    private ByteBuffer recvBuffer = 
ByteBuffer.allocate(GnunetMessage.Header.SIZE);
-
-
-    /**
-     * The handle for the current transmission. The current transmission either
-     * writes data to the channel or waits for the channel to connect
-     */
-    private TransmitHelper currentTransmitHelper = null;
-    /**
-     * The handle for the next transmission. The next transmission will become 
the current
-     * transmission once the current transmission has completed.
-     * While nextTransmitHelper is not null, no new transmit requests may be 
scheduled.
-     */
-    private TransmitHelper nextTransmitHelper = null;
-
-    /**
-     * The transmitters passed to transmitReadyNotify(...) write to this 
buffer by calling
-     * methods on the MessageSink passed to the 
Transmitter.transmit(MessageSink s) method.
-     * Initially, this buffer has the size of the smallest possible messages, 
but grows when
-     * transmitting larger messages.
-     */
-    private ByteBuffer transmitBuffer = 
ByteBuffer.allocate(GnunetMessage.Header.SIZE);
-
-
-    /**
-     * Represents a request for transmission.
-     */
-    public interface TransmitHandle {
-        /**
-         * Cancel a request for the transmit ready notification.
-         * This does *not* cancel a transmission that already has been started.
-         */
-        public void cancel();
-    }
-
-    /**
-     * An interface that allows the Transmitter.transmit method to deliver 
their messages
-     * to the client, which sends them to the service.
-     */
-    public interface MessageSink {
-        public void send(GnunetMessage.Body m);
-    }
-
-
-    /**
-     * The ReceiveHelper is responsible for receiving a whole
-     * GnunetMessage and call the respective MessageReceiver with the message 
on success,
-     * and null on failure or timeout.
-     */
-    private class ReceiveHelper implements Task {
-        private MessageReceiver receiver;
-        private RelativeTime timeout;
-        private GnunetMessage.Header msgh = null;
-        private Scheduler.TaskIdentifier recvTask = null;
-        private boolean finished = false;
-        // is this receiver actively working? if not, the connection process 
has to kick off the receiver
-        // (or select behaves badly)
-        private boolean working = false;
-
-        public ReceiveHelper(MessageReceiver receiver, RelativeTime timeout) {
-            this.receiver = receiver;
-            this.timeout = timeout;
-        }
-
-        public void dispatchMessage() {
-            assert msgh != null;
-            currentReceiveHelper = null;
-            finished = true;
-            logger.debug("dispatching message with " + recvBuffer.position() + 
" bytes");
-            recvBuffer.flip();
-
-            GnunetMessage msg = Construct.parseAs(recvBuffer, 
GnunetMessage.class);
-
-            receiver.process(msg.body);
-        }
-
-        @Override
-        public void run(Scheduler.RunContext ctx) {
-            logger.debug("receiving in helper");
-            recvTask = null;
-            if (ctx.reasons.contains(Scheduler.Reason.TIMEOUT)) {
-                currentReceiveHelper = null;
-                receiver.handleError();
-            } else if (ctx.reasons.contains(Scheduler.Reason.READ_READY)) {
-                try {
-                    int n = chan.read(recvBuffer);
-                    if (n == -1) {
-                        logger.error("end of stream in channel before complete 
message, read {} bytes",
-                                recvBuffer.position());
-                        chan.close();
-                        chan = null;
-                        receiver.handleError();
-                        if (currentTransmitHelper != null
-                                && currentTransmitHelper.autoRetry && 
!currentTransmitHelper.notifyDone()) {
-                            logger.debug("reconnecting due to transmitter 
autoRetry");
-                            reconnect();
-                        }
-                        return;
-                    }
-                    logger.debug(String.format("chan read %s bytes", n));
-                } catch (IOException e) {
-                    logger.error("read failed with exception:", e);
-                    receiver.handleError();
-                    return;
-                }
-                if (recvBuffer.remaining() == 0) {
-                    if (msgh != null) {
-                        dispatchMessage();
-                    } else {
-                        recvBuffer.rewind();
-                        msgh = Construct.parseAs(recvBuffer, 
GnunetMessage.Header.class);
-                        if (msgh.messageSize > GnunetMessage.Header.SIZE) {
-                            if (recvBuffer.capacity() < msgh.messageSize) {
-                                ByteBuffer buf = 
ByteBuffer.allocate(msgh.messageSize);
-                                recvBuffer.flip();
-                                buf.put(recvBuffer);
-                                recvBuffer = buf;
-                            }
-                            recvBuffer.limit(msgh.messageSize);
-                            schedule();
-                        } else {
-                            dispatchMessage();
-                        }
-                    }
-                } else {
-                    schedule();
-                }
-            } else {
-                // XXX: what to do here?
-                throw new RuntimeException("receive failed");
-            }
-        }
-
-        private void schedule() {
-            working = true;
-            recvTask = Scheduler.addRead(timeout, chan, this);
-        }
-
-        public void cancel() {
-            if (finished) {
-                throw new InterfaceViolationException("canceling finished 
receive");
-            }
-            if (recvTask != null) {
-                recvTask.cancel();
-            }
-        }
-    }
-
-
-    private class TransmitHelper implements Task, MessageSink {
-        private final MessageTransmitter transmitter;
-        private final boolean autoRetry;
-
-        private Scheduler.TaskIdentifier notifyTimeoutTask;
-
-        private Scheduler.TaskIdentifier transmitTask = null;
-
-        public TransmitHelper(final MessageTransmitter transmitter, 
RelativeTime notifyTimeout, boolean autoRetry) {
-            this.transmitter = transmitter;
-            this.autoRetry = autoRetry;
-
-            Scheduler.TaskBuilder b = new Scheduler.TaskBuilder();
-            b.withTask(new Task() {
-                @Override
-                public void run(Scheduler.RunContext ctx) {
-                    transmitter.handleError();
-                }
-            });
-            b.withTimeout(notifyTimeout);
-            notifyTimeoutTask = Scheduler.add(b);
-        }
-
-        public boolean notifyDone() {
-            return notifyTimeoutTask == null;
-        }
-
-        public void cancel() {
-            if (transmitTask != null) {
-                transmitTask.cancel();
-                transmitTask = null;
-            }
-            if (notifyTimeoutTask != null) {
-                notifyTimeoutTask.cancel();
-                notifyTimeoutTask = null;
-            }
-        }
-
-        @Override
-        public void run(Scheduler.RunContext ctx) {
-            try {
-                int n = chan.write(transmitBuffer);
-                logger.debug("chan has written " + n + " bytes");
-            } catch (IOException e) {
-                throw new IOError(e);
-            }
-            if (transmitBuffer.remaining() == 0) {
-                logger.debug("sent " + transmitBuffer.position() + "bytes 
complete message");
-                if (nextTransmitHelper == null) {
-                    currentTransmitHelper = null;
-                } else {
-                    currentTransmitHelper = nextTransmitHelper;
-                    nextTransmitHelper.start();
-                    nextTransmitHelper = null;
-                }
-            } else {
-                schedule();
-            }
-        }
-
-        /**
-         * called to notify when we are ready to put new messages in the 
transmit buffer
-         */
-        public void start() {
-            notifyTimeoutTask.cancel();
-            notifyTimeoutTask = null;
-            transmitBuffer.clear();
-            transmitter.transmit(TransmitHelper.this);
-            transmitBuffer.flip();
-            schedule();
-
-        }
-
-        private void schedule() {
-            // timeout is forever, because there is no way to directly limit 
the transmission time
-            // of a message, only the max. wait time before transmission.
-            // cancel must be called on the transmitTask if we disconnect
-            Scheduler.TaskBuilder b = new Scheduler.TaskBuilder();
-            
b.withTimeout(RelativeTime.FOREVER).withSelectWrite(chan).withTask(this);
-            this.transmitTask = Scheduler.add(b);
-        }
-
-        @Override
-        public void send(final GnunetMessage.Body m) {
-            final GnunetMessage gm = new GnunetMessage();
-            gm.header = new GnunetMessage.Header();
-            gm.body = m;
-            Construct.patch(gm);
-            gm.header.messageSize = Construct.getSize(gm);
-            byte[] b = Construct.toBinary(gm);
-            if (b.length != gm.header.messageSize) {
-                throw new InternalLogicError(
-                        String.format("tried to send message with binary size 
%s but size in header %s",
-                                b.length, gm.header.messageSize));
-            }
-            logger.debug("sending message (size={},type={})", b.length, 
gm.header.messageType);
-            if (transmitBuffer.remaining() < b.length) {
-                ByteBuffer buf = ByteBuffer.allocate(b.length + 
transmitBuffer.capacity());
-                transmitBuffer.flip();
-                buf.put(transmitBuffer);
-                transmitBuffer = buf;
-            }
-            transmitBuffer.put(b);
-        }
-    }
-
-    /**
      * Create a connection to a service.
      *
      * @param serviceName name of the service
@@ -362,193 +73,36 @@
      */
     public Client(String serviceName, Configuration cfg) {
         // get port of this service from the configuration
-        int port = (int) cfg.getValueNumer(serviceName, "PORT");
-        // ... and check for validity
-        if (port > 0xFFFF || port <= 0) {
-            throw new ConfigurationException(String.format("'%s' is not a 
valid port", port));
-        }
-        connectionPort = port;
+        port = (int) cfg.getValueNumer(serviceName, "PORT");
         // get the hostname from the configuration
-        connectionHost = cfg.getValueString(serviceName, "HOSTNAME");
-        // todo: further validity checks
-        if (connectionHost.isEmpty()) {
+        hostname = cfg.getValueString(serviceName, "HOSTNAME");
+        if (hostname.isEmpty()) {
             throw new ConfigurationException(String.format("hostname of 
service '%s' empty", serviceName));
         }
-
-        connect();
+        reconnect();
     }
 
 
-    class AddressHandler implements Resolver.AddressCallback {
-        @Override
-        public void onAddress(InetAddress addr) {
-            addressList.addFirst(addr);
-            if (!chan.isConnectionPending()) {
-                logger.debug("no connection pending - connecting to next 
addr");
-                connectNextAddress();
-            }
-        }
-
-        @Override
-        public void onFinished() {
-            resolveHandle = null;
-            if (addressList.isEmpty()) {
-                logger.debug("address could not be resolved");
-                initiateResolve();
-            }
-        }
-
-        @Override
-        public void onTimeout() {
-        }
-    }
-
-    private void initiateResolve() {
-        if (resolveHandle != null) {
-            return;
-        }
-        resolveHandle = Resolver.getInstance().resolveHostname(connectionHost, 
RelativeTime.FOREVER,
-                new AddressHandler());
-    }
-
-    private void connectDelayed() {
-        Scheduler.TaskBuilder b = new Scheduler.TaskBuilder();
-        b.withTask(new Task() {
-            @Override
-            public void run(Scheduler.RunContext ctx) {
-                logger.debug("calling connect from delayed task");
-                connectHandle = null;
-                connect();
-            }
-        });
-        b.withTimeout(connectBackoff);
-        connectHandle = Scheduler.add(b);
-    }
-
-    private void increaseBackoff() {
-        connectBackoff = RelativeTime.min(connectBackoff.multiply(2), new 
RelativeTime(5000));
-    }
-
-
-    private void connectNextAddress() {
-        if (addressList.isEmpty()) {
-            initiateResolve();
-            return;
-        }
-
-        InetAddress addr = addressList.pollFirst();
-        try {
-            chan.connect(new InetSocketAddress(addr, connectionPort));
-            logger.debug("connect called on channel");
-            Scheduler.TaskBuilder b = new Scheduler.TaskBuilder();
-            b.withTask(new Task() {
-                @Override
-                public void run(Scheduler.RunContext ctx) {
-                    connectHandle = null;
-                    if (ctx.reasons.contains(Scheduler.Reason.SHUTDOWN)) {
-                        return;
-                    }
-                    boolean connected = false;
-                    try {
-                        connected = chan.finishConnect();
-                        logger.debug("client successfully connected");
-                    } catch (IOException e) {
-                        logger.debug("finishConnect() was not successful: {}", 
(Object) e);
-                        increaseBackoff();
-                        logger.debug("backoff: {}", connectBackoff);
-                        connectDelayed();
-                    }
-                    if (connected) {
-                        //connectBackoff = INITAL_BACKOFF;
-                        if (currentTransmitHelper != null) {
-                            currentTransmitHelper.start();
-                        }
-                        if (currentReceiveHelper != null && 
!currentReceiveHelper.working) {
-                            currentReceiveHelper.schedule();
-                        }
-                    }
-                }
-            });
-            b.withSelectConnect(chan);
-            b.withTimeout(RelativeTime.FOREVER);
-            connectHandle = Scheduler.add(b);
-        } catch (IOException e) {
-            logger.debug("unable to connect: {}", (Object) e);
-            increaseBackoff();
-            connectDelayed();
-        } finally {
-            addressList.addLast(addr);
-        }
-    }
-
     /**
-     * Open a channel for this connection in non-blocking mode
-     */
-    private void openChannel() {
-        try {
-            chan = SelectorProvider.provider().openSocketChannel();
-            chan.configureBlocking(false);
-        } catch (IOException e) {
-            // this is fatal, no retry necessary
-            throw new IOError(e);
-        }
-    }
-
-    private void connect() {
-        openChannel();
-        connectNextAddress();
-    }
-
-    public boolean isConnected() {
-        return chan != null && chan.isConnected();
-    }
-
-    /**
-     * Cancel all pending receive requests. Reconnect to the service if not 
already connected.
-     */
-    public void reconnect() {
-        if (currentReceiveHelper != null) {
-            currentReceiveHelper.cancel();
-            currentReceiveHelper = null;
-        }
-
-        if (connectHandle == null && (chan == null || !chan.isOpen() || 
!chan.isConnected())) {
-            connect();
-        }
-    }
-
-    public interface ReceiveHandle {
-        public void cancel();
-    }
-
-    /**
      * Receive one message from the service.
+     * <p/>
+     * todo: comment on when this can be called (wrt notifyTransmitReady)
      *
      * @param timeout  deadline after which MessageReceiver.deadline will be 
called
      * @param receiver MessageReceiver that is responsible for the received 
message
      */
-    public ReceiveHandle receive(RelativeTime timeout, MessageReceiver 
receiver) {
-        if (currentReceiveHelper != null) {
-            throw new InterfaceViolationException("receive must not be called 
while receiving");
-        }
+    public Cancelable receive(RelativeTime timeout, MessageReceiver receiver) {
+        return connection.receive(timeout, receiver);
+    }
 
-        logger.debug("scheduling receive with timeout " + timeout);
 
-        recvBuffer.clear();
-        recvBuffer.limit(GnunetMessage.Header.SIZE);
-        final ReceiveHelper rh = new ReceiveHelper(receiver, timeout);
-        currentReceiveHelper = rh;
-
-        if (chan.isConnected()) {
-            currentReceiveHelper.schedule();
+    private class DelayedTransmitHandle implements Cancelable {
+        Cancelable realTransmitHandle;
+        Cancelable timeoutHandle;
+        @Override
+        public void cancel() {
+            throw new UnsupportedOperationException();
         }
-
-        return new ReceiveHandle() {
-            @Override
-            public void cancel() {
-                rh.cancel();
-            }
-        };
     }
 
     /**
@@ -565,52 +119,30 @@
      *                    when the timeout is over. Guaranteed to be called 
*after* notifyTransmitReady has returned.
      * @return a handle that can be used to cancel the transmit request
      */
-    public TransmitHandle notifyTransmitReady(RelativeTime timeout,
-                                              boolean autoRetry, final 
MessageTransmitter transmitter) {
-        if (nextTransmitHelper != null) {
-            throw new InterfaceViolationException(
-                    "previous transmit request must have completed before 
calling notifyTransmitReady again");
-        }
-
-        // negative timeout
-        if (timeout.getMilliseconds() <= 0) {
-            transmitter.handleError();
-            return new TransmitHandle() {
+    public Cancelable notifyTransmitReady(final RelativeTime timeout,
+                                          final boolean autoRetry, final 
MessageTransmitter transmitter) {
+        if (connection.isConnected()) {
+            return connection.notifyTransmitReady(timeout, transmitter);
+        } else {
+            logger.debug("notifyTransmitReady delayed");
+            final DelayedTransmitHandle delayedTransmitHandle = new 
DelayedTransmitHandle();
+            delayedTransmitHandle.timeoutHandle = 
Scheduler.addDelayed(connectBackoff, new Scheduler.Task() {
                 @Override
-                public void cancel() {
-                    throw new InterfaceViolationException("cancel() called on 
timed-out TransmitHandle");
+                public void run(Scheduler.RunContext ctx) {
+                    if (connection.isConnected()) {
+                        connection.notifyTransmitReady(timeout, transmitter);
+                    } else {
+                        logger.debug("still not connected, retrying in {}ms", 
connectBackoff.getMilliseconds());
+                        reconnect();
+                        connectBackoff = 
RelativeTime.min(connectBackoff.multiply(2), MAX_BACKOFF);
+                        Scheduler.addDelayed(connectBackoff, this);
+                    }
                 }
-            };
+            });
+            return delayedTransmitHandle;
         }
-
-        logger.debug("notifyTransmitReady with timeout {}", timeout);
-
-
-        final TransmitHelper transmit = new TransmitHelper(transmitter, 
timeout, autoRetry);
-
-        if (currentTransmitHelper == null) {
-            currentTransmitHelper = transmit;
-            if (chan.isConnected()) {
-                Scheduler.add(new Task() {
-                    @Override
-                    public void run(Scheduler.RunContext ctx) {
-                        currentTransmitHelper.start();
-                    }
-                });
-            }
-        } else {
-            nextTransmitHelper = transmit;
-        }
-
-        return new TransmitHandle() {
-            @Override
-            public void cancel() {
-                transmit.cancel();
-            }
-        };
     }
 
-
     /**
      * Send a message to the service and wait for a reply from the service.
      */
@@ -619,7 +151,7 @@
                                        final MessageReceiver receiver) {
         notifyTransmitReady(timeout, autoRetry, new MessageTransmitter() {
             @Override
-            public void transmit(MessageSink sink) {
+            public void transmit(Connection.MessageSink sink) {
                 sink.send(message);
                 receive(timeout, receiver);
             }
@@ -629,65 +161,26 @@
                 receiver.handleError();
             }
         });
+    }
 
+    public void reconnect() {
+        if (connection != null) {
+            connection.disconnect();
+        }
+        connection = new Connection(hostname, port);
     }
 
 
     /**
-     * Disconnect from the service. Cancel all pending recveive/transmit 
requests.
+     * Disconnect from the service. Cancel all pending receive/transmit 
requests.
      */
     public void disconnect() {
-        disconnect(false);
+        connection.disconnect();
     }
 
-    /**
-     * Disconnect from the service. Cancel all pending receive requests.
-     * <p/>
-     * If finishPendingRewrites is true, the client will only disconnect
-     * after the data in the transmit buffer has been transmitted.
-     *
-     * @param finishPendingWrites true if the client should finish 
transmitting pending messages
-     */
-    public void disconnect(boolean finishPendingWrites) {
-        if (!finishPendingWrites || !currentTransmitHelper.notifyDone()) {
-            if (currentTransmitHelper != null) {
-                currentTransmitHelper.cancel();
-                currentReceiveHelper = null;
-            }
-        }
-
-        if (nextTransmitHelper != null) {
-            nextTransmitHelper.cancel();
-            nextTransmitHelper = null;
-        }
-        if (currentReceiveHelper != null) {
-            currentReceiveHelper.cancel();
-            currentReceiveHelper = null;
-        }
-
-        if (resolveHandle != null) {
-            resolveHandle.cancel();
-            resolveHandle = null;
-        }
-
-        if (connectHandle != null) {
-            connectHandle.cancel();
-            connectHandle = null;
-        }
-    }
-
-
     @Override
     protected void finalize() throws Throwable {
         super.finalize();
         disconnect();
     }
-
-    public enum ReceiveError {
-        TIMEOUT, DISCONNECT, MSG_FORMAT
-    }
-
-    public enum TransmitError {
-        TIMEOUT, DISCONNECT
-    }
 }

Added: gnunet-java/src/org/gnunet/util/Connection.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Connection.java                             
(rev 0)
+++ gnunet-java/src/org/gnunet/util/Connection.java     2012-04-20 21:51:38 UTC 
(rev 21056)
@@ -0,0 +1,523 @@
+package org.gnunet.util;
+
+import org.gnunet.construct.Construct;
+import org.gnunet.exceptions.InterfaceViolationException;
+import org.gnunet.exceptions.InternalLogicError;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOError;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.nio.channels.spi.SelectorProvider;
+import java.util.Deque;
+import java.util.LinkedList;
+
+/**
+ * Integrate socket with the gnunet-java message loop / the scheduler.
+ */
+public class Connection {
+    private static final Logger logger = LoggerFactory
+            .getLogger(Connection.class);
+
+
+    /**
+     * The underlying socket the client is using to talk with the service.
+     */
+    private SocketChannel connectionChannel = null;
+
+    private LinkedList<AddressProbe> addressProbes = null;
+
+
+    /**
+     * The task that is currently used by the resolve mechanism.
+     */
+    private Cancelable resolveHandle = null;
+
+    /**
+     * The task that is responsible for establishing the connection to the 
server.
+     */
+    private Cancelable connectHandle = null;
+
+    /**
+     * The ReceiveHelper responsible for receiving a whole message from the 
service
+     * and calling the respective MessageReceiver.
+     */
+    private ReceiveHelper currentReceiveHelper = null;
+
+    /**
+     * The buffer with the (partial) message received from the service.
+     * Initially, this buffer has the size of the smallest possible messages, 
but grows when
+     * receiving larger messages.
+     */
+    private ByteBuffer recvBuffer = 
ByteBuffer.allocate(GnunetMessage.Header.SIZE);
+
+
+    /**
+     * The handle for the current transmission. The current transmission either
+     * writes data to the channel or waits for the channel to connect
+     */
+    private TransmitHelper currentTransmitHelper = null;
+    /**
+     * The handle for the next transmission. The next transmission will become 
the current
+     * transmission once the current transmission has completed.
+     * While nextTransmitHelper is not null, no new transmit requests may be 
scheduled.
+     */
+    private TransmitHelper nextTransmitHelper = null;
+
+    /**
+     * The transmitters passed to transmitReadyNotify(...) write to this 
buffer by calling
+     * methods on the MessageSink passed to the 
Transmitter.transmit(MessageSink s) method.
+     * Initially, this buffer has the size of the smallest possible messages, 
but grows when
+     * transmitting larger messages.
+     */
+    private ByteBuffer transmitBuffer = 
ByteBuffer.allocate(GnunetMessage.Header.SIZE);
+
+
+    private class AddressProbe {
+        Scheduler.TaskIdentifier connectTask;
+        SocketChannel channel;
+    }
+
+    /**
+     * Represents a request for transmission.
+     */
+    public interface TransmitHandle extends Cancelable {
+        /**
+         * Cancel a request for the transmit ready notification.
+         * This does *not* cancel a transmission that already has been started.
+         */
+        public void cancel();
+    }
+
+    /**
+     * An interface that allows the Transmitter.transmit method to deliver 
their messages
+     * to the client, which sends them to the service.
+     */
+    public interface MessageSink {
+        public void send(GnunetMessage.Body m);
+    }
+
+    /**
+     * The ReceiveHelper is responsible for receiving a whole
+     * GnunetMessage and call the respective MessageReceiver with the message 
on success,
+     * and null on failure or timeout.
+     */
+    private class ReceiveHelper implements Scheduler.Task {
+        private MessageReceiver receiver;
+        private RelativeTime timeout;
+        private GnunetMessage.Header msgh = null;
+        private Scheduler.TaskIdentifier recvTask = null;
+        private boolean finished = false;
+        // is this receiver actively working? if not, the connection process 
has to kick off the receiver
+        // (or select behaves badly)
+        private boolean working = false;
+
+        public ReceiveHelper(MessageReceiver receiver, RelativeTime timeout) {
+            this.receiver = receiver;
+            this.timeout = timeout;
+        }
+
+        public void dispatchMessage() {
+            assert msgh != null;
+            currentReceiveHelper = null;
+            finished = true;
+            recvBuffer.flip();
+
+            GnunetMessage msg = Construct.parseAs(recvBuffer, 
GnunetMessage.class);
+
+            receiver.process(msg.body);
+        }
+
+        @Override
+        public void run(Scheduler.RunContext ctx) {
+            logger.debug("receiving in helper");
+            recvTask = null;
+            if (ctx.reasons.contains(Scheduler.Reason.TIMEOUT)) {
+                currentReceiveHelper = null;
+                receiver.handleError();
+            } else if (ctx.reasons.contains(Scheduler.Reason.READ_READY)) {
+                try {
+                    int n = connectionChannel.read(recvBuffer);
+                    if (n == -1) {
+                        logger.error("end of stream in channel before complete 
message, read {} bytes",
+                                recvBuffer.position());
+                        connectionChannel.close();
+                        connectionChannel = null;
+                        receiver.handleError();
+                        return;
+                    }
+                    logger.debug(String.format("connectionChannel read %s 
bytes", n));
+                } catch (IOException e) {
+                    logger.error("read failed with exception:", e);
+                    receiver.handleError();
+                    return;
+                }
+                if (recvBuffer.remaining() == 0) {
+                    if (msgh != null) {
+                        dispatchMessage();
+                    } else {
+                        recvBuffer.rewind();
+                        msgh = Construct.parseAs(recvBuffer, 
GnunetMessage.Header.class);
+                        if (msgh.messageSize > GnunetMessage.Header.SIZE) {
+                            if (recvBuffer.capacity() < msgh.messageSize) {
+                                ByteBuffer buf = 
ByteBuffer.allocate(msgh.messageSize);
+                                recvBuffer.flip();
+                                buf.put(recvBuffer);
+                                recvBuffer = buf;
+                            }
+                            recvBuffer.limit(msgh.messageSize);
+                            schedule();
+                        } else {
+                            dispatchMessage();
+                        }
+                    }
+                } else {
+                    schedule();
+                }
+            } else {
+                // XXX: what to do here?
+                throw new RuntimeException("receive failed");
+            }
+        }
+
+        private void schedule() {
+            working = true;
+            recvTask = Scheduler.addRead(timeout, connectionChannel, this);
+        }
+
+        public void cancel() {
+            if (finished) {
+                throw new InterfaceViolationException("canceling finished 
receive");
+            }
+            if (recvTask != null) {
+                recvTask.cancel();
+            }
+        }
+    }
+
+
+    private class TransmitHelper implements Scheduler.Task, MessageSink {
+        private final MessageTransmitter transmitter;
+
+        private Scheduler.TaskIdentifier notifyTimeoutTask;
+
+        private Scheduler.TaskIdentifier transmitTask = null;
+
+        public TransmitHelper(final MessageTransmitter transmitter, 
RelativeTime notifyTimeout) {
+            this.transmitter = transmitter;
+
+            Scheduler.TaskBuilder b = new Scheduler.TaskBuilder();
+            b.withTask(new Scheduler.Task() {
+                @Override
+                public void run(Scheduler.RunContext ctx) {
+                    transmitter.handleError();
+                }
+            });
+            b.withTimeout(notifyTimeout);
+            notifyTimeoutTask = Scheduler.add(b);
+        }
+
+        public boolean notifyDone() {
+            return notifyTimeoutTask == null;
+        }
+
+        public void cancel() {
+            if (transmitTask != null) {
+                transmitTask.cancel();
+                transmitTask = null;
+            }
+            if (notifyTimeoutTask != null) {
+                notifyTimeoutTask.cancel();
+                notifyTimeoutTask = null;
+            }
+        }
+
+        @Override
+        public void run(Scheduler.RunContext ctx) {
+            try {
+                int n = connectionChannel.write(transmitBuffer);
+                logger.debug("connectionChannel has written " + n + " bytes");
+            } catch (IOException e) {
+                throw new IOError(e);
+            }
+            if (transmitBuffer.remaining() == 0) {
+                logger.debug("sent " + transmitBuffer.position() + "bytes 
complete message");
+                if (nextTransmitHelper == null) {
+                    currentTransmitHelper = null;
+                } else {
+                    currentTransmitHelper = nextTransmitHelper;
+                    nextTransmitHelper.start();
+                    nextTransmitHelper = null;
+                }
+            } else {
+                schedule();
+            }
+        }
+
+        /**
+         * called to notify when we are ready to put new messages in the 
transmit buffer
+         */
+        public void start() {
+            notifyTimeoutTask.cancel();
+            notifyTimeoutTask = null;
+            transmitBuffer.clear();
+            transmitter.transmit(TransmitHelper.this);
+            transmitBuffer.flip();
+            schedule();
+
+        }
+
+        private void schedule() {
+            // timeout is forever, because there is no way to directly limit 
the transmission time
+            // of a message, only the max. wait time before transmission.
+            // cancel must be called on the transmitTask if we disconnect
+            Scheduler.TaskBuilder b = new Scheduler.TaskBuilder();
+            
b.withTimeout(RelativeTime.FOREVER).withSelectWrite(connectionChannel).withTask(this);
+            this.transmitTask = Scheduler.add(b);
+        }
+
+        @Override
+        public void send(final GnunetMessage.Body m) {
+            final GnunetMessage gm = new GnunetMessage();
+            gm.header = new GnunetMessage.Header();
+            gm.body = m;
+            Construct.patch(gm);
+            gm.header.messageSize = Construct.getSize(gm);
+            byte[] b = Construct.toBinary(gm);
+            if (b.length != gm.header.messageSize) {
+                throw new InternalLogicError(
+                        String.format("tried to send message with binary size 
%s but size in header %s",
+                                b.length, gm.header.messageSize));
+            }
+            logger.debug("sending message (size={},type={})", b.length, 
gm.header.messageType);
+            if (transmitBuffer.remaining() < b.length) {
+                ByteBuffer buf = ByteBuffer.allocate(b.length + 
transmitBuffer.capacity());
+                transmitBuffer.flip();
+                buf.put(transmitBuffer);
+                transmitBuffer = buf;
+            }
+            transmitBuffer.put(b);
+        }
+    }
+
+    /**
+     * Create a connection to the given hostname/port.
+     *
+     * @param hostname name of the host to connect to
+     * @param port     port of the host to connect to
+     */
+    public Connection(String hostname, int port) {
+        addressProbes = new LinkedList<AddressProbe>();
+        ConnectionResolveHandler addressHandler = new 
ConnectionResolveHandler(port);
+        resolveHandle = Resolver.getInstance().resolveHostname(hostname, 
RelativeTime.FOREVER, addressHandler);
+    }
+
+    public Connection(SocketChannel sock) {
+        this.connectionChannel = sock;
+    }
+
+
+    class ConnectionResolveHandler implements Resolver.AddressCallback {
+        private final int port;
+        private Deque<InetAddress> addressList;
+
+        public ConnectionResolveHandler(int port) {
+            this.port = port;
+        }
+
+        @Override
+        public void onAddress(InetAddress addr) {
+            final SocketChannel channel = createChannel();
+            try {
+                channel.connect(new InetSocketAddress(addr, port));
+            } catch (IOException e) {
+                logger.error("could not connect to host");
+            }
+
+            final AddressProbe addressProbe = new AddressProbe();
+            addressProbe.channel = channel;
+            Scheduler.TaskBuilder builder = new Scheduler.TaskBuilder();
+            builder.withSelectConnect(channel);
+            builder.withTask(new Scheduler.Task() {
+                @Override
+                public void run(Scheduler.RunContext ctx) {
+                    addressProbe.connectTask = null;
+                    if (ctx.reasons.contains(Scheduler.Reason.SHUTDOWN)) {
+                        return;
+                    }
+                    Connection.this.finishConnect(channel);
+                }
+            });
+            addressProbe.connectTask = Scheduler.add(builder);
+        }
+
+        @Override
+        public void onFinished() {
+            resolveHandle = null;
+        }
+
+        @Override
+        public void onTimeout() {
+        }
+    }
+
+    private void finishConnect(SocketChannel channel) {
+        boolean connected = false;
+        try {
+            connected = channel.finishConnect();
+            connectionChannel = channel;
+
+            for (AddressProbe addressProbe : addressProbes) {
+                if (addressProbe.connectTask != null) {
+                    addressProbe.connectTask.cancel();
+                }
+            }
+            logger.debug("client successfully connected");
+        } catch (IOException e) {
+            logger.debug("finishConnect() was not successful: {}", (Object) e);
+            return;
+        }
+        if (connected) {
+            if (currentTransmitHelper != null) {
+                currentTransmitHelper.start();
+            }
+            if (currentReceiveHelper != null && !currentReceiveHelper.working) 
{
+                currentReceiveHelper.schedule();
+            }
+        } else {
+            logger.error("socket reported OP_CONNECT but is not connected");
+        }
+    }
+
+    /**
+     * Open a channel for this connection in non-blocking mode
+     */
+    private SocketChannel createChannel() {
+        try {
+            SocketChannel channel = 
SelectorProvider.provider().openSocketChannel();
+            channel.configureBlocking(false);
+            return channel;
+        } catch (IOException e) {
+            // this is fatal, no retry necessary
+            throw new IOError(e);
+        }
+    }
+
+    public boolean isConnected() {
+        return connectionChannel != null && connectionChannel.isConnected();
+    }
+
+
+    public interface ReceiveHandle extends Cancelable {
+        public void cancel();
+    }
+
+    /**
+     * Receive one message from the network.
+     *
+     * @param timeout  deadline after which MessageReceiver.onError will be 
called
+     * @param receiver MessageReceiver that is responsible for the received 
message
+     */
+    public ReceiveHandle receive(RelativeTime timeout, MessageReceiver 
receiver) {
+        if (currentReceiveHelper != null) {
+            throw new AssertionError("receive must not be called while 
receiving");
+        }
+
+        if (!isConnected()) {
+            throw new AssertionError("cannot receive if not connected");
+        }
+
+        logger.debug("scheduling receive with timeout " + timeout);
+
+        recvBuffer.clear();
+        recvBuffer.limit(GnunetMessage.Header.SIZE);
+        final ReceiveHelper rh = new ReceiveHelper(receiver, timeout);
+        currentReceiveHelper = rh;
+
+        if (connectionChannel.isConnected()) {
+            currentReceiveHelper.schedule();
+        }
+
+        return new ReceiveHandle() {
+            @Override
+            public void cancel() {
+                rh.cancel();
+            }
+        };
+    }
+
+    /**
+     * Call notify once the we are ready to transmit data.
+     *
+     * @param size        number of bytes to send
+     * @param timeout     after how long should we give up (and call 
transmitter.transmit(null))
+     * @param transmitter the MessageTransmitter object to call once the 
client is ready to transmit or
+     *                    when the timeout is over. Guaranteed to be called 
*after* notifyTransmitReady has returned.
+     * @return a handle that can be used to cancel the transmit request, null 
if request could be satisfied immediately
+     */
+    public TransmitHandle notifyTransmitReady(RelativeTime timeout, final 
MessageTransmitter transmitter) {
+        if (nextTransmitHelper != null) {
+            throw new InterfaceViolationException(
+                    "previous transmit request must have completed before 
calling notifyTransmitReady again");
+        }
+
+        if (timeout.getMilliseconds() <= 0) {
+            throw new AssertionError("notifyTransmitReady timeout must be 
positive");
+        }
+
+        if (!isConnected()) {
+            throw new AssertionError("notifyTransmitHandle can only be called 
once connected");
+        }
+
+        final TransmitHelper transmit = new TransmitHelper(transmitter, 
timeout);
+
+        if (currentTransmitHelper == null) {
+            currentTransmitHelper = transmit;
+            currentTransmitHelper.start();
+            return null;
+        }
+
+        nextTransmitHelper = transmit;
+
+        return new TransmitHandle() {
+            @Override
+            public void cancel() {
+                transmit.cancel();
+            }
+        };
+    }
+
+    /**
+     * Disconnect. Cancel pending receive/transmit requests.
+     */
+    public void disconnect() {
+        if (nextTransmitHelper != null) {
+            nextTransmitHelper.cancel();
+            nextTransmitHelper = null;
+        }
+        if (currentReceiveHelper != null) {
+            currentReceiveHelper.cancel();
+            currentReceiveHelper = null;
+        }
+
+        if (resolveHandle != null) {
+            resolveHandle.cancel();
+            resolveHandle = null;
+        }
+
+        if (connectHandle != null) {
+            connectHandle.cancel();
+            connectHandle = null;
+        }
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        super.finalize();
+        disconnect();
+    }
+}

Modified: gnunet-java/src/org/gnunet/util/MessageTransmitter.java
===================================================================
--- gnunet-java/src/org/gnunet/util/MessageTransmitter.java     2012-04-20 
17:18:14 UTC (rev 21055)
+++ gnunet-java/src/org/gnunet/util/MessageTransmitter.java     2012-04-20 
21:51:38 UTC (rev 21056)
@@ -7,7 +7,7 @@
      * @param sink A message sink that receives messages to be transmitted by 
the client,
      *             or null on timeout/error.
      */
-    public void transmit(Client.MessageSink sink);
+    public void transmit(Connection.MessageSink sink);
 
     void handleError();
 }

Modified: gnunet-java/src/org/gnunet/util/Resolver.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Resolver.java       2012-04-20 17:18:14 UTC 
(rev 21055)
+++ gnunet-java/src/org/gnunet/util/Resolver.java       2012-04-20 21:51:38 UTC 
(rev 21056)
@@ -24,7 +24,7 @@
 
     private Configuration cfg = null;
 
-    Client client = null;
+    private Client client = null;
 
     @UnionCase(4)
     public static class GetMessage implements GnunetMessage.Body {
@@ -209,8 +209,8 @@
         private AddressCallback cb;
         private boolean finished = false;
         private boolean canceled = false;
-        private Client.TransmitHandle transmitTask = null;
-        private Client.ReceiveHandle receiveTask = null;
+        private Cancelable transmitTask = null;
+        private Cancelable receiveTask = null;
 
         public void cancel() {
             if (finished) {
@@ -318,7 +318,7 @@
                 deadline.getRemaining(), true,
                 new MessageTransmitter() {
                     @Override
-                    public void transmit(Client.MessageSink sink) {
+                    public void transmit(Connection.MessageSink sink) {
                         if (sink == null) {
                                 onTimeout(rh);
                         }

Modified: gnunet-java/src/org/gnunet/util/Scheduler.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Scheduler.java      2012-04-20 17:18:14 UTC 
(rev 21055)
+++ gnunet-java/src/org/gnunet/util/Scheduler.java      2012-04-20 21:51:38 UTC 
(rev 21056)
@@ -31,7 +31,7 @@
 import java.util.*;
 
 /**
- * Schedule computations using CPS
+ * Schedule computations using continuation passing style.
  *
  * @author Florian Dold
  */
@@ -53,8 +53,10 @@
      * The context of a task that is ready to run.
      */
     public static class RunContext {
+        /**
+         * The reason this task has been called by the scheduler.
+         */
         Set<Reason> reasons = EnumSet.noneOf(Reason.class);
-        Channel eventChannel;
 
         public RunContext() {
         }
@@ -64,21 +66,18 @@
         }
     }
 
+    /**
+     * A task is the basic unit of work that is managed by the scheduler.
+     */
     public static interface Task {
         public void run(RunContext ctx);
     }
 
-
-    /**
-     * Subscriptions associate a channel's RegistrationKey with a 
TaskIdentifier.
-     * This is necessary when multiple tasks wait on the same channel
-     * (e.g. one task wants to read, another one wants to write)
-     */
-    static class SubscriberSet {
-        Set<TaskIdentifier> read = new TreeSet<TaskIdentifier>();
-        Set<TaskIdentifier> write = new TreeSet<TaskIdentifier>();
-        Set<TaskIdentifier> connect = new TreeSet<TaskIdentifier>();
-        Set<TaskIdentifier> accept = new TreeSet<TaskIdentifier>();
+    private static class Subscribers {
+        TaskIdentifier readSubscriber;
+        TaskIdentifier writeSubscriber;
+        TaskIdentifier connectSubscriber;
+        TaskIdentifier acceptSubscriber;
     }
 
     /**
@@ -97,7 +96,13 @@
                        boolean liveness, RelativeTime timeout,
                        Set<SelectableChannel> rs, Set<SelectableChannel> ws, 
Set<SelectableChannel> cs) {
             this.task = t;
-            this.priority = (activeTask == null) ? Priority.DEFAULT : 
activeTask.priority;
+
+            if (priority == null) {
+                this.priority = (activeTask == null) ? Priority.DEFAULT : 
activeTask.priority;
+            } else {
+                this.priority = priority;
+            }
+
             this.lifeness = liveness;
 
             if (timeout.getMilliseconds() < 0) {
@@ -106,28 +111,23 @@
 
             this.deadline = timeout.toAbsolute();
 
-
             if (rs != null) {
                 for (SelectableChannel sc : rs) {
-                    logger.debug("registering for OP_READ");
                     registerSelect(sc, SelectionKey.OP_READ);
                 }
             }
             if (ws != null) {
                 for (SelectableChannel sc : ws) {
-                    logger.debug("registering for OP_WRITE");
                     registerSelect(sc, SelectionKey.OP_WRITE);
                 }
             }
             if (cs != null) {
                 for (SelectableChannel sc : cs) {
-                    logger.debug("registering for OP_CONNECT");
                     registerSelect(sc, SelectionKey.OP_CONNECT);
                 }
             }
             if (as != null) {
                 for (SelectableChannel sc : as) {
-                    logger.debug("registering for OP_CONNECT");
                     registerSelect(sc, SelectionKey.OP_ACCEPT);
                 }
             }
@@ -136,21 +136,11 @@
             this.cs = new TreeSet<SelectableChannel>(cs == null ? 
Collections.EMPTY_SET : cs);
             this.as = new TreeSet<SelectableChannel>(as == null ? 
Collections.EMPTY_SET : as);
 
-            boolean selectEmpty = (ws == null || ws.isEmpty()) && (rs == null 
|| rs.isEmpty())
-                    && (cs == null || cs.isEmpty());
+            // todo: assertions for validity of this task
 
-            if (deadline.isForever() && selectEmpty) {
-                logger.debug("unschedulable keep-alive task created");
-            }
-
-            if (timeout.getMilliseconds() == 0 && !selectEmpty) {
-                throw new InterfaceViolationException("select used with 
zero-timeout task");
-            }
-
             pending.add(this);
         }
 
-
         /**
          * Create a light-weight task identifier that is not registerd as 
pending in the Scheduler,
          * used for continuations.
@@ -192,30 +182,47 @@
 
         private void registerSelect(SelectableChannel sc, int op) {
             SelectionKey key = sc.keyFor(selector);
-            SubscriberSet subscribers;
+            Subscribers subscribers;
+
             if (key == null || !key.isValid()) {
-                subscribers = new SubscriberSet();
+                subscribers = new Subscribers();
                 try {
                     sc.register(selector, op, subscribers);
                 } catch (ClosedChannelException e) {
                     throw new IOError(e);
                 }
             } else {
-                subscribers = (SubscriberSet) key.attachment();
+                subscribers = (Subscribers) key.attachment();
                 key.interestOps(key.interestOps() | op);
             }
             if ((op & SelectionKey.OP_READ) != 0) {
-                subscribers.read.add(this);
+                if (subscribers.readSubscriber != null) {
+                    throw new AssertionError("only one task can wait for a 
specific event at the same time");
+                }
+                subscribers.readSubscriber = this;
             }
             if ((op & SelectionKey.OP_WRITE) != 0) {
-                subscribers.write.add(this);
+                if (subscribers.writeSubscriber != null) {
+                    throw new AssertionError("only one task can wait for a 
specific event at the same time");
+                }
+                subscribers.writeSubscriber = this;
             }
             if ((op & SelectionKey.OP_CONNECT) != 0) {
-                subscribers.connect.add(this);
+                if (subscribers.connectSubscriber != null) {
+                    throw new AssertionError("only one task can wait for a 
specific event at the same time");
+                }
+                subscribers.connectSubscriber = this;
             }
             if ((op & SelectionKey.OP_ACCEPT) != 0) {
-                subscribers.accept.add(this);
+                if (subscribers.acceptSubscriber != null) {
+                    throw new AssertionError("only one task can wait for a 
specific event at the same time");
+                }
+                subscribers.acceptSubscriber = this;
             }
+
+            if (subscribers.connectSubscriber != null && 
subscribers.readSubscriber != null) {
+                throw new AssertionError("OP_CONNECT and OP_READ are 
incompatible in java");
+            }
         }
 
         private void deregisterOne(SelectableChannel sc, int op) {
@@ -223,32 +230,38 @@
             if (key == null) {
                 throw new AssertionError();
             }
-            SubscriberSet subscribers = (SubscriberSet) key.attachment();
+            Subscribers subscribers = (Subscribers) key.attachment();
+            if (subscribers == null) {
+                throw new AssertionError();
+            }
             if ((op & SelectionKey.OP_READ) != 0) {
-                subscribers.read.remove(this);
+                if (subscribers.readSubscriber == null) {
+                    throw new AssertionError();
+                }
+                key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);
+                subscribers.readSubscriber = null;
             }
             if ((op & SelectionKey.OP_WRITE) != 0) {
-                subscribers.write.remove(this);
-            }
-            if ((op & SelectionKey.OP_CONNECT) != 0) {
-                subscribers.connect.remove(this);
-            }
-            if ((op & SelectionKey.OP_ACCEPT) != 0) {
-                subscribers.accept.remove(this);
-            }
-            if (subscribers.write.isEmpty()) {
+                if (subscribers.writeSubscriber == null) {
+                    throw new AssertionError();
+                }
+                subscribers.writeSubscriber = null;
                 key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);
             }
-            if (subscribers.read.isEmpty()) {
-                key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);
-            }
-            if (subscribers.connect.isEmpty()) {
+            if ((op & SelectionKey.OP_CONNECT) != 0) {
+                if (subscribers.connectSubscriber == null) {
+                    throw new AssertionError();
+                }
+                subscribers.connectSubscriber = null;
                 key.interestOps(key.interestOps() & ~SelectionKey.OP_CONNECT);
             }
-            if (subscribers.accept.isEmpty()) {
+            if ((op & SelectionKey.OP_ACCEPT) != 0) {
+                if (subscribers.acceptSubscriber == null) {
+                    throw new AssertionError();
+                }
+                subscribers.acceptSubscriber = null;
                 key.interestOps(key.interestOps() & ~SelectionKey.OP_ACCEPT);
             }
-
         }
 
         private void deregister() {
@@ -412,7 +425,7 @@
     }
 
 
-    public static TaskIdentifier add(RelativeTime delay, Task task) {
+    public static TaskIdentifier addDelayed(RelativeTime delay, Task task) {
         return addSelect(Priority.KEEP, delay, null, null, task);
     }
 
@@ -559,62 +572,45 @@
             throw new IOError(e);
         }
 
+        // we have to do this so we don't execute any task twice
+        // todo: alternative: mark TaskIdentifier as executed
         Collection<TaskIdentifier> executableTasks = new 
TreeSet<TaskIdentifier>();
         for (SelectionKey sk : selector.selectedKeys()) {
-            Object obj = sk.attachment();
-            assert (obj instanceof SubscriberSet);
-            SubscriberSet ss = (SubscriberSet) obj;
+            Subscribers ss = (Subscribers) sk.attachment();
 
             Channel c = sk.channel();
 
             if (sk.isReadable()) {
-                for (TaskIdentifier tt : ss.read) {
-                    logger.debug("adding isReadable() task");
-                    executableTasks.add(tt);
-                    if (tt.ctx.reasons == null) {
-                        tt.ctx.reasons = EnumSet.of(Reason.READ_READY);
-                    } else {
-                        tt.ctx.reasons.add(Reason.READ_READY);
-                    }
+                if (ss.readSubscriber == null) {
+                    throw new AssertionError("event fired, but not registered 
before");
                 }
-
+                executableTasks.add(ss.readSubscriber);
+                ss.readSubscriber.ctx.reasons.add(Reason.READ_READY);
             }
             if (sk.isWritable()) {
-                for (TaskIdentifier tt : ss.write) {
-                    logger.debug("adding isWritable() task");
-                    executableTasks.add(tt);
-                    if (tt.ctx.reasons == null) {
-                        tt.ctx.reasons = EnumSet.of(Reason.WRITE_READY);
-                    } else {
-                        tt.ctx.reasons.add(Reason.WRITE_READY);
-                    }
+                if (ss.writeSubscriber == null) {
+                    throw new AssertionError("event fired, but not registered 
before");
                 }
+                executableTasks.add(ss.writeSubscriber);
+                ss.writeSubscriber.ctx.reasons.add(Reason.WRITE_READY);
             }
             if (sk.isConnectable()) {
-                logger.debug("adding isConnectable() task");
-                for (TaskIdentifier tt : ss.connect) {
-                    executableTasks.add(tt);
-                    if (tt.ctx.reasons == null) {
-                        tt.ctx.reasons = EnumSet.of(Reason.CONNECT_READY);
-                    } else {
-                        tt.ctx.reasons.add(Reason.CONNECT_READY);
-                    }
+                if (ss.connectSubscriber == null) {
+                    throw new AssertionError("event fired, but not registered 
before");
                 }
+                executableTasks.add(ss.connectSubscriber);
+                ss.connectSubscriber.ctx.reasons.add(Reason.CONNECT_READY);
             }
             if (sk.isAcceptable()) {
-                logger.debug("adding isAcceptable() task");
-                for (TaskIdentifier tt : ss.accept) {
-                    executableTasks.add(tt);
-                    if (tt.ctx.reasons == null) {
-                        tt.ctx.reasons = EnumSet.of(Reason.ACCEPT_READY);
-                    } else {
-                        tt.ctx.reasons.add(Reason.ACCEPT_READY);
-                    }
+                if (ss.acceptSubscriber == null) {
+                    throw new AssertionError("event fired, but not registered 
before");
                 }
+                executableTasks.add(ss.acceptSubscriber);
+                ss.acceptSubscriber.ctx.reasons.add(Reason.ACCEPT_READY);
             }
         }
         for (TaskIdentifier tt : executableTasks) {
-            // tasks must do this themselve to cancel subscriptions to other 
channels
+            // cancel subscriptions to other events, we can execute now!
             tt.deregister();
             queueReady(tt);
         }

Modified: gnunet-java/src/org/gnunet/util/Strings.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Strings.java        2012-04-20 17:18:14 UTC 
(rev 21055)
+++ gnunet-java/src/org/gnunet/util/Strings.java        2012-04-20 21:51:38 UTC 
(rev 21056)
@@ -1,5 +1,8 @@
 package org.gnunet.util;
 
+/**
+ * Common functions on Strings, specific to gnunet-java
+ */
 public class Strings {
     private static final String encTable = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
 
@@ -14,12 +17,15 @@
         while ((rpos < size) || (vbit > 0)) {
             if ((rpos < size) && (vbit < 5)) {
                 byte b = data[(int) rpos++];
+                // convert double to int without sign extension
                 int s = b >= 0 ? b : (256 + b);
-                bits = (bits << 8) | s;   /* eat 8 more bits */
+                // eat 8 more bits
+                bits = (bits << 8) | s;
                 vbit += 8;
             }
             if (vbit < 5) {
-                bits <<= (5 - vbit);      /* zero-padding */
+                // zero-padding
+                bits <<= (5 - vbit);
                 vbit = 5;
             }
             sb.append(encTable.charAt((int) (bits >>> (vbit - 5)) & 31));
@@ -27,4 +33,51 @@
         }
         return sb.toString();
     }
+
+    public static byte[] stringToData(String string) {
+        /*
+        long rpos;
+        long wpos;
+        long bits;
+        long vbit;
+        int ret;
+        int shift;
+        int encoded_len = out_size * 8;
+        if (encoded_len % 5 > 0) {
+            // padding!
+            vbit = encoded_len % 5;
+            shift = 5 - vbit;
+        } else {
+            vbit = 0;
+            shift = 0;
+        }
+        if ((encoded_len + shift) / 5 != enclen) {
+            throw new AssertionError();
+        }
+
+        wpos = out_size;
+        rpos = enclen;
+        bits = (ret = getValue__(enc[--rpos])) >> (5 - encoded_len % 5);
+        if (-1 == ret)
+            return GNUNET_SYSERR;
+        while (wpos > 0) {
+            GNUNET_assert(rpos > 0);
+            bits = ((ret = getValue__(enc[--rpos])) << vbit) | bits;
+            if (-1 == ret)
+                return GNUNET_SYSERR;
+            vbit += 5;
+            if (vbit >= 8) {
+                out[--wpos] = (unsigned char)bits;
+                bits >>= 8;
+                vbit -= 8;
+            }
+        }
+        GNUNET_assert(rpos == 0);
+        GNUNET_assert(vbit == 0);
+        return GNUNET_OK;
+
+    }
+    */
+    throw new UnsupportedOperationException("not yet implemented");
+    }
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]