diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java index e4db5673d219c82a65e44105c7e8f8f945a544fe..60520b563c9355c62a922ef8039d267d1bd44885 100644 --- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java +++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java @@ -3,74 +3,33 @@ package org.briarproject.plugins.droidtooth; import android.bluetooth.BluetoothSocket; import org.briarproject.api.plugins.Plugin; -import org.briarproject.api.plugins.TransportConnectionReader; -import org.briarproject.api.plugins.TransportConnectionWriter; -import org.briarproject.api.plugins.duplex.DuplexTransportConnection; +import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.atomic.AtomicBoolean; -class DroidtoothTransportConnection implements DuplexTransportConnection { +class DroidtoothTransportConnection extends AbstractDuplexTransportConnection { - private final Plugin plugin; private final BluetoothSocket socket; - private final Reader reader; - private final Writer writer; - private final AtomicBoolean halfClosed, closed; DroidtoothTransportConnection(Plugin plugin, BluetoothSocket socket) { - this.plugin = plugin; + super(plugin); this.socket = socket; - reader = new Reader(); - writer = new Writer(); - halfClosed = new AtomicBoolean(false); - closed = new AtomicBoolean(false); } - public TransportConnectionReader getReader() { - return reader; + @Override + protected InputStream getInputStream() throws IOException { + return socket.getInputStream(); } - public TransportConnectionWriter getWriter() { - return writer; + @Override + protected OutputStream getOutputStream() throws IOException { + return socket.getOutputStream(); } - private class Reader implements TransportConnectionReader { - - public InputStream getInputStream() throws IOException { - return socket.getInputStream(); - } - - public void dispose(boolean exception, boolean recognised) - throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) socket.close(); - } - } - - private class Writer implements TransportConnectionWriter { - - public int getMaxLatency() { - return plugin.getMaxLatency(); - } - - public int getMaxIdleTime() { - return plugin.getMaxIdleTime(); - } - - public long getCapacity() { - return Long.MAX_VALUE; - } - - public OutputStream getOutputStream() throws IOException { - return socket.getOutputStream(); - } - - public void dispose(boolean exception) throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) socket.close(); - } + @Override + protected void closeConnection(boolean exception) throws IOException { + socket.close(); } } diff --git a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java index f6d806c880f8c859704a10ad0b71b5f7a13b32a6..f44669188e3dd8531ae22dfd9cdffc4f23d849c2 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java @@ -1,75 +1,34 @@ package org.briarproject.plugins.tor; import org.briarproject.api.plugins.Plugin; -import org.briarproject.api.plugins.TransportConnectionReader; -import org.briarproject.api.plugins.TransportConnectionWriter; -import org.briarproject.api.plugins.duplex.DuplexTransportConnection; +import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; -import java.util.concurrent.atomic.AtomicBoolean; -class TorTransportConnection implements DuplexTransportConnection { +class TorTransportConnection extends AbstractDuplexTransportConnection { - private final Plugin plugin; private final Socket socket; - private final Reader reader; - private final Writer writer; - private final AtomicBoolean halfClosed, closed; TorTransportConnection(Plugin plugin, Socket socket) { - this.plugin = plugin; + super(plugin); this.socket = socket; - reader = new Reader(); - writer = new Writer(); - halfClosed = new AtomicBoolean(false); - closed = new AtomicBoolean(false); } - public TransportConnectionReader getReader() { - return reader; + @Override + protected InputStream getInputStream() throws IOException { + return socket.getInputStream(); } - public TransportConnectionWriter getWriter() { - return writer; + @Override + protected OutputStream getOutputStream() throws IOException { + return socket.getOutputStream(); } - private class Reader implements TransportConnectionReader { - - public InputStream getInputStream() throws IOException { - return socket.getInputStream(); - } - - public void dispose(boolean exception, boolean recognised) - throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) socket.close(); - } - } - - private class Writer implements TransportConnectionWriter { - - public int getMaxLatency() { - return plugin.getMaxLatency(); - } - - public int getMaxIdleTime() { - return plugin.getMaxIdleTime(); - } - - public long getCapacity() { - return Long.MAX_VALUE; - } - - public OutputStream getOutputStream() throws IOException { - return socket.getOutputStream(); - } - - public void dispose(boolean exception) throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) socket.close(); - } + @Override + protected void closeConnection(boolean exception) throws IOException { + socket.close(); } } diff --git a/briar-api/src/org/briarproject/api/plugins/duplex/AbstractDuplexTransportConnection.java b/briar-api/src/org/briarproject/api/plugins/duplex/AbstractDuplexTransportConnection.java new file mode 100644 index 0000000000000000000000000000000000000000..575e43dc6829cfb897451d0347f88db40cb712c5 --- /dev/null +++ b/briar-api/src/org/briarproject/api/plugins/duplex/AbstractDuplexTransportConnection.java @@ -0,0 +1,80 @@ +package org.briarproject.api.plugins.duplex; + +import org.briarproject.api.plugins.Plugin; +import org.briarproject.api.plugins.TransportConnectionReader; +import org.briarproject.api.plugins.TransportConnectionWriter; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.atomic.AtomicBoolean; + +public abstract class AbstractDuplexTransportConnection + implements DuplexTransportConnection { + + private final Plugin plugin; + private final Reader reader; + private final Writer writer; + private final AtomicBoolean halfClosed, closed; + + protected AbstractDuplexTransportConnection(Plugin plugin) { + this.plugin = plugin; + reader = new Reader(); + writer = new Writer(); + halfClosed = new AtomicBoolean(false); + closed = new AtomicBoolean(false); + } + + protected abstract InputStream getInputStream() throws IOException; + + protected abstract OutputStream getOutputStream() throws IOException; + + protected abstract void closeConnection(boolean exception) + throws IOException; + + @Override + public TransportConnectionReader getReader() { + return reader; + } + + @Override + public TransportConnectionWriter getWriter() { + return writer; + } + private class Reader implements TransportConnectionReader { + + public InputStream getInputStream() throws IOException { + return AbstractDuplexTransportConnection.this.getInputStream(); + } + + public void dispose(boolean exception, boolean recognised) + throws IOException { + if (halfClosed.getAndSet(true) || exception || !recognised) + if (!closed.getAndSet(true)) closeConnection(exception); + } + } + + private class Writer implements TransportConnectionWriter { + + public int getMaxLatency() { + return plugin.getMaxLatency(); + } + + public int getMaxIdleTime() { + return plugin.getMaxIdleTime(); + } + + public long getCapacity() { + return Long.MAX_VALUE; + } + + public OutputStream getOutputStream() throws IOException { + return AbstractDuplexTransportConnection.this.getOutputStream(); + } + + public void dispose(boolean exception) throws IOException { + if (halfClosed.getAndSet(true) || exception) + if (!closed.getAndSet(true)) closeConnection(exception); + } + } +} diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java index c400975bf3d44bb21ba87d97b174a7e292b728ac..7d8d33a9ae84c62873b8b581c4bc8c2ac64bd376 100644 --- a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java +++ b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java @@ -1,75 +1,34 @@ package org.briarproject.plugins.tcp; import org.briarproject.api.plugins.Plugin; -import org.briarproject.api.plugins.TransportConnectionReader; -import org.briarproject.api.plugins.TransportConnectionWriter; -import org.briarproject.api.plugins.duplex.DuplexTransportConnection; +import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; -import java.util.concurrent.atomic.AtomicBoolean; -class TcpTransportConnection implements DuplexTransportConnection { +class TcpTransportConnection extends AbstractDuplexTransportConnection { - private final Plugin plugin; private final Socket socket; - private final Reader reader; - private final Writer writer; - private final AtomicBoolean halfClosed, closed; TcpTransportConnection(Plugin plugin, Socket socket) { - this.plugin = plugin; + super(plugin); this.socket = socket; - reader = new Reader(); - writer = new Writer(); - halfClosed = new AtomicBoolean(false); - closed = new AtomicBoolean(false); } - public TransportConnectionReader getReader() { - return reader; + @Override + protected InputStream getInputStream() throws IOException { + return socket.getInputStream(); } - public TransportConnectionWriter getWriter() { - return writer; + @Override + protected OutputStream getOutputStream() throws IOException { + return socket.getOutputStream(); } - private class Reader implements TransportConnectionReader { - - public InputStream getInputStream() throws IOException { - return socket.getInputStream(); - } - - public void dispose(boolean exception, boolean recognised) - throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) socket.close(); - } - } - - private class Writer implements TransportConnectionWriter { - - public int getMaxLatency() { - return plugin.getMaxLatency(); - } - - public int getMaxIdleTime() { - return plugin.getMaxIdleTime(); - } - - public long getCapacity() { - return Long.MAX_VALUE; - } - - public OutputStream getOutputStream() throws IOException { - return socket.getOutputStream(); - } - - public void dispose(boolean exception) throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) socket.close(); - } + @Override + protected void closeConnection(boolean exception) throws IOException { + socket.close(); } } diff --git a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java index 6139b8c14bba8b749537ed1e6533526cfaee6113..a68dd001f22bbaef564478b86869e096171a0e25 100644 --- a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java +++ b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java @@ -1,76 +1,35 @@ package org.briarproject.plugins.bluetooth; import org.briarproject.api.plugins.Plugin; -import org.briarproject.api.plugins.TransportConnectionReader; -import org.briarproject.api.plugins.TransportConnectionWriter; -import org.briarproject.api.plugins.duplex.DuplexTransportConnection; +import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.atomic.AtomicBoolean; import javax.microedition.io.StreamConnection; -class BluetoothTransportConnection implements DuplexTransportConnection { +class BluetoothTransportConnection extends AbstractDuplexTransportConnection { - private final Plugin plugin; private final StreamConnection stream; - private final Reader reader; - private final Writer writer; - private final AtomicBoolean halfClosed, closed; BluetoothTransportConnection(Plugin plugin, StreamConnection stream) { - this.plugin = plugin; + super(plugin); this.stream = stream; - reader = new Reader(); - writer = new Writer(); - halfClosed = new AtomicBoolean(false); - closed = new AtomicBoolean(false); } - public TransportConnectionReader getReader() { - return reader; + @Override + protected InputStream getInputStream() throws IOException { + return stream.openInputStream(); } - public TransportConnectionWriter getWriter() { - return writer; + @Override + protected OutputStream getOutputStream() throws IOException { + return stream.openOutputStream(); } - private class Reader implements TransportConnectionReader { - - public InputStream getInputStream() throws IOException { - return stream.openInputStream(); - } - - public void dispose(boolean exception, boolean recognised) - throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) stream.close(); - } - } - - private class Writer implements TransportConnectionWriter { - - public int getMaxLatency() { - return plugin.getMaxLatency(); - } - - public int getMaxIdleTime() { - return plugin.getMaxIdleTime(); - } - - public long getCapacity() { - return Long.MAX_VALUE; - } - - public OutputStream getOutputStream() throws IOException { - return stream.openOutputStream(); - } - - public void dispose(boolean exception) throws IOException { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) stream.close(); - } + @Override + protected void closeConnection(boolean exception) throws IOException { + stream.close(); } } diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java index bbf71da9c0cafe5e92c2ce2f1d056ad29b6a20f3..10a68aa56f909086c8c0f0ee5c7e7ba13a45556d 100644 --- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java +++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java @@ -5,8 +5,7 @@ import org.briarproject.api.contact.ContactId; import org.briarproject.api.crypto.PseudoRandom; import org.briarproject.api.keyagreement.KeyAgreementListener; import org.briarproject.api.keyagreement.TransportDescriptor; -import org.briarproject.api.plugins.TransportConnectionReader; -import org.briarproject.api.plugins.TransportConnectionWriter; +import org.briarproject.api.plugins.duplex.AbstractDuplexTransportConnection; import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexTransportConnection; @@ -17,8 +16,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Collection; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import static java.util.logging.Level.INFO; @@ -180,23 +177,24 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { } private class ModemTransportConnection - implements DuplexTransportConnection { + extends AbstractDuplexTransportConnection { - private final AtomicBoolean halfClosed = new AtomicBoolean(false); - private final AtomicBoolean closed = new AtomicBoolean(false); - private final CountDownLatch disposalFinished = new CountDownLatch(1); - private final Reader reader = new Reader(); - private final Writer writer = new Writer(); + private ModemTransportConnection() { + super(ModemPlugin.this); + } - public TransportConnectionReader getReader() { - return reader; + @Override + protected InputStream getInputStream() throws IOException { + return modem.getInputStream(); } - public TransportConnectionWriter getWriter() { - return writer; + @Override + protected OutputStream getOutputStream() throws IOException { + return modem.getOutputStream(); } - private void hangUp(boolean exception) { + @Override + protected void closeConnection(boolean exception) { LOG.info("Call disconnected"); try { modem.hangUp(); @@ -205,43 +203,6 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { exception = true; } if (exception) resetModem(); - disposalFinished.countDown(); - } - - private class Reader implements TransportConnectionReader { - - public InputStream getInputStream() throws IOException { - return modem.getInputStream(); - } - - public void dispose(boolean exception, boolean recognised) { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) hangUp(exception); - } - } - - private class Writer implements TransportConnectionWriter { - - public int getMaxLatency() { - return ModemPlugin.this.getMaxLatency(); - } - - public int getMaxIdleTime() { - return ModemPlugin.this.getMaxIdleTime(); - } - - public long getCapacity() { - return Long.MAX_VALUE; - } - - public OutputStream getOutputStream() throws IOException { - return modem.getOutputStream(); - } - - public void dispose(boolean exception) { - if (halfClosed.getAndSet(true) || exception) - if (!closed.getAndSet(true)) hangUp(exception); - } } } }