summaryrefslogtreecommitdiff
path: root/src/main/kotlin/NinePConnection.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/NinePConnection.kt')
-rw-r--r--src/main/kotlin/NinePConnection.kt47
1 files changed, 23 insertions, 24 deletions
diff --git a/src/main/kotlin/NinePConnection.kt b/src/main/kotlin/NinePConnection.kt
index 5adb35b..13e2ecf 100644
--- a/src/main/kotlin/NinePConnection.kt
+++ b/src/main/kotlin/NinePConnection.kt
@@ -42,24 +42,21 @@ class NinePConnection(netPackTrans: NetworkPacketTransporter) : NinePTranslator
}
/**
- * Read an [nBytes]-long unsigned integer number from the connection.
+ * Read an [len] bytes long unsigned integer number from the connection.
*
* In 9P, binary numbers (non-textual) are specified in little-endian order (least significant byte first).
*
- * @param nBytes The length of the integer number in bytes. It only works with unsigned numbers strictly greater
- * than zero (zero is excluded).
- * @return The number's value.
- * @throws IllegalArgumentException if [nBytes] is zero or negative.
+ * @param len The length of the integer number in bytes. If zero, nothing is read.
+ * @return the number's value.
+ * @throws java.io.IOException if the message could not be correctly received.
*/
- private fun readInteger(nBytes: Int): BigInteger {
- require(nBytes > 0)
- val bytes = this.npt.receiveFixed(nBytes.toULong())
- var number: BigInteger = BigInteger.valueOf(0)
+ private fun readInteger(len: ULong): BigInteger {
+ val bytes = this.npt.receive(len)
+ var value = 0.toBigInteger()
for (i in 0..<bytes.size) {
- number += bytes[i].toInt().toBigInteger().shl(i)
+ value += bytes[i].toInt().toBigInteger().shl(i*8)
}
-
- return number
+ return value
}
/**
@@ -80,12 +77,13 @@ class NinePConnection(netPackTrans: NetworkPacketTransporter) : NinePTranslator
*
* @return A triple in which the first element is the message size in bytes, the second is the message type as a
* [NinePMessageType] constant, and the third element is the message tag.
+ * @throws java.io.IOException if the message could not be correctly received.
*/
private fun readSizeTypeTag(): Triple<UInt, NinePMessageType, UShort> {
return Triple(
- readInteger(4).toInt().toUInt(),
- NinePMessageType.fromByte(readInteger(1).toByte()),
- readInteger(2).toInt().toUShort()
+ readInteger(4u).toInt().toUInt(),
+ NinePMessageType.fromByte(readInteger(1u).toByte().toUByte()),
+ readInteger(2u).toShort().toUShort()
)
}
@@ -118,16 +116,17 @@ class NinePConnection(netPackTrans: NetworkPacketTransporter) : NinePTranslator
/**
* Read a 9P message of type Rerror, after the message size and type have already been read.
*
- * @return A pair of: (1) the message tag and (2) the error message
+ * @return A pair of: (1) the message tag and (2) the error message.
+ * @throws java.io.IOException if the message could not be correctly received.
*/
- private fun readError(): Pair<SizedMessageField, String> {
- val tag = readInteger(2)
+ private fun readError(): Pair<UShort, String> {
+ val tag = readInteger(2u).toInt().toUShort()
val error = readString()
- return Pair(SizedMessageField(2, tag), error)
+ return Pair(tag, error)
}
/**
- * Send 9P request and check for exceptions or a Rerror response.
+ * Send 9P request and check for exceptions or an Rerror response.
*/
private fun responseError(msg: NinePMessage): String? {
try {
@@ -143,10 +142,10 @@ class NinePConnection(netPackTrans: NetworkPacketTransporter) : NinePTranslator
return null
}
- override fun version(msize: SizedMessageField, version: String): String? {
+ override fun version(msize: UInt, version: String): String? {
val msg = NinePMessage(NinePMessageType.TVERSION, this.NOTAG, listOf("msize", "version"),
mapOf(
- "msize" to msize
+ "msize" to BigInteger(msize.toString())
),
mapOf(
"version" to version
@@ -157,10 +156,10 @@ class NinePConnection(netPackTrans: NetworkPacketTransporter) : NinePTranslator
if (error != null) {
return error
}
- val rmsize = readInteger(4)
+ val rmsize = readInteger(4u).toInt().toUInt()
val rversion = readString()
// this check should not be necessary, but you never know
- this.maxSize = ( if (rmsize < msize.value) msize.value else rmsize ).toInt().toUInt()
+ this.maxSize = ( if (rmsize < msize) msize else rmsize )
if (rversion == "unknown") {
return "Unknown version."
}