Close transport connection if tag isn't recognised. #281

This commit is contained in:
akwizgran
2016-04-05 11:37:38 +01:00
parent bbd14f1af4
commit 2b19e4c8db
6 changed files with 142 additions and 265 deletions

View File

@@ -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);
}
}
}