From fd2bd2eb92c13f7530964077f6e6af1b3b3e473a Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Mon, 15 Feb 2021 02:06:48 +0100 Subject: [PATCH] Cleanup the modules and improve documentation --- gradle.properties | 2 +- libquassel-client/build.gradle.kts | 2 +- .../libquassel/client/EndToEndTest.kt | 30 ++-- libquassel-messages/build.gradle.kts | 12 -- libquassel-messages/gradle.properties | 3 - .../messages/testutil/byteBufferOf.kt | 35 ---- .../messages/testutil/deserialize.kt | 60 ------- .../testutil/matchers/BomMatcherChar.kt | 39 ----- .../testutil/matchers/BomMatcherString.kt | 35 ---- .../testutil/matchers/ByteBufferMatcher.kt | 55 ------- .../messages/testutil/matchers/MapMatcher.kt | 62 ------- .../testutil/matchers/TemporalMatcher.kt | 58 ------- .../libquassel/messages/testutil/serialize.kt | 49 ------ .../src/test/resources/quasseltest.crt | 30 ---- .../src/test/resources/quasseltest.key | 52 ------ .../protocol/features/QuasselFeature.kt | 95 ----------- .../protocol/connection/ClientHeader.kt} | 11 +- .../connection/ClientHeaderSerializer.kt} | 9 +- .../protocol/connection/CoreHeader.kt} | 15 +- .../connection/CoreHeaderSerializer.kt} | 13 +- .../protocol/connection/ProtocolFeature.kt | 13 +- .../protocol/connection/ProtocolMeta.kt | 13 +- .../connection/ProtocolMetaSerializer.kt | 7 +- .../protocol/connection/ProtocolVersion.kt | 17 ++ .../protocol/features/FeatureSet.kt | 34 +++- .../protocol/features/LegacyFeature.kt | 82 ++++++++-- .../protocol/features/QuasselFeature.kt | 153 ++++++++++++++++++ .../protocol/features/QuasselFeatureName.kt | 14 ++ .../libquassel/protocol/io/ByteBufferUtil.kt | 26 +++ .../protocol/io/ChainedByteBuffer.kt | 83 +++++++++- .../libquassel/protocol/io/StringEncoder.kt | 18 +++ .../serializers}/HandshakeSerializer.kt | 19 ++- .../serializers}/HandshakeSerializers.kt | 22 ++- .../NoSerializerForTypeException.kt | 24 +++ .../protocol/serializers/QtSerializer.kt | 15 ++ .../protocol/serializers/QtSerializers.kt | 9 ++ .../protocol/serializers/QuasselSerializer.kt | 9 ++ .../serializers/QuasselSerializers.kt | 9 ++ .../protocol/serializers/Serializer.kt | 19 +++ .../handshake/ClientInitAckSerializer.kt | 7 +- .../handshake/ClientInitRejectSerializer.kt | 7 +- .../handshake/ClientInitSerializer.kt | 7 +- .../handshake/ClientLoginAckSerializer.kt | 7 +- .../handshake/ClientLoginRejectSerializer.kt | 7 +- .../handshake/ClientLoginSerializer.kt | 7 +- .../handshake/CoreSetupAckSerializer.kt | 7 +- .../handshake/CoreSetupDataSerializer.kt | 7 +- .../handshake/CoreSetupRejectSerializer.kt | 7 +- .../handshake/SessionInitSerializer.kt | 7 +- .../protocol/serializers/qt/BoolSerializer.kt | 3 + .../serializers/qt/ByteBufferSerializer.kt | 3 + .../protocol/serializers/qt/ByteSerializer.kt | 3 + .../protocol/serializers/qt/DateSerializer.kt | 3 + .../serializers/qt/DateTimeSerializer.kt | 3 + .../serializers/qt/DoubleSerializer.kt | 3 + .../serializers/qt/FloatSerializer.kt | 3 + .../serializers/qt/HandshakeMapSerializer.kt | 4 + .../protocol/serializers/qt/IntSerializer.kt | 3 + .../protocol/serializers/qt/LongSerializer.kt | 3 + .../serializers/qt/QCharSerializer.kt | 3 + .../serializers/qt/QStringListSerializer.kt | 3 + .../serializers/qt/QVariantListSerializer.kt | 3 + .../serializers/qt/QVariantMapSerializer.kt | 3 + .../serializers/qt/QVariantSerializer.kt | 5 +- .../serializers/qt/ShortSerializer.kt | 3 + .../serializers/qt/StringSerializer.kt | 5 + .../serializers/qt/StringSerializerAscii.kt | 3 + .../serializers/qt/StringSerializerUtf16.kt | 3 + .../serializers/qt/StringSerializerUtf8.kt | 3 + .../protocol/serializers/qt/TimeSerializer.kt | 3 + .../serializers/qt/UByteSerializer.kt | 3 + .../protocol/serializers/qt/UIntSerializer.kt | 3 + .../serializers/qt/ULongSerializer.kt | 3 + .../serializers/qt/UShortSerializer.kt | 3 + .../protocol/serializers/qt/VoidSerializer.kt | 3 + .../serializers/quassel/BufferIdSerializer.kt | 3 + .../quassel/BufferInfoSerializer.kt | 3 + .../quassel/DccIpDetectionModeSerializer.kt | 3 + .../quassel/DccPortSelectionModeSerializer.kt | 3 + .../quassel/IdentityIdSerializer.kt | 3 + .../serializers/quassel/MessageSerializer.kt | 3 + .../serializers/quassel/MsgIdSerializer.kt | 3 + .../quassel/NetworkIdSerializer.kt | 3 + .../serializers/quassel/PeerPtrSerializer.kt | 3 + .../quassel/QHostAddressSerializer.kt | 3 + .../protocol/types/BufferActivity.kt | 18 ++- .../libquassel/protocol/types/BufferId.kt | 17 +- .../libquassel/protocol/types/BufferInfo.kt | 18 +++ .../libquassel/protocol/types/BufferType.kt | 22 ++- .../protocol/types/DccIpDetectionMode.kt | 7 + .../protocol/types/DccPortSelectionMode.kt | 7 + .../protocol/types}/HandshakeMessage.kt | 2 +- .../libquassel/protocol/types/IdentityId.kt | 17 +- .../libquassel/protocol/types/Message.kt | 33 ++++ .../libquassel/protocol/types/MessageFlag.kt | 35 ++++ .../libquassel/protocol/types/MessageType.kt | 81 ++++++++++ .../libquassel/protocol/types/MsgId.kt | 18 ++- .../libquassel/protocol/types/NetworkId.kt | 17 +- .../protocol/types/NetworkLayerProtocol.kt | 29 ++++ .../libquassel/protocol/types/QStringList.kt | 6 + .../libquassel/protocol/types/SignedId.kt | 18 +++ .../libquassel/protocol/types/TimeSpec.kt | 0 .../libquassel/protocol/variant/QVariant.kt | 65 +++++--- .../protocol/variant/QVariantList.kt | 6 + .../protocol/variant/QVariantMap.kt | 6 + .../libquassel/protocol/variant/QtType.kt | 85 ++-------- .../protocol/variant/QuasselType.kt | 3 +- ...rTest.kt => ClientHeaderSerializerTest.kt} | 24 +-- .../protocol/features/FeatureSetTest.kt | 4 +- .../handshake/ClientInitSerializerTest.kt | 8 +- .../protocol/testutil/deserialize.kt | 24 +++ .../testutil/handshakeSerializerTest.kt | 4 +- .../libquassel/protocol/testutil/serialize.kt | 13 ++ .../testutil/testHandshakeSerializerDirect.kt | 4 +- .../testHandshakeSerializerEncoded.kt | 4 +- settings.gradle.kts | 1 - 116 files changed, 1250 insertions(+), 782 deletions(-) delete mode 100644 libquassel-messages/build.gradle.kts delete mode 100644 libquassel-messages/gradle.properties delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/byteBufferOf.kt delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/deserialize.kt delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherChar.kt delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherString.kt delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/ByteBufferMatcher.kt delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/MapMatcher.kt delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/TemporalMatcher.kt delete mode 100644 libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/serialize.kt delete mode 100644 libquassel-messages/src/test/resources/quasseltest.crt delete mode 100644 libquassel-messages/src/test/resources/quasseltest.key delete mode 100644 libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/QuasselFeature.kt rename libquassel-protocol/src/main/{java/de/justjanne/libquassel/protocol/connection/ConnectionHeader.kt => kotlin/de/justjanne/libquassel/protocol/connection/ClientHeader.kt} (81%) rename libquassel-protocol/src/main/{java/de/justjanne/libquassel/protocol/connection/ConnectionHeaderSerializer.kt => kotlin/de/justjanne/libquassel/protocol/connection/ClientHeaderSerializer.kt} (92%) rename libquassel-protocol/src/main/{java/de/justjanne/libquassel/protocol/connection/ProtocolInfo.kt => kotlin/de/justjanne/libquassel/protocol/connection/CoreHeader.kt} (75%) rename libquassel-protocol/src/main/{java/de/justjanne/libquassel/protocol/connection/ProtocolInfoSerializer.kt => kotlin/de/justjanne/libquassel/protocol/connection/CoreHeaderSerializer.kt} (79%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/connection/ProtocolFeature.kt (82%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/connection/ProtocolMeta.kt (81%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/connection/ProtocolMetaSerializer.kt (89%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/connection/ProtocolVersion.kt (76%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/features/FeatureSet.kt (75%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/features/LegacyFeature.kt (61%) create mode 100644 libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeature.kt create mode 100644 libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/io/ByteBufferUtil.kt (71%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt (59%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/io/StringEncoder.kt (88%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/HandshakeSerializer.kt (63%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/HandshakeSerializers.kt (58%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/NoSerializerForTypeException.kt (75%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/QtSerializer.kt (65%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/QtSerializers.kt (94%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/QuasselSerializer.kt (81%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/QuasselSerializers.kt (92%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/Serializer.kt (62%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/ClientInitAckSerializer.kt (90%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/ClientInitRejectSerializer.kt (85%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/ClientInitSerializer.kt (89%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/ClientLoginAckSerializer.kt (84%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/ClientLoginRejectSerializer.kt (85%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/ClientLoginSerializer.kt (86%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/CoreSetupAckSerializer.kt (84%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/CoreSetupDataSerializer.kt (90%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/CoreSetupRejectSerializer.kt (85%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/SessionInitSerializer.kt (88%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/DateSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/DateTimeSerializer.kt (96%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializer.kt (94%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/IntSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/LongSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializer.kt (98%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/QStringListSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializer.kt (98%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializer.kt (96%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/StringSerializer.kt (94%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerAscii.kt (95%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf16.kt (95%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf8.kt (95%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/TimeSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializer.kt (98%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializer.kt (99%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializer.kt (98%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializer.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializer.kt (95%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt (98%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/BufferActivity.kt (77%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/BufferId.kt (79%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/BufferInfo.kt (77%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/BufferType.kt (77%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/DccIpDetectionMode.kt (91%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/DccPortSelectionMode.kt (91%) rename {libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake => libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types}/HandshakeMessage.kt (97%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/IdentityId.kt (79%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/Message.kt (74%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/MessageFlag.kt (74%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/MessageType.kt (63%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/MsgId.kt (75%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/NetworkId.kt (79%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/NetworkLayerProtocol.kt (68%) create mode 100644 libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/QStringList.kt rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/SignedId.kt (84%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/types/TimeSpec.kt (100%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/variant/QVariant.kt (62%) create mode 100644 libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantList.kt create mode 100644 libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/variant/QtType.kt (63%) rename libquassel-protocol/src/main/{java => kotlin}/de/justjanne/libquassel/protocol/variant/QuasselType.kt (97%) rename libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/connection/{ConnectionHeaderSerializerTest.kt => ClientHeaderSerializerTest.kt} (92%) rename {libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers}/handshake/ClientInitSerializerTest.kt (91%) rename {libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol}/testutil/handshakeSerializerTest.kt (93%) rename {libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol}/testutil/testHandshakeSerializerDirect.kt (90%) rename {libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages => libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol}/testutil/testHandshakeSerializerEncoded.kt (92%) diff --git a/gradle.properties b/gradle.properties index 06e6f52..42e8ad2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ kotlinBitflagsVersion=1.1.0 sl4jVersion=1.7.30 testcontainersCiVersion=1.1.0 GROUP=de.justjanne.libquassel -VERSION_NAME=0.1.0 +VERSION_NAME=0.2.0 POM_URL=https://git.kuschku.de/justJanne/libquassel POM_SCM_URL=https://git.kuschku.de/justJanne/libquassel POM_SCM_CONNECTION=scm:git:https://git.kuschku.de/justJanne/libquassel.git diff --git a/libquassel-client/build.gradle.kts b/libquassel-client/build.gradle.kts index 63ff1a4..4159a46 100644 --- a/libquassel-client/build.gradle.kts +++ b/libquassel-client/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencies { - api(project(":libquassel-messages")) + api(project(":libquassel-protocol")) val testcontainersCiVersion: String by project testImplementation("de.justjanne", "testcontainers-ci", testcontainersCiVersion) diff --git a/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/EndToEndTest.kt b/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/EndToEndTest.kt index 818a6b2..c7941c2 100644 --- a/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/EndToEndTest.kt +++ b/libquassel-client/src/test/kotlin/de/justjanne/libquassel/client/EndToEndTest.kt @@ -23,21 +23,21 @@ import de.justjanne.bitflags.of import de.justjanne.libquassel.client.io.CoroutineChannel import de.justjanne.libquassel.client.testutil.QuasselCoreContainer import de.justjanne.libquassel.client.testutil.TestX509TrustManager -import de.justjanne.libquassel.messages.handshake.ClientInitSerializer -import de.justjanne.libquassel.messages.handshake.ClientLoginSerializer -import de.justjanne.libquassel.messages.handshake.CoreSetupDataSerializer -import de.justjanne.libquassel.messages.handshake.HandshakeMessage -import de.justjanne.libquassel.messages.handshake.HandshakeSerializers -import de.justjanne.libquassel.protocol.connection.ConnectionHeader -import de.justjanne.libquassel.protocol.connection.ConnectionHeaderSerializer +import de.justjanne.libquassel.protocol.connection.ClientHeader +import de.justjanne.libquassel.protocol.connection.ClientHeaderSerializer +import de.justjanne.libquassel.protocol.connection.CoreHeaderSerializer import de.justjanne.libquassel.protocol.connection.ProtocolFeature -import de.justjanne.libquassel.protocol.connection.ProtocolInfoSerializer import de.justjanne.libquassel.protocol.connection.ProtocolMeta import de.justjanne.libquassel.protocol.connection.ProtocolVersion import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.io.ChainedByteBuffer +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializers +import de.justjanne.libquassel.protocol.serializers.handshake.ClientInitSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.ClientLoginSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.CoreSetupDataSerializer import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer import de.justjanne.libquassel.protocol.serializers.qt.IntSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.into import de.justjanne.testcontainersci.api.providedContainer import de.justjanne.testcontainersci.extension.CiContainers @@ -80,17 +80,17 @@ class EndToEndTest { println("Writing protocol") write(sizePrefix = false) { - ConnectionHeaderSerializer.serialize( + ClientHeaderSerializer.serialize( it, - ConnectionHeader( + ClientHeader( features = ProtocolFeature.of( ProtocolFeature.Compression, ProtocolFeature.TLS ), versions = listOf( ProtocolMeta( - 0x0000u, ProtocolVersion.Datastream, + 0x0000u, ), ) ), @@ -100,19 +100,19 @@ class EndToEndTest { println("Reading protocol") read(4) { - val protocol = ProtocolInfoSerializer.deserialize(it, connectionFeatureSet) + val protocol = CoreHeaderSerializer.deserialize(it, connectionFeatureSet) assertEquals( ProtocolFeature.of( ProtocolFeature.TLS, ProtocolFeature.Compression ), - protocol.flags + protocol.features ) println("Negotiated protocol $protocol") - if (protocol.flags.contains(ProtocolFeature.TLS)) { + if (protocol.features.contains(ProtocolFeature.TLS)) { channel.enableTLS(sslContext) } - if (protocol.flags.contains(ProtocolFeature.Compression)) { + if (protocol.features.contains(ProtocolFeature.Compression)) { channel.enableCompression() } } diff --git a/libquassel-messages/build.gradle.kts b/libquassel-messages/build.gradle.kts deleted file mode 100644 index 84b7c31..0000000 --- a/libquassel-messages/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - id("com.vanniktech.maven.publish") -} - -dependencies { - api(project(":libquassel-protocol")) - - val testcontainersCiVersion: String by project - testImplementation("de.justjanne", "testcontainers-ci", testcontainersCiVersion) - val sl4jVersion: String by project - testImplementation("org.slf4j", "slf4j-simple", sl4jVersion) -} diff --git a/libquassel-messages/gradle.properties b/libquassel-messages/gradle.properties deleted file mode 100644 index 49edf04..0000000 --- a/libquassel-messages/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -POM_ARTIFACT_ID=libquassel-messages -POM_NAME=libquassel Messages -POM_DESCRIPTION=Library implementing Quassel's RPC messages for Kotlin diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/byteBufferOf.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/byteBufferOf.kt deleted file mode 100644 index 267a6f3..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/byteBufferOf.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package de.justjanne.libquassel.messages.testutil - -import java.nio.ByteBuffer - -@Suppress("NOTHING_TO_INLINE") -inline fun byteBufferOf( - vararg elements: Byte -): ByteBuffer = ByteBuffer.wrap(byteArrayOf(*elements)) - -@Suppress("NOTHING_TO_INLINE") -inline fun byteBufferOf( - vararg elements: UByte -): ByteBuffer = ByteBuffer.wrap(ubyteArrayOf(*elements).toByteArray()) - -@Suppress("NOTHING_TO_INLINE") -inline fun byteBufferOf(): ByteBuffer = - ByteBuffer.allocateDirect(0) diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/deserialize.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/deserialize.kt deleted file mode 100644 index 7de507e..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/deserialize.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package de.justjanne.libquassel.messages.testutil - -import de.justjanne.libquassel.messages.handshake.HandshakeSerializer -import de.justjanne.libquassel.protocol.features.FeatureSet -import de.justjanne.libquassel.protocol.serializers.Serializer -import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer -import org.hamcrest.Matcher -import org.hamcrest.MatcherAssert.assertThat -import org.junit.jupiter.api.Assertions.assertEquals -import java.nio.ByteBuffer - -fun <T> deserialize( - serializer: Serializer<T>, - buffer: ByteBuffer, - featureSet: FeatureSet = FeatureSet.all() -): T { - val result = serializer.deserialize(buffer, featureSet) - assertEquals(0, buffer.remaining()) - return result -} - -fun <T> testDeserialize( - serializer: HandshakeSerializer<T>, - matcher: Matcher<in T>, - buffer: ByteBuffer, - featureSet: FeatureSet = FeatureSet.all() -) { - val map = deserialize(HandshakeMapSerializer, buffer, featureSet) - val after = serializer.deserialize(map) - assertThat(after, matcher) -} - -fun <T> testDeserialize( - serializer: HandshakeSerializer<T>, - data: T, - buffer: ByteBuffer, - featureSet: FeatureSet = FeatureSet.all() -) { - val map = deserialize(HandshakeMapSerializer, buffer, featureSet) - val after = serializer.deserialize(map) - assertEquals(data, after) -} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherChar.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherChar.kt deleted file mode 100644 index 4c83d1e..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherChar.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package de.justjanne.libquassel.protocol.testutil.matchers - -import org.hamcrest.BaseMatcher -import org.hamcrest.Description - -class BomMatcherChar(private val expected: Char) : BaseMatcher<Char>() { - private val malformed = charArrayOf( - '\uFFFE', '\uFEFF', '\uFFFD', '' - ) - - override fun describeTo(description: Description?) { - description?.appendText(expected.toString()) - } - - override fun matches(item: Any?): Boolean { - if (item is Char) { - return (item == expected) || (item in malformed && expected in malformed) - } - return false - } -} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherString.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherString.kt deleted file mode 100644 index 4173866..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/BomMatcherString.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package de.justjanne.libquassel.protocol.testutil.matchers - -import org.hamcrest.BaseMatcher -import org.hamcrest.Description - -class BomMatcherString(private val expected: String?) : BaseMatcher<String?>() { - private val malformed = charArrayOf( - '', '' - ) - - override fun describeTo(description: Description?) { - description?.appendText(expected) - } - - override fun matches(item: Any?) = - (item as? String)?.endsWith(expected?.trimStart(*malformed) ?: "") == true -} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/ByteBufferMatcher.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/ByteBufferMatcher.kt deleted file mode 100644 index e8a6e9c..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/ByteBufferMatcher.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package de.justjanne.libquassel.protocol.testutil.matchers - -import de.justjanne.libquassel.protocol.io.contentToString -import de.justjanne.libquassel.protocol.io.isEmpty -import org.hamcrest.BaseMatcher -import org.hamcrest.Description -import java.nio.ByteBuffer - -class ByteBufferMatcher(buffer: ByteBuffer?) : BaseMatcher<ByteBuffer>() { - private val expected = buffer?.let { original -> - val copy = ByteBuffer.allocateDirect(original.limit()) - original.rewind() - copy.put(original) - copy.rewind() - original.rewind() - copy - } - - override fun describeTo(description: Description?) { - description?.appendText(expected?.contentToString()) - } - - override fun describeMismatch(item: Any?, description: Description?) { - description?.appendText("was ") - description?.appendText((item as? ByteBuffer)?.rewind()?.contentToString()) - } - - override fun matches(item: Any?): Boolean { - val actual = item as? ByteBuffer - - if (actual.isEmpty() && expected.isEmpty()) { - return true - } - - return actual?.rewind()?.contentToString() == expected?.rewind()?.contentToString() - } -} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/MapMatcher.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/MapMatcher.kt deleted file mode 100644 index cded0d1..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/MapMatcher.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.justjanne.libquassel.protocol.testutil.matchers - -import org.hamcrest.BaseMatcher -import org.hamcrest.Description - -class MapMatcher<K, V>( - private val expected: Map<K, V> -) : BaseMatcher<Map<K, V>>() { - override fun describeTo(description: Description?) { - description?.appendText(expected.toString()) - } - - override fun describeMismatch(item: Any?, description: Description?) { - if (item is Map<*, *>) { - for (key in expected.keys) { - if (!item.containsKey(key)) { - description?.appendText(" did not have key $key") - } - if (expected[key] != item[key]) { - description?.appendText(" key $key was: ${item[key]} instead of ${expected[key]}") - } - } - } else { - description?.appendText("was: $item") - } - } - - override fun matches(item: Any?): Boolean { - if (item is Map<*, *>) { - for (key in expected.keys) { - if (!item.containsKey(key)) { - return false - } - if (expected[key] != item[key]) { - return false - } - } - return true - } else { - return false - } - } -} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/TemporalMatcher.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/TemporalMatcher.kt deleted file mode 100644 index eb9a46c..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/matchers/TemporalMatcher.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package de.justjanne.libquassel.protocol.testutil.matchers - -import org.hamcrest.BaseMatcher -import org.hamcrest.Description -import org.threeten.bp.Instant -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalTime -import org.threeten.bp.OffsetDateTime -import org.threeten.bp.ZonedDateTime -import org.threeten.bp.temporal.Temporal - -class TemporalMatcher<T : Temporal>( - private val expected: T -) : BaseMatcher<T>() { - override fun describeTo(description: Description?) { - description?.appendText(expected.toString()) - } - - override fun matches(item: Any?): Boolean { - return when { - expected is ZonedDateTime && item is ZonedDateTime -> - expected == item - expected is ZonedDateTime && item is OffsetDateTime -> - expected.toOffsetDateTime() == item - expected is OffsetDateTime && item is OffsetDateTime -> - expected == item - expected is LocalDateTime && item is LocalDateTime -> - expected == item - expected is LocalTime && item is LocalTime -> - expected == item - expected is LocalDate && item is LocalDate -> - expected == item - expected is Instant && item is Instant -> - expected == item - else -> - false - } - } -} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/serialize.kt b/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/serialize.kt deleted file mode 100644 index b2be32a..0000000 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/serialize.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package de.justjanne.libquassel.messages.testutil - -import de.justjanne.libquassel.messages.handshake.HandshakeSerializer -import de.justjanne.libquassel.protocol.features.FeatureSet -import de.justjanne.libquassel.protocol.io.ChainedByteBuffer -import de.justjanne.libquassel.protocol.serializers.Serializer -import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer -import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher -import org.hamcrest.MatcherAssert.assertThat -import java.nio.ByteBuffer - -fun <T> serialize( - serializer: Serializer<T>, - data: T, - featureSet: FeatureSet = FeatureSet.all() -): ByteBuffer { - val buffer = ChainedByteBuffer() - serializer.serialize(buffer, data, featureSet) - return buffer.toBuffer() -} - -fun <T> testSerialize( - serializer: HandshakeSerializer<T>, - data: T, - buffer: ByteBuffer, - featureSet: FeatureSet = FeatureSet.all() -) { - val map = serializer.serialize(data) - val after = serialize(HandshakeMapSerializer, map, featureSet) - assertThat(after, ByteBufferMatcher(buffer)) -} diff --git a/libquassel-messages/src/test/resources/quasseltest.crt b/libquassel-messages/src/test/resources/quasseltest.crt deleted file mode 100644 index 8d0bd31..0000000 --- a/libquassel-messages/src/test/resources/quasseltest.crt +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFHzCCAwegAwIBAgIUEV/Rf5DceQhjul2yqHDa/ODr5+YwDQYJKoZIhvcNAQEL -BQAwHjEcMBoGA1UEAwwTcXVhc3NlbHRlc3QuaW52YWxpZDAgFw0yMTAyMDgyMzM5 -MjRaGA8yMTIxMDExNTIzMzkyNFowHjEcMBoGA1UEAwwTcXVhc3NlbHRlc3QuaW52 -YWxpZDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM2OZTae4BKzppB2 -nEF2e2oGLl1YGaCfqaVeQjKNS3DY8fjIG9lb6hDzE1MneoGtou7TafWvqh2u1Q8p -aRNpcW+ftTqcUecGPuMTQHHSWjZJDocvH2vG5xM48u5DqLNUThs7eEoPis7AGpus -7xm8wmjGokKYZb6WdXGLcOEPLb2ZSQH4MRHkAMtM1zF3/L0bYzRLil9+aQ6y0P3/ -4hRfUiy5ZkIiPS3+fJPOj/ZaABukLtffWicbeAvNDk7Jp2FvoVfXPXU14CXQaV16 -BhfCbWHamUM4d0ZWu85J8Jbon+JRfmIvg+0z4nlZaJ6a23nkO4ljL6IKdwlEUYbM -uZ4bimCxmk2g3t27DxDBYAeudCQYQjvlA7fYf9b2tBjdvVx7BRyFk09Z+zSWKXVx -67iL5nURY8iOY+sHF7t/D/vbDx1/nDkXZPxEl1jZlDnu2xCkM8sYgocXsfjIaW3f -1dcGJ6lr50g69LgTBBuT2Db3Li91nAr3s+V5Urf1CcTMFipNAdeY3qN717LzKsJS -FpjAtvUJQhPin9Is0AZkYCrDxIYZJYgQZaeDCrXRQwoS8qIhXWbgHXRPUTwgGzmS -og62+rfwn3JDRDKOGuiYIc8uhBj0mOOV/GBegFg1cskaX+EMvdurx2jyNc6y1JOG -WJHZ2ctMSHlkm4/vG9lEHoW43HcPAgMBAAGjUzBRMB0GA1UdDgQWBBQ4uKrImjUv -C/TJhb03I3YJEjgjrjAfBgNVHSMEGDAWgBQ4uKrImjUvC/TJhb03I3YJEjgjrjAP -BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCMahqY1LVdSny9oc7B -AGET5Y/sTdALZN/GslYWjY9iTNx4kXz6u0654onDTBHZ6c+8+dmZdWFrdPTzJuJX -dB4HqQyY2tLhR3N44F6LRkx97klbvSscMJr3QK4344AtksbEq1BGeDCm5VeaZZJU -A+WSNXjJC22EFR5RLftdArRquJVcwCDPWI1lf/iv/iXJPpv8Mq5qFpY1Agusi/sv -PLO6GVV2qPADoI0NjgYCjJ2VVJQeHasFCC+izihmrTQUMc4G/JF9gHMPOLRofm32 -zMQ8LK+iWa9p+VoRbdnsWDw4Fy9s34VXuT5ijAz6KbQ8v9alQv6VfYwnZCrylyKH -K3vWg7g1tlyMZP7ExzHfu428lVmYZbf1k7GUA+2Qu9s/jPfszwQzdDnr5dN9jCUj -CIqLXoHZeyIc2Cxu1KMaZvkPVn2/zJUa3RNLfcl+1pGOCwaUd5lcGtdzrk/9lZwR -zHh9nvQWPAE2r36E7CtOgy0uMIfFdNnDc1iYKU2I9075k+bo7y4zvO9gQx3dmkxU -SCm2sKQzkScSBPtCBtsfKfN4csL5FyLevl7C5izpQqtChqLZu9XXDNVTE7jd48Wy -VrIlBGHwGkksmYUqALI81bvBaOZ1GytAIMbRNQ8YRLIPvjuL/CorfqrR5kEKXqsd -eZw3w5qGASg6Xk0d9OxKyjHKeQ== ------END CERTIFICATE----- diff --git a/libquassel-messages/src/test/resources/quasseltest.key b/libquassel-messages/src/test/resources/quasseltest.key deleted file mode 100644 index 1a2218e..0000000 --- a/libquassel-messages/src/test/resources/quasseltest.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQDNjmU2nuASs6aQ -dpxBdntqBi5dWBmgn6mlXkIyjUtw2PH4yBvZW+oQ8xNTJ3qBraLu02n1r6odrtUP -KWkTaXFvn7U6nFHnBj7jE0Bx0lo2SQ6HLx9rxucTOPLuQ6izVE4bO3hKD4rOwBqb -rO8ZvMJoxqJCmGW+lnVxi3DhDy29mUkB+DER5ADLTNcxd/y9G2M0S4pffmkOstD9 -/+IUX1IsuWZCIj0t/nyTzo/2WgAbpC7X31onG3gLzQ5Oyadhb6FX1z11NeAl0Gld -egYXwm1h2plDOHdGVrvOSfCW6J/iUX5iL4PtM+J5WWiemtt55DuJYy+iCncJRFGG -zLmeG4pgsZpNoN7duw8QwWAHrnQkGEI75QO32H/W9rQY3b1cewUchZNPWfs0lil1 -ceu4i+Z1EWPIjmPrBxe7fw/72w8df5w5F2T8RJdY2ZQ57tsQpDPLGIKHF7H4yGlt -39XXBiepa+dIOvS4EwQbk9g29y4vdZwK97PleVK39QnEzBYqTQHXmN6je9ey8yrC -UhaYwLb1CUIT4p/SLNAGZGAqw8SGGSWIEGWngwq10UMKEvKiIV1m4B10T1E8IBs5 -kqIOtvq38J9yQ0QyjhromCHPLoQY9JjjlfxgXoBYNXLJGl/hDL3bq8do8jXOstST -hliR2dnLTEh5ZJuP7xvZRB6FuNx3DwIDAQABAoICAA1xaJEf5suSUCxWdXWaiAux -B8s2/cYRawjTl0SzFOH2biy0+Y1Hg5FENFlV1Z8xedxgmydkK53xVyG8tZB9btu7 -+CAzJPAU6nvzQF2xQhEWygpxPH7R7T7GlKycZCYGN210gDNnvM40pgjUUHbAb35m -rynnyY+jS173nZQ6Z+VkZu/oCV2AKcUh61ji3faIGf7Liesg20II074ow+JNMZSX -M2bT0mh1ojQQaD3WOPeVzzJy+vRfyYQMDwl8CqRGpqiV/QDzWwteC+X/GvLm1jx2 -DVvmD3bcKUAeecuEvyAP8FH/hYM3x3HkNQFaY0wfbv1XLUBNqudCPoqwTNtYNb5q -7/IDRJaAXv016XHd31AHPtbzwlLztFiTycnmL/exfxZDEXaAU28C5PuYyLQNqm7s -k6A9BtNYwcffbs2TyAq6RgOQs2ERWdHhk8syPNwBdgeXTXSLqubTD87ySb/YfLhY -/Y/o91a0N4AhJJDf5jJxJfkzDfRwIijo5mnUSpkEtd48uR14stsyOLtFWRl+oclN -o8rCjwauHG7AeFpz1hdh2CQe0tMohf/TnuSpDxokJQwmTIKgXgubslfHtnoW0KFk -jKhwQp2r3+1mnxOS1nqFUtnS+Gq6vYY/lT7q6nCjKKmll7c1n14Ptx+U6IoBrap1 -qt81ltxnTvYIorMGugphAoIBAQD/45TfSd5+G+Vc2i9rGk7XN3agWkmQtJWt19NF -O7sFfPR3bA9JqI3YAl7z4hvu4nTQHEWMNUxDpDjg5/CEoyar4WcxMAQ85J0w2LcM -IXSOICbpWHZx1TiAj/6iAjghfzYmQPcoQXs5GLlgN8IL6+jJGckacUdJJL8bG5UH -objYg8Zc1D3qPEnLobL8Kt/ixS+lqsVw+FDF35alIUMD0ZJrSU94nDNqt+HCE1xP -MFmWYsy68ey03gxC2vw3+tTDs0+521l/0yw+m/F4p/92BHnk/Jta8egF/4moJl+T -j4AHnYiCpH+6O1KQkum82HkBGbMHkb6i0gMMtLbC5jHxGoZ5AoIBAQDNpTlXOld1 -9kzoII6ZDUQUEuHId9AdjCn7beki2PZOiq31j67QiSoCIAKtFhrb8PjJyaxNYKas -NXk6P6MD5gVDQojeBv24cayGG95FCUYtIVD2Hrm7/sR2wkJRvBROlYakRC/zkPkG -dyEtfivIUBznBM4MI3gx741lBVFppAdqw2qN6JQMoUVAoEPkiEg7wy+fQUWz2OMr -vZ1yIPxJDh2c7PKIUf7x6H08THOXVZ+sWzoFHZ4CVsHbs23Z3IRLwT4YD+TdD+in -zMa1m14e3xtt5qLpE+zeSB/WUWZKpSlgUKhRylgdqb/r85RIW7oaWk7ICfCa9YL1 -jeDyLyYubafHAoIBADhbhVRQTqJzvmZe34a1OpwH6SaT/BPU0gqBuFRNPXmN9cG/ -mPZeGy9yBjuslv5b/eI/98lTi8JyDtzp+H0d+cxtTm705loK99vkPxx62dLbnfZS -t3OGxHT8QdaoqngmLmTqdgT1tw/yNBHO9fvuL0zrUvFx9YNUhoqP3pjZs35sN2oG -jMRkFtS0flkvkDO/vii8ndOtvQx3nBQuaTYUGC1s7gXgUSq16RD3dqMyQOjwRar+ -0WVcalLnLBmgMvAPNAX5G5MdjWcUrXAngAocHkSipgy3rqRzjXvtR6uWNVp4BbLQ -TBlWK28QDE69Vpk5cca/AL+XhXhs7LusO1+gufECggEAfGgLA2ERDhTdu8QOYDrt -R3OQ0bTh2y4zK573XhSBFUzCJn8w04lXN4fj9pAb2Ziy+Wge64Sf8Cg9WWasGKyr -3F/A6wixr0Zdh5gOZBdTM/QmxW4bEMb0VZ/5fPbaFhxRIsj5dVDrxeSF1r6wf/Mv -OPboK+G9UgBIuqd38/++WPE1YfokrmtVuN37lKJ5iGXxRle3cjCwZYLFYAjidtOq -SIfzxVJNeE0cjkD14MR031ElDXk4YNPZXS70Mss74ZRbGzVqT+3S4sh4Id+HFggE -0Pyo63YZYvOhBwehaWD3YgQJf8l4eyF5MKXfu9J6CH0/kbapryT9f83AGuM5JvdB -ewKCAQAoVN+HS/af2O09+3TEtFyv4m5ozFB6ntaC12dhrboVwAw8MPLGXaEqsfPV -L9ORMA6lRL+4OIo2FcM6TklD/rMAHr/b9VtWou8EReiOR1zSgt7opCZ6wLhBnp9P -msz1puP/O+SR3lrcQOmETMK7ofqoewem5rz0CmTraXqreHuzRX+c/nWQqmJDyN8o -NeHhG5sItIhePpNQ+QcPezVyl++vMHFwOO92o+i/z7zH6ucR+g8OR41vXjIQEP5n -5w9OGyOxVfgFhO6Q+CUfIs3JMlwo/XkwFp2NJohNWAPzPIyJ5V9XpJkuaWJ17c/U -jwfYNzNlv1pDyVGAaI8oMDXRMaZ3 ------END PRIVATE KEY----- diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/QuasselFeature.kt b/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/QuasselFeature.kt deleted file mode 100644 index 23160e7..0000000 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/QuasselFeature.kt +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Quasseldroid - Quassel client for Android - * - * Copyright (c) 2021 Janne Mareike Koschinski - * Copyright (c) 2021 The Quassel Project - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.justjanne.libquassel.protocol.features - -import de.justjanne.libquassel.annotations.Generated - -@Generated -inline class QuasselFeatureName( - val name: String, -) - -enum class QuasselFeature { - SynchronizedMarkerLine, - SaslAuthentication, - SaslExternal, - HideInactiveNetworks, - PasswordChange, - - /** IRCv3 capability negotiation, account tracking */ - CapNegotiation, - - /** IRC server SSL validation */ - VerifyServerSSL, - - /** IRC server custom message rate limits */ - CustomRateLimits, - - // Currently not supported - DccFileTransfer, - - /** Timestamp formatting in away (e.g. %%hh:mm%%) */ - AwayFormatTimestamp, - - /** Whether or not the core supports auth backends. */ - Authenticators, - - /** Sync buffer activity status */ - BufferActivitySync, - - /** Core-Side highlight configuration and matching */ - CoreSideHighlights, - - /** Show prefixes for senders in backlog */ - SenderPrefixes, - - /** Supports RPC call disconnectFromCore to remotely disconnect a client */ - RemoteDisconnect, - - /** Transmit features as list of strings */ - ExtendedFeatures, - - /** Serialize message time as 64-bit */ - LongTime, - - /** Real Name and Avatar URL in backlog */ - RichMessages, - - /** Backlogmanager supports filtering backlog by messagetype */ - BacklogFilterType, - - /** ECDSA keys for CertFP in identities */ - EcdsaCertfpKeys, - - /** 64-bit IDs for messages */ - LongMessageId, - - /** CoreInfo dynamically updated using signals */ - SyncedCoreInfo; - - val feature = QuasselFeatureName(name) - - companion object { - private val values = values().associateBy(QuasselFeature::feature) - - @JvmStatic - fun valueOf(name: QuasselFeatureName): QuasselFeature? = values[name] - } -} diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ConnectionHeader.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeader.kt similarity index 81% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ConnectionHeader.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeader.kt index bf056f5..9c7570e 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ConnectionHeader.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeader.kt @@ -19,7 +19,16 @@ package de.justjanne.libquassel.protocol.connection -data class ConnectionHeader( +/** + * Model encapsulating the client side of protocol negotiation + */ +data class ClientHeader( + /** + * Supported protocol features + */ val features: ProtocolFeatures, + /** + * Supported protocol version/meta pairs + */ val versions: List<ProtocolMeta> ) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ConnectionHeaderSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeaderSerializer.kt similarity index 92% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ConnectionHeaderSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeaderSerializer.kt index 4cc3b7a..802fe47 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ConnectionHeaderSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeaderSerializer.kt @@ -28,7 +28,10 @@ import de.justjanne.libquassel.protocol.serializers.qt.UByteSerializer import de.justjanne.libquassel.protocol.serializers.qt.UIntSerializer import java.nio.ByteBuffer -object ConnectionHeaderSerializer : Serializer<ConnectionHeader> { +/** + * Serializer for a [ClientHeader] + */ +object ClientHeaderSerializer : Serializer<ClientHeader> { private const val magic: UInt = 0x42b3_3f00u private const val featureMask: UInt = 0x0000_00ffu private const val lastMagic: UByte = 0x80u @@ -69,14 +72,14 @@ object ConnectionHeaderSerializer : Serializer<ConnectionHeader> { return list } - override fun serialize(buffer: ChainedByteBuffer, data: ConnectionHeader, featureSet: FeatureSet) { + override fun serialize(buffer: ChainedByteBuffer, data: ClientHeader, featureSet: FeatureSet) { UIntSerializer.serialize(buffer, addMagic(data.features.toBits()), featureSet) writeList(buffer, data.versions, featureSet) { ProtocolMetaSerializer.serialize(buffer, it, featureSet) } } - override fun deserialize(buffer: ByteBuffer, featureSet: FeatureSet) = ConnectionHeader( + override fun deserialize(buffer: ByteBuffer, featureSet: FeatureSet) = ClientHeader( features = ProtocolFeature.of( removeMagic(UIntSerializer.deserialize(buffer, featureSet)) ), diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolInfo.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/CoreHeader.kt similarity index 75% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolInfo.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/CoreHeader.kt index 920541d..7b09711 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolInfo.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/CoreHeader.kt @@ -19,7 +19,16 @@ package de.justjanne.libquassel.protocol.connection -data class ProtocolInfo( - val flags: ProtocolFeatures, - val meta: ProtocolMeta, +/** + * Model encapsulating the core side of protocol negotiation + */ +data class CoreHeader( + /** + * Supported protocol features + */ + val features: ProtocolFeatures, + /** + * Chosen protocol version/meta pair + */ + val version: ProtocolMeta, ) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolInfoSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/CoreHeaderSerializer.kt similarity index 79% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolInfoSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/CoreHeaderSerializer.kt index a156b97..d2b36a3 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolInfoSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/CoreHeaderSerializer.kt @@ -27,13 +27,16 @@ import de.justjanne.libquassel.protocol.serializers.Serializer import de.justjanne.libquassel.protocol.serializers.qt.UByteSerializer import java.nio.ByteBuffer -object ProtocolInfoSerializer : Serializer<ProtocolInfo> { - override fun serialize(buffer: ChainedByteBuffer, data: ProtocolInfo, featureSet: FeatureSet) { - UByteSerializer.serialize(buffer, data.flags.toBits(), featureSet) - ProtocolMetaSerializer.serialize(buffer, data.meta, featureSet) +/** + * Serializer for a [CoreHeader] + */ +object CoreHeaderSerializer : Serializer<CoreHeader> { + override fun serialize(buffer: ChainedByteBuffer, data: CoreHeader, featureSet: FeatureSet) { + UByteSerializer.serialize(buffer, data.features.toBits(), featureSet) + ProtocolMetaSerializer.serialize(buffer, data.version, featureSet) } - override fun deserialize(buffer: ByteBuffer, featureSet: FeatureSet) = ProtocolInfo( + override fun deserialize(buffer: ByteBuffer, featureSet: FeatureSet) = CoreHeader( ProtocolFeature.of(UByteSerializer.deserialize(buffer, featureSet)), ProtocolMetaSerializer.deserialize(buffer, featureSet) ) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolFeature.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolFeature.kt similarity index 82% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolFeature.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolFeature.kt index c0ada8f..eb8a59e 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolFeature.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolFeature.kt @@ -23,11 +23,19 @@ import de.justjanne.bitflags.Flag import de.justjanne.bitflags.Flags import de.justjanne.bitflags.toEnumSet +/** + * Model representing protocol-level features + */ enum class ProtocolFeature( override val value: UByte, ) : Flag<UByte> { - None(0x00u), + /** + * Model representing whether TLS is supported + */ TLS(0x01u), + /** + * Model representing whether DEFLATE compression is supported + */ Compression(0x02u); companion object : Flags<UByte, ProtocolFeature> { @@ -36,4 +44,7 @@ enum class ProtocolFeature( } } +/** + * Model representing a bitfield of [ProtocolFeature] flags + */ typealias ProtocolFeatures = Set<ProtocolFeature> diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolMeta.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolMeta.kt similarity index 81% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolMeta.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolMeta.kt index c9165f3..b81652c 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolMeta.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolMeta.kt @@ -19,7 +19,16 @@ package de.justjanne.libquassel.protocol.connection +/** + * Model representing a supported protocol configuration + */ data class ProtocolMeta( - val data: UShort, - val version: ProtocolVersion + /** + * Protocol version + */ + val version: ProtocolVersion, + /** + * Protocol metadata + */ + val data: UShort ) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolMetaSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolMetaSerializer.kt similarity index 89% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolMetaSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolMetaSerializer.kt index 7d6f260..b3fd3bc 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolMetaSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolMetaSerializer.kt @@ -26,6 +26,9 @@ import de.justjanne.libquassel.protocol.serializers.qt.UByteSerializer import de.justjanne.libquassel.protocol.serializers.qt.UShortSerializer import java.nio.ByteBuffer +/** + * Serializer for a [ProtocolMeta] + */ object ProtocolMetaSerializer : Serializer<ProtocolMeta> { override fun serialize(buffer: ChainedByteBuffer, data: ProtocolMeta, featureSet: FeatureSet) { UShortSerializer.serialize(buffer, data.data, featureSet) @@ -33,7 +36,7 @@ object ProtocolMetaSerializer : Serializer<ProtocolMeta> { } override fun deserialize(buffer: ByteBuffer, featureSet: FeatureSet) = ProtocolMeta( - UShortSerializer.deserialize(buffer, featureSet), - ProtocolVersion.of(UByteSerializer.deserialize(buffer, featureSet)) + data = UShortSerializer.deserialize(buffer, featureSet), + version = ProtocolVersion.of(UByteSerializer.deserialize(buffer, featureSet)) ) } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolVersion.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolVersion.kt similarity index 76% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolVersion.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolVersion.kt index 8ffcabf..059edd0 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/connection/ProtocolVersion.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/connection/ProtocolVersion.kt @@ -19,14 +19,31 @@ package de.justjanne.libquassel.protocol.connection +/** + * Model representing the possible protocol versions + */ enum class ProtocolVersion( + /** + * Protocol version id + */ val value: UByte, ) { + /** + * Legacy protocol, used up til Quassel 0.10, not fully supported by this library + */ Legacy(0x01u), + + /** + * Datastream protocol, introduced in Quassel 0.10. + */ Datastream(0x02u); companion object { private val values = values().associateBy(ProtocolVersion::value) + + /** + * Obtain the protocol version for a protocol version id + */ fun of(value: UByte): ProtocolVersion = values[value] ?: throw IllegalArgumentException("Protocol not supported: $value") } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/FeatureSet.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/FeatureSet.kt similarity index 75% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/FeatureSet.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/FeatureSet.kt index 9c34c5a..75adb73 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/FeatureSet.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/FeatureSet.kt @@ -21,20 +21,37 @@ package de.justjanne.libquassel.protocol.features import de.justjanne.bitflags.of +/** + * Model representing the set of negotiated or supported features for a + * connection or library + */ class FeatureSet internal constructor( private val features: Set<QuasselFeature>, private val additional: Set<QuasselFeatureName> = emptySet() ) { + /** + * Check whether a certain feature is supported + */ fun hasFeature(feature: QuasselFeature) = features.contains(feature) + /** + * List of features with their name, for serialization + */ fun featureList(): List<QuasselFeatureName> = features.map(QuasselFeature::feature) + additional + /** + * Set of supported [LegacyFeature]s + */ fun legacyFeatures(): LegacyFeatures = LegacyFeature.of(features.mapNotNull(LegacyFeature.Companion::get)) companion object { - fun parse( + /** + * Build a [FeatureSet] from a collection of feature names and a set of + * legacy features + */ + fun build( legacy: LegacyFeatures, features: Collection<QuasselFeatureName> ) = FeatureSet( @@ -42,9 +59,24 @@ class FeatureSet internal constructor( additional = unknownFeatures(features) ) + /** + * Build a [FeatureSet] directly from features + */ fun build(vararg features: QuasselFeature) = FeatureSet(features.toSet()) + + /** + * Build a [FeatureSet] directly from features + */ fun build(features: Set<QuasselFeature>) = FeatureSet(features) + + /** + * Model with all possible features enabled + */ fun all() = build(*QuasselFeature.values()) + + /** + * Model with no features enabled + */ fun none() = build() private fun parseFeatures(features: LegacyFeatures) = diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/LegacyFeature.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/LegacyFeature.kt similarity index 61% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/LegacyFeature.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/LegacyFeature.kt index 70ab07d..114e3f5 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/features/LegacyFeature.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/LegacyFeature.kt @@ -22,59 +22,106 @@ package de.justjanne.libquassel.protocol.features import de.justjanne.bitflags.Flag import de.justjanne.bitflags.Flags import de.justjanne.bitflags.toEnumSet +import de.justjanne.libquassel.protocol.types.MessageType /** - * A list of features that are optional in core and/or client, but need runtime checking + * List of optional features in a quassel connection. * - * Some features require an uptodate counterpart, but don't justify a protocol break. - * This is what we use this enum for. Add such features to it and check at runtime on the other - * side for their existence. - * - * This list should be cleaned up after every protocol break, as we can assume them to be present then. + * Replaced by [QuasselFeature] negotiation if both sides of the connection are + * new enough */ enum class LegacyFeature( override val value: UInt, + /** + * Modern feature corresponding to this legacy feature + */ val feature: QuasselFeature, ) : Flag<UInt> { + /** + * Support for a synced marker line/last read position + */ SynchronizedMarkerLine(0x0001u, QuasselFeature.SynchronizedMarkerLine), + + /** + * Support for configurable SASL authentication to replace NickServ + */ SaslAuthentication(0x0002u, QuasselFeature.SaslAuthentication), + + /** + * Support for certificate based SASL EXTERNAL authentication + */ SaslExternal(0x0004u, QuasselFeature.SaslExternal), + + /** + * Support for hiding inactive/disconnected networks in a chat list + */ HideInactiveNetworks(0x0008u, QuasselFeature.HideInactiveNetworks), + + /** + * Support for changing the password through the client + */ PasswordChange(0x0010u, QuasselFeature.PasswordChange), - /** IRCv3 capability negotiation, account tracking */ + /** + * IRCv3 capability negotiation, account tracking + */ CapNegotiation(0x0020u, QuasselFeature.CapNegotiation), - /** IRC server SSL validation */ + /** + * IRC server SSL validation + */ VerifyServerSSL(0x0040u, QuasselFeature.VerifyServerSSL), - /** IRC server custom message rate limits */ + /** + * IRC server custom message rate limits + */ CustomRateLimits(0x0080u, QuasselFeature.CustomRateLimits), + /** + * (X)DCC direct file transfers (EXPERIMENTAL) + */ DccFileTransfer(0x0100u, QuasselFeature.DccFileTransfer), - /** Timestamp formatting in away (e.g. %%hh:mm%%) */ + /** + * Timestamp formatting in away (e.g. %%hh:mm%%) + */ AwayFormatTimestamp(0x0200u, QuasselFeature.AwayFormatTimestamp), - /** Whether or not the core supports auth backends. */ + /** + * Whether or not the core supports auth backends. + */ Authenticators(0x0400u, QuasselFeature.Authenticators), - /** Sync buffer activity status */ + /** + * Sync buffer activity status + */ BufferActivitySync(0x0800u, QuasselFeature.BufferActivitySync), - /** Core-Side highlight configuration and matching */ + /** + * Core-Side highlight configuration and matching + */ CoreSideHighlights(0x1000u, QuasselFeature.CoreSideHighlights), - /** Show prefixes for senders in backlog */ + /** + * Show prefixes for senders in backlog + */ SenderPrefixes(0x2000u, QuasselFeature.SenderPrefixes), - /** Supports RPC call disconnectFromCore to remotely disconnect a client */ + /** + * Supports RPC call disconnectFromCore to remotely disconnect a client + */ RemoteDisconnect(0x4000u, QuasselFeature.RemoteDisconnect), - /** Transmit features as list of strings */ + /** + * Transmit features as list of strings + */ ExtendedFeatures(0x8000u, QuasselFeature.ExtendedFeatures); companion object : Flags<UInt, LegacyFeature> { private val features = values().associateBy(LegacyFeature::feature) + + /** + * Obtain by modern feature corresponding to this feature + */ fun get(feature: QuasselFeature) = features[feature] private val values = values().associateBy(LegacyFeature::value) @@ -82,4 +129,7 @@ enum class LegacyFeature( } } +/** + * Model representing a bitfield of [LegacyFeature] flags + */ typealias LegacyFeatures = Set<LegacyFeature> diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeature.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeature.kt new file mode 100644 index 0000000..84d97d0 --- /dev/null +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeature.kt @@ -0,0 +1,153 @@ +/* + * Quasseldroid - Quassel client for Android + * + * Copyright (c) 2021 Janne Mareike Koschinski + * Copyright (c) 2021 The Quassel Project + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3 as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package de.justjanne.libquassel.protocol.features + +/** + * List of optional features in a quassel connection. + * + * Replaces [LegacyFeature] negotiation if both sides of the connection are new + * enough + */ +enum class QuasselFeature { + /** + * Support for a synced marker line/last read position + */ + SynchronizedMarkerLine, + + /** + * Support for configurable SASL authentication to replace NickServ + */ + SaslAuthentication, + + /** + * Support for certificate based SASL EXTERNAL authentication + */ + SaslExternal, + + /** + * Support for hiding inactive/disconnected networks in a chat list + */ + HideInactiveNetworks, + + /** + * Support for changing the password through the client + */ + PasswordChange, + + /** + * IRCv3 capability negotiation, account tracking + */ + CapNegotiation, + + /** + * IRC server SSL validation + */ + VerifyServerSSL, + + /** + * IRC server custom message rate limits + */ + CustomRateLimits, + + /** + * (X)DCC direct file transfers (EXPERIMENTAL) + */ + DccFileTransfer, + + /** + * Timestamp formatting in away (e.g. %%hh:mm%%) + */ + AwayFormatTimestamp, + + /** + * Whether or not the core supports auth backends. + */ + Authenticators, + + /** + * Sync buffer activity status + */ + BufferActivitySync, + + /** + * Core-Side highlight configuration and matching + */ + CoreSideHighlights, + + /** + * Show prefixes for senders in backlog + */ + SenderPrefixes, + + /** + * Supports RPC call disconnectFromCore to remotely disconnect a client + */ + RemoteDisconnect, + + /** + * Transmit features as list of strings + */ + ExtendedFeatures, + + /** + * Serialize message time as 64-bit + */ + LongTime, + + /** + * Real Name and Avatar URL in backlog + */ + RichMessages, + + /** + * Backlogmanager supports filtering backlog by messagetype + */ + BacklogFilterType, + + /** + * ECDSA keys for CertFP in identities + */ + EcdsaCertfpKeys, + + /** + * 64-bit IDs for messages + */ + LongMessageId, + + /** + * CoreInfo dynamically updated using signals + */ + SyncedCoreInfo; + + /** + * Get the standardized feature name + */ + val feature = QuasselFeatureName(name) + + companion object { + private val values = values().associateBy(QuasselFeature::feature) + + /** + * Get a [QuasselFeature], if existing, for a certain feature name + */ + @JvmStatic + fun valueOf(name: QuasselFeatureName): QuasselFeature? = values[name] + } +} diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt new file mode 100644 index 0000000..a2869a6 --- /dev/null +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt @@ -0,0 +1,14 @@ +package de.justjanne.libquassel.protocol.features + +import de.justjanne.libquassel.annotations.Generated + +/** + * Inline class encapsulating a quassel feature name + */ +@Generated +inline class QuasselFeatureName( + /** + * Standardized name of the feature + */ + val name: String, +) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/ByteBufferUtil.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ByteBufferUtil.kt similarity index 71% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/ByteBufferUtil.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ByteBufferUtil.kt index 0beb4d2..e03ede5 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/ByteBufferUtil.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ByteBufferUtil.kt @@ -21,6 +21,16 @@ package de.justjanne.libquassel.protocol.io import java.nio.ByteBuffer +/** + * Copy data from one buffer to another + * + * Starts at the current position of each buffer, copies until either buffer + * is at its limit or the desired amount is reached. + * + * @param from source buffer to copy from + * @param to target buffer to copy to + * @param desiredAmount maximum amount to copy + */ fun copyData(from: ByteBuffer, to: ByteBuffer, desiredAmount: Int) { val limit = from.limit() val availableAmount = minOf(from.remaining(), to.remaining()) @@ -30,12 +40,25 @@ fun copyData(from: ByteBuffer, to: ByteBuffer, desiredAmount: Int) { from.limit(limit) } +/** + * Copy data from a buffer + * + * Starts at the current position of the buffer, copies until either the buffer + * is at its limit or the desired amount is reached. + * + * @param from source buffer to copy from + * @param desiredAmount maximum amount to copy + * @return buffer of the copied data + */ fun copyData(from: ByteBuffer, desiredAmount: Int): ByteBuffer { val to = ByteBuffer.allocate(minOf(from.remaining(), desiredAmount)) copyData(from, to, desiredAmount) return to.flip() } +/** + * Utility function to determine whether a buffer can be read from/written to. + */ fun ByteBuffer?.isEmpty() = this == null || !this.hasRemaining() private val alphabet = charArrayOf( @@ -43,6 +66,9 @@ private val alphabet = charArrayOf( '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ) +/** + * Utility function to generate a hexdump of a buffer + */ fun ByteBuffer.contentToString(): String { val position = position() val limit = limit() diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt similarity index 59% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt index 0ccd690..d0b1726 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt @@ -20,16 +20,24 @@ package de.justjanne.libquassel.protocol.io import java.nio.ByteBuffer +import java.util.LinkedList +/** + * Linked List of ByteBuffers, able to be written to as if it was a single one. + * Automatically expands if needed. + */ class ChainedByteBuffer( private val chunkSize: Int = 1024, private val direct: Boolean = false, private val limit: Long = 0, ) : Iterable<ByteBuffer> { - private val bufferList: MutableList<ByteBuffer> = ArrayList() + private val bufferList: MutableList<ByteBuffer> = LinkedList() private var currentIndex = 0 + /** + * Number of bytes in the buffer + */ var size = 0 private set @@ -48,42 +56,99 @@ class ChainedByteBuffer( size += requested } + /** + * Write an 8-bit signed byte to the buffer and increment its position. + */ fun put(value: Byte) { ensureSpace(1) bufferList.last().put(value) } + /** + * Write an 8-bit unsigned byte to the buffer and increment its position. + */ + fun put(value: UByte) { + ensureSpace(1) + + bufferList.last().put(value.toByte()) + } + + /** + * Write a 16-bit signed short to the buffer and increment its position. + */ fun putShort(value: Short) { ensureSpace(2) bufferList.last().putShort(value) } + /** + * Write a 16-bit unsigned short to the buffer and increment its position. + */ + fun putShort(value: UShort) { + ensureSpace(2) + + bufferList.last().putShort(value.toShort()) + } + + /** + * Write a 32-bit signed int to the buffer and increment its position. + */ fun putInt(value: Int) { ensureSpace(4) bufferList.last().putInt(value) } + /** + * Write a 32-bit unsigned int to the buffer and increment its position. + */ + fun putInt(value: UInt) { + ensureSpace(4) + + bufferList.last().putInt(value.toInt()) + } + + /** + * Write a 64-bit signed long to the buffer and increment its position. + */ fun putLong(value: Long) { ensureSpace(8) bufferList.last().putLong(value) } + /** + * Write a 64-bit unsigned long to the buffer and increment its position. + */ + fun putLong(value: ULong) { + ensureSpace(8) + + bufferList.last().putLong(value.toLong()) + } + + /** + * Write a 32-bit float to the buffer and increment its position. + */ fun putFloat(value: Float) { ensureSpace(4) bufferList.last().putFloat(value) } + /** + * Write a 64-bit double to the buffer and increment its position. + */ fun putDouble(value: Double) { ensureSpace(8) bufferList.last().putDouble(value) } + /** + * Write the full remaining content of a bytebuffer to the buffer and increment its position + */ fun put(value: ByteBuffer) { while (value.hasRemaining()) { val requested = minOf(value.remaining(), chunkSize) @@ -97,17 +162,27 @@ class ChainedByteBuffer( } } + /** + * Write the full remaining content of a bytearray to the buffer and increment its position + */ fun put(value: ByteArray) { - value.forEach(this::put) + this.put(ByteBuffer.wrap(value)) } + /** + * Empty the buffer + */ fun clear() { bufferList.clear() size = 0 } - override fun iterator() = ChainedByteBufferIterator(this) + override fun iterator(): Iterator<ByteBuffer> = + ChainedByteBufferIterator(this) + /** + * Convert this buffer into a bytebuffer of the same capacity and content. + */ fun toBuffer(): ByteBuffer { val byteBuffer = allocate(chunkSize * bufferList.size) for (buffer in iterator()) { @@ -117,7 +192,7 @@ class ChainedByteBuffer( return byteBuffer } - class ChainedByteBufferIterator( + private class ChainedByteBufferIterator( private val buffer: ChainedByteBuffer ) : Iterator<ByteBuffer> { private var index = 0 diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/StringEncoder.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/StringEncoder.kt similarity index 88% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/StringEncoder.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/StringEncoder.kt index 957e36a..49b9e88 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/io/StringEncoder.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/StringEncoder.kt @@ -23,6 +23,9 @@ import java.nio.ByteBuffer import java.nio.CharBuffer import java.nio.charset.Charset +/** + * Class encapsulating encoding/decoding for a certain charset + */ class StringEncoder(charset: Charset) { private val encoder = charset.newEncoder() private val decoder = charset.newDecoder() @@ -41,6 +44,9 @@ class StringEncoder(charset: Charset) { return encoder.encode(data) } + /** + * Encode a string into a bytebuffer + */ fun encode(data: String?): ByteBuffer { if (data == null || !encoder.canEncode(data)) { return ByteBuffer.allocateDirect(0) @@ -64,6 +70,9 @@ class StringEncoder(charset: Charset) { } } + /** + * Encode a single char into a bytebuffer + */ fun encodeChar(data: Char?): ByteBuffer { val charBuffer = charBuffer(1) charBuffer.put(replacementChar(data)) @@ -86,14 +95,23 @@ class StringEncoder(charset: Charset) { return charBuffer.flip() } + /** + * Decode a string with known length from a bytebuffer + */ fun decode(source: ByteBuffer, length: Int): String { return decodeInternal(source, length).toString() } + /** + * Decode the full bytebuffer as string + */ fun decode(source: ByteBuffer): String { return decodeInternal(source, source.remaining()).toString() } + /** + * Decode a single char from a bytebuffer + */ fun decodeChar(source: ByteBuffer): Char { return decodeInternal(source, 2).get() } diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/HandshakeSerializer.kt similarity index 63% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/HandshakeSerializer.kt index 4c4116a..8e98f78 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/HandshakeSerializer.kt @@ -17,14 +17,31 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers import de.justjanne.libquassel.protocol.variant.QVariantMap +/** High-level serializer for handshake messages. */ interface HandshakeSerializer<T> { + /** + * The underlying handshake message type this serializer can (de-)serialize. + * Used for type-safe serializer autodiscovery. + */ val type: String + + /** + * The underlying java type this serializer can (de-)serialize. + * Used for type-safe serializer autodiscovery. + */ val javaType: Class<out T> + /** + * Serialize a handshake message into a [QVariantMap] (for further serialization) + */ fun serialize(data: T): QVariantMap + + /** + * Deserialize a handshake message from a [QVariantMap] + */ fun deserialize(data: QVariantMap): T } diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeSerializers.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/HandshakeSerializers.kt similarity index 58% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeSerializers.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/HandshakeSerializers.kt index fdb5f6b..14d64a4 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeSerializers.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/HandshakeSerializers.kt @@ -17,10 +17,22 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers -import de.justjanne.libquassel.protocol.serializers.NoSerializerForTypeException +import de.justjanne.libquassel.protocol.serializers.handshake.ClientInitAckSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.ClientInitRejectSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.ClientInitSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.ClientLoginAckSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.ClientLoginRejectSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.ClientLoginSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.CoreSetupAckSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.CoreSetupDataSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.CoreSetupRejectSerializer +import de.justjanne.libquassel.protocol.serializers.handshake.SessionInitSerializer +/** + * Singleton object containing all serializers for handshake message types + */ object HandshakeSerializers { private val serializers = listOf<HandshakeSerializer<*>>( ClientInitSerializer, @@ -38,8 +50,14 @@ object HandshakeSerializers { SessionInitSerializer, ).associateBy(HandshakeSerializer<*>::type) + /** + * Obtain the serializer for a handshake message type + */ operator fun get(type: String) = serializers[type] + /** + * Obtain the serializer for a handshake message type (type safe) + */ @Suppress("UNCHECKED_CAST") inline fun <reified T> find(type: String): HandshakeSerializer<T> { val serializer = get(type) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/NoSerializerForTypeException.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/NoSerializerForTypeException.kt similarity index 75% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/NoSerializerForTypeException.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/NoSerializerForTypeException.kt index 60d1568..3a20043 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/NoSerializerForTypeException.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/NoSerializerForTypeException.kt @@ -22,7 +22,13 @@ package de.justjanne.libquassel.protocol.serializers import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.QuasselType +/** + * Exception describing a missing serializer condition + */ sealed class NoSerializerForTypeException : Exception() { + /** + * Exception describing a missing serializer condition for a qt type + */ data class Qt( private val type: Int, private val javaType: Class<*>? = null @@ -37,6 +43,9 @@ sealed class NoSerializerForTypeException : Exception() { } } + /** + * Exception describing a missing serializer condition for a quassel type + */ data class Quassel( private val type: Int, private val typename: String?, @@ -58,6 +67,9 @@ sealed class NoSerializerForTypeException : Exception() { } } + /** + * Exception describing a missing serializer condition for a handshake type + */ data class Handshake( private val type: String, private val javaType: Class<*>? = null @@ -66,4 +78,16 @@ sealed class NoSerializerForTypeException : Exception() { return "NoSerializerForTypeException.Handshake(type='$type', javaType=$javaType)" } } + + /** + * Exception describing a missing serializer condition for a signal proxy type + */ + data class SignalProxy( + private val type: String, + private val javaType: Class<*>? = null + ) : NoSerializerForTypeException() { + override fun toString(): String { + return "NoSerializerForTypeException.Handshake(type='$type', javaType=$javaType)" + } + } } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QtSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QtSerializer.kt similarity index 65% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QtSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QtSerializer.kt index e44f5ad..2298c5b 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QtSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QtSerializer.kt @@ -21,7 +21,22 @@ package de.justjanne.libquassel.protocol.serializers import de.justjanne.libquassel.protocol.variant.QtType +/** + * Interface describing a serializer for a [QtType], that is a type introduced + * by qt, and serialized compatible with the QDataStream format. + * + * See [QDataStream Documentation](https://doc.qt.io/qt-5/qdatastream.html) + */ interface QtSerializer<T> : Serializer<T> { + /** + * The underlying QtType this Serializer can (de-)serialize. + * Used for type-safe serializer autodiscovery. + */ val qtType: QtType + + /** + * The underlying Java type this Serializer can (de-)serialize. + * Used for type-safe serializer autodiscovery. + */ val javaType: Class<out T> } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QtSerializers.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QtSerializers.kt similarity index 94% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QtSerializers.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QtSerializers.kt index baa34e1..846ffc3 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QtSerializers.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QtSerializers.kt @@ -43,6 +43,9 @@ import de.justjanne.libquassel.protocol.serializers.qt.UShortSerializer import de.justjanne.libquassel.protocol.serializers.qt.VoidSerializer import de.justjanne.libquassel.protocol.variant.QtType +/** + * Singleton object containing all serializers for qt types + */ object QtSerializers { private val serializers = setOf<QtSerializer<*>>( VoidSerializer, @@ -74,8 +77,14 @@ object QtSerializers { QVariantMapSerializer, ).associateBy(QtSerializer<*>::qtType) + /** + * Obtain the serializer for a qt type + */ operator fun get(type: QtType) = serializers[type] + /** + * Obtain the serializer for a qt type (type safe) + */ @Suppress("UNCHECKED_CAST") inline fun <reified T> find(type: QtType): QtSerializer<T> { val serializer = get(type) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QuasselSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QuasselSerializer.kt similarity index 81% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QuasselSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QuasselSerializer.kt index bb897ea..55fb54a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QuasselSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QuasselSerializer.kt @@ -22,7 +22,16 @@ package de.justjanne.libquassel.protocol.serializers import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.QuasselType +/** + * Interface describing a serializer for a [QuasselType], that is a type + * custom to quassel. + */ interface QuasselSerializer<T> : QtSerializer<T> { override val qtType: QtType get() = quasselType.qtType + + /** + * The underlying quassel type this serializer can (de-)serialize. + * Used for type-safe serializer autodiscovery. + */ val quasselType: QuasselType } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QuasselSerializers.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QuasselSerializers.kt similarity index 92% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QuasselSerializers.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QuasselSerializers.kt index 3ac6287..7d2643c 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/QuasselSerializers.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/QuasselSerializers.kt @@ -31,6 +31,9 @@ import de.justjanne.libquassel.protocol.serializers.quassel.PeerPtrSerializer import de.justjanne.libquassel.protocol.serializers.quassel.QHostAddressSerializer import de.justjanne.libquassel.protocol.variant.QuasselType +/** + * Singleton object containing all serializers for quassel types + */ object QuasselSerializers { private val serializers = listOf<QuasselSerializer<*>>( BufferIdSerializer, @@ -50,8 +53,14 @@ object QuasselSerializers { PeerPtrSerializer, ).associateBy(QuasselSerializer<*>::quasselType) + /** + * Obtain the serializer for a quassel type + */ operator fun get(type: QuasselType) = serializers[type] + /** + * Obtain the serializer for a quassel type (type safe) + */ @Suppress("UNCHECKED_CAST") inline fun <reified T> find(type: QuasselType): QuasselSerializer<T> { val serializer = get(type) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/Serializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/Serializer.kt similarity index 62% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/Serializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/Serializer.kt index 7162eae..ebe9b15 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/Serializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/Serializer.kt @@ -23,7 +23,26 @@ import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.io.ChainedByteBuffer import java.nio.ByteBuffer +/** + * Interface describing a generic quassel protocol serializer. + * + * Further specialized into [QtSerializer] and [QuasselSerializer] + */ interface Serializer<T> { + /** + * Serialize data with the Quassel protocol to a buffer + * @param buffer target buffer to serialize to + * @param data value to serialize + * @param featureSet features to use when serializing, usually the featureset + * of the currently negotiated connection + */ fun serialize(buffer: ChainedByteBuffer, data: T, featureSet: FeatureSet) + + /** + * Deserialize Quassel protocol data from a buffer + * @param buffer source buffer to deserialize from + * @param featureSet features to use when deserializing, usually the + * featureset of the currently negotiated connection + */ fun deserialize(buffer: ByteBuffer, featureSet: FeatureSet): T } diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitAckSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializer.kt similarity index 90% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitAckSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializer.kt index b0be630..c63b991 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitAckSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializer.kt @@ -17,18 +17,23 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake import de.justjanne.bitflags.of import de.justjanne.bitflags.toBits import de.justjanne.libquassel.protocol.features.LegacyFeature import de.justjanne.libquassel.protocol.features.QuasselFeatureName +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QStringList import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.ClientInitAck] + */ object ClientInitAckSerializer : HandshakeSerializer<HandshakeMessage.ClientInitAck> { override val type: String = "ClientInitAck" override val javaType: Class<out HandshakeMessage.ClientInitAck> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitRejectSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitRejectSerializer.kt similarity index 85% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitRejectSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitRejectSerializer.kt index 3a6ff23..f750b64 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitRejectSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitRejectSerializer.kt @@ -17,13 +17,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.ClientInitReject] + */ object ClientInitRejectSerializer : HandshakeSerializer<HandshakeMessage.ClientInitReject> { override val type: String = "ClientInitReject" override val javaType: Class<out HandshakeMessage.ClientInitReject> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializer.kt similarity index 89% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializer.kt index d1fc067..add62e8 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializer.kt @@ -17,17 +17,22 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake import de.justjanne.bitflags.of import de.justjanne.bitflags.toBits import de.justjanne.libquassel.protocol.features.LegacyFeature import de.justjanne.libquassel.protocol.features.QuasselFeatureName +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.ClientInit] + */ object ClientInitSerializer : HandshakeSerializer<HandshakeMessage.ClientInit> { override val type: String = "ClientInit" override val javaType: Class<out HandshakeMessage.ClientInit> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginAckSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginAckSerializer.kt similarity index 84% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginAckSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginAckSerializer.kt index afd8ea3..8ebf038 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginAckSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginAckSerializer.kt @@ -17,12 +17,17 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.ClientLoginAck] + */ object ClientLoginAckSerializer : HandshakeSerializer<HandshakeMessage.ClientLoginAck> { override val type: String = "ClientLoginAck" override val javaType: Class<out HandshakeMessage.ClientLoginAck> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginRejectSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginRejectSerializer.kt similarity index 85% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginRejectSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginRejectSerializer.kt index e12af1a..1912cfa 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginRejectSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginRejectSerializer.kt @@ -17,13 +17,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.ClientLoginReject] + */ object ClientLoginRejectSerializer : HandshakeSerializer<HandshakeMessage.ClientLoginReject> { override val type: String = "ClientLoginReject" override val javaType: Class<out HandshakeMessage.ClientLoginReject> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginSerializer.kt similarity index 86% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginSerializer.kt index 6211371..ba9016d 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/ClientLoginSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientLoginSerializer.kt @@ -17,13 +17,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.ClientLogin] + */ object ClientLoginSerializer : HandshakeSerializer<HandshakeMessage.ClientLogin> { override val type: String = "ClientLogin" override val javaType: Class<out HandshakeMessage.ClientLogin> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupAckSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupAckSerializer.kt similarity index 84% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupAckSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupAckSerializer.kt index da01a78..3feecb1 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupAckSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupAckSerializer.kt @@ -17,12 +17,17 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.CoreSetupAck] + */ object CoreSetupAckSerializer : HandshakeSerializer<HandshakeMessage.CoreSetupAck> { override val type: String = "CoreSetupAck" override val javaType: Class<out HandshakeMessage.CoreSetupAck> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupDataSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupDataSerializer.kt similarity index 90% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupDataSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupDataSerializer.kt index be39eb3..613f414 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupDataSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupDataSerializer.kt @@ -17,13 +17,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.CoreSetupData] + */ object CoreSetupDataSerializer : HandshakeSerializer<HandshakeMessage.CoreSetupData> { override val type: String = "CoreSetupData" override val javaType: Class<out HandshakeMessage.CoreSetupData> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupRejectSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupRejectSerializer.kt similarity index 85% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupRejectSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupRejectSerializer.kt index a36d0ed..03c99e3 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/CoreSetupRejectSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/CoreSetupRejectSerializer.kt @@ -17,13 +17,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.CoreSetupReject] + */ object CoreSetupRejectSerializer : HandshakeSerializer<HandshakeMessage.CoreSetupReject> { override val type: String = "CoreSetupReject" override val javaType: Class<out HandshakeMessage.CoreSetupReject> = diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/SessionInitSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/SessionInitSerializer.kt similarity index 88% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/SessionInitSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/SessionInitSerializer.kt index 70309e8..419ceab 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/SessionInitSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/SessionInitSerializer.kt @@ -17,13 +17,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer +import de.justjanne.libquassel.protocol.types.HandshakeMessage import de.justjanne.libquassel.protocol.variant.QVariantMap import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant +/** + * Serializer for [HandshakeMessage.SessionInit] + */ object SessionInitSerializer : HandshakeSerializer<HandshakeMessage.SessionInit> { override val type: String = "SessionInit" override val javaType: Class<out HandshakeMessage.SessionInit> = diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializer.kt index 13c8282..113b69a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [Boolean] + */ object BoolSerializer : QtSerializer<Boolean> { override val qtType: QtType = QtType.Bool override val javaType: Class<Boolean> = Boolean::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializer.kt index 6dabf23..77e01be 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializer.kt @@ -26,6 +26,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [ByteBuffer] + */ object ByteBufferSerializer : QtSerializer<ByteBuffer?> { override val qtType: QtType = QtType.QByteArray override val javaType: Class<out ByteBuffer?> = ByteBuffer::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializer.kt index 20afff7..3e80b34 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [Byte] + */ object ByteSerializer : QtSerializer<Byte> { override val qtType: QtType = QtType.Char override val javaType: Class<Byte> = Byte::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DateSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DateSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DateSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DateSerializer.kt index 8710ab9..663b21a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DateSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DateSerializer.kt @@ -27,6 +27,9 @@ import org.threeten.bp.LocalDate import org.threeten.bp.temporal.JulianFields import java.nio.ByteBuffer +/** + * Serializer for [LocalDate] + */ object DateSerializer : QtSerializer<LocalDate> { override val qtType: QtType = QtType.QDate override val javaType: Class<out LocalDate> = LocalDate::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DateTimeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DateTimeSerializer.kt similarity index 96% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DateTimeSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DateTimeSerializer.kt index 41fef1d..c7ac7f9 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DateTimeSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DateTimeSerializer.kt @@ -32,6 +32,9 @@ import org.threeten.bp.ZonedDateTime import org.threeten.bp.temporal.Temporal import java.nio.ByteBuffer +/** + * Serializer for temporal types such as [Instant], [ZonedDateTime], [OffsetDateTime] or [LocalDateTime] + */ object DateTimeSerializer : QtSerializer<Temporal> { override val qtType: QtType = QtType.QDateTime override val javaType: Class<out Temporal> = Temporal::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializer.kt index 4e35405..12f0a1a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [Double] + */ object DoubleSerializer : QtSerializer<Double> { override val qtType: QtType = QtType.Double override val javaType: Class<Double> = Double::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializer.kt index bf8bad1..1fdccbf 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [Float] + */ object FloatSerializer : QtSerializer<Float> { override val qtType: QtType = QtType.Float override val javaType: Class<Float> = Float::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializer.kt similarity index 94% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializer.kt index 06278a7..cad1368 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializer.kt @@ -29,6 +29,10 @@ import de.justjanne.libquassel.protocol.variant.into import de.justjanne.libquassel.protocol.variant.qVariant import java.nio.ByteBuffer +/** + * Serializer for [QVariantMap] during handshake, + * which uses a special format instead of [QVariantMapSerializer] + */ object HandshakeMapSerializer : QtSerializer<QVariantMap> { override val qtType = QtType.QVariantMap diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/IntSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/IntSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/IntSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/IntSerializer.kt index 47aa3f0..eb10cd5 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/IntSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/IntSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [Int] + */ object IntSerializer : QtSerializer<Int> { override val qtType: QtType = QtType.Int override val javaType: Class<Int> = Int::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/LongSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/LongSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/LongSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/LongSerializer.kt index c04fee8..6268691 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/LongSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/LongSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [Long] + */ object LongSerializer : QtSerializer<Long> { override val qtType: QtType = QtType.Long override val javaType: Class<Long> = Long::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializer.kt similarity index 98% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializer.kt index 4eaa9eb..354e979 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer import kotlin.concurrent.getOrSet +/** + * Serializer for [Char] + */ object QCharSerializer : QtSerializer<Char> { override val qtType: QtType = QtType.QChar override val javaType: Class<out Char> = Char::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QStringListSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QStringListSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QStringListSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QStringListSerializer.kt index 3c1675b..bbdfa7a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QStringListSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QStringListSerializer.kt @@ -26,6 +26,9 @@ import de.justjanne.libquassel.protocol.variant.QStringList import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [QStringList] + */ object QStringListSerializer : QtSerializer<QStringList> { override val qtType = QtType.QStringList diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializer.kt index b216eee..520fe34 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.variant.QVariant_ import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [QVariantList] + */ object QVariantListSerializer : QtSerializer<QVariantList> { override val qtType = QtType.QVariantList diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializer.kt similarity index 98% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializer.kt index b2043e4..128a098 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.variant.QVariant_ import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [QVariantMap] + */ object QVariantMapSerializer : QtSerializer<QVariantMap> { override val qtType = QtType.QVariantMap diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializer.kt similarity index 96% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializer.kt index 0486714..ac7beeb 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializer.kt @@ -32,6 +32,9 @@ import de.justjanne.libquassel.protocol.variant.QtType import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [QVariant] + */ object QVariantSerializer : QtSerializer<QVariant_> { override val qtType = QtType.QVariant override val javaType: Class<QVariant_> = QVariant::class.java @@ -39,7 +42,7 @@ object QVariantSerializer : QtSerializer<QVariant_> { override fun serialize(buffer: ChainedByteBuffer, data: QVariant_, featureSet: FeatureSet) { IntSerializer.serialize(buffer, data.serializer.qtType.id, featureSet) BoolSerializer.serialize(buffer, false, featureSet) - if (data is QVariant.Custom) { + if (data.serializer.qtType == QtType.UserType && data is QVariant.Custom) { StringSerializerAscii.serialize(buffer, data.serializer.quasselType.typeName, featureSet) } data.serialize(buffer, featureSet) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializer.kt index bbe4c9a..d0fdda4 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [Short] + */ object ShortSerializer : QtSerializer<Short> { override val qtType: QtType = QtType.Short override val javaType: Class<Short> = Short::class.javaObjectType diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializer.kt similarity index 94% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializer.kt index 3b93ee4..4174161 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializer.kt @@ -28,6 +28,11 @@ import java.nio.ByteBuffer import java.nio.charset.Charset import kotlin.concurrent.getOrSet +/** + * Abstract serializer for Strings. + * + * For concrete implementations see [StringSerializerAscii], [StringSerializerUtf8] and [StringSerializerUtf16] + */ abstract class StringSerializer( private val charset: Charset, private val nullLimited: Boolean, diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerAscii.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerAscii.kt similarity index 95% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerAscii.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerAscii.kt index 95d0ffb..928b990 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerAscii.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerAscii.kt @@ -19,4 +19,7 @@ package de.justjanne.libquassel.protocol.serializers.qt +/** + * Serializer for ASCII strings + */ object StringSerializerAscii : StringSerializer(Charsets.ISO_8859_1, true) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf16.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf16.kt similarity index 95% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf16.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf16.kt index 70aee02..8d1c2d3 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf16.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf16.kt @@ -19,4 +19,7 @@ package de.justjanne.libquassel.protocol.serializers.qt +/** + * Serializer for UTF-16 strings + */ object StringSerializerUtf16 : StringSerializer(Charsets.UTF_16BE, false) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf8.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf8.kt similarity index 95% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf8.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf8.kt index 6a02d47..1133a06 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf8.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerUtf8.kt @@ -19,4 +19,7 @@ package de.justjanne.libquassel.protocol.serializers.qt +/** + * Serializer for UTF-8 strings + */ object StringSerializerUtf8 : StringSerializer(Charsets.UTF_8, false) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/TimeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/TimeSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/TimeSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/TimeSerializer.kt index b6e472a..8de9398 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/TimeSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/TimeSerializer.kt @@ -26,6 +26,9 @@ import de.justjanne.libquassel.protocol.variant.QtType import org.threeten.bp.LocalTime import java.nio.ByteBuffer +/** + * Serializer for [LocalTime] + */ object TimeSerializer : QtSerializer<LocalTime> { override val qtType: QtType = QtType.QTime override val javaType: Class<out LocalTime> = LocalTime::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializer.kt index 2c92292..dfe1718 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [UByte] + */ object UByteSerializer : QtSerializer<UByte> { override val qtType: QtType = QtType.UChar override val javaType: Class<UByte> = UByte::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializer.kt index c8ac10e..67cce79 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [UInt] + */ object UIntSerializer : QtSerializer<UInt> { override val qtType: QtType = QtType.UInt override val javaType: Class<UInt> = UInt::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializer.kt index ee3a7bc..a5015cd 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [ULong] + */ object ULongSerializer : QtSerializer<ULong> { override val qtType: QtType = QtType.ULong override val javaType: Class<ULong> = ULong::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializer.kt index 0037c34..28e9c07 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for [UShort] + */ object UShortSerializer : QtSerializer<UShort> { override val qtType: QtType = QtType.UShort override val javaType: Class<UShort> = UShort::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializer.kt index 9ebf40b..9444f09 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QtSerializer import de.justjanne.libquassel.protocol.variant.QtType import java.nio.ByteBuffer +/** + * Serializer for empty data + */ object VoidSerializer : QtSerializer<Unit> { override val qtType: QtType = QtType.Void override val javaType: Class<out Unit> = Unit::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializer.kt index a17ffe0..622a0d1 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.types.BufferId import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [BufferId] + */ object BufferIdSerializer : QuasselSerializer<BufferId> { override val quasselType: QuasselType = QuasselType.BufferId override val javaType: Class<out BufferId> = BufferId::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializer.kt similarity index 98% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializer.kt index 356caba..553a92c 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializer.kt @@ -32,6 +32,9 @@ import de.justjanne.libquassel.protocol.types.BufferType import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [BufferInfo] + */ object BufferInfoSerializer : QuasselSerializer<BufferInfo> { override val quasselType: QuasselType = QuasselType.BufferInfo override val javaType: Class<out BufferInfo> = BufferInfo::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt index 5fdc6dc..607a8ba 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.types.DccIpDetectionMode import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [DccIpDetectionMode] + */ object DccIpDetectionModeSerializer : QuasselSerializer<DccIpDetectionMode?> { override val quasselType: QuasselType = QuasselType.DccConfigIpDetectionMode diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt index f7a4e33..da9ff12 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.types.DccPortSelectionMode import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [DccPortSelectionMode] + */ object DccPortSelectionModeSerializer : QuasselSerializer<DccPortSelectionMode?> { override val quasselType: QuasselType = QuasselType.DccConfigPortSelectionMode diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializer.kt index a259c7b..afa871d 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.types.IdentityId import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [IdentityId] + */ object IdentityIdSerializer : QuasselSerializer<IdentityId> { override val quasselType: QuasselType = QuasselType.IdentityId override val javaType: Class<out IdentityId> = IdentityId::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializer.kt similarity index 99% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializer.kt index 25b2770..3728759 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializer.kt @@ -37,6 +37,9 @@ import de.justjanne.libquassel.protocol.variant.QuasselType import org.threeten.bp.Instant import java.nio.ByteBuffer +/** + * Serializer for [Message] + */ object MessageSerializer : QuasselSerializer<Message> { override val quasselType: QuasselType = QuasselType.Message override val javaType: Class<out Message> = Message::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializer.kt similarity index 98% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializer.kt index 47da019..6a381fb 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializer.kt @@ -29,6 +29,9 @@ import de.justjanne.libquassel.protocol.types.MsgId import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [MsgId] + */ object MsgIdSerializer : QuasselSerializer<MsgId> { override val quasselType: QuasselType = QuasselType.MsgId override val javaType: Class<out MsgId> = MsgId::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializer.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializer.kt index e82dac9..c09a584 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializer.kt @@ -27,6 +27,9 @@ import de.justjanne.libquassel.protocol.types.NetworkId import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for [NetworkId] + */ object NetworkIdSerializer : QuasselSerializer<NetworkId> { override val quasselType: QuasselType = QuasselType.NetworkId override val javaType: Class<out NetworkId> = NetworkId::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializer.kt similarity index 95% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializer.kt index 74cc9cb..40473ca 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializer.kt @@ -25,6 +25,9 @@ import de.justjanne.libquassel.protocol.serializers.QuasselSerializer import de.justjanne.libquassel.protocol.variant.QuasselType import java.nio.ByteBuffer +/** + * Serializer for PeerPtr, which is implemented as [ULong] + */ object PeerPtrSerializer : QuasselSerializer<ULong> { override val quasselType: QuasselType = QuasselType.PeerPtr override val javaType: Class<ULong> = ULong::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt similarity index 98% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt index d6d4d6e..ac5bc81 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt @@ -30,6 +30,9 @@ import java.net.Inet6Address import java.net.InetAddress import java.nio.ByteBuffer +/** + * Serializer for [InetAddress] + */ object QHostAddressSerializer : QuasselSerializer<InetAddress> { override val quasselType: QuasselType = QuasselType.QHostAddress override val javaType: Class<out InetAddress> = InetAddress::class.java diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferActivity.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferActivity.kt similarity index 77% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferActivity.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferActivity.kt index 76228ed..458c7da 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferActivity.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferActivity.kt @@ -23,12 +23,25 @@ import de.justjanne.bitflags.Flag import de.justjanne.bitflags.Flags import de.justjanne.bitflags.toEnumSet +/** + * Model representing all seen activity on a buffer + */ enum class BufferActivity( override val value: UInt, ) : Flag<UInt> { - NoActivity(0x00u), + /** + * Other, unspecified activity has occurred on this buffer (join, part, quit, etc) + */ OtherActivity(0x01u), + + /** + * A new unread mesage is available on this buffer + */ NewMessage(0x02u), + + /** + * A highlight for the current user is available on this buffer + */ Highlight(0x04u); companion object : Flags<UInt, BufferActivity> { @@ -37,4 +50,7 @@ enum class BufferActivity( } } +/** + * Model representing a bitfield of [BufferActivity] flags + */ typealias BufferActivities = Set<BufferActivity> diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferId.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferId.kt similarity index 79% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferId.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferId.kt index 2bebd40..8720e7a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferId.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferId.kt @@ -21,11 +21,26 @@ package de.justjanne.libquassel.protocol.types private typealias BufferIdType = SignedIdType -inline class BufferId(override val id: BufferIdType) : SignedId<BufferIdType> { +/** + * A [SignedId] for a chat/buuffer + */ +inline class BufferId( + /** + * Native value + */ + override val id: BufferIdType +) : SignedId<BufferIdType> { override fun toString() = "BufferId($id)" companion object { + /** + * Lower limit for this type + */ val MIN_VALUE = BufferId(BufferIdType.MIN_VALUE) + + /** + * Upper limit for this type + */ val MAX_VALUE = BufferId(BufferIdType.MAX_VALUE) } } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferInfo.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferInfo.kt similarity index 77% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferInfo.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferInfo.kt index cb49ccf..b3531b1 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferInfo.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferInfo.kt @@ -21,10 +21,28 @@ package de.justjanne.libquassel.protocol.types import de.justjanne.bitflags.none +/** + * Model object representing metadata for a single chat + */ data class BufferInfo( + /** + * Id of the chat + */ val bufferId: BufferId = BufferId(-1), + /** + * Id of the network to which this chat belongs + */ val networkId: NetworkId = NetworkId(-1), + /** + * type of this chat + */ val type: BufferTypes = BufferType.none(), + /** + * Id of the group to which this chat belongs + */ val groupId: Int = -1, + /** + * User-visible name of this chat + */ val bufferName: String? = null, ) diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferType.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferType.kt similarity index 77% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferType.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferType.kt index 8ee3b1a..32257da 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/BufferType.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/BufferType.kt @@ -23,13 +23,30 @@ import de.justjanne.bitflags.Flag import de.justjanne.bitflags.Flags import de.justjanne.bitflags.toEnumSet +/** + * Model representing different types of chats + */ enum class BufferType( override val value: UShort, ) : Flag<UShort> { - Invalid(0x00u), + /** + * Status chat with technical data and internal information + */ Status(0x01u), + + /** + * Named channel with potentially multiple users + */ Channel(0x02u), + + /** + * Direct chat with a single other user + */ Query(0x04u), + + /** + * Unnamed group between multiple users + */ Group(0x08u); companion object : Flags<UShort, BufferType> { @@ -38,4 +55,7 @@ enum class BufferType( } } +/** + * Model representing a bitfield of [BufferType] flags + */ typealias BufferTypes = Set<BufferType> diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/DccIpDetectionMode.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/DccIpDetectionMode.kt similarity index 91% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/DccIpDetectionMode.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/DccIpDetectionMode.kt index 153e5a5..5b4ebde 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/DccIpDetectionMode.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/DccIpDetectionMode.kt @@ -23,6 +23,9 @@ package de.justjanne.libquassel.protocol.types * Mode for detecting the outgoing IP */ enum class DccIpDetectionMode( + /** + * Underlying representation + */ val value: UByte, ) { /** Automatic detection (network socket or USERHOST) */ @@ -33,6 +36,10 @@ enum class DccIpDetectionMode( companion object { private val values = values().associateBy(DccIpDetectionMode::value) + + /** + * Obtain from underlying representation + */ fun of(value: UByte): DccIpDetectionMode? = values[value] } } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/DccPortSelectionMode.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/DccPortSelectionMode.kt similarity index 91% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/DccPortSelectionMode.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/DccPortSelectionMode.kt index b26a5fb..462d11d 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/DccPortSelectionMode.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/DccPortSelectionMode.kt @@ -23,6 +23,9 @@ package de.justjanne.libquassel.protocol.types * Mode for selecting the port range for DCC */ enum class DccPortSelectionMode( + /** + * Underlying representation + */ val value: UByte, ) { /** Automatic port selection */ @@ -33,6 +36,10 @@ enum class DccPortSelectionMode( companion object { private val values = values().associateBy(DccPortSelectionMode::value) + + /** + * Obtain from underlying representation + */ fun of(value: UByte): DccPortSelectionMode? = values[value] } } diff --git a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeMessage.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/HandshakeMessage.kt similarity index 97% rename from libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeMessage.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/HandshakeMessage.kt index 18786e0..7126e63 100644 --- a/libquassel-messages/src/main/kotlin/de/justjanne/libquassel/messages/handshake/HandshakeMessage.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/HandshakeMessage.kt @@ -17,7 +17,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.types import de.justjanne.libquassel.protocol.features.LegacyFeatures import de.justjanne.libquassel.protocol.features.QuasselFeatureName diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/IdentityId.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/IdentityId.kt similarity index 79% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/IdentityId.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/IdentityId.kt index a6061e8..1c3cd40 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/IdentityId.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/IdentityId.kt @@ -20,12 +20,25 @@ package de.justjanne.libquassel.protocol.types private typealias IdentityIdType = SignedIdType - -inline class IdentityId(override val id: IdentityIdType) : SignedId<IdentityIdType> { +/** + * A [SignedId] for an identity object + */ +inline class IdentityId( + /** + * Native value + */ + override val id: IdentityIdType +) : SignedId<IdentityIdType> { override fun toString() = "IdentityId($id)" companion object { + /** + * Lower limit for this type + */ val MIN_VALUE = IdentityId(IdentityIdType.MIN_VALUE) + /** + * Upper limit for this type + */ val MAX_VALUE = IdentityId(IdentityIdType.MAX_VALUE) } } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/Message.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/Message.kt similarity index 74% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/Message.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/Message.kt index 8098880..682ee48 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/Message.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/Message.kt @@ -21,16 +21,49 @@ package de.justjanne.libquassel.protocol.types import org.threeten.bp.Instant +/** + * Model representing a chat message + */ data class Message( + /** + * Id of the message + */ val messageId: MsgId, + /** + * Timestamp at which the message was sent + */ val time: Instant, + /** + * Message type + */ val type: MessageTypes, + /** + * Set flags on the message + */ val flag: MessageFlags, + /** + * Metadata of the buffer the message was received in + */ val bufferInfo: BufferInfo, + /** + * nick!ident@host of the sender + */ val sender: String, + /** + * Channel role prefixes of the sender + */ val senderPrefixes: String, + /** + * Realname of the sender + */ val realName: String, + /** + * Avatar of the sender + */ val avatarUrl: String, + /** + * Message content + */ val content: String ) { override fun toString(): String { diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MessageFlag.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MessageFlag.kt similarity index 74% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MessageFlag.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MessageFlag.kt index f953139..59afe90 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MessageFlag.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MessageFlag.kt @@ -23,13 +23,45 @@ import de.justjanne.bitflags.Flag import de.justjanne.bitflags.Flags import de.justjanne.bitflags.toEnumSet +/** + * Model representing different types of message flags + */ enum class MessageFlag( override val value: UInt, ) : Flag<UInt> { + /** + * Self-Message + * + * Sent by same user + */ Self(0x01u), + + /** + * Highlight + * + * User was mentioned + */ Highlight(0x02u), + + /** + * Redirected + * + * Message was redirected + */ Redirected(0x04u), + + /** + * ServerMsg + * + * Server info message + */ ServerMsg(0x08u), + + /** + * Backlog + * + * Message was loaded from history + */ Backlog(0x80u); companion object : Flags<UInt, MessageFlag> { @@ -38,4 +70,7 @@ enum class MessageFlag( } } +/** + * Model representing a bitfield of [MessageFlag] flags + */ typealias MessageFlags = Set<MessageFlag> diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MessageType.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MessageType.kt similarity index 63% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MessageType.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MessageType.kt index 8f8d345..d4606a7 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MessageType.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MessageType.kt @@ -23,27 +23,105 @@ import de.justjanne.bitflags.Flag import de.justjanne.bitflags.Flags import de.justjanne.bitflags.toEnumSet +/** + * Model representing different types of messages + */ enum class MessageType( override val value: UInt, ) : Flag<UInt> { + /** + * Plain text message + */ Plain(0x00001u), + + /** + * Bot response/redirected notice + */ Notice(0x00002u), + + /** + * Third-person message + */ Action(0x00004u), + + /** + * Nick change + */ Nick(0x00008u), + + /** + * Mode change + */ Mode(0x00010u), + + /** + * Channel join + */ Join(0x00020u), + + /** + * Channel leave + */ Part(0x00040u), + + /** + * Network leave + */ Quit(0x00080u), + + /** + * Involuntary channel leave + */ Kick(0x00100u), + + /** + * Involuntary network leave + */ Kill(0x00200u), + + /** + * Server message + */ Server(0x00400u), + + /** + * Global info message + */ Info(0x00800u), + + /** + * Server error + */ Error(0x01000u), + + /** + * Midnight marker + */ DayChange(0x02000u), + + /** + * Channel topic has changed + */ Topic(0x04000u), + + /** + * Multiple users joined (usually due to a flaky server) + */ NetsplitJoin(0x08000u), + + /** + * Multiple users left (usually due to a flaky server) + */ NetsplitQuit(0x10000u), + + /** + * User invited to channel + */ Invite(0x20000u), + + /** + * Last read marker + */ Markerline(0x40000u); companion object : Flags<UInt, MessageType> { @@ -52,4 +130,7 @@ enum class MessageType( } } +/** + * Model representing a bitfield of [MessageType] flags + */ typealias MessageTypes = Set<MessageType> diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MsgId.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MsgId.kt similarity index 75% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MsgId.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MsgId.kt index 06c9df9..6b54497 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/MsgId.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/MsgId.kt @@ -21,11 +21,27 @@ package de.justjanne.libquassel.protocol.types private typealias MsgIdType = SignedId64Type -inline class MsgId(override val id: MsgIdType) : SignedId<MsgIdType> { +/** + * A [SignedId] for an individual message + * Warning: this is the only id which can be backed by a 64-bit value + */ +inline class MsgId( + /** + * Native value + */ + override val id: MsgIdType +) : SignedId<MsgIdType> { override fun toString() = "MsgId($id)" companion object { + /** + * Lower limit for this type + */ val MIN_VALUE = MsgId(MsgIdType.MIN_VALUE) + + /** + * Upper limit for this type + */ val MAX_VALUE = MsgId(MsgIdType.MAX_VALUE) } } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/NetworkId.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/NetworkId.kt similarity index 79% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/NetworkId.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/NetworkId.kt index 7ee9425..46abe65 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/NetworkId.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/NetworkId.kt @@ -21,11 +21,26 @@ package de.justjanne.libquassel.protocol.types private typealias NetworkIdType = SignedIdType -inline class NetworkId(override val id: NetworkIdType) : SignedId<NetworkIdType> { +/** + * A [SignedId] for an irc network + */ +inline class NetworkId( + /** + * Native value + */ + override val id: NetworkIdType +) : SignedId<NetworkIdType> { override fun toString() = "NetworkId($id)" companion object { + /** + * Lower limit for this type + */ val MIN_VALUE = NetworkId(NetworkIdType.MIN_VALUE) + + /** + * Upper limit for this type + */ val MAX_VALUE = NetworkId(NetworkIdType.MAX_VALUE) } } diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/NetworkLayerProtocol.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/NetworkLayerProtocol.kt similarity index 68% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/NetworkLayerProtocol.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/NetworkLayerProtocol.kt index db85d25..67bc28a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/NetworkLayerProtocol.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/NetworkLayerProtocol.kt @@ -19,16 +19,45 @@ package de.justjanne.libquassel.protocol.types +/** + * Network protocol version + */ enum class NetworkLayerProtocol( + /** + * Underlying representation + */ val value: UByte, ) { + /** + * Internet Protocol Version 4 + * + * See [RFC-791](https://tools.ietf.org/html/rfc791) + */ IPv4Protocol(0x00u), + /** + * Internet Protocol Version 6 + * + * See [RFC-2460](https://tools.ietf.org/html/rfc2460) + * See [RFC-8200](https://tools.ietf.org/html/rfc8200) + */ IPv6Protocol(0x01u), + + /** + * Any other IP based protocol + */ AnyIPProtocol(0x02u), + + /** + * Any other network protocol + */ UnknownNetworkLayerProtocol(0xFFu); companion object { private val values = values().associateBy(NetworkLayerProtocol::value) + + /** + * Obtain from underlying representation + */ fun of(value: UByte): NetworkLayerProtocol? = values[value] } } diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/QStringList.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/QStringList.kt new file mode 100644 index 0000000..e94eb62 --- /dev/null +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/QStringList.kt @@ -0,0 +1,6 @@ +package de.justjanne.libquassel.protocol.types + +/** + * Simple alias for a generic QStringList type + */ +typealias QStringList = List<String?> diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/SignedId.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/SignedId.kt similarity index 84% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/SignedId.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/SignedId.kt index 77dc79c..15d8862 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/SignedId.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/SignedId.kt @@ -22,11 +22,23 @@ package de.justjanne.libquassel.protocol.types import de.justjanne.libquassel.annotations.Generated import java.io.Serializable +/** + * Native representation of a SignedId + */ typealias SignedIdType = Int +/** + * Native representation of a SignedId64 + */ typealias SignedId64Type = Long +/** + * Base type for a signed id + */ interface SignedId<T> : Serializable, Comparable<SignedId<T>> where T : Number, T : Comparable<T> { + /** + * Underlying representation + */ val id: T override fun compareTo(other: SignedId<T>): Int { @@ -34,11 +46,17 @@ interface SignedId<T> : Serializable, Comparable<SignedId<T>> } } +/** + * Validity check for a signed id + */ @Suppress("NOTHING_TO_INLINE") @JvmName("isValidId") @Generated inline fun SignedId<SignedIdType>.isValid() = id > 0 +/** + * Validity check for a signed id + */ @Suppress("NOTHING_TO_INLINE") @JvmName("isValidId64") @Generated diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/TimeSpec.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/TimeSpec.kt similarity index 100% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/types/TimeSpec.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/types/TimeSpec.kt diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QVariant.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariant.kt similarity index 62% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QVariant.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariant.kt index 30a1b17..e646a91 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QVariant.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariant.kt @@ -28,32 +28,44 @@ import de.justjanne.libquassel.protocol.serializers.QuasselSerializer import de.justjanne.libquassel.protocol.serializers.QuasselSerializers import java.nio.ByteBuffer +/** + * Simple alias for a generic QVariant type + */ typealias QVariant_ = QVariant<*> -typealias QVariantList = List<QVariant_> -typealias QVariantMap = Map<String, QVariant_> -typealias QStringList = List<String?> +/** + * Variant box for generic types + */ sealed class QVariant<T> { - abstract val data: T - abstract val serializer: QtSerializer<T> + @PublishedApi + internal abstract val data: T + + @PublishedApi + internal abstract val serializer: QtSerializer<T> - data class Typed<T> internal constructor( + /** + * QVariant of a predefined qt type + */ + data class Typed<T> @PublishedApi internal constructor( override val data: T, override val serializer: QtSerializer<T> ) : QVariant<T>() { override fun toString() = super.toString() } - data class Custom<T> internal constructor( + /** + * QVariant of an arbitrary custom type + * + * Serialized as [QtType.UserType] with the custom type name serialized as ASCII string + */ + data class Custom<T> @PublishedApi internal constructor( override val data: T, override val serializer: QuasselSerializer<T> ) : QVariant<T>() { override fun toString() = super.toString() } - fun value(): T = data - - fun serialize(buffer: ChainedByteBuffer, featureSet: FeatureSet) { + internal fun serialize(buffer: ChainedByteBuffer, featureSet: FeatureSet) { serializer.serialize(buffer, data, featureSet) } @@ -66,25 +78,36 @@ sealed class QVariant<T> { } } + @PublishedApi @Suppress("UNCHECKED_CAST") - inline fun <reified T> withType(): QVariant<T>? = - if (serializer.javaType == T::class.java && this.value() is T) this as QVariant<T> + internal inline fun <reified T> withType(): QVariant<T>? = + if (serializer.javaType == T::class.java && this.data is T) this as QVariant<T> else null - - companion object { - fun <T> of(data: T, serializer: QtSerializer<T>) = Typed(data, serializer) - fun <T> of(data: T, serializer: QuasselSerializer<T>) = Custom(data, serializer) - } } +/** + * Construct a QVariant from data and type + */ inline fun <reified T> qVariant(data: T, type: QtType): QVariant<T> = - QVariant.of(data, QtSerializers.find(type)) + QVariant.Typed(data, QtSerializers.find(type)) +/** + * Construct a QVariant from data and type + */ inline fun <reified T> qVariant(data: T, type: QuasselType): QVariant<T> = - QVariant.of(data, QuasselSerializers.find(type)) + QVariant.Custom(data, QuasselSerializers.find(type)) +/** + * Extract the content of a QVariant in a type-safe manner + * @return value of the QVariant or null + */ inline fun <reified T> QVariant_?.into(): T? = - this?.withType<T>()?.value() + this?.withType<T>()?.data +/** + * Extract the content of a QVariant in a type-safe manner + * @param defValue default value if the type does not match or no value is found + * @return value of the QVariant or defValue + */ inline fun <reified T> QVariant_?.into(defValue: T): T = - this?.withType<T>()?.value() ?: defValue + this?.withType<T>()?.data ?: defValue 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 new file mode 100644 index 0000000..9199776 --- /dev/null +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantList.kt @@ -0,0 +1,6 @@ +package de.justjanne.libquassel.protocol.variant + +/** + * Simple alias for a generic QVariantList type + */ +typealias QVariantList = List<QVariant_> 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 new file mode 100644 index 0000000..76057f1 --- /dev/null +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt @@ -0,0 +1,6 @@ +package de.justjanne.libquassel.protocol.variant + +/** + * Simple alias for a generic QVariantMap type + */ +typealias QVariantMap = Map<String, QVariant_> diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QtType.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QtType.kt similarity index 63% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QtType.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QtType.kt index 607a0d2..c99fc1a 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QtType.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QtType.kt @@ -22,87 +22,26 @@ package de.justjanne.libquassel.protocol.variant enum class QtType(val id: kotlin.Int) { Void(0), Bool(1), + Char(131), + UChar(134), + Short(130), + UShort(133), Int(2), UInt(3), - LongLong(4), - ULongLong(5), - + Long(129), + ULong(132), + Float(135), Double(6), + QDate(14), + QTime(15), + QDateTime(16), QChar(7), - QVariantMap(8), - QVariantList(9), - QString(10), QStringList(11), QByteArray(12), - - QBitArray(13), - QDate(14), - QTime(15), - QDateTime(16), - QUrl(17), - - QLocale(18), - QRect(19), - QRectF(20), - QSize(21), - QSizeF(22), - - QLine(23), - QLineF(24), - QPoint(25), - QPointF(26), - QRegExp(27), - - QVariantHash(28), - QEasingCurve(29), - - FirstGuiType(63), - - QFont(64), - QPixmap(65), - QBrush(66), - QColor(67), - QPalette(68), - - QIcon(69), - QImage(70), - QPolygon(71), - QRegion(72), - QBitmap(73), - - QCursor(74), - QSizePolicy(75), - QKeySequence(76), - QPen(77), - - QTextLength(78), - QTextFormat(79), - QMatrix(80), - QTransform(81), - - QMatrix4x4(82), - QVector2D(83), - QVector3D(84), - QVector4D(85), - - QQuaternion(86), - - VoidStar(128), - Long(129), - Short(130), - Char(131), - ULong(132), - - UShort(133), - UChar(134), - Float(135), - QObjectStar(136), - QWidgetStar(137), - QVariant(138), - - User(256), + QVariantMap(8), + QVariantList(9), UserType(127); companion object { diff --git a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QuasselType.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QuasselType.kt similarity index 97% rename from libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QuasselType.kt rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QuasselType.kt index 3cd82d0..b163618 100644 --- a/libquassel-protocol/src/main/java/de/justjanne/libquassel/protocol/variant/QuasselType.kt +++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QuasselType.kt @@ -37,8 +37,7 @@ enum class QuasselType( NetworkInfo("NetworkInfo"), NetworkServer("Network::Server"), QHostAddress("QHostAddress"), - PeerPtr("PeerPtr"), - Unknown(""); + PeerPtr("PeerPtr"); companion object { private val values = values().associateBy(QuasselType::typeName) diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/connection/ConnectionHeaderSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeaderSerializerTest.kt similarity index 92% rename from libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/connection/ConnectionHeaderSerializerTest.kt rename to libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeaderSerializerTest.kt index 7a2db6d..b139377 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/connection/ConnectionHeaderSerializerTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/connection/ClientHeaderSerializerTest.kt @@ -24,19 +24,19 @@ import de.justjanne.libquassel.protocol.testutil.byteBufferOf import de.justjanne.libquassel.protocol.testutil.serializerTest import org.junit.jupiter.api.Test -class ConnectionHeaderSerializerTest { +class ClientHeaderSerializerTest { @Test fun testQuasseldroid() = serializerTest( - ConnectionHeaderSerializer, - ConnectionHeader( + ClientHeaderSerializer, + ClientHeader( features = ProtocolFeature.of( ProtocolFeature.TLS, ProtocolFeature.Compression, ), versions = listOf( ProtocolMeta( - data = 0x0000u, version = ProtocolVersion.Datastream, + data = 0x0000u, ) ) ), @@ -48,20 +48,20 @@ class ConnectionHeaderSerializerTest { @Test fun testQuasselClient() = serializerTest( - ConnectionHeaderSerializer, - ConnectionHeader( + ClientHeaderSerializer, + ClientHeader( features = ProtocolFeature.of( ProtocolFeature.TLS, ProtocolFeature.Compression, ), versions = listOf( ProtocolMeta( - data = 0x0000u, version = ProtocolVersion.Legacy, + data = 0x0000u, ), ProtocolMeta( - data = 0x0000u, version = ProtocolVersion.Datastream, + data = 0x0000u, ) ) ), @@ -74,17 +74,17 @@ class ConnectionHeaderSerializerTest { @Test fun testDebugClient() = serializerTest( - ConnectionHeaderSerializer, - ConnectionHeader( + ClientHeaderSerializer, + ClientHeader( features = ProtocolFeature.of(), versions = listOf( ProtocolMeta( - data = 0x0000u, version = ProtocolVersion.Legacy, + data = 0x0000u, ), ProtocolMeta( - data = 0x0000u, version = ProtocolVersion.Datastream, + data = 0x0000u, ) ) ), diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/features/FeatureSetTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/features/FeatureSetTest.kt index 4f0b689..f0a44ca 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/features/FeatureSetTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/features/FeatureSetTest.kt @@ -29,7 +29,7 @@ class FeatureSetTest { fun testParse() { assertEquals( emptyList<QuasselFeatureName>(), - FeatureSet.parse( + FeatureSet.build( LegacyFeature.none(), emptyList() ).featureList() @@ -41,7 +41,7 @@ class FeatureSetTest { QuasselFeature.ExtendedFeatures.feature, QuasselFeatureName("_unknownFeature") ), - FeatureSet.parse( + FeatureSet.build( LegacyFeature.of( LegacyFeature.SynchronizedMarkerLine ), diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt similarity index 91% rename from libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitSerializerTest.kt rename to libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt index d15075d..2a356f3 100644 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/handshake/ClientInitSerializerTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt @@ -16,13 +16,15 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.handshake +package de.justjanne.libquassel.protocol.serializers.handshake import de.justjanne.bitflags.none -import de.justjanne.libquassel.messages.testutil.byteBufferOf -import de.justjanne.libquassel.messages.testutil.handshakeSerializerTest import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.features.LegacyFeature +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializers +import de.justjanne.libquassel.protocol.testutil.byteBufferOf +import de.justjanne.libquassel.protocol.testutil.handshakeSerializerTest +import de.justjanne.libquassel.protocol.types.HandshakeMessage import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/deserialize.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/deserialize.kt index bbb0a8a..833dc11 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/deserialize.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/deserialize.kt @@ -19,7 +19,9 @@ package de.justjanne.libquassel.protocol.testutil import de.justjanne.libquassel.protocol.features.FeatureSet +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer import de.justjanne.libquassel.protocol.serializers.Serializer +import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer import org.hamcrest.Matcher import org.hamcrest.MatcherAssert.assertThat import org.junit.jupiter.api.Assertions.assertEquals @@ -54,3 +56,25 @@ fun <T> testDeserialize( val after = deserialize(serializer, buffer, featureSet) assertEquals(data, after) } + +fun <T> testDeserialize( + serializer: HandshakeSerializer<T>, + matcher: Matcher<in T>, + buffer: ByteBuffer, + featureSet: FeatureSet = FeatureSet.all() +) { + val map = deserialize(HandshakeMapSerializer, buffer, featureSet) + val after = serializer.deserialize(map) + assertThat(after, matcher) +} + +fun <T> testDeserialize( + serializer: HandshakeSerializer<T>, + data: T, + buffer: ByteBuffer, + featureSet: FeatureSet = FeatureSet.all() +) { + val map = deserialize(HandshakeMapSerializer, buffer, featureSet) + val after = serializer.deserialize(map) + assertEquals(data, after) +} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/handshakeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt similarity index 93% rename from libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/handshakeSerializerTest.kt rename to libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt index 0640b99..d0e2271 100644 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/handshakeSerializerTest.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.testutil +package de.justjanne.libquassel.protocol.testutil -import de.justjanne.libquassel.messages.handshake.HandshakeSerializer import de.justjanne.libquassel.protocol.features.FeatureSet +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer import org.hamcrest.Matcher import java.nio.ByteBuffer diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serialize.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serialize.kt index e835d3d..c606ef8 100644 --- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serialize.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serialize.kt @@ -20,7 +20,9 @@ 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.serializers.HandshakeSerializer import de.justjanne.libquassel.protocol.serializers.Serializer +import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher import org.hamcrest.MatcherAssert.assertThat import java.nio.ByteBuffer @@ -44,3 +46,14 @@ fun <T> testSerialize( val after = serialize(serializer, data, featureSet) assertThat(after, ByteBufferMatcher(buffer)) } + +fun <T> testSerialize( + serializer: HandshakeSerializer<T>, + data: T, + buffer: ByteBuffer, + featureSet: FeatureSet = FeatureSet.all() +) { + val map = serializer.serialize(data) + val after = serialize(HandshakeMapSerializer, map, featureSet) + assertThat(after, ByteBufferMatcher(buffer)) +} diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/testHandshakeSerializerDirect.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerDirect.kt similarity index 90% rename from libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/testHandshakeSerializerDirect.kt rename to libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerDirect.kt index b5b0091..c1ad766 100644 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/testHandshakeSerializerDirect.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerDirect.kt @@ -16,9 +16,9 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.testutil +package de.justjanne.libquassel.protocol.testutil -import de.justjanne.libquassel.messages.handshake.HandshakeSerializer +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer import org.hamcrest.Matcher import org.hamcrest.MatcherAssert.assertThat import org.junit.jupiter.api.Assertions.assertEquals diff --git a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/testHandshakeSerializerEncoded.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerEncoded.kt similarity index 92% rename from libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/testHandshakeSerializerEncoded.kt rename to libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerEncoded.kt index 6248b47..56692a9 100644 --- a/libquassel-messages/src/test/kotlin/de/justjanne/libquassel/messages/testutil/testHandshakeSerializerEncoded.kt +++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerEncoded.kt @@ -16,11 +16,11 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.justjanne.libquassel.messages.testutil +package de.justjanne.libquassel.protocol.testutil -import de.justjanne.libquassel.messages.handshake.HandshakeSerializer import de.justjanne.libquassel.protocol.features.FeatureSet import de.justjanne.libquassel.protocol.io.ChainedByteBuffer +import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer import org.hamcrest.Matcher import org.hamcrest.MatcherAssert.assertThat diff --git a/settings.gradle.kts b/settings.gradle.kts index 09febef..dd56c80 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,5 @@ include( ":libquassel-tests", ":libquassel-annotations", ":libquassel-protocol", - ":libquassel-messages", ":libquassel-client" ) -- GitLab