From 8848729c679d0c9614f9a22bb0fa1a9bdb026019 Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski <janne@kuschku.de> Date: Tue, 16 Feb 2021 22:15:06 +0100 Subject: [PATCH] Further cleanups and improved documentation --- .../client/io/FixedDeflaterOutputStream.kt | 3 +++ .../libquassel/client/io/ReadableWrappedChannel.kt | 10 ++++++++++ .../libquassel/client/io/WritableWrappedChannel.kt | 10 ++++++++++ .../justjanne/libquassel/client/util/X509Helper.kt | 4 ++++ .../libquassel/protocol/io/ChainedByteBuffer.kt | 8 -------- .../libquassel/protocol/io/useChainedByteBuffer.kt | 14 ++++++++++++++ .../protocol/models/DccIpDetectionMode.kt | 8 ++++++-- .../protocol/models/DccPortSelectionMode.kt | 8 ++++++-- .../signalproxy/HeartBeatReplySerializer.kt | 3 +++ .../serializers/signalproxy/HeartBeatSerializer.kt | 3 +++ .../serializers/signalproxy/InitDataSerializer.kt | 3 +++ .../signalproxy/InitRequestSerializer.kt | 3 +++ .../serializers/signalproxy/RpcSerializer.kt | 3 +++ .../serializers/signalproxy/SyncSerializer.kt | 3 +++ .../libquassel/protocol/variant/QVariantList.kt | 5 ++++- .../libquassel/protocol/variant/QVariantMap.kt | 5 ++++- .../protocol/testutil/handshakeSerializerTest.kt | 7 +++---- .../protocol/testutil/primitiveSerializerTest.kt | 5 ++--- .../libquassel/protocol/testutil/serializerTest.kt | 5 ++--- .../protocol/testutil/signalProxySerializerTest.kt | 7 +++---- 20 files changed, 89 insertions(+), 28 deletions(-) create mode 100644 libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/useChainedByteBuffer.kt diff --git a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/FixedDeflaterOutputStream.kt b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/FixedDeflaterOutputStream.kt index ff09c58..ae060f6 100644 --- a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/FixedDeflaterOutputStream.kt +++ b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/FixedDeflaterOutputStream.kt @@ -29,6 +29,9 @@ import java.util.zip.DeflaterOutputStream class FixedDeflaterOutputStream( stream: OutputStream ) : DeflaterOutputStream(stream, true) { + /** + * Close the underlying stream and deflater + */ override fun close() { try { super.close() diff --git a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/ReadableWrappedChannel.kt b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/ReadableWrappedChannel.kt index ce82b7b..9a6a0ca 100644 --- a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/ReadableWrappedChannel.kt +++ b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/ReadableWrappedChannel.kt @@ -24,12 +24,19 @@ import java.nio.ByteBuffer import java.nio.channels.ReadableByteChannel import java.nio.channels.spi.AbstractInterruptibleChannel +/** + * Utility function to wrap an input stream into a readable channel + */ class ReadableWrappedChannel( private var backingStream: InputStream ) : AbstractInterruptibleChannel(), ReadableByteChannel { private val buffer = ByteBuffer.allocate(PAGE_SIZE) private val lock = Any() + /** + * Reads from the channel into a given byte buffer and returns the amount of + * written bytes + */ override fun read(dst: ByteBuffer): Int { val totalData = dst.remaining() var remainingData = totalData @@ -81,6 +88,9 @@ class ReadableWrappedChannel( return (totalData - remainingData) } + /** + * Close the underlying stream + */ override fun implCloseChannel() = backingStream.close() companion object { diff --git a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/WritableWrappedChannel.kt b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/WritableWrappedChannel.kt index a558250..db07d3e 100644 --- a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/WritableWrappedChannel.kt +++ b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/io/WritableWrappedChannel.kt @@ -24,12 +24,19 @@ import java.nio.ByteBuffer import java.nio.channels.WritableByteChannel import java.nio.channels.spi.AbstractInterruptibleChannel +/** + * Utility function to wrap an output stream into a writable channel + */ class WritableWrappedChannel( private var backingStream: OutputStream ) : AbstractInterruptibleChannel(), WritableByteChannel { private val buffer = ByteBuffer.allocate(PAGE_SIZE) private val lock = Any() + /** + * Write a given byte buffer to the channel and return the amount of written + * bytes + */ override fun write(src: ByteBuffer): Int { val totalData = src.remaining() var remainingData = totalData @@ -63,6 +70,9 @@ class WritableWrappedChannel( } } + /** + * Close the underlying stream + */ override fun implCloseChannel() = backingStream.close() companion object { diff --git a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/util/X509Helper.kt b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/util/X509Helper.kt index 17f61e6..a51bd29 100644 --- a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/util/X509Helper.kt +++ b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/util/X509Helper.kt @@ -26,6 +26,10 @@ import java.security.cert.X509Certificate private val certificateFactory = CertificateFactory.getInstance("X.509") +/** + * Utility function to extract, if available, an X509 Certificate from a given + * certificate + */ fun Certificate.toX509(): X509Certificate = certificateFactory.generateCertificate(ByteArrayInputStream(this.encoded)) as X509Certificate diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt index c92022c..d0b1726 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt @@ -204,11 +204,3 @@ class ChainedByteBuffer( buffer.bufferList[index++].duplicate().flip() } } - -inline fun ChainedByteBuffer.use( - function: (ChainedByteBuffer) -> Unit -): ByteBuffer { - val buffer = ChainedByteBuffer() - function(buffer) - return buffer.toBuffer() -} diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/useChainedByteBuffer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/useChainedByteBuffer.kt new file mode 100644 index 0000000..9e5f588 --- /dev/null +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/useChainedByteBuffer.kt @@ -0,0 +1,14 @@ +package de.justjanne.libquassel.protocol.io + +import java.nio.ByteBuffer + +/** + * Utility function to apply a closure to a chained byte buffer and return its data + */ +inline fun useChainedByteBuffer( + function: (ChainedByteBuffer) -> Unit +): ByteBuffer { + val buffer = ChainedByteBuffer() + function(buffer) + return buffer.toBuffer() +} diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccIpDetectionMode.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccIpDetectionMode.kt index 04234b6..bb0cccf 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccIpDetectionMode.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccIpDetectionMode.kt @@ -28,10 +28,14 @@ enum class DccIpDetectionMode( */ val value: UByte, ) { - /** Automatic detection (network socket or USERHOST) */ + /** + * Automatic detection + */ Automatic(0x00u), - /** Manually specified IP */ + /** + * Manually specified + */ Manual(0x01u); companion object { diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccPortSelectionMode.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccPortSelectionMode.kt index e3a5f38..95f94a8 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccPortSelectionMode.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccPortSelectionMode.kt @@ -28,10 +28,14 @@ enum class DccPortSelectionMode( */ val value: UByte, ) { - /** Automatic port selection */ + /** + * Automatic port selection + */ Automatic(0x00u), - /** Manually specified port range */ + /** + * Manually specified port range + */ Manual(0x01u); companion object { diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt index e31ba6e..a495b4f 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt @@ -8,6 +8,9 @@ import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant import org.threeten.bp.Instant +/** + * Serializer for [SignalProxyMessage.HeartBeatReply] + */ object HeartBeatReplySerializer : SignalProxySerializer<SignalProxyMessage.HeartBeatReply> { override val type: Int = 6 diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatSerializer.kt index efbc8a4..afb2c4f 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatSerializer.kt @@ -8,6 +8,9 @@ import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant import org.threeten.bp.Instant +/** + * Serializer for [SignalProxyMessage.HeartBeat] + */ object HeartBeatSerializer : SignalProxySerializer<SignalProxyMessage.HeartBeat> { override val type: Int = 5 diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt index e913014..f7e331e 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt @@ -11,6 +11,9 @@ import de.justjanne.libquassel.protocol.variant.toVariantList import de.justjanne.libquassel.protocol.variant.toVariantMap import java.nio.ByteBuffer +/** + * Serializer for [SignalProxyMessage.InitData] + */ object InitDataSerializer : SignalProxySerializer<SignalProxyMessage.InitData> { override val type: Int = 4 diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitRequestSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitRequestSerializer.kt index a082f18..1c82d03 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitRequestSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitRequestSerializer.kt @@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant import java.nio.ByteBuffer +/** + * Serializer for [SignalProxyMessage.InitRequest] + */ object InitRequestSerializer : SignalProxySerializer<SignalProxyMessage.InitRequest> { override val type: Int = 3 diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/RpcSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/RpcSerializer.kt index 0b72810..0cdfe3b 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/RpcSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/RpcSerializer.kt @@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant import java.nio.ByteBuffer +/** + * Serializer for [SignalProxyMessage.Rpc] + */ object RpcSerializer : SignalProxySerializer<SignalProxyMessage.Rpc> { override val type: Int = 2 diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/SyncSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/SyncSerializer.kt index 1315215..d1fb9c1 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/SyncSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/SyncSerializer.kt @@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant import java.nio.ByteBuffer +/** + * Serializer for [SignalProxyMessage.Sync] + */ object SyncSerializer : SignalProxySerializer<SignalProxyMessage.Sync> { override val type: Int = 1 diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantList.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantList.kt index 5f70f09..a6c97a5 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantList.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantList.kt @@ -5,7 +5,10 @@ package de.justjanne.libquassel.protocol.variant */ typealias QVariantList = List<QVariant_> +/** + * Transform a QVariantList of interleaved keys and values into a QVariantMap + */ fun QVariantList.toVariantMap(): QVariantMap = - this.zipWithNext().map { (key, value) -> + zipWithNext { key, value -> Pair(key.into(""), value) }.toMap() diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt index 52e0fe8..24bbe71 100644 --- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt @@ -7,7 +7,10 @@ import de.justjanne.libquassel.protocol.models.types.QtType */ typealias QVariantMap = Map<String, QVariant_> +/** + * Transform a QVariantMap into a QVariantList of interleaved keys and values + */ fun QVariantMap.toVariantList(): QVariantList = - this.toList().flatMap { (key, value) -> + flatMap { (key, value) -> listOf(qVariant(key, QtType.QString), value) } diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt index 59e47af..8d059b9 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt @@ -19,8 +19,7 @@ package de.justjanne.libquassel.protocol.testutil import de.justjanne.libquassel.protocol.features.FeatureSet -import de.justjanne.libquassel.protocol.io.ChainedByteBuffer -import de.justjanne.libquassel.protocol.io.use +import de.justjanne.libquassel.protocol.io.useChainedByteBuffer import de.justjanne.libquassel.protocol.models.HandshakeMessage import de.justjanne.libquassel.protocol.serializers.HandshakeMessageSerializer import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher @@ -48,7 +47,7 @@ inline fun <reified T : HandshakeMessage> handshakeSerializerTest( } if (serializeFeatureSet != null) { assertThat( - ChainedByteBuffer().use { + useChainedByteBuffer { HandshakeMessageSerializer.serialize(it, value, serializeFeatureSet) }, ByteBufferMatcher(encoded.rewind()) @@ -57,7 +56,7 @@ inline fun <reified T : HandshakeMessage> handshakeSerializerTest( } for (featureSet in featureSets) { val after = HandshakeMessageSerializer.deserialize( - ChainedByteBuffer().use { + useChainedByteBuffer { HandshakeMessageSerializer.serialize(it, value, featureSet) }, featureSet diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/primitiveSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/primitiveSerializerTest.kt index eefbafb..871ffd9 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/primitiveSerializerTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/primitiveSerializerTest.kt @@ -19,8 +19,7 @@ package de.justjanne.libquassel.protocol.testutil import de.justjanne.libquassel.protocol.features.FeatureSet -import de.justjanne.libquassel.protocol.io.ChainedByteBuffer -import de.justjanne.libquassel.protocol.io.use +import de.justjanne.libquassel.protocol.io.useChainedByteBuffer import de.justjanne.libquassel.protocol.models.types.QtType import de.justjanne.libquassel.protocol.models.types.QuasselType import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer @@ -86,7 +85,7 @@ inline fun <reified T : Any?> primitiveSerializerTest( } } if (serializeFeatureSet != null) { - val after = ChainedByteBuffer().use { + val after = useChainedByteBuffer { serializer.serialize(it, value, serializeFeatureSet) } assertThat(after, ByteBufferMatcher(encoded.rewind())) diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt index ff9231e..1af35db 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt @@ -19,8 +19,7 @@ package de.justjanne.libquassel.protocol.testutil import de.justjanne.libquassel.protocol.features.FeatureSet -import de.justjanne.libquassel.protocol.io.ChainedByteBuffer -import de.justjanne.libquassel.protocol.io.use +import de.justjanne.libquassel.protocol.io.useChainedByteBuffer import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher import org.hamcrest.Matcher @@ -47,7 +46,7 @@ fun <T : Any?> serializerTest( } } if (serializeFeatureSet != null) { - val after = ChainedByteBuffer().use { + val after = useChainedByteBuffer { serializer.serialize(it, value, serializeFeatureSet) } assertThat(after, ByteBufferMatcher(encoded.rewind())) diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt index 08e0b83..2f4c502 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt @@ -19,8 +19,7 @@ package de.justjanne.libquassel.protocol.testutil import de.justjanne.libquassel.protocol.features.FeatureSet -import de.justjanne.libquassel.protocol.io.ChainedByteBuffer -import de.justjanne.libquassel.protocol.io.use +import de.justjanne.libquassel.protocol.io.useChainedByteBuffer import de.justjanne.libquassel.protocol.models.SignalProxyMessage import de.justjanne.libquassel.protocol.serializers.SignalProxyMessageSerializer import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher @@ -48,7 +47,7 @@ inline fun <reified T : SignalProxyMessage> signalProxySerializerTest( } if (serializeFeatureSet != null) { assertThat( - ChainedByteBuffer().use { + useChainedByteBuffer { SignalProxyMessageSerializer.serialize(it, value, serializeFeatureSet) }, ByteBufferMatcher(encoded.rewind()) @@ -57,7 +56,7 @@ inline fun <reified T : SignalProxyMessage> signalProxySerializerTest( } for (featureSet in featureSets) { val after = SignalProxyMessageSerializer.deserialize( - ChainedByteBuffer().use { + useChainedByteBuffer { SignalProxyMessageSerializer.serialize(it, value, featureSet) }, featureSet -- GitLab