diff options
Diffstat (limited to 'src/com/isode/stroke/filetransfer/SOCKS5BytestreamServer.java')
-rw-r--r-- | src/com/isode/stroke/filetransfer/SOCKS5BytestreamServer.java | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/com/isode/stroke/filetransfer/SOCKS5BytestreamServer.java b/src/com/isode/stroke/filetransfer/SOCKS5BytestreamServer.java new file mode 100644 index 0000000..3a745e2 --- /dev/null +++ b/src/com/isode/stroke/filetransfer/SOCKS5BytestreamServer.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010-2015 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.filetransfer; + +import com.isode.stroke.network.ConnectionServer; +import com.isode.stroke.network.HostAddressPort; +import com.isode.stroke.network.Connection; +import com.isode.stroke.jid.JID; +import com.isode.stroke.signals.SignalConnection; +import com.isode.stroke.signals.Slot1; +import com.isode.stroke.signals.Slot; +import java.util.Vector; + +public class SOCKS5BytestreamServer { + + private ConnectionServer connectionServer; + private SOCKS5BytestreamRegistry registry; + private Vector<SOCKS5BytestreamServerSession> sessions = new Vector<SOCKS5BytestreamServerSession>(); + private SignalConnection onNewConnectionConn; + private SignalConnection onFinishedConnection; + + public SOCKS5BytestreamServer(ConnectionServer connectionServer, SOCKS5BytestreamRegistry registry) { + this.connectionServer = connectionServer; + this.registry = registry; + } + + public HostAddressPort getAddressPort() { + return connectionServer.getAddressPort(); + } + + public void start() { + onNewConnectionConn = connectionServer.onNewConnection.connect(new Slot1<Connection>() { + @Override + public void call(Connection c) { + handleNewConnection(c); + } + }); + } + + public void stop() { + onNewConnectionConn.disconnect(); + for (SOCKS5BytestreamServerSession session : sessions) { + session.onFinished.disconnectAll(); + session.stop(); + } + sessions.clear(); + } + + public Vector<SOCKS5BytestreamServerSession> getSessions(final String streamID) { + Vector<SOCKS5BytestreamServerSession> result = new Vector<SOCKS5BytestreamServerSession>(); + for (SOCKS5BytestreamServerSession session : sessions) { + if (session.getStreamID().equals(streamID)) { + result.add(session); + } + } + return result; + } + + private void handleNewConnection(Connection connection) { + final SOCKS5BytestreamServerSession session = new SOCKS5BytestreamServerSession(connection, registry); + onFinishedConnection = session.onFinished.connect(new Slot1<FileTransferError>() { + @Override + public void call(FileTransferError e) { + handleSessionFinished(session); + } + }); + sessions.add(session); + session.start(); + } + + private void handleSessionFinished(SOCKS5BytestreamServerSession session) { + while(sessions.contains(session)) { + sessions.remove(session); + } + onFinishedConnection.disconnect(); + } +}
\ No newline at end of file |