diff --git a/src/main/java/in/dragonbra/javasteam/steam/CMClient.java b/src/main/java/in/dragonbra/javasteam/steam/CMClient.java index 3c1f834b..940c0962 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/CMClient.java +++ b/src/main/java/in/dragonbra/javasteam/steam/CMClient.java @@ -24,16 +24,16 @@ import in.dragonbra.javasteam.util.event.ScheduledFunction; import in.dragonbra.javasteam.util.log.LogManager; import in.dragonbra.javasteam.util.log.Logger; -import in.dragonbra.javasteam.util.stream.BinaryReader; +import okio.Buffer; +import okio.BufferedSource; +import okio.GzipSource; +import okio.Okio; import org.jetbrains.annotations.Nullable; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.EnumSet; -import java.util.zip.GZIPInputStream; /** * This base client handles the underlying connection to a CM server. This class should not be use directly, but through @@ -334,8 +334,8 @@ public static IPacketMsg getPacketMsg(byte[] data) { } int rawEMsg = 0; - try (var reader = new BinaryReader(new ByteArrayInputStream(data))) { - rawEMsg = reader.readInt(); + try (var buffer = new Buffer().write(data)) { + rawEMsg = buffer.readIntLe(); } catch (IOException e) { logger.debug("Exception while getting EMsg code", e); } @@ -374,24 +374,25 @@ private void handleMulti(IPacketMsg packetMsg) { var msgMulti = new ClientMsgProtobuf(CMsgMulti.class, packetMsg); var payload = msgMulti.getBody().getMessageBody().toByteArray(); - try { - InputStream inputStream; + try (var payloadBuffer = new Buffer().write(payload)) { + BufferedSource source; if (msgMulti.getBody().getSizeUnzipped() > 0) { - inputStream = new GZIPInputStream(new ByteArrayInputStream(payload)); + source = Okio.buffer(new GzipSource(payloadBuffer)); } else { - inputStream = new ByteArrayInputStream(payload); + source = payloadBuffer; } - try (inputStream; var br = new BinaryReader(inputStream)) { - while (br.available() > 0) { - var subSize = br.readInt(); - var subData = br.readBytes(subSize); + try (source) { + do { + var subSize = source.readIntLe(); + var subData = source.readByteArray(subSize); + var msg = getPacketMsg(subData); - if (!onClientMsgReceived(getPacketMsg(subData))) { + if (!onClientMsgReceived(msg)) { break; } - } + } while (!source.exhausted()); } } catch (IOException e) { logger.error("error in handleMulti()", e);