diff options
Diffstat (limited to 'src/com/isode/stroke/network/ProxiedConnection.java')
-rw-r--r-- | src/com/isode/stroke/network/ProxiedConnection.java | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/src/com/isode/stroke/network/ProxiedConnection.java b/src/com/isode/stroke/network/ProxiedConnection.java new file mode 100644 index 0000000..a94fbc5 --- /dev/null +++ b/src/com/isode/stroke/network/ProxiedConnection.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2012-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.network; + +import com.isode.stroke.signals.SignalConnection; +import com.isode.stroke.signals.Slot2; +import com.isode.stroke.signals.Slot1; +import com.isode.stroke.base.SafeByteArray; + +public abstract class ProxiedConnection extends Connection { + + private boolean connected_; + private DomainNameResolver resolver_; + private ConnectionFactory connectionFactory_; + private TimerFactory timerFactory_; + private String proxyHost_ = ""; + private int proxyPort_; + private HostAddressPort server_; + private Connector connector_; + private Connection connection_; + private SignalConnection onDataReadConnection; + private SignalConnection onDisconnectedConnection; + private SignalConnection onConnectFinishedConnection; + + public ProxiedConnection(DomainNameResolver resolver, ConnectionFactory connectionFactory, TimerFactory timerFactory, final String proxyHost, int proxyPort) { + this.resolver_ = resolver; + this.connectionFactory_ = connectionFactory; + this.timerFactory_ = timerFactory; + this.proxyHost_ = proxyHost; + this.proxyPort_ = proxyPort; + this.server_ = new HostAddressPort(new HostAddress("0.0.0.0"), 0); + this.connected_ = false; + } + + protected void finalize() throws Throwable { + try { + cancelConnector(); + if (connection_ != null) { + onDataReadConnection.disconnect(); + onDisconnectedConnection.disconnect(); + } + if (connected_) { + System.err.println("Warning: Connection was still established."); + } + } + finally { + super.finalize(); + } + } + + public void listen() { + assert(false); + connection_.listen(); + } + + public void connect(final HostAddressPort server) { + server_ = server; + + connector_ = Connector.create(proxyHost_, proxyPort_, null, resolver_, connectionFactory_, timerFactory_); + onConnectFinishedConnection = connector_.onConnectFinished.connect(new Slot2<Connection, com.isode.stroke.base.Error>() { + @Override + public void call(Connection c, com.isode.stroke.base.Error e) { + handleConnectFinished(c); + } + }); + connector_.start(); + } + + public void disconnect() { + connected_ = false; + connection_.disconnect(); + } + + public void write(final SafeByteArray data) { + connection_.write(data); + } + + public HostAddressPort getLocalAddress() { + return connection_.getLocalAddress(); + } + + private void handleConnectFinished(Connection connection) { + cancelConnector(); + if (connection != null) { + connection_ = connection; + connection_.onDataRead.connect(new Slot1<SafeByteArray>() { + @Override + public void call(SafeByteArray s) { + handleDataRead(s); + } + }); + connection_.onDisconnected.connect(new Slot1<Error>() { + @Override + public void call(Error e) { + handleDisconnected(e); + } + }); + + initializeProxy(); + } + else { + onConnectFinished.emit(true); + } + } + + private void handleDataRead(SafeByteArray data) { + if (!connected_) { + handleProxyInitializeData(data); + } + else { + onDataRead.emit(data); + } + } + + private void handleDisconnected(final Error error) { + onDisconnected.emit(error); + } + + private void cancelConnector() { + if (connector_ != null) { + onConnectFinishedConnection.disconnect(); + connector_.stop(); + connector_ = null; + } + } + + protected void setProxyInitializeFinished(boolean success) { + connected_ = success; + if (!success) { + disconnect(); + } + onConnectFinished.emit(!success); + } + + protected abstract void initializeProxy(); + protected abstract void handleProxyInitializeData(SafeByteArray data); + + protected HostAddressPort getServer() { + return server_; + } +}
\ No newline at end of file |