From f404986aef02d05b86cdf396e3d928e800b5443d Mon Sep 17 00:00:00 2001 From: rusefi Date: Wed, 8 Jul 2020 21:44:54 -0400 Subject: [PATCH] proxy progress --- .../rusefi/io/tcp/BinaryProtocolServer.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java b/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java index 154756d45c..a2d63c3489 100644 --- a/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java +++ b/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java @@ -5,6 +5,7 @@ import com.opensr5.Logger; import com.rusefi.Listener; import com.rusefi.binaryprotocol.BinaryProtocolCommands; import com.rusefi.binaryprotocol.BinaryProtocolState; +import com.rusefi.binaryprotocol.IncomingDataBuffer; import com.rusefi.binaryprotocol.IoHelper; import com.rusefi.config.generated.Fields; import com.rusefi.io.LinkManager; @@ -48,7 +49,7 @@ public class BinaryProtocolServer implements BinaryProtocolCommands { Function clientSocketRunnableFactory = clientSocket -> () -> { try { runProxy(linkManager, clientSocket); - } catch (IOException e) { + } catch (IOException | InterruptedException e) { logger.info("proxy connection: " + e); } }; @@ -87,9 +88,10 @@ public class BinaryProtocolServer implements BinaryProtocolCommands { } @SuppressWarnings("InfiniteLoopStatement") - private void runProxy(LinkManager linkManager, Socket clientSocket) throws IOException { - DataInputStream in = new DataInputStream(clientSocket.getInputStream()); + private void runProxy(LinkManager linkManager, Socket clientSocket) throws IOException, InterruptedException { TcpIoStream stream = new TcpIoStream(logger, clientSocket); + IncomingDataBuffer in = IncomingDataBuffer.createDataBuffer(stream, logger); + stream.setDataBuffer(in); while (true) { byte first = in.readByte(); @@ -168,6 +170,20 @@ public class BinaryProtocolServer implements BinaryProtocolCommands { return new Packet(packet, crc); } + public static Packet readPromisedBytes(IncomingDataBuffer in, int length) throws IOException, InterruptedException { + if (length < 0) + throw new IllegalArgumentException(String.format("Negative %d %x", length, length)); + byte[] packet = new byte[length]; + int size = in.read(packet); + if (size != packet.length) + throw new IllegalStateException(size + " promised but " + packet.length + " arrived"); + int crc = in.readInt(); + int fromPacket = IoHelper.getCrc32(packet); + if (crc != fromPacket) + throw new IllegalStateException("CRC mismatch " + crc + " vs " + fromPacket); + return new Packet(packet, crc); + } + public static void handleProtocolCommand(Socket clientSocket) throws IOException { System.out.println("Got plain F command"); OutputStream outputStream = clientSocket.getOutputStream();