summaryrefslogtreecommitdiff
path: root/src/main/kotlin/NinePMessage.kt
diff options
context:
space:
mode:
authorEdoardo La Greca2025-08-01 16:53:52 +0200
committerEdoardo La Greca2025-08-01 16:53:52 +0200
commit391de1ffbd961f7ae6bc4e489975ed0a645e0089 (patch)
tree84a28da2f75a689c807aa056b7cb73118b97ce45 /src/main/kotlin/NinePMessage.kt
parent4050df8178def9df2107bab3d49ae97282f79e53 (diff)
fix types
Diffstat (limited to 'src/main/kotlin/NinePMessage.kt')
-rw-r--r--src/main/kotlin/NinePMessage.kt27
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