Code cleanup, fixed potential NullPointerException if never connected.

This commit is contained in:
akwizgran
2012-11-27 00:00:52 +00:00
parent a0c015352d
commit 14f2fd1995
2 changed files with 10 additions and 12 deletions

View File

@@ -38,7 +38,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
private int lineLen = 0; private int lineLen = 0;
private volatile ReliabilityLayer reliabilityLayer = null; private volatile ReliabilityLayer reliabilityLayer;
ModemImpl(Executor executor, Callback callback, String portName) { ModemImpl(Executor executor, Callback callback, String portName) {
this.executor = executor; this.executor = executor;
@@ -48,6 +48,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
offHook = new Semaphore(1); offHook = new Semaphore(1);
connected = new AtomicBoolean(false); connected = new AtomicBoolean(false);
line = new byte[MAX_LINE_LENGTH]; line = new byte[MAX_LINE_LENGTH];
reliabilityLayer = new ReliabilityLayer(this);
} }
public void init() throws IOException { public void init() throws IOException {
@@ -129,6 +130,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
throw new IOException(e.toString()); throw new IOException(e.toString());
} }
reliabilityLayer.invalidate(); reliabilityLayer.invalidate();
reliabilityLayer = new ReliabilityLayer(this);
connected.set(false); connected.set(false);
offHook.release(); offHook.release();
} }
@@ -176,7 +178,6 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
lineLen = 0; lineLen = 0;
if(LOG.isLoggable(INFO)) LOG.info("Modem status: " + s); if(LOG.isLoggable(INFO)) LOG.info("Modem status: " + s);
if(s.startsWith("CONNECT")) { if(s.startsWith("CONNECT")) {
reliabilityLayer = new ReliabilityLayer(this);
synchronized(connected) { synchronized(connected) {
if(connected.getAndSet(true)) if(connected.getAndSet(true))
throw new IOException("Connected twice"); throw new IOException("Connected twice");

View File

@@ -6,26 +6,21 @@ import java.io.OutputStream;
class ReliabilityLayer implements ReadHandler, WriteHandler { class ReliabilityLayer implements ReadHandler, WriteHandler {
// Write side
private final WriteHandler writeHandler; private final WriteHandler writeHandler;
private final SlipEncoder encoder;
private final Sender sender;
private final SenderOutputStream outputStream;
// Read side
private final SlipDecoder decoder; private final SlipDecoder decoder;
private final Receiver receiver;
private final ReceiverInputStream inputStream; private final ReceiverInputStream inputStream;
private final SenderOutputStream outputStream;
private volatile boolean valid = true; private volatile boolean valid = true;
ReliabilityLayer(WriteHandler writeHandler) { ReliabilityLayer(WriteHandler writeHandler) {
this.writeHandler = writeHandler; this.writeHandler = writeHandler;
encoder = new SlipEncoder(this); SlipEncoder encoder = new SlipEncoder(this);
sender = new Sender(encoder); Sender sender = new Sender(encoder);
outputStream = new SenderOutputStream(sender); Receiver receiver = new Receiver(sender);
receiver = new Receiver(sender);
decoder = new SlipDecoder(receiver); decoder = new SlipDecoder(receiver);
inputStream = new ReceiverInputStream(receiver); inputStream = new ReceiverInputStream(receiver);
outputStream = new SenderOutputStream(sender);
} }
InputStream getInputStream() { InputStream getInputStream() {
@@ -40,11 +35,13 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
valid = false; valid = false;
} }
// The modem calls this method to pass data up to the SLIP decoder
public void handleRead(byte[] b, int length) throws IOException { public void handleRead(byte[] b, int length) throws IOException {
if(!valid) throw new IOException("Connection closed"); if(!valid) throw new IOException("Connection closed");
decoder.handleRead(b, length); 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 { public void handleWrite(byte[] b, int length) throws IOException {
if(!valid) throw new IOException("Connection closed"); if(!valid) throw new IOException("Connection closed");
writeHandler.handleWrite(b, length); writeHandler.handleWrite(b, length);