Refactor: Moving out transport code into its own class.

This commit is contained in:
Samuel Carlsson 2013-07-25 21:38:44 +02:00
parent 2799f05250
commit 831ee1ecbc
2 changed files with 59 additions and 40 deletions

View File

@ -1,68 +1,37 @@
package se.vidstige.jadb; package se.vidstige.jadb;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket; import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.nio.charset.Charset;
public class JadbConnection { public class JadbConnection {
private Socket _socket; private final Socket _socket;
private static final int DEFAULTPORT = 5037; private static final int DEFAULTPORT = 5037;
private final Transport transport;
public JadbConnection() throws UnknownHostException, IOException public JadbConnection() throws UnknownHostException, IOException
{ {
_socket = new Socket("localhost", DEFAULTPORT); _socket = new Socket("localhost", DEFAULTPORT);
transport = new Transport(_socket.getOutputStream(), _socket.getInputStream());
} }
public void getHostVersion() throws IOException, JadbException { public void getHostVersion() throws IOException, JadbException {
send("host:version"); transport.send("host:version");
verifyResponse(); transport.verifyResponse();
} }
public void getDevices() throws IOException, JadbException public void getDevices() throws IOException, JadbException
{ {
send("host:devices"); transport.send("host:devices");
verifyResponse(); transport.verifyResponse();
String body = readString(); String body = transport.readString();
System.out.println(body); System.out.println(body);
} }
private String readString() throws IOException {
String encodedLength = readString(4);
int length = Integer.parseInt(encodedLength, 16);
return readString(length);
}
public void close() throws IOException public void close() throws IOException
{ {
_socket.close(); _socket.close();
} }
private void verifyResponse() throws IOException, JadbException {
String response = readString(4);
if ("OKAY".equals(response) == false) throw new JadbException("command failed");
}
private String readString(int length) throws IOException {
DataInput reader = new DataInputStream(_socket.getInputStream());
byte[] responseBuffer = new byte[length];
reader.readFully(responseBuffer);
String response = new String(responseBuffer, Charset.forName("utf-8"));
return response;
}
private String getCommandLength(String command) {
return String.format("%04x", Integer.valueOf(command.length()));
}
private void send(String command) throws IOException {
OutputStreamWriter writer = new OutputStreamWriter(_socket.getOutputStream());
writer.write(getCommandLength(command));
writer.write(command);
writer.flush();
}
} }

View File

@ -0,0 +1,50 @@
package se.vidstige.jadb;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
class Transport {
private final OutputStream outputStream;
private final InputStream inputStream;
public Transport(OutputStream outputStream, InputStream inputStream) {
this.outputStream = outputStream;
this.inputStream = inputStream;
}
public String readString() throws IOException {
String encodedLength = readString(4);
int length = Integer.parseInt(encodedLength, 16);
return readString(length);
}
public void verifyResponse() throws IOException, JadbException {
String response = readString(4);
if ("OKAY".equals(response) == false) throw new JadbException("command failed");
}
public String readString(int length) throws IOException {
DataInput reader = new DataInputStream(inputStream);
byte[] responseBuffer = new byte[length];
reader.readFully(responseBuffer);
String response = new String(responseBuffer, Charset.forName("utf-8"));
return response;
}
public String getCommandLength(String command) {
return String.format("%04x", Integer.valueOf(command.length()));
}
public void send(String command) throws IOException {
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
writer.write(getCommandLength(command));
writer.write(command);
writer.flush();
}
}