From 2ec849beb21de582bf5525e6a610d3896d5e7b2d Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Tue, 15 Apr 2008 18:18:45 +0000 Subject: [PATCH] add cancelling of requests in case of protocol errors or connection aborts git-svn-id: http://trooper/svn/projects/jFCPlib/branch/high-level-client@829 c3eda9e8-030b-0410-8277-bc7414b0a119 --- .../fcp/highlevel/HighLevelClient.java | 74 ++++++++++++++++++---- 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java b/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java index 14be335..5e13487 100644 --- a/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java +++ b/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java @@ -25,6 +25,7 @@ import java.net.UnknownHostException; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import net.pterodactylus.fcp.AllData; import net.pterodactylus.fcp.ClientHello; @@ -253,10 +254,69 @@ public class HighLevelClient { HighLevelClientFcpListener() { } + // + // PRIVATE METHODS + // + + /** + * Searches all callback collections for a callback with the given + * identifier and cancels it. + * + * @param identifier + * The identifier to search for, or null to + * cancel all pending requests + */ + @SuppressWarnings("synthetic-access") + private void cancelIdentifier(String identifier) { + synchronized (syncObject) { + if (connectCallback != null) { + connectCallback.getIntermediaryResult().setFailed(true); + connectCallback.setDone(); + connectCallback = null; + } + } + if (identifier == null) { + /* key generation callbacks */ + for (Entry> keyGenerationEntry: keyGenerationCallbacks.entrySet()) { + keyGenerationEntry.getValue().getIntermediaryResult().setFailed(true); + keyGenerationEntry.getValue().setDone(); + } + keyGenerationCallbacks.clear(); + /* peer list callbacks. */ + for (Entry> peerListEntry: peerListCallbacks.entrySet()) { + peerListEntry.getValue().getIntermediaryResult().setFailed(true); + peerListEntry.getValue().setDone(); + } + peerListCallbacks.clear(); + } else { + HighLevelCallback keyGenerationCallback = keyGenerationCallbacks.remove(identifier); + if (keyGenerationCallback != null) { + keyGenerationCallback.getIntermediaryResult().setFailed(true); + keyGenerationCallback.setDone(); + return; + } + HighLevelCallback peerListCallback = peerListCallbacks.remove(identifier); + if (peerListCallback != null) { + peerListCallback.getIntermediaryResult().setFailed(true); + peerListCallback.setDone(); + return; + } + } + } + + // + // INTERFACE FcpListener + // + /** * @see net.pterodactylus.fcp.FcpListener#connectionClosed(net.pterodactylus.fcp.FcpConnection) */ + @SuppressWarnings("synthetic-access") public void connectionClosed(FcpConnection fcpConnection) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + cancelIdentifier(null); } /** @@ -455,19 +515,7 @@ public class HighLevelClient { if (identifier == null) { return; } - /* now check all callbacks. */ - synchronized (syncObject) { - if (connectCallback != null) { - connectCallback.getIntermediaryResult().setFailed(true); - connectCallback.setDone(); - connectCallback = null; - } - } - HighLevelCallback keyGenerationCallback = keyGenerationCallbacks.remove(identifier); - if (keyGenerationCallback != null) { - keyGenerationCallback.getIntermediaryResult().setFailed(true); - keyGenerationCallback.setDone(); - } + cancelIdentifier(identifier); } /** -- 2.7.4