summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Clayton <alex.clayton@isode.com>2016-01-26 16:33:29 (GMT)
committerAlex Clayton <alex.clayton@isode.com>2016-01-27 12:29:01 (GMT)
commit91e97e936fe671678758702bbede6a47b5487f13 (patch)
treef92b1939fb1704d602f30cbf3791bb98d1a56018 /src/com/isode/stroke/filetransfer/SOCKS5BytestreamProxiesManager.java
parent97a085f7e2c9b7820000eaace97dc0ab6392cb0d (diff)
downloadstroke-91e97e936fe671678758702bbede6a47b5487f13.zip
stroke-91e97e936fe671678758702bbede6a47b5487f13.tar.bz2
Some fixes for File Transfer Patch
Some fixes that were required for the File Transfer Patch (see patch notes on Gerrit). Test-information: By code inspection. Ran against MLC (after modification so it works for stroke interface changes introduces in a previous patch) it still runs correctly. Ran unit tests they still all pass. Change-Id: Ib49d9f9160f5e6b6b578f16695f8e8bc0f96a412
Diffstat (limited to 'src/com/isode/stroke/filetransfer/SOCKS5BytestreamProxiesManager.java')
-rw-r--r--src/com/isode/stroke/filetransfer/SOCKS5BytestreamProxiesManager.java77
1 files changed, 57 insertions, 20 deletions
diff --git a/src/com/isode/stroke/filetransfer/SOCKS5BytestreamProxiesManager.java b/src/com/isode/stroke/filetransfer/SOCKS5BytestreamProxiesManager.java
index 14c7ea3..eab3031 100644
--- a/src/com/isode/stroke/filetransfer/SOCKS5BytestreamProxiesManager.java
+++ b/src/com/isode/stroke/filetransfer/SOCKS5BytestreamProxiesManager.java
@@ -25,12 +25,15 @@ import com.isode.stroke.network.DomainNameResolveError;
import com.isode.stroke.network.DomainNameAddressQuery;
import com.isode.stroke.network.HostAddress;
import com.isode.stroke.queries.IQRouter;
+import com.isode.stroke.session.Session;
import com.isode.stroke.signals.Slot1;
import com.isode.stroke.signals.Slot2;
import com.isode.stroke.signals.Signal;
import com.isode.stroke.signals.SignalConnection;
import com.isode.stroke.elements.S5BProxyRequest;
import com.isode.stroke.jid.JID;
+
+import java.util.Iterator;
import java.util.Vector;
import java.util.Collection;
import java.util.Map;
@@ -49,9 +52,9 @@ public class SOCKS5BytestreamProxiesManager {
private IQRouter iqRouter_;
private JID serviceRoot_;
private Logger logger_ = Logger.getLogger(this.getClass().getName());
- private SignalConnection onSessionReadyConnection;
- private SignalConnection onFinishedConnection;
+ // TODO plonk this into the pair or not
+ // TODO think what this is trying to do?
private static class Pair {
public JID jid;
public SOCKS5BytestreamClientSession sock5;
@@ -61,6 +64,20 @@ public class SOCKS5BytestreamProxiesManager {
private Map<String, Collection<Pair> > proxySessions_ = new HashMap<String, Collection<Pair> >();
+ /**
+ * Map between {@link SOCKS5BytestreamClientSession} and a {@link SignalConnection} to their
+ * {@link SOCKS5BytestreamClientSession#onSessionReady}
+ */
+ private Map<SOCKS5BytestreamClientSession,SignalConnection> onSessionReadyConnectionMap =
+ new HashMap<SOCKS5BytestreamClientSession,SignalConnection>();
+
+ /**
+ * Map between {@link SOCKS5BytestreamClientSession} and a {@link SignalConnection} to their
+ * {@link SOCKS5BytestreamClientSession#onFinished}
+ */
+ private Map<SOCKS5BytestreamClientSession,SignalConnection> onFinishedConnectionMap =
+ new HashMap<SOCKS5BytestreamClientSession,SignalConnection>();
+
private SOCKS5BytestreamProxyFinder proxyFinder_;
private Collection<S5BProxyRequest> localS5BProxies_;
@@ -107,18 +124,20 @@ public class SOCKS5BytestreamProxiesManager {
final SOCKS5BytestreamClientSession session = new SOCKS5BytestreamClientSession(conn, addressPort, sessionID, timerFactory_);
final JID proxyJid = proxy.getStreamHost().jid;
clientSessions.add(new Pair(proxyJid, session));
- onSessionReadyConnection = session.onSessionReady.connect(new Slot1<Boolean>() {
+ SignalConnection onSessionReadyConnection = session.onSessionReady.connect(new Slot1<Boolean>() {
@Override
public void call(Boolean b) {
handleProxySessionReady(sessionID, proxyJid, session, b);
}
});
- onFinishedConnection = session.onFinished.connect(new Slot1<FileTransferError>() {
+ onSessionReadyConnectionMap.put(session, onSessionReadyConnection);
+ SignalConnection onFinishedConnection = session.onFinished.connect(new Slot1<FileTransferError>() {
@Override
public void call(FileTransferError e) {
handleProxySessionFinished(sessionID, proxyJid, session, e);
}
});
+ onFinishedConnectionMap.put(session, onFinishedConnection);
session.start();
}
}
@@ -135,8 +154,16 @@ public class SOCKS5BytestreamProxiesManager {
// get active session
SOCKS5BytestreamClientSession activeSession = null;
for(Pair i : proxySessions_.get(sessionID)) {
- i.sock5.onSessionReady.disconnectAll();
- i.sock5.onFinished.disconnectAll();
+ SignalConnection onSessionReadyConnection =
+ onSessionReadyConnectionMap.remove(i.sock5);
+ if (onSessionReadyConnection != null) {
+ onSessionReadyConnection.disconnect();
+ }
+ SignalConnection onFinishedConnection =
+ onFinishedConnectionMap.remove(i.sock5);
+ if (onFinishedConnection != null) {
+ onFinishedConnection.disconnect();
+ }
if (i.jid.equals(proxyJID) && activeSession == null) {
activeSession = i.sock5;
}
@@ -217,32 +244,42 @@ public class SOCKS5BytestreamProxiesManager {
}
private void handleProxySessionReady(final String sessionID, final JID jid, SOCKS5BytestreamClientSession session, boolean error) {
- onSessionReadyConnection.disconnect();
+ SignalConnection onSessionReadyConnection = onSessionReadyConnectionMap.remove(session);
+ if (onSessionReadyConnection != null) {
+ onSessionReadyConnection.disconnect();
+ }
if (!error) {
// The SOCKS5 bytestream session to the proxy succeeded; stop and remove other sessions.
if (proxySessions_.containsKey(sessionID)) {
- for(Pair i : proxySessions_.get(sessionID)) {
- if ((i.jid.equals(jid)) && (!i.sock5.equals(session))) {
- i.sock5.stop();
- proxySessions_.get(sessionID).remove(i); //Swiften assigns i, so that iterator points to the next element.
- }
+ Iterator<Pair> iterator = proxySessions_.get(sessionID).iterator();
+ while (iterator.hasNext()) {
+ Pair i = iterator.next();
+ if ((i.jid.equals(jid)) && (!i.sock5.equals(session))) {
+ i.sock5.stop();
+ iterator.remove();; //Swiften assigns i, so that iterator points to the next element.
+ }
}
}
}
}
private void handleProxySessionFinished(final String sessionID, final JID jid, SOCKS5BytestreamClientSession session, FileTransferError error) {
- onFinishedConnection.disconnect();
+ SignalConnection onFinishedConnection = onFinishedConnectionMap.remove(session);
+ if (onFinishedConnection != null) {
+ onFinishedConnection.disconnect();
+ }
if (error != null) {
// The SOCKS5 bytestream session to the proxy failed; remove it.
if (proxySessions_.containsKey(sessionID)) {
- for(Pair i : proxySessions_.get(sessionID)) {
- if ((i.jid.equals(jid)) && (i.sock5.equals(session))) {
- i.sock5.stop();
- proxySessions_.get(sessionID).remove(i); //Swiften assigns i, so that iterator points to the next element.
- break;
- }
- }
+ Iterator<Pair> iterator = proxySessions_.get(sessionID).iterator();
+ while (iterator.hasNext()) {
+ Pair i = iterator.next();
+ if ((i.jid.equals(jid)) && (i.sock5.equals(session))) {
+ i.sock5.stop();
+ iterator.remove();; //Swiften assigns i, so that iterator points to the next element.
+ break;
+ }
+ }
}
}
}