[Top][All Lists]
[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");
+ }
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [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,
gnunet <=