diff options
Diffstat (limited to 'src/main/kotlin/NetworkPacketTransporterJavaNet.kt')
-rw-r--r-- | src/main/kotlin/NetworkPacketTransporterJavaNet.kt | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/main/kotlin/NetworkPacketTransporterJavaNet.kt b/src/main/kotlin/NetworkPacketTransporterJavaNet.kt index 6badc3d..6855604 100644 --- a/src/main/kotlin/NetworkPacketTransporterJavaNet.kt +++ b/src/main/kotlin/NetworkPacketTransporterJavaNet.kt @@ -1,6 +1,7 @@ import java.io.InputStream import java.io.OutputStream import java.net.Socket +import kotlin.math.min /* TODO: @@ -36,8 +37,9 @@ class NetworkPacketTransporterJavaNet : NetworkPacketTransporter { this.socket.close() } - override fun transmit(payload: List<Byte>) { - this.outStream.write(payload.toByteArray()) + override fun transmit(payload: Array<UByte>) { + val bytes = ByteArray(payload.size) { i -> payload[i].toByte() } + this.outStream.write(bytes) } override fun receiveUntil(untilByte: Byte): List<Byte> { @@ -55,7 +57,20 @@ class NetworkPacketTransporterJavaNet : NetworkPacketTransporter { return payload } - override fun receiveFixed(length: ULong): List<Byte> { - return this.inStream.readNBytes(length.toInt()).toList() + override fun receive(length: ULong): Array<UByte> { + var length = length + val intMax = Int.MAX_VALUE.toULong() + val bytes: MutableList<Byte> = MutableList(0) { 0 } + // readNBytes only takes Int values, so it must be called multiple times if the length is greater than Int's + // maximum value + while (length > 0u) { + // the min function ensures that the value passed to readNBytes never exceeds Int's maximum value while also + // switching to the length variable when its value eventually becomes less than Int's maximum value, which + // avoids writing duplicated readNBytes calls in the code + val lenMin = min(length, intMax) + bytes += this.inStream.readNBytes(lenMin.toInt()).toMutableList() + length -= intMax + } + return Array(bytes.size) { i -> bytes[i].toUByte() } } }
\ No newline at end of file |