diff --git a/src/net/sf/briar/plugins/modem/ModemImpl.java b/src/net/sf/briar/plugins/modem/ModemImpl.java index e9135831325704bd4f09f538610a465665660550..5ca78fee18a998a714b89190971c9dd69b8b19e4 100644 --- a/src/net/sf/briar/plugins/modem/ModemImpl.java +++ b/src/net/sf/briar/plugins/modem/ModemImpl.java @@ -38,7 +38,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener { private int lineLen = 0; - private volatile ReliabilityLayer reliabilityLayer = null; + private volatile ReliabilityLayer reliabilityLayer; ModemImpl(Executor executor, Callback callback, String portName) { this.executor = executor; @@ -48,6 +48,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener { offHook = new Semaphore(1); connected = new AtomicBoolean(false); line = new byte[MAX_LINE_LENGTH]; + reliabilityLayer = new ReliabilityLayer(this); } public void init() throws IOException { @@ -129,6 +130,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener { throw new IOException(e.toString()); } reliabilityLayer.invalidate(); + reliabilityLayer = new ReliabilityLayer(this); connected.set(false); offHook.release(); } @@ -176,7 +178,6 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener { lineLen = 0; if(LOG.isLoggable(INFO)) LOG.info("Modem status: " + s); if(s.startsWith("CONNECT")) { - reliabilityLayer = new ReliabilityLayer(this); synchronized(connected) { if(connected.getAndSet(true)) throw new IOException("Connected twice"); diff --git a/src/net/sf/briar/plugins/modem/ReliabilityLayer.java b/src/net/sf/briar/plugins/modem/ReliabilityLayer.java index 3c965b37e8c073e255e2824cfb7bdecd10b5f665..bc97a5e2ed46303ecbbac4faa19366219e1742f9 100644 --- a/src/net/sf/briar/plugins/modem/ReliabilityLayer.java +++ b/src/net/sf/briar/plugins/modem/ReliabilityLayer.java @@ -6,26 +6,21 @@ import java.io.OutputStream; class ReliabilityLayer implements ReadHandler, WriteHandler { - // Write side private final WriteHandler writeHandler; - private final SlipEncoder encoder; - private final Sender sender; - private final SenderOutputStream outputStream; - // Read side private final SlipDecoder decoder; - private final Receiver receiver; private final ReceiverInputStream inputStream; + private final SenderOutputStream outputStream; private volatile boolean valid = true; ReliabilityLayer(WriteHandler writeHandler) { this.writeHandler = writeHandler; - encoder = new SlipEncoder(this); - sender = new Sender(encoder); - outputStream = new SenderOutputStream(sender); - receiver = new Receiver(sender); + SlipEncoder encoder = new SlipEncoder(this); + Sender sender = new Sender(encoder); + Receiver receiver = new Receiver(sender); decoder = new SlipDecoder(receiver); inputStream = new ReceiverInputStream(receiver); + outputStream = new SenderOutputStream(sender); } InputStream getInputStream() { @@ -40,11 +35,13 @@ class ReliabilityLayer implements ReadHandler, WriteHandler { valid = false; } + // The modem calls this method to pass data up to the SLIP decoder public void handleRead(byte[] b, int length) throws IOException { if(!valid) throw new IOException("Connection closed"); decoder.handleRead(b, length); } + // The SLIP encoder calls this method to pass data down to the modem public void handleWrite(byte[] b, int length) throws IOException { if(!valid) throw new IOException("Connection closed"); writeHandler.handleWrite(b, length);