diff --git a/src/net/sf/briar/plugins/modem/ModemImpl.java b/src/net/sf/briar/plugins/modem/ModemImpl.java index eb8542259..82ac37e5d 100644 --- a/src/net/sf/briar/plugins/modem/ModemImpl.java +++ b/src/net/sf/briar/plugins/modem/ModemImpl.java @@ -36,11 +36,12 @@ class ModemImpl implements Modem, SerialPortEventListener { private final SerialPort port; private final AtomicBoolean initialised, connected; private final Semaphore offHook; - private final BlockingQueue received; private final byte[] line; private int lineLen = 0; + private volatile BlockingQueue received = null; + ModemImpl(Executor executor, Callback callback, String portName) { this.executor = executor; this.callback = callback; @@ -48,7 +49,6 @@ class ModemImpl implements Modem, SerialPortEventListener { initialised = new AtomicBoolean(false); offHook = new Semaphore(1); connected = new AtomicBoolean(false); - received = new LinkedBlockingQueue(); line = new byte[MAX_LINE_LENGTH]; } @@ -92,6 +92,7 @@ class ModemImpl implements Modem, SerialPortEventListener { Thread.currentThread().interrupt(); throw new IOException("Interrupted while initialising modem"); } + received = new LinkedBlockingQueue(); } public boolean dial(String number) throws IOException { @@ -124,7 +125,7 @@ class ModemImpl implements Modem, SerialPortEventListener { } public InputStream getInputStream() { - return new ModemInputStream(); + return new ModemInputStream(received); } public OutputStream getOutputStream() { @@ -140,6 +141,7 @@ class ModemImpl implements Modem, SerialPortEventListener { throw new IOException(e.toString()); } received.add(new byte[0]); // Empty buffer indicates EOF + received = new LinkedBlockingQueue(); connected.set(false); offHook.release(); } @@ -246,9 +248,15 @@ class ModemImpl implements Modem, SerialPortEventListener { private class ModemInputStream extends InputStream { + private final BlockingQueue received; + private byte[] buf = null; private int offset = 0; + private ModemInputStream(BlockingQueue received) { + this.received = received; + } + @Override public int read() throws IOException { getBufferIfNecessary();