diff options
author | Edoardo La Greca | 2025-08-01 16:53:52 +0200 |
---|---|---|
committer | Edoardo La Greca | 2025-08-01 16:53:52 +0200 |
commit | 391de1ffbd961f7ae6bc4e489975ed0a645e0089 (patch) | |
tree | 84a28da2f75a689c807aa056b7cb73118b97ce45 /src/main/kotlin/NinePMessage.kt | |
parent | 4050df8178def9df2107bab3d49ae97282f79e53 (diff) |
fix types
Diffstat (limited to 'src/main/kotlin/NinePMessage.kt')
-rw-r--r-- | src/main/kotlin/NinePMessage.kt | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/src/main/kotlin/NinePMessage.kt b/src/main/kotlin/NinePMessage.kt index 87d59a5..225ec45 100644 --- a/src/main/kotlin/NinePMessage.kt +++ b/src/main/kotlin/NinePMessage.kt @@ -1,3 +1,4 @@ +import java.math.BigInteger import kotlin.math.pow /** @@ -13,7 +14,7 @@ import kotlin.math.pow * @param fieldValuesInt A map of each field name into its value. This map only stores integer values. * @param fieldValuesStr A map of each field name into its value. This map only stores string values. */ -class NinePMessage(val type: NinePMessageType, val tag: UShort, val fieldNames: List<String>, val fieldValuesInt: Map<String, SizedMessageField>, val fieldValuesStr: Map<String, String>, val maxSize: UInt) { +class NinePMessage(val type: NinePMessageType, val tag: UShort, val fieldNames: List<String>, val fieldValuesInt: Map<String, BigInteger>, val fieldValuesStr: Map<String, String>, val maxSize: UInt) { /** * Intersection between [fieldNames] and [fieldValuesInt]. In other words: the amount of integer fields that are * going to be used when writing the message. @@ -37,11 +38,11 @@ class NinePMessage(val type: NinePMessageType, val tag: UShort, val fieldNames: require(insecInts.size == fieldNames.size - insecStrs.size) val totalSize = size() - if (totalSize > this.maxSize.toLong()) { + if (totalSize > this.maxSize) { throw IllegalArgumentException("Message size exceeded.") } writeMessageSizeType(npt, totalSize, type) - writeInteger(npt, SizedMessageField(2, tag.toInt().toBigInteger())) + writeInteger(npt, tag.toInt().toBigInteger()) for (field in fieldNames) { if (field in insecInts) { writeInteger(npt, fieldValuesInt[field]!!) @@ -59,8 +60,9 @@ class NinePMessage(val type: NinePMessageType, val tag: UShort, val fieldNames: * @param npt The networking API. * @param value The number's value. [SizedMessageField] defines both its actual value and its size. */ - private fun writeInteger(npt: NetworkPacketTransporter, value: SizedMessageField) { - npt.transmit(value.value.toByteArray().toList()) + private fun writeInteger(npt: NetworkPacketTransporter, value: BigInteger) { + val bytes = value.toByteArray() + npt.transmit(Array(bytes.size) { i -> bytes[i].toUByte() }) } /** @@ -75,8 +77,9 @@ class NinePMessage(val type: NinePMessageType, val tag: UShort, val fieldNames: */ private fun writeString(npt: NetworkPacketTransporter, value: String) { require(value.length <= 2.0.pow(16.0) - 1) - writeInteger(npt, SizedMessageField(2, value.length.toBigInteger())) - npt.transmit(value.toByteArray().toList()) + writeInteger(npt, value.length.toBigInteger()) + val bytes = value.toByteArray() + npt.transmit(Array(bytes.size) { i -> bytes[i].toUByte() }) } /** @@ -86,15 +89,15 @@ class NinePMessage(val type: NinePMessageType, val tag: UShort, val fieldNames: * @param size The total message size, including the 4 bytes of this parameter and the type's byte. * @param type The 9P message type as a [NinePMessageType] constant. */ - private fun writeMessageSizeType(npt: NetworkPacketTransporter, size: Int, type: NinePMessageType) { - writeInteger(npt, SizedMessageField(4, size.toBigInteger())) - writeInteger(npt, SizedMessageField(1, type.value.toInt().toBigInteger())) + private fun writeMessageSizeType(npt: NetworkPacketTransporter, size: UInt, type: NinePMessageType) { + writeInteger(npt, size.toInt().toBigInteger()) + writeInteger(npt, type.value.toInt().toBigInteger()) } /** * Calculate the expected size of the message. */ - fun size(): Int { - return 4 + 1 + 2 + this.insecInts.sumOf { this.fieldValuesInt[it]!!.size } + this.insecStrs.sumOf { 2 + this.fieldValuesStr[it]!!.length } + fun size(): UInt { + return 4u + 1u + 2u + this.insecInts.sumOf { this.fieldValuesInt[it]!!.bitLength().toUInt() } + this.insecStrs.sumOf { 2u + this.fieldValuesStr[it]!!.length.toUInt() } } }
\ No newline at end of file |