Skip to content
Snippets Groups Projects
Verified Commit 8848729c authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Further cleanups and improved documentation

parent ea76271c
Branches
Tags
No related merge requests found
Showing
with 89 additions and 28 deletions
...@@ -29,6 +29,9 @@ import java.util.zip.DeflaterOutputStream ...@@ -29,6 +29,9 @@ import java.util.zip.DeflaterOutputStream
class FixedDeflaterOutputStream( class FixedDeflaterOutputStream(
stream: OutputStream stream: OutputStream
) : DeflaterOutputStream(stream, true) { ) : DeflaterOutputStream(stream, true) {
/**
* Close the underlying stream and deflater
*/
override fun close() { override fun close() {
try { try {
super.close() super.close()
......
...@@ -24,12 +24,19 @@ import java.nio.ByteBuffer ...@@ -24,12 +24,19 @@ import java.nio.ByteBuffer
import java.nio.channels.ReadableByteChannel import java.nio.channels.ReadableByteChannel
import java.nio.channels.spi.AbstractInterruptibleChannel import java.nio.channels.spi.AbstractInterruptibleChannel
/**
* Utility function to wrap an input stream into a readable channel
*/
class ReadableWrappedChannel( class ReadableWrappedChannel(
private var backingStream: InputStream private var backingStream: InputStream
) : AbstractInterruptibleChannel(), ReadableByteChannel { ) : AbstractInterruptibleChannel(), ReadableByteChannel {
private val buffer = ByteBuffer.allocate(PAGE_SIZE) private val buffer = ByteBuffer.allocate(PAGE_SIZE)
private val lock = Any() 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 { override fun read(dst: ByteBuffer): Int {
val totalData = dst.remaining() val totalData = dst.remaining()
var remainingData = totalData var remainingData = totalData
...@@ -81,6 +88,9 @@ class ReadableWrappedChannel( ...@@ -81,6 +88,9 @@ class ReadableWrappedChannel(
return (totalData - remainingData) return (totalData - remainingData)
} }
/**
* Close the underlying stream
*/
override fun implCloseChannel() = backingStream.close() override fun implCloseChannel() = backingStream.close()
companion object { companion object {
......
...@@ -24,12 +24,19 @@ import java.nio.ByteBuffer ...@@ -24,12 +24,19 @@ import java.nio.ByteBuffer
import java.nio.channels.WritableByteChannel import java.nio.channels.WritableByteChannel
import java.nio.channels.spi.AbstractInterruptibleChannel import java.nio.channels.spi.AbstractInterruptibleChannel
/**
* Utility function to wrap an output stream into a writable channel
*/
class WritableWrappedChannel( class WritableWrappedChannel(
private var backingStream: OutputStream private var backingStream: OutputStream
) : AbstractInterruptibleChannel(), WritableByteChannel { ) : AbstractInterruptibleChannel(), WritableByteChannel {
private val buffer = ByteBuffer.allocate(PAGE_SIZE) private val buffer = ByteBuffer.allocate(PAGE_SIZE)
private val lock = Any() 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 { override fun write(src: ByteBuffer): Int {
val totalData = src.remaining() val totalData = src.remaining()
var remainingData = totalData var remainingData = totalData
...@@ -63,6 +70,9 @@ class WritableWrappedChannel( ...@@ -63,6 +70,9 @@ class WritableWrappedChannel(
} }
} }
/**
* Close the underlying stream
*/
override fun implCloseChannel() = backingStream.close() override fun implCloseChannel() = backingStream.close()
companion object { companion object {
......
...@@ -26,6 +26,10 @@ import java.security.cert.X509Certificate ...@@ -26,6 +26,10 @@ import java.security.cert.X509Certificate
private val certificateFactory = CertificateFactory.getInstance("X.509") private val certificateFactory = CertificateFactory.getInstance("X.509")
/**
* Utility function to extract, if available, an X509 Certificate from a given
* certificate
*/
fun Certificate.toX509(): X509Certificate = fun Certificate.toX509(): X509Certificate =
certificateFactory.generateCertificate(ByteArrayInputStream(this.encoded)) certificateFactory.generateCertificate(ByteArrayInputStream(this.encoded))
as X509Certificate as X509Certificate
...@@ -204,11 +204,3 @@ class ChainedByteBuffer( ...@@ -204,11 +204,3 @@ class ChainedByteBuffer(
buffer.bufferList[index++].duplicate().flip() buffer.bufferList[index++].duplicate().flip()
} }
} }
inline fun ChainedByteBuffer.use(
function: (ChainedByteBuffer) -> Unit
): ByteBuffer {
val buffer = ChainedByteBuffer()
function(buffer)
return buffer.toBuffer()
}
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()
}
...@@ -28,10 +28,14 @@ enum class DccIpDetectionMode( ...@@ -28,10 +28,14 @@ enum class DccIpDetectionMode(
*/ */
val value: UByte, val value: UByte,
) { ) {
/** Automatic detection (network socket or USERHOST) */ /**
* Automatic detection
*/
Automatic(0x00u), Automatic(0x00u),
/** Manually specified IP */ /**
* Manually specified
*/
Manual(0x01u); Manual(0x01u);
companion object { companion object {
......
...@@ -28,10 +28,14 @@ enum class DccPortSelectionMode( ...@@ -28,10 +28,14 @@ enum class DccPortSelectionMode(
*/ */
val value: UByte, val value: UByte,
) { ) {
/** Automatic port selection */ /**
* Automatic port selection
*/
Automatic(0x00u), Automatic(0x00u),
/** Manually specified port range */ /**
* Manually specified port range
*/
Manual(0x01u); Manual(0x01u);
companion object { companion object {
......
...@@ -8,6 +8,9 @@ import de.justjanne.libquassel.protocol.variant.into ...@@ -8,6 +8,9 @@ import de.justjanne.libquassel.protocol.variant.into
import de.justjanne.libquassel.protocol.variant.qVariant import de.justjanne.libquassel.protocol.variant.qVariant
import org.threeten.bp.Instant import org.threeten.bp.Instant
/**
* Serializer for [SignalProxyMessage.HeartBeatReply]
*/
object HeartBeatReplySerializer : SignalProxySerializer<SignalProxyMessage.HeartBeatReply> { object HeartBeatReplySerializer : SignalProxySerializer<SignalProxyMessage.HeartBeatReply> {
override val type: Int = 6 override val type: Int = 6
......
...@@ -8,6 +8,9 @@ import de.justjanne.libquassel.protocol.variant.into ...@@ -8,6 +8,9 @@ import de.justjanne.libquassel.protocol.variant.into
import de.justjanne.libquassel.protocol.variant.qVariant import de.justjanne.libquassel.protocol.variant.qVariant
import org.threeten.bp.Instant import org.threeten.bp.Instant
/**
* Serializer for [SignalProxyMessage.HeartBeat]
*/
object HeartBeatSerializer : SignalProxySerializer<SignalProxyMessage.HeartBeat> { object HeartBeatSerializer : SignalProxySerializer<SignalProxyMessage.HeartBeat> {
override val type: Int = 5 override val type: Int = 5
......
...@@ -11,6 +11,9 @@ import de.justjanne.libquassel.protocol.variant.toVariantList ...@@ -11,6 +11,9 @@ import de.justjanne.libquassel.protocol.variant.toVariantList
import de.justjanne.libquassel.protocol.variant.toVariantMap import de.justjanne.libquassel.protocol.variant.toVariantMap
import java.nio.ByteBuffer import java.nio.ByteBuffer
/**
* Serializer for [SignalProxyMessage.InitData]
*/
object InitDataSerializer : SignalProxySerializer<SignalProxyMessage.InitData> { object InitDataSerializer : SignalProxySerializer<SignalProxyMessage.InitData> {
override val type: Int = 4 override val type: Int = 4
......
...@@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into ...@@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into
import de.justjanne.libquassel.protocol.variant.qVariant import de.justjanne.libquassel.protocol.variant.qVariant
import java.nio.ByteBuffer import java.nio.ByteBuffer
/**
* Serializer for [SignalProxyMessage.InitRequest]
*/
object InitRequestSerializer : SignalProxySerializer<SignalProxyMessage.InitRequest> { object InitRequestSerializer : SignalProxySerializer<SignalProxyMessage.InitRequest> {
override val type: Int = 3 override val type: Int = 3
......
...@@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into ...@@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into
import de.justjanne.libquassel.protocol.variant.qVariant import de.justjanne.libquassel.protocol.variant.qVariant
import java.nio.ByteBuffer import java.nio.ByteBuffer
/**
* Serializer for [SignalProxyMessage.Rpc]
*/
object RpcSerializer : SignalProxySerializer<SignalProxyMessage.Rpc> { object RpcSerializer : SignalProxySerializer<SignalProxyMessage.Rpc> {
override val type: Int = 2 override val type: Int = 2
......
...@@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into ...@@ -9,6 +9,9 @@ import de.justjanne.libquassel.protocol.variant.into
import de.justjanne.libquassel.protocol.variant.qVariant import de.justjanne.libquassel.protocol.variant.qVariant
import java.nio.ByteBuffer import java.nio.ByteBuffer
/**
* Serializer for [SignalProxyMessage.Sync]
*/
object SyncSerializer : SignalProxySerializer<SignalProxyMessage.Sync> { object SyncSerializer : SignalProxySerializer<SignalProxyMessage.Sync> {
override val type: Int = 1 override val type: Int = 1
......
...@@ -5,7 +5,10 @@ package de.justjanne.libquassel.protocol.variant ...@@ -5,7 +5,10 @@ package de.justjanne.libquassel.protocol.variant
*/ */
typealias QVariantList = List<QVariant_> typealias QVariantList = List<QVariant_>
/**
* Transform a QVariantList of interleaved keys and values into a QVariantMap
*/
fun QVariantList.toVariantMap(): QVariantMap = fun QVariantList.toVariantMap(): QVariantMap =
this.zipWithNext().map { (key, value) -> zipWithNext { key, value ->
Pair(key.into(""), value) Pair(key.into(""), value)
}.toMap() }.toMap()
...@@ -7,7 +7,10 @@ import de.justjanne.libquassel.protocol.models.types.QtType ...@@ -7,7 +7,10 @@ import de.justjanne.libquassel.protocol.models.types.QtType
*/ */
typealias QVariantMap = Map<String, QVariant_> typealias QVariantMap = Map<String, QVariant_>
/**
* Transform a QVariantMap into a QVariantList of interleaved keys and values
*/
fun QVariantMap.toVariantList(): QVariantList = fun QVariantMap.toVariantList(): QVariantList =
this.toList().flatMap { (key, value) -> flatMap { (key, value) ->
listOf(qVariant(key, QtType.QString), value) listOf(qVariant(key, QtType.QString), value)
} }
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
package de.justjanne.libquassel.protocol.testutil package de.justjanne.libquassel.protocol.testutil
import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.features.FeatureSet
import de.justjanne.libquassel.protocol.io.ChainedByteBuffer import de.justjanne.libquassel.protocol.io.useChainedByteBuffer
import de.justjanne.libquassel.protocol.io.use
import de.justjanne.libquassel.protocol.models.HandshakeMessage import de.justjanne.libquassel.protocol.models.HandshakeMessage
import de.justjanne.libquassel.protocol.serializers.HandshakeMessageSerializer import de.justjanne.libquassel.protocol.serializers.HandshakeMessageSerializer
import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
...@@ -48,7 +47,7 @@ inline fun <reified T : HandshakeMessage> handshakeSerializerTest( ...@@ -48,7 +47,7 @@ inline fun <reified T : HandshakeMessage> handshakeSerializerTest(
} }
if (serializeFeatureSet != null) { if (serializeFeatureSet != null) {
assertThat( assertThat(
ChainedByteBuffer().use { useChainedByteBuffer {
HandshakeMessageSerializer.serialize(it, value, serializeFeatureSet) HandshakeMessageSerializer.serialize(it, value, serializeFeatureSet)
}, },
ByteBufferMatcher(encoded.rewind()) ByteBufferMatcher(encoded.rewind())
...@@ -57,7 +56,7 @@ inline fun <reified T : HandshakeMessage> handshakeSerializerTest( ...@@ -57,7 +56,7 @@ inline fun <reified T : HandshakeMessage> handshakeSerializerTest(
} }
for (featureSet in featureSets) { for (featureSet in featureSets) {
val after = HandshakeMessageSerializer.deserialize( val after = HandshakeMessageSerializer.deserialize(
ChainedByteBuffer().use { useChainedByteBuffer {
HandshakeMessageSerializer.serialize(it, value, featureSet) HandshakeMessageSerializer.serialize(it, value, featureSet)
}, },
featureSet featureSet
......
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
package de.justjanne.libquassel.protocol.testutil package de.justjanne.libquassel.protocol.testutil
import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.features.FeatureSet
import de.justjanne.libquassel.protocol.io.ChainedByteBuffer import de.justjanne.libquassel.protocol.io.useChainedByteBuffer
import de.justjanne.libquassel.protocol.io.use
import de.justjanne.libquassel.protocol.models.types.QtType import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.models.types.QuasselType import de.justjanne.libquassel.protocol.models.types.QuasselType
import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
...@@ -86,7 +85,7 @@ inline fun <reified T : Any?> primitiveSerializerTest( ...@@ -86,7 +85,7 @@ inline fun <reified T : Any?> primitiveSerializerTest(
} }
} }
if (serializeFeatureSet != null) { if (serializeFeatureSet != null) {
val after = ChainedByteBuffer().use { val after = useChainedByteBuffer {
serializer.serialize(it, value, serializeFeatureSet) serializer.serialize(it, value, serializeFeatureSet)
} }
assertThat(after, ByteBufferMatcher(encoded.rewind())) assertThat(after, ByteBufferMatcher(encoded.rewind()))
......
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
package de.justjanne.libquassel.protocol.testutil package de.justjanne.libquassel.protocol.testutil
import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.features.FeatureSet
import de.justjanne.libquassel.protocol.io.ChainedByteBuffer import de.justjanne.libquassel.protocol.io.useChainedByteBuffer
import de.justjanne.libquassel.protocol.io.use
import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
import org.hamcrest.Matcher import org.hamcrest.Matcher
...@@ -47,7 +46,7 @@ fun <T : Any?> serializerTest( ...@@ -47,7 +46,7 @@ fun <T : Any?> serializerTest(
} }
} }
if (serializeFeatureSet != null) { if (serializeFeatureSet != null) {
val after = ChainedByteBuffer().use { val after = useChainedByteBuffer {
serializer.serialize(it, value, serializeFeatureSet) serializer.serialize(it, value, serializeFeatureSet)
} }
assertThat(after, ByteBufferMatcher(encoded.rewind())) assertThat(after, ByteBufferMatcher(encoded.rewind()))
......
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
package de.justjanne.libquassel.protocol.testutil package de.justjanne.libquassel.protocol.testutil
import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.features.FeatureSet
import de.justjanne.libquassel.protocol.io.ChainedByteBuffer import de.justjanne.libquassel.protocol.io.useChainedByteBuffer
import de.justjanne.libquassel.protocol.io.use
import de.justjanne.libquassel.protocol.models.SignalProxyMessage import de.justjanne.libquassel.protocol.models.SignalProxyMessage
import de.justjanne.libquassel.protocol.serializers.SignalProxyMessageSerializer import de.justjanne.libquassel.protocol.serializers.SignalProxyMessageSerializer
import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
...@@ -48,7 +47,7 @@ inline fun <reified T : SignalProxyMessage> signalProxySerializerTest( ...@@ -48,7 +47,7 @@ inline fun <reified T : SignalProxyMessage> signalProxySerializerTest(
} }
if (serializeFeatureSet != null) { if (serializeFeatureSet != null) {
assertThat( assertThat(
ChainedByteBuffer().use { useChainedByteBuffer {
SignalProxyMessageSerializer.serialize(it, value, serializeFeatureSet) SignalProxyMessageSerializer.serialize(it, value, serializeFeatureSet)
}, },
ByteBufferMatcher(encoded.rewind()) ByteBufferMatcher(encoded.rewind())
...@@ -57,7 +56,7 @@ inline fun <reified T : SignalProxyMessage> signalProxySerializerTest( ...@@ -57,7 +56,7 @@ inline fun <reified T : SignalProxyMessage> signalProxySerializerTest(
} }
for (featureSet in featureSets) { for (featureSet in featureSets) {
val after = SignalProxyMessageSerializer.deserialize( val after = SignalProxyMessageSerializer.deserialize(
ChainedByteBuffer().use { useChainedByteBuffer {
SignalProxyMessageSerializer.serialize(it, value, featureSet) SignalProxyMessageSerializer.serialize(it, value, featureSet)
}, },
featureSet featureSet
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment