From cb1da56946880da9ca9ec2a7699e43625efc561f Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Thu, 29 Mar 2018 15:42:23 +0200 Subject: [PATCH] Significant performance improvements --- .../quasseldroid/service/QuasselService.kt | 4 +- .../compatibility/AndroidHandlerService.kt | 2 +- .../annotations/InvokerProcessor.java | 11 +- .../kuschku/libquassel/protocol/MetaType.kt | 103 ------------------ .../de/kuschku/libquassel/protocol/QType.kt | 43 +++++--- .../de/kuschku/libquassel/protocol/QTypes.kt | 5 +- .../kuschku/libquassel/protocol/QVariant.kt | 36 ++++-- .../de/kuschku/libquassel/protocol/Type.kt | 41 +++---- .../message/ClientInitAckSerializer.kt | 17 ++- .../message/ClientInitRejectSerializer.kt | 6 +- .../protocol/message/ClientInitSerializer.kt | 12 +- .../message/ClientLoginAckSerializer.kt | 4 +- .../message/ClientLoginRejectSerializer.kt | 6 +- .../protocol/message/ClientLoginSerializer.kt | 8 +- .../message/CoreSetupAckSerializer.kt | 4 +- .../message/CoreSetupDataSerializer.kt | 21 ++-- .../message/CoreSetupRejectSerializer.kt | 6 +- .../protocol/message/HandshakeMessage.kt | 2 - .../message/HeartBeatReplySerializer.kt | 6 +- .../protocol/message/HeartBeatSerializer.kt | 6 +- .../protocol/message/InitDataSerializer.kt | 8 +- .../protocol/message/InitRequestSerializer.kt | 8 +- .../protocol/message/RpcCallSerializer.kt | 6 +- .../protocol/message/SessionInitSerializer.kt | 15 ++- .../protocol/message/SignalProxyMessage.kt | 2 - .../protocol/message/SyncMessageSerializer.kt | 10 +- .../primitive/serializer/CharSerializer.kt | 1 - .../HandshakeVariantMapSerializer.kt | 4 +- .../primitive/serializer/Serializer.kt | 1 - .../primitive/serializer/StringSerializer.kt | 3 +- .../serializer/VariantListSerializer.kt | 1 - .../serializer/VariantMapSerializer.kt | 1 - .../primitive/serializer/VariantSerializer.kt | 31 +++--- .../libquassel/quassel/QuasselFeatures.kt | 2 +- .../exceptions/DeserializationException.kt | 9 ++ .../exceptions/MessageHandlingException.kt | 16 +++ .../quassel/syncables/AliasManager.kt | 8 +- .../quassel/syncables/BufferSyncer.kt | 24 ++-- .../quassel/syncables/BufferViewConfig.kt | 32 +++--- .../quassel/syncables/BufferViewManager.kt | 4 +- .../quassel/syncables/CertManager.kt | 4 +- .../libquassel/quassel/syncables/CoreInfo.kt | 4 +- .../libquassel/quassel/syncables/DccConfig.kt | 20 ++-- .../libquassel/quassel/syncables/Identity.kt | 38 +++---- .../quassel/syncables/IgnoreListManager.kt | 4 +- .../quassel/syncables/IrcChannel.kt | 37 +++---- .../libquassel/quassel/syncables/IrcUser.kt | 38 +++---- .../libquassel/quassel/syncables/Network.kt | 97 ++++++++--------- .../quassel/syncables/NetworkConfig.kt | 18 +-- .../quassel/syncables/interfaces/INetwork.kt | 24 ++-- .../libquassel/session/CoreConnection.kt | 3 +- .../libquassel/session/MessageRunnable.kt | 6 + .../libquassel/session/ObjectStorage.kt | 6 +- .../libquassel/session/ProtocolHandler.kt | 57 +++++----- .../de/kuschku/libquassel/session/Session.kt | 13 +-- .../libquassel/session/SessionManager.kt | 6 +- .../kuschku/libquassel/session/SignalProxy.kt | 10 +- .../util/compatibility/LoggingHandler.kt | 9 +- .../kuschku/libquassel/ConnectionUnitTest.kt | 18 +-- .../kuschku/libquassel/SerializerUnitTest.kt | 88 ++++++++++++++- .../java/de/kuschku/malheur/CrashHandler.kt | 2 +- 61 files changed, 519 insertions(+), 512 deletions(-) delete mode 100644 lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt create mode 100644 lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/DeserializationException.kt create mode 100644 lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/MessageHandlingException.kt diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt index 73d59ca90..a85ad2860 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt @@ -11,6 +11,7 @@ import de.kuschku.libquassel.protocol.Protocol_Feature import de.kuschku.libquassel.protocol.Protocol_Features import de.kuschku.libquassel.quassel.QuasselFeatures import de.kuschku.libquassel.session.* +import de.kuschku.malheur.CrashHandler import de.kuschku.quasseldroid.BuildConfig import de.kuschku.quasseldroid.Keys import de.kuschku.quasseldroid.R @@ -270,7 +271,8 @@ class QuasselService : DaggerLifecycleService(), ISession.NULL, QuasselBacklogStorage(database), handlerService, - ::disconnectFromCore + ::disconnectFromCore, + CrashHandler::handle ) clientData = ClientData( diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt b/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt index 7044fd697..b61c3b793 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt @@ -11,7 +11,7 @@ class AndroidHandlerService : HandlerService { } override fun deserialize(f: () -> Unit) { - serializeHandler.post(f) + deserializeHandler.post(f) } override fun write(f: () -> Unit) { diff --git a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java index 0a3a15456..a53a6b016 100644 --- a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java +++ b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java @@ -9,6 +9,7 @@ import com.squareup.javapoet.ParameterSpec; import com.squareup.javapoet.ParameterizedTypeName; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; +import com.squareup.javapoet.WildcardTypeName; import java.io.IOException; import java.util.ArrayList; @@ -129,9 +130,11 @@ public class InvokerProcessor extends AbstractProcessor { .builder( ParameterizedTypeName.get( ClassName.get(List.class), - ParameterizedTypeName.get( - ClassName.get("de.kuschku.libquassel.protocol", "QVariant"), - TypeName.get(Object.class) + WildcardTypeName.subtypeOf( + ParameterizedTypeName.get( + ClassName.get("de.kuschku.libquassel.protocol", "QVariant"), + WildcardTypeName.subtypeOf(Object.class) + ) ) ), "params" @@ -159,7 +162,7 @@ public class InvokerProcessor extends AbstractProcessor { TypeMirror parameterType = slot.type.getParameterTypes().get(i); boolean isLast = i + 1 == slot.type.getParameterTypes().size(); - invokeSpec = invokeSpec.addCode("($T) $N.get($L).getData()", parameterType, parameterSpecParams, i); + invokeSpec = invokeSpec.addCode("($T) ($T) $N.get($L).getData()", parameterType, Object.class, parameterSpecParams, i); if (!isLast) invokeSpec = invokeSpec.addCode(","); invokeSpec = invokeSpec.addCode("\n"); diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt deleted file mode 100644 index fee50680b..000000000 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt +++ /dev/null @@ -1,103 +0,0 @@ -package de.kuschku.libquassel.protocol - -import de.kuschku.libquassel.protocol.primitive.serializer.* -import org.threeten.bp.LocalTime -import org.threeten.bp.OffsetDateTime - -data class MetaType<T>(val klass: Class<T>, val type: Type, val serializer: Serializer<T>? = null, - val name: String = type.serializableName) { - companion object { - private val byName = HashMap<String, MetaType<*>>() - private val byType = HashMap<Type, MetaType<*>>() - - private inline fun <reified T : Any?> addType(type: Type, - serializer: Serializer<T>? = null) { - val metaType = MetaType(T::class.java, type, serializer, type.serializableName) - byName[metaType.name] = metaType - byType[metaType.type] = metaType - } - - private inline fun <reified T : Any?> addType(type: Type, name: String, - serializer: Serializer<T>? = null) { - val metaType = MetaType(T::class.java, type, serializer, name) - byName[metaType.name] = metaType - } - - private inline fun <reified T : Any?> addType(type: Type, name: QType, - serializer: Serializer<T>? = null) { - addType(type, name.typeName, serializer) - } - - init { - addType(Type.Void, VoidSerializer) - addType(Type.Bool, BoolSerializer) - addType(Type.Char, ByteSerializer) - addType(Type.UChar, ByteSerializer) - addType(Type.Short, ShortSerializer) - addType(Type.UShort, ShortSerializer) - addType(Type.Int, IntSerializer) - addType(Type.UInt, IntSerializer) - addType(Type.Long, LongSerializer) - addType(Type.ULong, LongSerializer) - - addType(Type.QTime, TimeSerializer) - addType(Type.QDateTime, DateTimeSerializer) - addType(Type.QChar, CharSerializer) - addType(Type.QString, StringSerializer.UTF16) - addType(Type.QByteArray, ByteArraySerializer) - addType(Type.QStringList, StringListSerializer) - addType(Type.QVariantList, VariantListSerializer) - addType(Type.QVariantMap, VariantMapSerializer) - addType(Type.QVariant, VariantSerializer) - - addType(Type.UserType, QType.BufferId, IntSerializer) - addType(Type.UserType, QType.BufferInfo, BufferInfoSerializer) - addType(Type.UserType, QType.DccConfig_IpDetectionMode, DccConfig_IpDetectionModeSerializer) - addType( - Type.UserType, QType.DccConfig_PortSelectionMode, - DccConfig_PortSelectionModeSerializer - ) - addType(Type.UserType, QType.IrcUser, VariantMapSerializer) - addType(Type.UserType, QType.IrcChannel, VariantMapSerializer) - addType(Type.UserType, QType.Identity, VariantMapSerializer) - addType(Type.UserType, QType.IdentityId, IntSerializer) - addType(Type.UserType, QType.MsgId, IntSerializer) - addType(Type.UserType, QType.Message, MessageSerializer) - addType(Type.UserType, QType.NetworkId, IntSerializer) - addType(Type.UserType, QType.NetworkInfo, VariantMapSerializer) - addType(Type.UserType, QType.Network_Server, VariantMapSerializer) - addType(Type.UserType, QType.QHostAddress, HostAddressSerializer) - - addType(Type.QByteArray, "UTF8String", StringSerializer.UTF8) - addType(Type.QByteArray, "CString", StringSerializer.C) - - addType(Type.Long, "PeerPtr", LongSerializer) - } - - fun <T : Any?> get(key: String?): MetaType<T> = - byName[key] as MetaType<T>? ?: throw(IllegalArgumentException("Type does not exist: $key")) - - - fun <T : Any?> get(key: Type?): MetaType<T> = - byType[key] as MetaType<T>? ?: throw(IllegalArgumentException("Type does not exist: $key")) - - fun <T : Any?> get(data: T): MetaType<T>? = when (data) { - equals(null) -> get(Type.Void) - is Boolean -> get<Boolean>(Type.Bool) - is Byte -> get<Byte>(Type.Char) - is Short -> get<Short>(Type.Short) - is Int -> get<Int>(Type.Int) - is Long -> get<Long>(Type.Long) - is LocalTime -> get<LocalTime>(Type.QTime) - is OffsetDateTime -> get<OffsetDateTime>(Type.QDateTime) - is String -> get<String?>(Type.QString) - is QVariant<*> -> get<QVariant<*>>(Type.QVariant) - is List<*> -> if (data.isEmpty() || data[0] !is String) { - get<List<*>>(Type.QVariantList) - } else { - get<QStringList>(Type.QStringList) - } - else -> throw IllegalArgumentException("Unsupported type: $data") - } as MetaType<T> - } -} diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt index 21529ef3f..8da3dff44 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt @@ -1,19 +1,30 @@ package de.kuschku.libquassel.protocol -enum class QType(val typeName: String) { - BufferId("BufferId"), - BufferInfo("BufferInfo"), - DccConfig_IpDetectionMode("DccConfig::IpDetectionMode"), - DccConfig_PortSelectionMode("DccConfig::PortSelectionMode"), - IrcUser("IrcUser"), - IrcChannel("IrcChannel"), - Identity("Identity"), - IdentityId("IdentityId"), - Message("Message"), - MsgId("MsgId"), - Network("Network"), - NetworkId("NetworkId"), - NetworkInfo("NetworkInfo"), - Network_Server("Network::Server"), - QHostAddress("QHostAddress") +import de.kuschku.libquassel.protocol.primitive.serializer.* + +enum class QType(val typeName: String, val serializer: Serializer<*>, + val type: Type = Type.UserType) { + BufferId("BufferId", IntSerializer), + BufferInfo("BufferInfo", BufferInfoSerializer), + DccConfig_IpDetectionMode("DccConfig::IpDetectionMode", DccConfig_IpDetectionModeSerializer), + DccConfig_PortSelectionMode("DccConfig::PortSelectionMode", + DccConfig_PortSelectionModeSerializer), + IrcUser("IrcUser", VariantMapSerializer), + IrcChannel("IrcChannel", VariantMapSerializer), + Identity("Identity", VariantMapSerializer), + IdentityId("IdentityId", IntSerializer), + Message("Message", MessageSerializer), + MsgId("MsgId", IntSerializer), + NetworkId("NetworkId", IntSerializer), + NetworkInfo("NetworkInfo", VariantMapSerializer), + Network_Server("Network::Server", VariantMapSerializer), + QHostAddress("QHostAddress", HostAddressSerializer), + PeerPtr("PeerPtr", LongSerializer, type = Type.Long); + + override fun toString() = "QType($typeName, $type)" + + companion object { + private val map = values().associateBy(QType::typeName) + fun of(name: String) = map[name] + } } diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt index 5b931a465..dd3ec4116 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt @@ -12,7 +12,7 @@ import java.nio.ByteBuffer typealias QStringList = List<String?> typealias All_ = Any? -typealias QVariant_ = QVariant<All_> +typealias QVariant_ = QVariant<*> typealias QVariantMap = Map<String, QVariant_> typealias QVariantList = List<QVariant_> @@ -47,7 +47,8 @@ typealias UShort = Short typealias UInt = Int typealias ULong = Long -typealias ARG = QVariant_ +inline fun <T> ARG(data: T?, type: Type) = QVariant.of(data, type) +inline fun <T> ARG(data: T?, type: QType) = QVariant.of(data, type) fun QVariantList.toVariantMap(): QVariantMap { val map = HashMap<String, QVariant_>() diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt index 22cd81d6d..e70c2ab8d 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt @@ -1,19 +1,41 @@ package de.kuschku.libquassel.protocol -class QVariant<T>(val data: T?, val type: MetaType<T>) { - constructor(data: T?, type: Type) : this(data, MetaType.Companion.get(type)) - constructor(data: T?, type: QType) : this(data, type.typeName) - constructor(data: T?, type: String) : this(data, MetaType.Companion.get(type)) +import de.kuschku.libquassel.protocol.primitive.serializer.Serializer +import java.nio.ByteBuffer +import java.nio.CharBuffer + +sealed class QVariant<T> constructor(val data: T?, val type: Type, val serializer: Serializer<T>) { + class Typed<T> internal constructor(data: T?, type: Type, serializer: Serializer<T>) : + QVariant<T>(data, type, serializer) { + override fun toString() = "QVariant.Typed(${type.serializableName}, ${toString(data)})" + } + + class Custom<T> internal constructor(data: T?, val qtype: QType, serializer: Serializer<T>) : + QVariant<T>(data, qtype.type, serializer) { + override fun toString() = "QVariant.Custom($qtype, ${toString(data)})" + } fun or(defValue: T): T { return data ?: defValue } - override fun toString(): String { - return "QVariant(${type.name}, $data)" + companion object { + fun <T> of(data: T?, type: Type): QVariant<T> { + return QVariant.Typed(data, type, type.serializer as Serializer<T>) + } + + fun <T> of(data: T?, type: QType) = + QVariant.Custom(data, type, type.serializer as Serializer<T>) } } +inline fun toString(data: Any?) = when (data) { + is ByteBuffer -> data.array()?.contentToString() + is CharBuffer -> data.array()?.contentToString() + is Array<*> -> data.contentToString() + else -> data.toString() +} + inline fun <reified U> QVariant_?.value(): U? = this?.value<U?>(null) inline fun <reified U> QVariant_?.value(defValue: U): U = this?.data as? U ?: defValue @@ -24,4 +46,4 @@ inline fun <reified U> QVariant_?.valueOrThrow(e: Throwable = NullPointerExcepti this?.data as? U ?: throw e inline fun <reified U> QVariant_?.valueOrThrow(e: () -> Throwable): U = - this?.data as? U ?: throw e() + this?.data as? U ?: throw e() \ No newline at end of file diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt index f644d14a9..44a70bef0 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt @@ -1,29 +1,30 @@ package de.kuschku.libquassel.protocol +import de.kuschku.libquassel.protocol.primitive.serializer.* import java.util.* -enum class Type(val id: kotlin.Int) { - Void(0), - Bool(1), - Int(2), - UInt(3), +enum class Type(val id: kotlin.Int, val serializer: Serializer<*>? = null) { + Void(0, VoidSerializer), + Bool(1, BoolSerializer), + Int(2, IntSerializer), + UInt(3, IntSerializer), LongLong(4), ULongLong(5), Double(6), - QChar(7), - QVariantMap(8), - QVariantList(9), + QChar(7, CharSerializer), + QVariantMap(8, VariantMapSerializer), + QVariantList(9, VariantListSerializer), - QString(10), - QStringList(11), - QByteArray(12), + QString(10, StringSerializer.UTF16), + QStringList(11, StringListSerializer), + QByteArray(12, ByteArraySerializer), QBitArray(13), QDate(14), - QTime(15), - QDateTime(16), + QTime(15, TimeSerializer), + QDateTime(16, DateTimeSerializer), QUrl(17), QLocale(18), @@ -73,18 +74,18 @@ enum class Type(val id: kotlin.Int) { QQuaternion(86), VoidStar(128), - Long(129), - Short(130), - Char(131), - ULong(132), + Long(129, LongSerializer), + Short(130, ShortSerializer), + Char(131, ByteSerializer), + ULong(132, LongSerializer), - UShort(133), - UChar(134), + UShort(133, ShortSerializer), + UChar(134, ByteSerializer), Float(135), QObjectStar(136), QWidgetStar(137), - QVariant(138), + QVariant(138, VariantSerializer), User(256), UserType(127), diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt index 5f45467c8..69aade656 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt @@ -1,19 +1,16 @@ package de.kuschku.libquassel.protocol.message -import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ -import de.kuschku.libquassel.protocol.Type -import de.kuschku.libquassel.protocol.value +import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.util.Flags object ClientInitAckSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInitAck> { override fun serialize(data: HandshakeMessage.ClientInitAck) = mapOf( - "MsgType" to QVariant_("ClientInitAck", Type.QString), - "CoreFeatures" to QVariant_(data.coreFeatures?.toInt(), Type.UInt), - "StorageBackends" to QVariant_(data.backendInfo, Type.QVariantList), - "Authenticator" to QVariant_(data.authenticatorInfo, Type.QVariantList), - "Configured" to QVariant_(data.coreConfigured, Type.Bool), - "FeatureList" to QVariant_(data.featureList, Type.QStringList) + "MsgType" to QVariant.of<All_>("ClientInitAck", Type.QString), + "CoreFeatures" to QVariant.of<All_>(data.coreFeatures?.toInt(), Type.UInt), + "StorageBackends" to QVariant.of<All_>(data.backendInfo, Type.QVariantList), + "Authenticator" to QVariant.of<All_>(data.authenticatorInfo, Type.QVariantList), + "Configured" to QVariant.of<All_>(data.coreConfigured, Type.Bool), + "FeatureList" to QVariant.of<All_>(data.featureList, Type.QStringList) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitAck( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt index 41da7bf3f..12655873b 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt @@ -1,14 +1,14 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value object ClientInitRejectSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInitReject> { override fun serialize(data: HandshakeMessage.ClientInitReject) = mapOf( - "MsgType" to QVariant_("ClientInitReject", Type.QString), - "Error" to QVariant_(data.errorString, Type.QString) + "MsgType" to QVariant.of("ClientInitReject", Type.QString), + "Error" to QVariant.of(data.errorString, Type.QString) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitReject( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt index 9d7c44c0e..9050cc750 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt @@ -1,18 +1,18 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value import de.kuschku.libquassel.util.Flags object ClientInitSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInit> { override fun serialize(data: HandshakeMessage.ClientInit) = mapOf( - "MsgType" to QVariant_("ClientInit", Type.QString), - "ClientVersion" to QVariant_(data.clientVersion, Type.QString), - "ClientDate" to QVariant_(data.buildDate, Type.QString), - "Features" to QVariant_(data.clientFeatures?.toInt(), Type.UInt), - "FeatureList" to QVariant_(data.featureList, Type.QStringList) + "MsgType" to QVariant.of("ClientInit", Type.QString), + "ClientVersion" to QVariant.of(data.clientVersion, Type.QString), + "ClientDate" to QVariant.of(data.buildDate, Type.QString), + "Features" to QVariant.of(data.clientFeatures?.toInt(), Type.UInt), + "FeatureList" to QVariant.of(data.featureList, Type.QStringList) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInit( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt index ee42806e4..7096331cc 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt @@ -1,12 +1,12 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type object ClientLoginAckSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientLoginAck> { override fun serialize(data: HandshakeMessage.ClientLoginAck) = mapOf( - "MsgType" to QVariant_("ClientLoginAck", Type.QString) + "MsgType" to QVariant.of("ClientLoginAck", Type.QString) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLoginAck() diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt index 11dd2b7fb..c2e53de45 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt @@ -1,15 +1,15 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value object ClientLoginRejectSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientLoginReject> { override fun serialize(data: HandshakeMessage.ClientLoginReject) = mapOf( - "MsgType" to QVariant_("ClientLoginReject", Type.QString), - "Error" to QVariant_(data.errorString, Type.QString) + "MsgType" to QVariant.of("ClientLoginReject", Type.QString), + "Error" to QVariant.of(data.errorString, Type.QString) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLoginReject( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt index 35fdc7c70..0a9347706 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt @@ -1,15 +1,15 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value object ClientLoginSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientLogin> { override fun serialize(data: HandshakeMessage.ClientLogin) = mapOf( - "MsgType" to QVariant_("ClientLogin", Type.QString), - "User" to QVariant_(data.user, Type.QString), - "Password" to QVariant_(data.password, Type.QString) + "MsgType" to QVariant.of("ClientLogin", Type.QString), + "User" to QVariant.of(data.user, Type.QString), + "Password" to QVariant.of(data.password, Type.QString) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLogin( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt index 8f92d8a58..dbc954868 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt @@ -1,12 +1,12 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type object CoreSetupAckSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupAck> { override fun serialize(data: HandshakeMessage.CoreSetupAck) = mapOf( - "MsgType" to QVariant_("CoreSetupAck", Type.QString) + "MsgType" to QVariant.of("CoreSetupAck", Type.QString) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.CoreSetupAck() diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt index 47462bb78..6988b1c18 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt @@ -1,22 +1,21 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value object CoreSetupDataSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupData> { override fun serialize(data: HandshakeMessage.CoreSetupData) = mapOf( - "MsgType" to QVariant_("CoreSetupData", Type.QString), - "SetupData" to QVariant_( - mapOf( - "AdminUser" to QVariant_(data.adminUser, Type.QString), - "AdminPasswd" to QVariant_(data.adminPassword, Type.QString), - "Backend" to QVariant_(data.backend, Type.QString), - "ConnectionProperties" to QVariant_(data.setupData, Type.QVariantMap), - "Authenticator" to QVariant_(data.authenticator, Type.QString), - "AuthProperties" to QVariant_(data.authSetupData, Type.QVariantMap) - ), Type.QVariantMap + "MsgType" to QVariant.of("CoreSetupData", Type.QString), + "SetupData" to QVariant.of(mapOf( + "AdminUser" to QVariant.of(data.adminUser, Type.QString), + "AdminPasswd" to QVariant.of(data.adminPassword, Type.QString), + "Backend" to QVariant.of(data.backend, Type.QString), + "ConnectionProperties" to QVariant.of(data.setupData, Type.QVariantMap), + "Authenticator" to QVariant.of(data.authenticator, Type.QString), + "AuthProperties" to QVariant.of(data.authSetupData, Type.QVariantMap) + ), Type.QVariantMap ) ) diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt index e6c732a94..981da5b53 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt @@ -1,14 +1,14 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value object CoreSetupRejectSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupReject> { override fun serialize(data: HandshakeMessage.CoreSetupReject) = mapOf( - "MsgType" to QVariant_("CoreSetupReject", Type.QString), - "Error" to QVariant_(data.errorString, Type.QString) + "MsgType" to QVariant.of("CoreSetupReject", Type.QString), + "Error" to QVariant.of(data.errorString, Type.QString) ) override fun deserialize(data: QVariantMap) = HandshakeMessage.CoreSetupReject( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt index a4f584fa5..be120e3ad 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt @@ -5,7 +5,6 @@ import de.kuschku.libquassel.protocol.QVariantList import de.kuschku.libquassel.protocol.QVariantMap import de.kuschku.libquassel.protocol.value - sealed class HandshakeMessage { class ClientInit( val clientVersion: String?, val buildDate: String?, @@ -112,6 +111,5 @@ sealed class HandshakeMessage { ) } } - } } diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt index 2340c29f9..debd53083 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt @@ -1,15 +1,15 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantList -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value import org.threeten.bp.Instant object HeartBeatReplySerializer : SignalProxyMessageSerializer<SignalProxyMessage.HeartBeatReply> { override fun serialize(data: SignalProxyMessage.HeartBeatReply) = listOf( - QVariant_(RequestType.HeartBeatReply.value, Type.Int), - QVariant_(data.timestamp, Type.QDateTime) + QVariant.of(RequestType.HeartBeatReply.value, Type.Int), + QVariant.of(data.timestamp, Type.QDateTime) ) override fun deserialize(data: QVariantList) = SignalProxyMessage.HeartBeatReply( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt index f17071c7f..471275147 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt @@ -1,15 +1,15 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantList -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value import org.threeten.bp.Instant object HeartBeatSerializer : SignalProxyMessageSerializer<SignalProxyMessage.HeartBeat> { override fun serialize(data: SignalProxyMessage.HeartBeat) = listOf( - QVariant_(RequestType.HeartBeat.value, Type.Int), - QVariant_(data.timestamp, Type.QDateTime) + QVariant.of(RequestType.HeartBeat.value, Type.Int), + QVariant.of(data.timestamp, Type.QDateTime) ) override fun deserialize(data: QVariantList) = SignalProxyMessage.HeartBeat( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt index 2f85f5ac7..574db68dc 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt @@ -8,10 +8,10 @@ import java.nio.ByteBuffer object InitDataSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitData> { override fun serialize(data: SignalProxyMessage.InitData) = listOf( - QVariant_(RequestType.InitData.value, Type.Int), - QVariant_(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray), - QVariant_(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray), - QVariant_(data.initData, Type.QVariantMap) + QVariant.of<Any>(RequestType.InitData.value, Type.Int), + QVariant.of<Any>(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray), + QVariant.of<Any>(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray), + QVariant.of<Any>(data.initData, Type.QVariantMap) ) override fun deserialize(data: QVariantList) = SignalProxyMessage.InitData( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt index 4a891f52a..604b81373 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantList -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer import de.kuschku.libquassel.protocol.value @@ -11,9 +11,9 @@ import java.nio.ByteBuffer object InitRequestSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitRequest> { override fun serialize(data: SignalProxyMessage.InitRequest) = listOf( - QVariant_(RequestType.InitRequest.value, Type.Int), - QVariant_(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray), - QVariant_(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray) + QVariant.of(RequestType.InitRequest.value, Type.Int), + QVariant.of(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray), + QVariant.of(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray) ) override fun deserialize(data: QVariantList) = SignalProxyMessage.InitRequest( diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt index b0acbfe5b..aaf9d34dd 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantList -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer import de.kuschku.libquassel.protocol.value @@ -11,8 +11,8 @@ import java.nio.ByteBuffer object RpcCallSerializer : SignalProxyMessageSerializer<SignalProxyMessage.RpcCall> { override fun serialize(data: SignalProxyMessage.RpcCall) = listOf( - QVariant_(RequestType.RpcCall.value, Type.Int), - QVariant_(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray), + QVariant.of(RequestType.RpcCall.value, Type.Int), + QVariant.of(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray), *data.params.toTypedArray() ) diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt index fb18d6748..7526191e7 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt @@ -1,19 +1,18 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value object SessionInitSerializer : HandshakeMessageSerializer<HandshakeMessage.SessionInit> { override fun serialize(data: HandshakeMessage.SessionInit) = mapOf( - "MsgType" to QVariant_("SessionInit", Type.QString), - "SessionState" to QVariant_( - mapOf( - "BufferInfos" to QVariant_(data.bufferInfos, Type.QVariantList), - "NetworkIds" to QVariant_(data.networkIds, Type.QVariantList), - "Identities" to QVariant_(data.identities, Type.QVariantList) - ), Type.QVariantMap + "MsgType" to QVariant.of("SessionInit", Type.QString), + "SessionState" to QVariant.of(mapOf( + "BufferInfos" to QVariant.of(data.bufferInfos, Type.QVariantList), + "NetworkIds" to QVariant.of(data.networkIds, Type.QVariantList), + "Identities" to QVariant.of(data.identities, Type.QVariantList) + ), Type.QVariantMap ) ) diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt index f9beac786..5f7c4a7f4 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt @@ -67,7 +67,5 @@ sealed class SignalProxyMessage { else -> throw IllegalArgumentException("Invalid MsgType: $type") } } - } } - diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt index 27f177c3a..284fe4908 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.protocol.message +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantList -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer import de.kuschku.libquassel.protocol.value @@ -11,10 +11,10 @@ import java.nio.ByteBuffer object SyncMessageSerializer : SignalProxyMessageSerializer<SignalProxyMessage.SyncMessage> { override fun serialize(data: SignalProxyMessage.SyncMessage): QVariantList = listOf( - QVariant_(RequestType.Sync.value, Type.Int), - QVariant_(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray), - QVariant_(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray), - QVariant_(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray), + QVariant.of(RequestType.Sync.value, Type.Int), + QVariant.of(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray), + QVariant.of(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray), + QVariant.of(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray), *data.params.toTypedArray() ) diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt index aa45a98d1..23f92b87f 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt @@ -12,7 +12,6 @@ object CharSerializer : Serializer<Char> { private val charBufferOut = CharBuffer.allocate(1) private val encoder = Charsets.UTF_16BE.newEncoder() private val decoder = Charsets.UTF_16BE.newDecoder() - override fun serialize(buffer: ChainedByteBuffer, data: Char, features: QuasselFeatures) { charBufferIn.clear() charBufferIn.put(data) diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt index f4da382ef..39ae048b8 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.protocol.primitive.serializer +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value import de.kuschku.libquassel.quassel.QuasselFeatures @@ -12,7 +12,7 @@ object HandshakeVariantMapSerializer : Serializer<QVariantMap> { override fun serialize(buffer: ChainedByteBuffer, data: QVariantMap, features: QuasselFeatures) { IntSerializer.serialize(buffer, data.size * 2, features) data.entries.forEach { (key, value) -> - VariantSerializer.serialize(buffer, QVariant_(key, Type.QString), features) + VariantSerializer.serialize(buffer, QVariant.of(key, Type.QString), features) VariantSerializer.serialize(buffer, value, features) } } diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt index b83a10733..a04131205 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt @@ -14,7 +14,6 @@ * 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.kuschku.libquassel.protocol.primitive.serializer import de.kuschku.libquassel.quassel.QuasselFeatures diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt index a9b2ef1d9..c882f38f8 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt @@ -15,8 +15,7 @@ abstract class StringSerializer( private val decoder: CharsetDecoder, private val trailingNullBytes: Int ) : Serializer<String?> { - constructor(charset: Charset, - trailingNullByte: Boolean = false) : this( + constructor(charset: Charset, trailingNullByte: Boolean = false) : this( charset.newEncoder(), charset.newDecoder(), if (trailingNullByte) { diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt index c121938b3..8e6159a44 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt @@ -22,5 +22,4 @@ object VariantListSerializer : Serializer<QVariantList> { } return result } - } diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt index f8d1676f0..3a5a68ca9 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt @@ -24,5 +24,4 @@ object VariantMapSerializer : Serializer<QVariantMap> { }.toTypedArray() ) } - } diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt index b57221a27..c55df4dac 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt @@ -7,34 +7,29 @@ import java.nio.ByteBuffer object VariantSerializer : Serializer<QVariant_> { override fun serialize(buffer: ChainedByteBuffer, data: QVariant_, features: QuasselFeatures) { - IntSerializer.serialize(buffer, data.type.type.id, features) + IntSerializer.serialize(buffer, data.type.id, features) BoolSerializer.serialize(buffer, false, features) - if (data.type.type == Type.UserType) { - StringSerializer.C.serialize(buffer, data.type.name, features) + if (data is QVariant.Custom && data.type == Type.UserType) { + StringSerializer.C.serialize(buffer, data.qtype.name, features) } - if (data.type.serializer == null) { - throw IllegalArgumentException("Unknown type: ${data.type.name}") - } - data.type.serializer.serialize(buffer, data.data, features) + (data.serializer as Serializer<Any?>).serialize(buffer, data.data, features) } override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): QVariant_ { val rawType = IntSerializer.deserialize(buffer, features) val type = Type.of(rawType) - val isNull = BoolSerializer.deserialize(buffer, features) - val metaType: MetaType<All_> = if (type == Type.UserType) { - val deserialize = StringSerializer.C.deserialize(buffer, features) - MetaType.get(deserialize) + return if (type == Type.UserType) { + val name = StringSerializer.C.deserialize(buffer, features) + val qType = name?.let(QType.Companion::of) + ?: throw IllegalArgumentException("No such type: $name") + val value = qType.serializer.deserialize(buffer, features) + QVariant.of<All_>(value, qType) } else { - MetaType.get(type) + val serializer = type?.serializer ?: throw IllegalArgumentException("No such type: $type") + val value = serializer.deserialize(buffer, features) + QVariant.of<All_>(value, type) } - if (metaType.serializer == null) { - throw IllegalArgumentException("Unknown type: ${metaType.name}") - } - - val result = metaType.serializer.deserialize(buffer, features) - return QVariant(result, metaType) } } diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt index 6b61e4b66..6bce7edbe 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt @@ -5,7 +5,7 @@ import de.kuschku.libquassel.protocol.Legacy_Features class QuasselFeatures( val enabledFeatures: Set<ExtendedFeature>, - val unknownFeatures: Set<String> + val unknownFeatures: Set<String> = emptySet() ) { constructor(legacyFeatures: Legacy_Features?, extendedFeatures: Collection<String>) : this( legacyFeatures?.enabledValues()?.map(Legacy_Feature::toExtended).orEmpty() union diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/DeserializationException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/DeserializationException.kt new file mode 100644 index 000000000..e4fd7384f --- /dev/null +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/DeserializationException.kt @@ -0,0 +1,9 @@ +package de.kuschku.libquassel.quassel.exceptions + +class DeserializationException : Exception { + constructor() : super() + constructor(p0: String?) : super(p0) + constructor(p0: String?, p1: Throwable?) : super(p0, p1) + constructor(p0: Throwable?) : super(p0) + constructor(p0: String?, p1: Throwable?, p2: Boolean, p3: Boolean) : super(p0, p1, p2, p3) +} \ No newline at end of file diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/MessageHandlingException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/MessageHandlingException.kt new file mode 100644 index 000000000..93f36ceee --- /dev/null +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/MessageHandlingException.kt @@ -0,0 +1,16 @@ +package de.kuschku.libquassel.quassel.exceptions + +import de.kuschku.libquassel.protocol.message.HandshakeMessage +import de.kuschku.libquassel.protocol.message.SignalProxyMessage + +sealed class MessageHandlingException(cause: Throwable?) : Exception(cause) { + class SignalProxy( + val source: SignalProxyMessage, + cause: Throwable? + ) : MessageHandlingException(cause) + + class Handshake( + val source: HandshakeMessage, + cause: Throwable? + ) : MessageHandlingException(cause) +} \ No newline at end of file diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt index 6774b96f1..146a837f7 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.quassel.syncables +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.valueOr import de.kuschku.libquassel.quassel.BufferInfo @@ -16,7 +16,7 @@ class AliasManager constructor( proxy: SignalProxy ) : SyncableObject(proxy, "AliasManager"), IAliasManager, ISyncableObject { override fun toVariantMap(): QVariantMap = mapOf( - "Aliases" to QVariant_(initAliases(), Type.QVariantMap) + "Aliases" to QVariant.of(initAliases(), Type.QVariantMap) ) override fun fromVariantMap(properties: QVariantMap) { @@ -24,8 +24,8 @@ class AliasManager constructor( } override fun initAliases(): QVariantMap = mapOf( - "names" to QVariant_(_aliases.map(Alias::name), Type.QStringList), - "expansions" to QVariant_(_aliases.map(Alias::expansion), Type.QStringList) + "names" to QVariant.of(_aliases.map(Alias::name), Type.QStringList), + "expansions" to QVariant.of(_aliases.map(Alias::expansion), Type.QStringList) ) override fun initSetAliases(aliases: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt index a6497e25d..54f9ab51e 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt @@ -46,10 +46,10 @@ class BufferSyncer constructor( fun liveBufferInfos(): Observable<Map<BufferId, BufferInfo>> = live_bufferInfos override fun toVariantMap(): QVariantMap = mapOf( - "Activities" to QVariant_(initActivities(), Type.QVariantList), - "HighlightCounts" to QVariant_(initHighlightCounts(), Type.QVariantList), - "LastSeenMsg" to QVariant_(initLastSeenMsg(), Type.QVariantList), - "MarkerLines" to QVariant_(initMarkerLines(), Type.QVariantList) + "Activities" to QVariant.of(initActivities(), Type.QVariantList), + "HighlightCounts" to QVariant.of(initHighlightCounts(), Type.QVariantList), + "LastSeenMsg" to QVariant.of(initLastSeenMsg(), Type.QVariantList), + "MarkerLines" to QVariant.of(initMarkerLines(), Type.QVariantList) ) override fun fromVariantMap(properties: QVariantMap) { @@ -62,8 +62,8 @@ class BufferSyncer constructor( override fun initActivities(): QVariantList { val list: MutableList<QVariant_> = mutableListOf() for ((key, value) in _bufferActivities) { - list.add(QVariant_(key, QType.BufferId)) - list.add(QVariant_(value, Type.Int)) + list.add(QVariant.of(key, QType.BufferId)) + list.add(QVariant.of(value, Type.Int)) } return list } @@ -71,8 +71,8 @@ class BufferSyncer constructor( override fun initHighlightCounts(): QVariantList { val list: MutableList<QVariant_> = mutableListOf() for ((key, value) in _highlightCounts) { - list.add(QVariant_(key, QType.BufferId)) - list.add(QVariant_(value, Type.Int)) + list.add(QVariant.of(key, QType.BufferId)) + list.add(QVariant.of(value, Type.Int)) } return list } @@ -80,8 +80,8 @@ class BufferSyncer constructor( override fun initLastSeenMsg(): QVariantList { val list: MutableList<QVariant_> = mutableListOf() for ((key, value) in _bufferActivities) { - list.add(QVariant_(key, QType.BufferId)) - list.add(QVariant_(value, QType.MsgId)) + list.add(QVariant.of(key, QType.BufferId)) + list.add(QVariant.of(value, QType.MsgId)) } return list } @@ -89,8 +89,8 @@ class BufferSyncer constructor( override fun initMarkerLines(): QVariantList { val list: MutableList<QVariant_> = mutableListOf() for ((key, value) in _bufferActivities) { - list.add(QVariant_(key, QType.BufferId)) - list.add(QVariant_(value, QType.MsgId)) + list.add(QVariant.of(key, QType.BufferId)) + list.add(QVariant.of(value, QType.MsgId)) } return list } diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt index f3f69c2a6..cafcc17df 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt @@ -19,9 +19,9 @@ class BufferViewConfig constructor( } override fun toVariantMap(): QVariantMap = mapOf( - "BufferList" to QVariant_(initBufferList(), Type.QVariantList), - "RemovedBuffers" to QVariant_(initBufferList(), Type.QVariantList), - "TemporarilyRemovedBuffers" to QVariant_(initBufferList(), Type.QVariantList) + "BufferList" to QVariant.of(initBufferList(), Type.QVariantList), + "RemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList), + "TemporarilyRemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList) ) + initProperties() override fun fromVariantMap(properties: QVariantMap) { @@ -39,28 +39,28 @@ class BufferViewConfig constructor( } override fun initBufferList(): QVariantList = _buffers.map { - QVariant_(it, QType.BufferId) + QVariant.of(it, QType.BufferId) } override fun initRemovedBuffers(): QVariantList = _removedBuffers.map { - QVariant_(it, QType.BufferId) + QVariant.of(it, QType.BufferId) } override fun initTemporarilyRemovedBuffers(): QVariantList = _temporarilyRemovedBuffers.map { - QVariant_(it, QType.BufferId) + QVariant.of(it, QType.BufferId) } override fun initProperties(): QVariantMap = mapOf( - "bufferViewName" to QVariant_(bufferViewName(), Type.QString), - "networkId" to QVariant_(networkId(), QType.NetworkId), - "addNewBuffersAutomatically" to QVariant_(addNewBuffersAutomatically(), Type.Bool), - "sortAlphabetically" to QVariant_(sortAlphabetically(), Type.Bool), - "hideInactiveBuffers" to QVariant_(hideInactiveBuffers(), Type.Bool), - "hideInactiveNetworks" to QVariant_(hideInactiveNetworks(), Type.Bool), - "disableDecoration" to QVariant_(disableDecoration(), Type.Bool), - "allowedBufferTypes" to QVariant_(allowedBufferTypes(), Type.Int), - "minimumActivity" to QVariant_(minimumActivity(), Type.Int), - "showSearch" to QVariant_(showSearch(), Type.Bool) + "bufferViewName" to QVariant.of(bufferViewName(), Type.QString), + "networkId" to QVariant.of(networkId(), QType.NetworkId), + "addNewBuffersAutomatically" to QVariant.of(addNewBuffersAutomatically(), Type.Bool), + "sortAlphabetically" to QVariant.of(sortAlphabetically(), Type.Bool), + "hideInactiveBuffers" to QVariant.of(hideInactiveBuffers(), Type.Bool), + "hideInactiveNetworks" to QVariant.of(hideInactiveNetworks(), Type.Bool), + "disableDecoration" to QVariant.of(disableDecoration(), Type.Bool), + "allowedBufferTypes" to QVariant.of(allowedBufferTypes(), Type.Int), + "minimumActivity" to QVariant.of(minimumActivity(), Type.Int), + "showSearch" to QVariant.of(showSearch(), Type.Bool) ) override fun initSetBufferList(buffers: QVariantList) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt index bf56136b4..3d479dc22 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt @@ -13,7 +13,7 @@ class BufferViewManager constructor( private val session: ISession ) : SyncableObject(proxy, "BufferViewManager"), IBufferViewManager { override fun toVariantMap(): QVariantMap = mapOf( - "BufferViewIds" to QVariant_(initBufferViewIds(), Type.QVariantList) + "BufferViewIds" to QVariant.of(initBufferViewIds(), Type.QVariantList) ) override fun fromVariantMap(properties: QVariantMap) { @@ -21,7 +21,7 @@ class BufferViewManager constructor( } override fun initBufferViewIds(): QVariantList = _bufferViewConfigs.keys.map { - QVariant_(it, Type.Int) + QVariant.of(it, Type.Int) } fun bufferViewConfig(bufferViewId: Int) = _bufferViewConfigs[bufferViewId] diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt index 749d5a594..a35d0cbfa 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt @@ -20,8 +20,8 @@ class CertManager constructor( } override fun initProperties(): QVariantMap = mapOf( - "sslKey" to QVariant_(sslKeyPem(), Type.QByteArray), - "sslCert" to QVariant_(sslCertPem(), Type.QByteArray) + "sslKey" to QVariant.of(sslKeyPem(), Type.QByteArray), + "sslCert" to QVariant.of(sslCertPem(), Type.QByteArray) ) override fun initSetProperties(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt index 528178b7c..ad2561581 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.quassel.syncables +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.value import de.kuschku.libquassel.quassel.syncables.interfaces.ICoreInfo @@ -17,7 +17,7 @@ class CoreInfo constructor( } override fun initProperties(): QVariantMap = mapOf( - "coreData" to QVariant_(coreData(), Type.QVariantMap) + "coreData" to QVariant.of(coreData(), Type.QVariantMap) ) override fun initSetProperties(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt index 9663599c2..d682ef607 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt @@ -21,25 +21,25 @@ class DccConfig constructor( override fun initProperties(): QVariantMap = mapOf( /// Whether DCC is enabled - "dccEnabled" to QVariant_(isDccEnabled(), Type.Bool), + "dccEnabled" to QVariant.of(isDccEnabled(), Type.Bool), /// The IP to use for outgoing traffic - "outgoingIp" to QVariant_(outgoingIp(), QType.QHostAddress), + "outgoingIp" to QVariant.of(outgoingIp(), QType.QHostAddress), /// The IP detection mode - "ipDetectionMode" to QVariant_(ipDetectionMode(), QType.DccConfig_IpDetectionMode), + "ipDetectionMode" to QVariant.of(ipDetectionMode(), QType.DccConfig_IpDetectionMode), /// The port range selection mode - "portSelectionMode" to QVariant_(portSelectionMode(), QType.DccConfig_PortSelectionMode), + "portSelectionMode" to QVariant.of(portSelectionMode(), QType.DccConfig_PortSelectionMode), /// Minimum port to use for incoming connections - "minPort" to QVariant_(minPort(), Type.UShort), + "minPort" to QVariant.of(minPort(), Type.UShort), /// Maximum port to use for incoming connections - "maxPort" to QVariant_(maxPort(), Type.UShort), + "maxPort" to QVariant.of(maxPort(), Type.UShort), /// The chunk size to be used - "chunkSize" to QVariant_(chunkSize(), Type.Int), + "chunkSize" to QVariant.of(chunkSize(), Type.Int), /// The timeout for DCC transfers - "sendTimeout" to QVariant_(sendTimeout(), Type.Int), + "sendTimeout" to QVariant.of(sendTimeout(), Type.Int), /// Whether passive (reverse) DCC should be used - "usePassiveDcc" to QVariant_(usePassiveDcc(), Type.Bool), + "usePassiveDcc" to QVariant.of(usePassiveDcc(), Type.Bool), /// Whether fast sending should be used - "useFastSend" to QVariant_(useFastSend(), Type.Bool) + "useFastSend" to QVariant.of(useFastSend(), Type.Bool) ) override fun initSetProperties(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt index 3f0152e6e..953ee32dc 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt @@ -17,25 +17,25 @@ class Identity constructor( } override fun initProperties(): QVariantMap = mapOf( - "identityId" to QVariant_(id(), QType.IdentityId), - "identityName" to QVariant_(identityName(), Type.QString), - "realName" to QVariant_(realName(), Type.QString), - "nicks" to QVariant_(nicks(), Type.QStringList), - "awayNick" to QVariant_(awayNick(), Type.QString), - "awayNickEnabled" to QVariant_(awayNickEnabled(), Type.Bool), - "awayReason" to QVariant_(awayReason(), Type.QString), - "awayReasonEnabled" to QVariant_(awayReasonEnabled(), Type.Bool), - "autoAwayEnabled" to QVariant_(autoAwayEnabled(), Type.Bool), - "autoAwayTime" to QVariant_(autoAwayTime(), Type.Int), - "autoAwayReason" to QVariant_(autoAwayReason(), Type.QString), - "autoAwayReasonEnabled" to QVariant_(autoAwayReasonEnabled(), Type.Bool), - "detachAwayEnabled" to QVariant_(detachAwayEnabled(), Type.Bool), - "detachAwayReason" to QVariant_(detachAwayReason(), Type.QString), - "detachAwayReasonEnabled" to QVariant_(detachAwayReasonEnabled(), Type.Bool), - "ident" to QVariant_(ident(), Type.QString), - "kickReason" to QVariant_(kickReason(), Type.QString), - "partReason" to QVariant_(partReason(), Type.QString), - "quitReason" to QVariant_(quitReason(), Type.QString) + "identityId" to QVariant.of(id(), QType.IdentityId), + "identityName" to QVariant.of(identityName(), Type.QString), + "realName" to QVariant.of(realName(), Type.QString), + "nicks" to QVariant.of(nicks(), Type.QStringList), + "awayNick" to QVariant.of(awayNick(), Type.QString), + "awayNickEnabled" to QVariant.of(awayNickEnabled(), Type.Bool), + "awayReason" to QVariant.of(awayReason(), Type.QString), + "awayReasonEnabled" to QVariant.of(awayReasonEnabled(), Type.Bool), + "autoAwayEnabled" to QVariant.of(autoAwayEnabled(), Type.Bool), + "autoAwayTime" to QVariant.of(autoAwayTime(), Type.Int), + "autoAwayReason" to QVariant.of(autoAwayReason(), Type.QString), + "autoAwayReasonEnabled" to QVariant.of(autoAwayReasonEnabled(), Type.Bool), + "detachAwayEnabled" to QVariant.of(detachAwayEnabled(), Type.Bool), + "detachAwayReason" to QVariant.of(detachAwayReason(), Type.QString), + "detachAwayReasonEnabled" to QVariant.of(detachAwayReasonEnabled(), Type.Bool), + "ident" to QVariant.of(ident(), Type.QString), + "kickReason" to QVariant.of(kickReason(), Type.QString), + "partReason" to QVariant.of(partReason(), Type.QString), + "quitReason" to QVariant.of(quitReason(), Type.QString) ) override fun initSetProperties(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt index 43b3b8e7c..8d262696e 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.quassel.syncables +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.valueOr import de.kuschku.libquassel.quassel.syncables.interfaces.IIgnoreListManager @@ -11,7 +11,7 @@ class IgnoreListManager constructor( proxy: SignalProxy ) : SyncableObject(proxy, "IgnoreListManager"), IIgnoreListManager { override fun toVariantMap(): QVariantMap = mapOf( - "IgnoreList" to QVariant_(initIgnoreList(), Type.QVariantMap) + "IgnoreList" to QVariant.of(initIgnoreList(), Type.QVariantMap) ) override fun fromVariantMap(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt index 4b9718b1b..d0ad84789 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt @@ -23,8 +23,8 @@ class IrcChannel( } override fun toVariantMap(): QVariantMap = mapOf( - "ChanModes" to QVariant_(initChanModes(), Type.QVariantMap), - "UserModes" to QVariant_(initUserModes(), Type.QVariantMap) + "ChanModes" to QVariant.of(initChanModes(), Type.QVariantMap), + "UserModes" to QVariant.of(initUserModes(), Type.QVariantMap) ) + initProperties() override fun fromVariantMap(properties: QVariantMap) { @@ -34,33 +34,30 @@ class IrcChannel( } override fun initChanModes(): QVariantMap = mapOf( - "A" to QVariant_( - _A_channelModes.entries.map { (key, value) -> - key to QVariant_(value.toList(), Type.QStringList) - }, Type.QVariantMap + "A" to QVariant.of(_A_channelModes.entries.map { (key, value) -> + key to QVariant.of(value.toList(), Type.QStringList) + }, Type.QVariantMap ), - "B" to QVariant_( - _B_channelModes.entries.map { (key, value) -> - key to QVariant_(value, Type.QString) - }, Type.QVariantMap + "B" to QVariant.of(_B_channelModes.entries.map { (key, value) -> + key to QVariant.of(value, Type.QString) + }, Type.QVariantMap ), - "C" to QVariant_( - _C_channelModes.entries.map { (key, value) -> - key to QVariant_(value, Type.QString) - }, Type.QVariantMap + "C" to QVariant.of(_C_channelModes.entries.map { (key, value) -> + key to QVariant.of(value, Type.QString) + }, Type.QVariantMap ), - "D" to QVariant_(_D_channelModes.joinToString(), Type.QString) + "D" to QVariant.of(_D_channelModes.joinToString(), Type.QString) ) override fun initUserModes(): QVariantMap = _userModes.entries.map { (key, value) -> - key.nick() to QVariant_(value, Type.QString) + key.nick() to QVariant.of(value, Type.QString) }.toMap() override fun initProperties(): QVariantMap = mapOf( - "name" to QVariant_(name(), Type.QString), - "topic" to QVariant_(topic(), Type.QString), - "password" to QVariant_(password(), Type.QString), - "encrypted" to QVariant_(encrypted(), Type.Bool) + "name" to QVariant.of(name(), Type.QString), + "topic" to QVariant.of(topic(), Type.QString), + "password" to QVariant.of(password(), Type.QString), + "encrypted" to QVariant.of(encrypted(), Type.Bool) ) override fun initSetChanModes(chanModes: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt index de37e29f9..ebda98119 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.quassel.syncables +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.valueOr import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcUser @@ -28,24 +28,24 @@ class IrcUser( } override fun initProperties(): QVariantMap = mapOf( - "user" to QVariant_(user(), Type.QString), - "host" to QVariant_(host(), Type.QString), - "nick" to QVariant_(nick(), Type.QString), - "realName" to QVariant_(realName(), Type.QString), - "account" to QVariant_(account(), Type.QString), - "away" to QVariant_(isAway(), Type.Bool), - "awayMessage" to QVariant_(awayMessage(), Type.QString), - "idleTime" to QVariant_(idleTime(), Type.QDateTime), - "loginTime" to QVariant_(loginTime(), Type.QDateTime), - "server" to QVariant_(server(), Type.QString), - "ircOperator" to QVariant_(ircOperator(), Type.QString), - "lastAwayMessage" to QVariant_(lastAwayMessage(), Type.Int), - "whoisServiceReply" to QVariant_(whoisServiceReply(), Type.QString), - "suserHost" to QVariant_(suserHost(), Type.QString), - "encrypted" to QVariant_(encrypted(), Type.Bool), - - "channels" to QVariant_(channels(), Type.QStringList), - "userModes" to QVariant_(userModes(), Type.QString) + "user" to QVariant.of(user(), Type.QString), + "host" to QVariant.of(host(), Type.QString), + "nick" to QVariant.of(nick(), Type.QString), + "realName" to QVariant.of(realName(), Type.QString), + "account" to QVariant.of(account(), Type.QString), + "away" to QVariant.of(isAway(), Type.Bool), + "awayMessage" to QVariant.of(awayMessage(), Type.QString), + "idleTime" to QVariant.of(idleTime(), Type.QDateTime), + "loginTime" to QVariant.of(loginTime(), Type.QDateTime), + "server" to QVariant.of(server(), Type.QString), + "ircOperator" to QVariant.of(ircOperator(), Type.QString), + "lastAwayMessage" to QVariant.of(lastAwayMessage(), Type.Int), + "whoisServiceReply" to QVariant.of(whoisServiceReply(), Type.QString), + "suserHost" to QVariant.of(suserHost(), Type.QString), + "encrypted" to QVariant.of(encrypted(), Type.Bool), + + "channels" to QVariant.of(channels(), Type.QStringList), + "userModes" to QVariant.of(userModes(), Type.QString) ) override fun initSetProperties(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt index 5bb660f6a..5f6ac0b5b 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt @@ -33,11 +33,11 @@ class Network constructor( } override fun toVariantMap(): QVariantMap = mapOf( - "Caps" to QVariant_(initCaps(), Type.QVariantMap), - "CapsEnabled" to QVariant_(initCapsEnabled(), Type.QVariantList), - "IrcUsersAndChannels" to QVariant_(initIrcUsersAndChannels(), Type.QVariantMap), - "ServerList" to QVariant_(initServerList(), Type.QVariantList), - "Supports" to QVariant_(initSupports(), Type.QVariantMap) + "Caps" to QVariant.of(initCaps(), Type.QVariantMap), + "CapsEnabled" to QVariant.of(initCapsEnabled(), Type.QVariantList), + "IrcUsersAndChannels" to QVariant.of(initIrcUsersAndChannels(), Type.QVariantMap), + "ServerList" to QVariant.of(initServerList(), Type.QVariantList), + "Supports" to QVariant.of(initSupports(), Type.QVariantMap) ) + initProperties() fun isMyNick(nick: String) = myNick().equals(nick, true) @@ -174,7 +174,7 @@ class Network constructor( setCodecForDecoding(Charset.forName(info.codecForDecoding)) // FIXME compare components if (info.serverList.isNotEmpty()) - setServerList(info.serverList.map { QVariant_(it, QType.Network_Server) }) + setServerList(info.serverList.map { QVariant.of(it, QType.Network_Server) }) if (info.useRandomServer != useRandomServer()) setUseRandomServer(info.useRandomServer) if (info.perform != perform()) @@ -682,73 +682,68 @@ class Network constructor( } override fun initSupports(): QVariantMap = _supports.entries.map { (key, value) -> - key to QVariant_(value, Type.QString) + key to QVariant.of(value, Type.QString) }.toMap() override fun initCaps(): QVariantMap = _caps.entries.map { (key, value) -> - key to QVariant_(value, Type.QString) + key to QVariant.of(value, Type.QString) }.toMap() override fun initCapsEnabled(): QVariantList = _capsEnabled.map { - QVariant_(it, Type.QString) + QVariant.of(it, Type.QString) }.toList() override fun initServerList(): QVariantList = _serverList.map { - QVariant_(it, QType.Network_Server) + QVariant.of(it, QType.Network_Server) }.toList() override fun initIrcUsersAndChannels(): QVariantMap { return mapOf( - "Users" to QVariant_( - _ircUsers.values.map { it.toVariantMap() }.transpose().map { - QVariant_(it, Type.QVariantList) - }, Type.QVariantMap + "Users" to QVariant.of(_ircUsers.values.map { it.toVariantMap() }.transpose().map { + QVariant.of(it, Type.QVariantList) + }, Type.QVariantMap ), - "Channels" to QVariant_( - _ircChannels.values.map { it.toVariantMap() }.transpose().map { - QVariant_(it, Type.QVariantList) - }, Type.QVariantMap + "Channels" to QVariant.of(_ircChannels.values.map { it.toVariantMap() }.transpose().map { + QVariant.of(it, Type.QVariantList) + }, Type.QVariantMap ) ) } override fun initProperties(): QVariantMap = mapOf( - "networkName" to QVariant_(networkName(), Type.QString), - "currentServer" to QVariant_(currentServer(), Type.QString), - "myNick" to QVariant_(myNick(), Type.QString), - "latency" to QVariant_(latency(), Type.Int), - "codecForServer" to QVariant_( - codecForServer().serializeString(StringSerializer.UTF8), - Type.QByteArray + "networkName" to QVariant.of(networkName(), Type.QString), + "currentServer" to QVariant.of(currentServer(), Type.QString), + "myNick" to QVariant.of(myNick(), Type.QString), + "latency" to QVariant.of(latency(), Type.Int), + "codecForServer" to QVariant.of(codecForServer().serializeString(StringSerializer.UTF8), + Type.QByteArray ), - "codecForEncoding" to QVariant_( - codecForEncoding().serializeString(StringSerializer.UTF8), - Type.QByteArray + "codecForEncoding" to QVariant.of(codecForEncoding().serializeString(StringSerializer.UTF8), + Type.QByteArray ), - "codecForDecoding" to QVariant_( - codecForDecoding().serializeString(StringSerializer.UTF8), - Type.QByteArray + "codecForDecoding" to QVariant.of(codecForDecoding().serializeString(StringSerializer.UTF8), + Type.QByteArray ), - "identityId" to QVariant_(identity(), QType.IdentityId), - "isConnected" to QVariant_(isConnected(), Type.Bool), - "connectionState" to QVariant_(connectionState(), Type.Int), - "useRandomServer" to QVariant_(useRandomServer(), Type.Bool), - "perform" to QVariant_(perform(), Type.QStringList), - "useAutoIdentify" to QVariant_(useAutoIdentify(), Type.Bool), - "autoIdentifyService" to QVariant_(autoIdentifyService(), Type.QString), - "autoIdentifyPassword" to QVariant_(autoIdentifyPassword(), Type.QString), - "useSasl" to QVariant_(useSasl(), Type.Bool), - "saslAccount" to QVariant_(saslAccount(), Type.QString), - "saslPassword" to QVariant_(saslPassword(), Type.QString), - "useAutoReconnect" to QVariant_(useAutoReconnect(), Type.Bool), - "autoReconnectInterval" to QVariant_(autoReconnectInterval(), Type.UInt), - "autoReconnectRetries" to QVariant_(autoReconnectRetries(), Type.UShort), - "unlimitedReconnectRetries" to QVariant_(unlimitedReconnectRetries(), Type.Bool), - "rejoinChannels" to QVariant_(rejoinChannels(), Type.Bool), - "useCustomMessageRate" to QVariant_(useCustomMessageRate(), Type.Bool), - "msgRateBurstSize" to QVariant_(messageRateBurstSize(), Type.UInt), - "msgRateMessageDelay" to QVariant_(messageRateDelay(), Type.UInt), - "unlimitedMessageRate" to QVariant_(unlimitedMessageRate(), Type.Bool) + "identityId" to QVariant.of(identity(), QType.IdentityId), + "isConnected" to QVariant.of(isConnected(), Type.Bool), + "connectionState" to QVariant.of(connectionState(), Type.Int), + "useRandomServer" to QVariant.of(useRandomServer(), Type.Bool), + "perform" to QVariant.of(perform(), Type.QStringList), + "useAutoIdentify" to QVariant.of(useAutoIdentify(), Type.Bool), + "autoIdentifyService" to QVariant.of(autoIdentifyService(), Type.QString), + "autoIdentifyPassword" to QVariant.of(autoIdentifyPassword(), Type.QString), + "useSasl" to QVariant.of(useSasl(), Type.Bool), + "saslAccount" to QVariant.of(saslAccount(), Type.QString), + "saslPassword" to QVariant.of(saslPassword(), Type.QString), + "useAutoReconnect" to QVariant.of(useAutoReconnect(), Type.Bool), + "autoReconnectInterval" to QVariant.of(autoReconnectInterval(), Type.UInt), + "autoReconnectRetries" to QVariant.of(autoReconnectRetries(), Type.UShort), + "unlimitedReconnectRetries" to QVariant.of(unlimitedReconnectRetries(), Type.Bool), + "rejoinChannels" to QVariant.of(rejoinChannels(), Type.Bool), + "useCustomMessageRate" to QVariant.of(useCustomMessageRate(), Type.Bool), + "msgRateBurstSize" to QVariant.of(messageRateBurstSize(), Type.UInt), + "msgRateMessageDelay" to QVariant.of(messageRateDelay(), Type.UInt), + "unlimitedMessageRate" to QVariant.of(unlimitedMessageRate(), Type.Bool) ) override fun initSetSupports(supports: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt index eda892ee5..bccb74c55 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.quassel.syncables +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.QVariantMap -import de.kuschku.libquassel.protocol.QVariant_ import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.valueOr import de.kuschku.libquassel.quassel.syncables.interfaces.INetworkConfig @@ -21,14 +21,14 @@ class NetworkConfig constructor( } override fun initProperties(): QVariantMap = mapOf( - "pingTimeoutEnabled" to QVariant_(pingTimeoutEnabled(), Type.Bool), - "pingInterval" to QVariant_(pingInterval(), Type.Int), - "maxPingCount" to QVariant_(maxPingCount(), Type.Int), - "autoWhoEnabled" to QVariant_(autoWhoEnabled(), Type.Bool), - "autoWhoInterval" to QVariant_(autoWhoInterval(), Type.Int), - "autoWhoNickLimit" to QVariant_(autoWhoNickLimit(), Type.Int), - "autoWhoDelay" to QVariant_(autoWhoDelay(), Type.Int), - "standardCtcp" to QVariant_(standardCtcp(), Type.Bool) + "pingTimeoutEnabled" to QVariant.of(pingTimeoutEnabled(), Type.Bool), + "pingInterval" to QVariant.of(pingInterval(), Type.Int), + "maxPingCount" to QVariant.of(maxPingCount(), Type.Int), + "autoWhoEnabled" to QVariant.of(autoWhoEnabled(), Type.Bool), + "autoWhoInterval" to QVariant.of(autoWhoInterval(), Type.Int), + "autoWhoNickLimit" to QVariant.of(autoWhoNickLimit(), Type.Int), + "autoWhoDelay" to QVariant.of(autoWhoDelay(), Type.Int), + "standardCtcp" to QVariant.of(standardCtcp(), Type.Bool) ) override fun initSetProperties(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt index e21882d7f..df3410e34 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt @@ -298,18 +298,18 @@ interface INetwork : ISyncableObject { val proxyPass: String = "" ) { fun toVariantMap(): QVariantMap = mapOf( - "Host" to QVariant_(host, Type.QString), - "Port" to QVariant_(port, Type.UInt), - "Password" to QVariant_(password, Type.QString), - "UseSSL" to QVariant_(useSsl, Type.Bool), - "sslVerify" to QVariant_(sslVerify, Type.Bool), - "sslVersion" to QVariant_(sslVersion, Type.Int), - "UseProxy" to QVariant_(useProxy, Type.Bool), - "ProxyType" to QVariant_(proxyType, Type.Bool), - "ProxyHost" to QVariant_(proxyHost, Type.QString), - "ProxyPort" to QVariant_(proxyPort, Type.UInt), - "ProxyUser" to QVariant_(proxyUser, Type.QString), - "ProxyPass" to QVariant_(proxyPass, Type.QString) + "Host" to QVariant.of(host, Type.QString), + "Port" to QVariant.of(port, Type.UInt), + "Password" to QVariant.of(password, Type.QString), + "UseSSL" to QVariant.of(useSsl, Type.Bool), + "sslVerify" to QVariant.of(sslVerify, Type.Bool), + "sslVersion" to QVariant.of(sslVersion, Type.Int), + "UseProxy" to QVariant.of(useProxy, Type.Bool), + "ProxyType" to QVariant.of(proxyType, Type.Bool), + "ProxyHost" to QVariant.of(proxyHost, Type.QString), + "ProxyPort" to QVariant.of(proxyPort, Type.UInt), + "ProxyUser" to QVariant.of(proxyUser, Type.QString), + "ProxyPass" to QVariant.of(proxyPass, Type.QString) ) companion object { diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt index 90c2f3403..9a0de43cf 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt @@ -180,7 +180,7 @@ class CoreConnection( } dataBuffer.flip() - handlerService.serialize { + handlerService.deserialize { when (state.value) { ConnectionState.CLOSED -> // Connection closed, do nothing @@ -195,6 +195,7 @@ class CoreConnection( } } catch (e: Throwable) { log(WARN, TAG, "Error encountered in connection", e) + log(WARN, TAG, "Last sent message: ${MessageRunnable.lastSent.get()}") close() } } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt b/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt index 7f8cf765a..5ac489f34 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt @@ -8,6 +8,7 @@ import de.kuschku.libquassel.util.helpers.write import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.WrappedChannel import java.nio.ByteBuffer +import java.util.concurrent.atomic.AtomicReference class MessageRunnable<T>( private val data: T, @@ -25,8 +26,13 @@ class MessageRunnable<T>( channel?.write(sizeBuffer) channel?.write(chainedBuffer) channel?.flush() + lastSent.set(data) } catch (e: Throwable) { log(WARN, "MessageDispatching", e) } } + + companion object { + val lastSent = AtomicReference<Any>() + } } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt index 5bb8962df..5cee6a28e 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt @@ -1,7 +1,7 @@ package de.kuschku.libquassel.session import de.kuschku.libquassel.protocol.QType -import de.kuschku.libquassel.protocol.QVariant_ +import de.kuschku.libquassel.protocol.QVariant import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.message.SignalProxyMessage import de.kuschku.libquassel.quassel.exceptions.ObjectNotFoundException @@ -47,8 +47,8 @@ class ObjectStorage(private val proxy: SignalProxy) { SignalProxyMessage.RpcCall( "__objectRenamed__", listOf( - QVariant_(obj.className, Type.QString), QVariant_(new, Type.QString), - QVariant_(old, Type.QString) + QVariant.of(obj.className, Type.QString), QVariant.of(new, Type.QString), + QVariant.of(old, Type.QString) ) ) ) diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt index b04a2ae3a..292dc67be 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt @@ -1,20 +1,22 @@ package de.kuschku.libquassel.session -import de.kuschku.libquassel.protocol.QVariant_ +import de.kuschku.libquassel.protocol.QVariantList import de.kuschku.libquassel.protocol.message.HandshakeMessage import de.kuschku.libquassel.protocol.message.SignalProxyMessage +import de.kuschku.libquassel.quassel.exceptions.MessageHandlingException import de.kuschku.libquassel.quassel.exceptions.ObjectNotFoundException import de.kuschku.libquassel.quassel.syncables.RpcHandler import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.DEBUG -import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.WARN import org.threeten.bp.Instant import java.io.Closeable @Suppress("LeakingThis") -abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable { +abstract class ProtocolHandler( + protected val exceptionHandler: (Throwable) -> Unit +) : SignalProxy, AuthHandler, Closeable { protected var closed = false private val objectStorage: ObjectStorage = ObjectStorage(this) @@ -42,7 +44,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable { log(DEBUG, "ProtocolHandler", "No receiver registered for $f") } } catch (e: Throwable) { - log(WARN, "ProtocolHandler", "Error Handling SignalProxyMessage", e) + exceptionHandler.invoke(MessageHandlingException.SignalProxy(f, e)) } return true } @@ -55,13 +57,12 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable { log(DEBUG, "ProtocolHandler", "No receiver registered for $f") } } catch (e: Throwable) { - log(WARN, "ProtocolHandler", "Error Handling HandshakeMessage", e) + exceptionHandler.invoke(MessageHandlingException.Handshake(f, e)) } return true } override fun handle(f: SignalProxyMessage.InitData): Boolean { - log(DEBUG, "ProtocolHandler", "< $f") val obj: ISyncableObject = objectStorage.get(f.className, f.objectName) ?: throw ObjectNotFoundException(f.className, f.objectName) @@ -83,7 +84,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable { try { this.handle(it) } catch (e: Throwable) { - log(WARN, "ProtocolHandler", e) + exceptionHandler.invoke(e) } } } @@ -92,36 +93,32 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable { open fun onInitStatusChanged(progress: Int, total: Int) {} override fun handle(f: SignalProxyMessage.SyncMessage): Boolean { - log(DEBUG, "ProtocolHandler", "< $f") - val obj = objectStorage.get(f.className, f.objectName) ?: if (isInitializing) { syncQueue.add(f) return true - } else { - throw ObjectNotFoundException(f.className, f.objectName) - } + } else null - val initQueue = toInit[obj] - if (initQueue != null) { - initQueue.add(f) - return true - } + obj?.let { + val initQueue = toInit[it] + if (initQueue != null) { + initQueue.add(f) + return true + } - val invoker = Invokers.get(f.className) - ?: throw IllegalArgumentException("Invalid classname: ${f.className}") - currentCallClass = f.className - currentCallInstance = f.objectName - currentCallSlot = f.slotName - invoker.invoke(obj, f.slotName, f.params) - currentCallClass = "" - currentCallInstance = "" - currentCallSlot = "" + val invoker = Invokers.get(f.className) + ?: throw IllegalArgumentException("Invalid classname: ${f.className}") + currentCallClass = f.className + currentCallInstance = f.objectName + currentCallSlot = f.slotName + invoker.invoke(it, f.slotName, f.params) + currentCallClass = "" + currentCallInstance = "" + currentCallSlot = "" + } return true } override fun handle(f: SignalProxyMessage.RpcCall): Boolean { - log(DEBUG, "ProtocolHandler", "< $f") - currentCallSlot = f.slotName Invokers.RPC?.invoke(rpcHandler, f.slotName, f.params) currentCallSlot = "" @@ -137,13 +134,13 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable { override fun shouldSync(type: String, instance: String, slot: String): Boolean = type != currentCallClass || slot != currentCallSlot || instance != currentCallInstance - override fun callSync(type: String, instance: String, slot: String, params: List<QVariant_>) { + override fun callSync(type: String, instance: String, slot: String, params: QVariantList) { dispatch(SignalProxyMessage.SyncMessage(type, instance, slot, params)) } override fun shouldRpc(slot: String): Boolean = slot != currentCallSlot - override fun callRpc(slot: String, params: List<QVariant_>) { + override fun callRpc(slot: String, params: QVariantList) { dispatch(SignalProxyMessage.RpcCall(slot, params)) } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt index 04f10cb53..07a3af97a 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt @@ -7,9 +7,6 @@ import de.kuschku.libquassel.quassel.ExtendedFeature import de.kuschku.libquassel.quassel.QuasselFeatures import de.kuschku.libquassel.quassel.syncables.* import de.kuschku.libquassel.util.compatibility.HandlerService -import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log -import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.DEBUG -import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO import io.reactivex.subjects.BehaviorSubject import org.threeten.bp.Instant import javax.net.ssl.X509TrustManager @@ -21,8 +18,9 @@ class Session( private val handlerService: HandlerService, backlogStorage: BacklogStorage, private var userData: Pair<String, String>, - val disconnectFromCore: () -> Unit -) : ProtocolHandler(), ISession { + val disconnectFromCore: () -> Unit, + exceptionHandler: (Throwable) -> Unit +) : ProtocolHandler(exceptionHandler), ISession { override val features = Features(clientData.clientFeatures, QuasselFeatures.empty()) override val sslSession @@ -152,8 +150,6 @@ class Session( override fun onInitDone() { coreConnection.setState(ConnectionState.CONNECTED) - log(INFO, "Session", "Initialization finished") - dispatch(SignalProxyMessage.HeartBeat(Instant.now())) } @@ -167,14 +163,11 @@ class Session( override fun dispatch(message: SignalProxyMessage) { if (closed) return - log(DEBUG, "Session", "> $message") coreConnection.dispatch(message) } override fun dispatch(message: HandshakeMessage) { if (closed) return - - log(DEBUG, "Session", "> $message") coreConnection.dispatch(message) } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt index b252dc121..02e993639 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt @@ -20,7 +20,8 @@ class SessionManager( offlineSession: ISession, val backlogStorage: BacklogStorage, val handlerService: HandlerService, - private val disconnectFromCore: () -> Unit + private val disconnectFromCore: () -> Unit, + private val exceptionHandler: (Throwable) -> Unit ) : ISession { override val features: Features get() = session.or(lastSession).features @@ -125,7 +126,8 @@ class SessionManager( handlerService, backlogStorage, userData, - disconnectFromCore + disconnectFromCore, + exceptionHandler ) ) } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt index 474d326d9..b37a93c52 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt @@ -2,7 +2,7 @@ package de.kuschku.libquassel.session import de.kuschku.libquassel.protocol.IdentityId import de.kuschku.libquassel.protocol.NetworkId -import de.kuschku.libquassel.protocol.QVariant_ +import de.kuschku.libquassel.protocol.QVariantList import de.kuschku.libquassel.protocol.message.HandshakeMessage import de.kuschku.libquassel.protocol.message.SignalProxyMessage import de.kuschku.libquassel.quassel.syncables.Identity @@ -29,8 +29,8 @@ interface SignalProxy { fun dispatch(message: SignalProxyMessage) fun dispatch(message: HandshakeMessage) - fun callSync(type: String, instance: String, slot: String, params: List<QVariant_>) - fun callRpc(slot: String, params: List<QVariant_>) + fun callSync(type: String, instance: String, slot: String, params: QVariantList) + fun callRpc(slot: String, params: QVariantList) fun shouldSync(type: String, instance: String, slot: String): Boolean fun shouldRpc(slot: String): Boolean @@ -49,9 +49,9 @@ interface SignalProxy { override fun dispatch(message: SignalProxyMessage) = Unit override fun dispatch(message: HandshakeMessage) = Unit override fun callSync(type: String, instance: String, slot: String, - params: List<QVariant_>) = Unit + params: QVariantList) = Unit - override fun callRpc(slot: String, params: List<QVariant_>) = Unit + override fun callRpc(slot: String, params: QVariantList) = Unit override fun shouldSync(type: String, instance: String, slot: String) = false override fun shouldRpc(slot: String) = false override fun network(id: NetworkId): Network? = null diff --git a/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt b/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt index efc5ab6e3..bcd7977da 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt @@ -33,14 +33,17 @@ abstract class LoggingHandler { companion object { val loggingHandlers: MutableSet<LoggingHandler> = mutableSetOf(JavaLoggingHandler) - inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, message: String? = null, - throwable: Throwable? = null) { + inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, message: String?, + throwable: Throwable?) { LoggingHandler.loggingHandlers .filter { it.isLoggable(logLevel, tag) } .forEach { it.log(logLevel, tag, message, throwable) } } - inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, throwable: Throwable? = null) = + inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, throwable: Throwable) = log(logLevel, tag, null, throwable) + + inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, message: String) = + log(logLevel, tag, message, null) } } diff --git a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt index bf959c785..f2b187560 100644 --- a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt @@ -1,20 +1,7 @@ package de.kuschku.libquassel -import de.kuschku.libquassel.protocol.* -import de.kuschku.libquassel.quassel.LegacyFeature -import de.kuschku.libquassel.quassel.ProtocolFeature -import de.kuschku.libquassel.session.BacklogStorage -import de.kuschku.libquassel.session.Session -import de.kuschku.libquassel.session.SocketAddress -import de.kuschku.libquassel.util.compatibility.reference.JavaHandlerService -import org.junit.BeforeClass -import org.junit.Test -import org.threeten.bp.Instant -import java.security.cert.X509Certificate -import java.util.logging.LogManager -import javax.net.ssl.X509TrustManager - class ConnectionUnitTest { +/* companion object { @JvmStatic @BeforeClass @@ -55,4 +42,5 @@ class ConnectionUnitTest { ) {} session.join() } -} +*/ +} \ No newline at end of file diff --git a/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt b/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt index d097fa660..71ab8fe92 100644 --- a/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt @@ -1,8 +1,10 @@ package de.kuschku.libquassel -import de.kuschku.libquassel.protocol.Quassel_Feature -import de.kuschku.libquassel.protocol.Quassel_Features +import de.kuschku.libquassel.protocol.QType +import de.kuschku.libquassel.protocol.QVariant +import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.protocol.primitive.serializer.* +import de.kuschku.libquassel.quassel.QuasselFeatures import de.kuschku.libquassel.util.nio.ChainedByteBuffer import org.junit.Assert.assertArrayEquals import org.junit.Assert.assertEquals @@ -97,9 +99,89 @@ class SerializerUnitTest { assertEquals(0L.inv(), roundTrip(LongSerializer, 0L.inv())) } + @Test + fun stringSerializer() { + assertEquals("Test", roundTrip(StringSerializer.UTF16, "Test")) + assertEquals("Test", roundTrip(StringSerializer.UTF8, "Test")) + assertEquals("Test", roundTrip(StringSerializer.C, "Test")) + } + + @Test + fun variantListSerializer() { + val value = listOf( + QVariant.of(1, Type.Int), + QVariant.of(ByteBuffer.wrap(byteArrayOf( + 66, + 97, + 99, + 107, + 108, + 111, + 103, + 77, + 97, + 110, + 97, + 103, + 101, + 114, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + )), Type.QByteArray), + QVariant.of(ByteBuffer.wrap(byteArrayOf( + 114, + 101, + 113, + 117, + 101, + 115, + 116, + 66, + 97, + 99, + 107, + 108, + 111, + 103, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + )), Type.QByteArray), + QVariant.of(1873, QType.BufferId), + QVariant.of(-1, QType.MsgId), + QVariant.of(-1, QType.MsgId), + QVariant.of(20, Type.Int), + QVariant.of(0, Type.Int) + ) + assert(value == roundTrip(VariantListSerializer, value)) + } + companion object { fun <T> roundTrip(serializer: Serializer<T>, value: T, - features: Quassel_Features = Quassel_Feature.NONE): T { + features: QuasselFeatures = QuasselFeatures.all()): T { val chainedBuffer = ChainedByteBuffer( direct = false ) diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt index ed48026a2..487462636 100644 --- a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt +++ b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt @@ -58,7 +58,7 @@ object CrashHandler { val crashFile = File(crashDirectory, "${System.currentTimeMillis()}.json") crashFile.createNewFile() crashFile.writeText(json) - Log.e("Malheur", "Crash report saved: $crashFile") + Log.e("Malheur", "Crash report saved: $crashFile", throwable) handler.post { Toast.makeText(application, "Crash report saved: ${crashFile.name}", -- GitLab