summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/isode/stroke/disco/DiscoServiceWalker.java104
1 files changed, 65 insertions, 39 deletions
diff --git a/src/com/isode/stroke/disco/DiscoServiceWalker.java b/src/com/isode/stroke/disco/DiscoServiceWalker.java
index 1b5c54e..39900aa 100644
--- a/src/com/isode/stroke/disco/DiscoServiceWalker.java
+++ b/src/com/isode/stroke/disco/DiscoServiceWalker.java
@@ -1,3 +1,3 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
@@ -25,5 +25,9 @@ import com.isode.stroke.signals.SignalConnection;
import com.isode.stroke.base.NotNull;
+
import java.util.logging.Logger;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
+
import com.isode.stroke.base.NotNull;
@@ -48,4 +52,14 @@ public class DiscoServiceWalker {
private SignalConnection onWalkCompleteConnection;
- private SignalConnection onResponseDiscoInfoConnection;
- private SignalConnection onResponseDiscoItemsConnection;
+
+ /**
+ * The discoInfo.onResponse connections for each GetDiscoInfoRequest
+ */
+ private Map<GetDiscoInfoRequest,SignalConnection> onResponseDiscoInfoConnections =
+ new HashMap<GetDiscoInfoRequest,SignalConnection>();
+
+ /**
+ * The discoItems.onResponse connections for each GetDiscoItemsRequest
+ */
+ private Map<GetDiscoItemsRequest,SignalConnection> onResponseDiscoItemsConnections =
+ new HashMap<GetDiscoItemsRequest,SignalConnection>();
@@ -101,13 +115,15 @@ public class DiscoServiceWalker {
public void endWalk() {
- if (active_) {
- logger_.fine("Ending walk to" + service_ + "\n");
- for (GetDiscoInfoRequest request : pendingDiscoInfoRequests_) {
- onResponseDiscoInfoConnection.disconnect();
- }
- for (GetDiscoItemsRequest request : pendingDiscoItemsRequests_) {
- onResponseDiscoItemsConnection.disconnect();
- }
- active_ = false;
- onWalkAborted.emit();
- }
+ if (active_) {
+ logger_.fine("Ending walk to" + service_ + "\n");
+ for (SignalConnection discoInfoConnection : onResponseDiscoInfoConnections.values()) {
+ discoInfoConnection.disconnect();
+ }
+ onResponseDiscoInfoConnections.clear();
+ for (SignalConnection discoItemsConnection : onResponseDiscoItemsConnections.values()) {
+ discoItemsConnection.disconnect();
+ }
+ onResponseDiscoItemsConnections.clear();
+ active_ = false;
+ onWalkAborted.emit();
+ }
}
@@ -123,3 +139,3 @@ public class DiscoServiceWalker {
final GetDiscoInfoRequest discoInfoRequest = GetDiscoInfoRequest.create(jid, iqRouter_);
- onResponseDiscoInfoConnection = discoInfoRequest.onResponse.connect(new Slot2<DiscoInfo, ErrorPayload>() {
+ SignalConnection connection = discoInfoRequest.onResponse.connect(new Slot2<DiscoInfo, ErrorPayload>() {
@@ -130,2 +146,3 @@ public class DiscoServiceWalker {
});
+ onResponseDiscoInfoConnections.put(discoInfoRequest, connection);
pendingDiscoInfoRequests_.add(discoInfoRequest);
@@ -157,2 +174,6 @@ public class DiscoServiceWalker {
+
+ SignalConnection connection = onResponseDiscoInfoConnections.remove(request);
+ connection.disconnect();
+
pendingDiscoInfoRequests_.remove(request);
@@ -172,3 +193,3 @@ public class DiscoServiceWalker {
final GetDiscoItemsRequest discoItemsRequest = GetDiscoItemsRequest.create(request.getReceiver(), iqRouter_);
- onResponseDiscoItemsConnection = discoItemsRequest.onResponse.connect(new Slot2<DiscoItems, ErrorPayload>() {
+ SignalConnection discoItemsConnection = discoItemsRequest.onResponse.connect(new Slot2<DiscoItems, ErrorPayload>() {
@@ -179,2 +200,3 @@ public class DiscoServiceWalker {
});
+ onResponseDiscoItemsConnections.put(discoItemsRequest, discoItemsConnection);
pendingDiscoItemsRequests_.add(discoItemsRequest);
@@ -191,25 +213,29 @@ public class DiscoServiceWalker {
private void handleDiscoItemsResponse(DiscoItems items, ErrorPayload error, GetDiscoItemsRequest request) {
- /* If we got canceled, don't do anything */
- if (!active_) {
- return;
- }
-
- logger_.fine("Received disco items from " + request.getReceiver() + "\n");
- pendingDiscoItemsRequests_.remove(request);
- if (error != null) {
- handleDiscoError(request.getReceiver(), error);
- return;
- }
- for (DiscoItems.Item item : items.getItems()) {
- if (item.getNode().isEmpty()) {
- /* Don't look at noded items. It's possible that this will exclude some services,
- * but I've never seen one in the wild, and it's an easy fix for not looping.
- */
- if(!searchedServices_.contains(item.getJID())) {
- logger_.fine("Received disco item " + item.getJID() + "\n");
- walkNode(item.getJID());
- }
- }
- }
- markNodeCompleted(request.getReceiver());
+ /* If we got canceled, don't do anything */
+ if (!active_) {
+ return;
+ }
+
+ logger_.fine("Received disco items from " + request.getReceiver() + "\n");
+
+ SignalConnection connection = onResponseDiscoItemsConnections.remove(request);
+ connection.disconnect();
+
+ pendingDiscoItemsRequests_.remove(request);
+ if (error != null) {
+ handleDiscoError(request.getReceiver(), error);
+ return;
+ }
+ for (DiscoItems.Item item : items.getItems()) {
+ if (item.getNode().isEmpty()) {
+ /* Don't look at noded items. It's possible that this will exclude some services,
+ * but I've never seen one in the wild, and it's an easy fix for not looping.
+ */
+ if(!searchedServices_.contains(item.getJID())) {
+ logger_.fine("Received disco item " + item.getJID() + "\n");
+ walkNode(item.getJID());
+ }
+ }
+ }
+ markNodeCompleted(request.getReceiver());
}