diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/com/isode/stroke/disco/DiscoServiceWalker.java | 104 |
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()); } |
Swift