diff options
Diffstat (limited to 'src/main/kotlin/NinePConnection.kt')
-rw-r--r-- | src/main/kotlin/NinePConnection.kt | 47 |
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." } |