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 ff09c58f00e094fddf106b97abfab3121e15380a..ae060f6606f16c4286d0688eea8bccebd2893f05 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 ce82b7b3790a4d0cb7db55f31365d43287e97274..9a6a0cac3b8a24a3a109b6479a82406530c5e479 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 a5582508ea2eb782e14d2227207bd6355bea91d5..db07d3edd7ecddba1c426b6ba0e540f9462d7f93 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 17f61e638f4786965eed690c9105ccbaa511c431..a51bd29aaf6495b7dfbdaac3ce35a924d6585fc3 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 c92022c794b7259311f6b598a5b0c69b69f7a3fb..d0b1726242284c794cc612157d104985ab2c1a62 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 0000000000000000000000000000000000000000..9e5f5888cae9a60279ebc8b808999a1996c8e716 --- /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 04234b65491145fc41d40a15cc8c73713ef627a7..bb0cccf06c7e449568e882eebb9a36b00ff158f8 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 e3a5f38b459e2fff9f581376d93d39ee697d7522..95f94a875938bff4fcb2849666d32a171b11ce04 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 e31ba6e980dd0cc0e8cf67b8394d8d17f740fe79..a495b4ff217ab250fab06db7e769fc4de8a0653a 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 efbc8a452d76027a3da9512a14ac6bf3f99e03e4..afb2c4fd0e3b20dedb1ffaf7130e523ae9ebcf4a 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 e913014b7a4123d59756e411e6b37e21d9abb7e7..f7e331e131bd6549f17d037d420294dba7ddce6e 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 a082f18054feae0c8fa6f6f55c26a4bcb09144b9..1c82d03f6b2d645a73b94346718ba4e36f6af5a2 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 0b72810b8be4051d334f15eb05c201360a433675..0cdfe3b92de754416d010fbec682b049d35bd257 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 1315215ef3a81723a81f885bd9cce59567c77c7c..d1fb9c1a4328cc1ac9efe88b9145308a179e4671 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 5f70f09b11745c0dcbc8bbff9ce81615e25ab162..a6c97a5effe619d5d325448a2fb97e30459b65f9 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 52e0fe81db563126618dc9e4d1eadbf8a86644f0..24bbe7153272412f0a55e43df0994a1d05087a7d 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 59e47afbc2f54b558cc694fdbd8e56157440772d..8d059b970ba2d2f8d70d666290e53574ede844c3 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 eefbafbdb28414556112033fdb262670187f2b95..871ffd9ab042a6338239db8298e4f28147591b8e 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 ff9231eac00e27561f64205a06b41ac3ee45678d..1af35dbf738e549f38ad636cdd38adca02748aa8 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 08e0b835e542773a6d0da98918512a5d29946cd3..2f4c502ae86cb6bb2595e19d31b8836b91a16b40 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