Skip to content
Snippets Groups Projects
Commit 3c641a0d authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Implement extended features

parent 7b10813d
No related branches found
No related tags found
No related merge requests found
Showing
with 105 additions and 97 deletions
...@@ -5,7 +5,11 @@ import android.arch.lifecycle.Observer ...@@ -5,7 +5,11 @@ import android.arch.lifecycle.Observer
import android.content.* import android.content.*
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.os.Binder import android.os.Binder
import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.protocol.ClientData
import de.kuschku.libquassel.protocol.Protocol
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.libquassel.session.*
import de.kuschku.quasseldroid.BuildConfig import de.kuschku.quasseldroid.BuildConfig
import de.kuschku.quasseldroid.Keys import de.kuschku.quasseldroid.Keys
...@@ -272,7 +276,7 @@ class QuasselService : DaggerLifecycleService(), ...@@ -272,7 +276,7 @@ class QuasselService : DaggerLifecycleService(),
clientData = ClientData( clientData = ClientData(
identifier = "${resources.getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}", identifier = "${resources.getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}",
buildDate = Instant.ofEpochSecond(BuildConfig.GIT_COMMIT_DATE), buildDate = Instant.ofEpochSecond(BuildConfig.GIT_COMMIT_DATE),
clientFeatures = Quassel_Features.of(*Quassel_Feature.validValues), clientFeatures = QuasselFeatures.all(),
protocolFeatures = Protocol_Features.of( protocolFeatures = Protocol_Features.of(
Protocol_Feature.Compression, Protocol_Feature.Compression,
Protocol_Feature.TLS Protocol_Feature.TLS
......
package de.kuschku.libquassel.protocol package de.kuschku.libquassel.protocol
import de.kuschku.libquassel.quassel.QuasselFeatures
import org.threeten.bp.Instant import org.threeten.bp.Instant
data class ClientData( data class ClientData(
val identifier: String, val identifier: String,
val buildDate: Instant, val buildDate: Instant,
val clientFeatures: Quassel_Features, val clientFeatures: QuasselFeatures,
val protocolFeatures: Protocol_Features, val protocolFeatures: Protocol_Features,
val supportedProtocols: List<Protocol> val supportedProtocols: List<Protocol>
) )
...@@ -40,6 +40,7 @@ class Message( ...@@ -40,6 +40,7 @@ class Message(
override val NONE = MessageType.of() override val NONE = MessageType.of()
override fun of(bit: Int) = Flags.of<MessageType>(bit) override fun of(bit: Int) = Flags.of<MessageType>(bit)
override fun of(vararg flags: MessageType) = Flags.of(*flags) override fun of(vararg flags: MessageType) = Flags.of(*flags)
override fun of(flags: Iterable<MessageType>) = Flags.of(flags)
} }
} }
...@@ -54,6 +55,7 @@ class Message( ...@@ -54,6 +55,7 @@ class Message(
override val NONE = MessageFlag.of() override val NONE = MessageFlag.of()
override fun of(bit: Int) = Flags.of<MessageFlag>(bit) override fun of(bit: Int) = Flags.of<MessageFlag>(bit)
override fun of(vararg flags: MessageFlag) = Flags.of(*flags) override fun of(vararg flags: MessageFlag) = Flags.of(*flags)
override fun of(flags: Iterable<MessageFlag>) = Flags.of(flags)
} }
} }
......
...@@ -2,8 +2,8 @@ package de.kuschku.libquassel.protocol ...@@ -2,8 +2,8 @@ package de.kuschku.libquassel.protocol
import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.LegacyFeature
import de.kuschku.libquassel.quassel.ProtocolFeature import de.kuschku.libquassel.quassel.ProtocolFeature
import de.kuschku.libquassel.quassel.QuasselFeature
import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
import de.kuschku.libquassel.util.Flags import de.kuschku.libquassel.util.Flags
import de.kuschku.libquassel.util.ShortFlags import de.kuschku.libquassel.util.ShortFlags
...@@ -27,8 +27,8 @@ typealias Message_Types = Flags<Message_Type> ...@@ -27,8 +27,8 @@ typealias Message_Types = Flags<Message_Type>
typealias Message_Flag = Message.MessageFlag typealias Message_Flag = Message.MessageFlag
typealias Message_Flags = Flags<Message_Flag> typealias Message_Flags = Flags<Message_Flag>
typealias Quassel_Feature = QuasselFeature typealias Legacy_Feature = LegacyFeature
typealias Quassel_Features = Flags<Quassel_Feature> typealias Legacy_Features = Flags<Legacy_Feature>
typealias Protocol_Feature = ProtocolFeature typealias Protocol_Feature = ProtocolFeature
typealias Protocol_Features = Flags<Protocol_Feature> typealias Protocol_Features = Flags<Protocol_Feature>
......
...@@ -12,13 +12,15 @@ object ClientInitAckSerializer : HandshakeMessageSerializer<HandshakeMessage.Cli ...@@ -12,13 +12,15 @@ object ClientInitAckSerializer : HandshakeMessageSerializer<HandshakeMessage.Cli
"CoreFeatures" to QVariant_(data.coreFeatures?.toInt(), Type.UInt), "CoreFeatures" to QVariant_(data.coreFeatures?.toInt(), Type.UInt),
"StorageBackends" to QVariant_(data.backendInfo, Type.QVariantList), "StorageBackends" to QVariant_(data.backendInfo, Type.QVariantList),
"Authenticator" to QVariant_(data.authenticatorInfo, Type.QVariantList), "Authenticator" to QVariant_(data.authenticatorInfo, Type.QVariantList),
"Configured" to QVariant_(data.coreConfigured, Type.Bool) "Configured" to QVariant_(data.coreConfigured, Type.Bool),
"FeatureList" to QVariant_(data.featureList, Type.QStringList)
) )
override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitAck( override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitAck(
coreFeatures = Flags.Companion.of(data["CoreFeatures"].value(0)), coreFeatures = Flags.Companion.of(data["CoreFeatures"].value(0)),
backendInfo = data["StorageBackends"].value(), backendInfo = data["StorageBackends"].value(),
authenticatorInfo = data["Authenticators"].value(), authenticatorInfo = data["Authenticators"].value(),
coreConfigured = data["Configured"].value() coreConfigured = data["Configured"].value(),
featureList = data["FeatureList"].value(emptyList())
) )
} }
...@@ -11,12 +11,14 @@ object ClientInitSerializer : HandshakeMessageSerializer<HandshakeMessage.Client ...@@ -11,12 +11,14 @@ object ClientInitSerializer : HandshakeMessageSerializer<HandshakeMessage.Client
"MsgType" to QVariant_("ClientInit", Type.QString), "MsgType" to QVariant_("ClientInit", Type.QString),
"ClientVersion" to QVariant_(data.clientVersion, Type.QString), "ClientVersion" to QVariant_(data.clientVersion, Type.QString),
"ClientDate" to QVariant_(data.buildDate, Type.QString), "ClientDate" to QVariant_(data.buildDate, Type.QString),
"Features" to QVariant_(data.clientFeatures?.toInt(), Type.UInt) "Features" to QVariant_(data.clientFeatures?.toInt(), Type.UInt),
"FeatureList" to QVariant_(data.featureList, Type.QStringList)
) )
override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInit( override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInit(
clientVersion = data["ClientVersion"].value(), clientVersion = data["ClientVersion"].value(),
buildDate = data["ClientDate"].value(), buildDate = data["ClientDate"].value(),
clientFeatures = Flags.of(data["Features"].value(0)) clientFeatures = Flags.of(data["Features"].value(0)),
featureList = data["FeatureList"].value(emptyList())
) )
} }
package de.kuschku.libquassel.protocol.message package de.kuschku.libquassel.protocol.message
import de.kuschku.libquassel.protocol.Legacy_Features
import de.kuschku.libquassel.protocol.QVariantList import de.kuschku.libquassel.protocol.QVariantList
import de.kuschku.libquassel.protocol.QVariantMap import de.kuschku.libquassel.protocol.QVariantMap
import de.kuschku.libquassel.protocol.Quassel_Features
import de.kuschku.libquassel.protocol.value import de.kuschku.libquassel.protocol.value
sealed class HandshakeMessage { sealed class HandshakeMessage {
class ClientInit(val clientVersion: String?, val buildDate: String?, class ClientInit(
val clientFeatures: Quassel_Features?) : HandshakeMessage() { val clientVersion: String?, val buildDate: String?,
val clientFeatures: Legacy_Features?, val featureList: List<String>
) : HandshakeMessage() {
override fun toString(): String { override fun toString(): String {
return "ClientInit(clientVersion=$clientVersion, buildDate=$buildDate, clientFeatures=$clientFeatures)" return "ClientInit(clientVersion=$clientVersion, buildDate=$buildDate, clientFeatures=$clientFeatures, featureList=$featureList)"
} }
} }
...@@ -20,11 +22,13 @@ sealed class HandshakeMessage { ...@@ -20,11 +22,13 @@ sealed class HandshakeMessage {
} }
} }
class ClientInitAck(val coreFeatures: Quassel_Features?, val coreConfigured: Boolean?, class ClientInitAck(
val backendInfo: QVariantList?, val coreFeatures: Legacy_Features?, val coreConfigured: Boolean?,
val authenticatorInfo: QVariantList?) : HandshakeMessage() { val backendInfo: QVariantList?, val authenticatorInfo: QVariantList?,
val featureList: List<String>
) : HandshakeMessage() {
override fun toString(): String { override fun toString(): String {
return "ClientInitAck(coreFeatures=$coreFeatures, coreConfigured=$coreConfigured, backendInfo=$backendInfo, authenticatorInfo=$authenticatorInfo)" return "ClientInitAck(coreFeatures=$coreFeatures, coreConfigured=$coreConfigured, backendInfo=$backendInfo, authenticatorInfo=$authenticatorInfo, featureList=$featureList)"
} }
} }
......
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object BoolSerializer : Serializer<Boolean> { object BoolSerializer : Serializer<Boolean> {
override fun serialize(buffer: ChainedByteBuffer, data: Boolean, override fun serialize(buffer: ChainedByteBuffer, data: Boolean, features: QuasselFeatures) =
features: Quassel_Features) = buffer.put( buffer.put((if (data) 0x01 else 0x00).toByte())
if (data) {
0x01
} else {
0x00
}.toByte()
)
override fun deserialize(buffer: ByteBuffer, override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures) =
features: Quassel_Features) = buffer.get() != 0x00.toByte() buffer.get() != 0x00.toByte()
} }
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Buffer_Type import de.kuschku.libquassel.protocol.Buffer_Type
import de.kuschku.libquassel.protocol.Quassel_Features
import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object BufferInfoSerializer : Serializer<BufferInfo> { object BufferInfoSerializer : Serializer<BufferInfo> {
override fun serialize(buffer: ChainedByteBuffer, data: BufferInfo, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: BufferInfo, features: QuasselFeatures) {
IntSerializer.serialize(buffer, data.bufferId, features) IntSerializer.serialize(buffer, data.bufferId, features)
IntSerializer.serialize(buffer, data.networkId, features) IntSerializer.serialize(buffer, data.networkId, features)
ShortSerializer.serialize(buffer, data.type.toShort(), features) ShortSerializer.serialize(buffer, data.type.toShort(), features)
...@@ -15,7 +15,7 @@ object BufferInfoSerializer : Serializer<BufferInfo> { ...@@ -15,7 +15,7 @@ object BufferInfoSerializer : Serializer<BufferInfo> {
StringSerializer.UTF8.serialize(buffer, data.bufferName, features) StringSerializer.UTF8.serialize(buffer, data.bufferName, features)
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): BufferInfo { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): BufferInfo {
val bufferId = IntSerializer.deserialize(buffer, features) val bufferId = IntSerializer.deserialize(buffer, features)
val networkId = IntSerializer.deserialize(buffer, features) val networkId = IntSerializer.deserialize(buffer, features)
val type = Buffer_Type.of(ShortSerializer.deserialize(buffer, features)) val type = Buffer_Type.of(ShortSerializer.deserialize(buffer, features))
......
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object ByteArraySerializer : Serializer<ByteBuffer?> { object ByteArraySerializer : Serializer<ByteBuffer?> {
override fun serialize(buffer: ChainedByteBuffer, data: ByteBuffer?, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: ByteBuffer?, features: QuasselFeatures) {
if (data == null) { if (data == null) {
IntSerializer.serialize(buffer, -1, features) IntSerializer.serialize(buffer, -1, features)
} else { } else {
...@@ -14,7 +14,7 @@ object ByteArraySerializer : Serializer<ByteBuffer?> { ...@@ -14,7 +14,7 @@ object ByteArraySerializer : Serializer<ByteBuffer?> {
} }
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): ByteBuffer? { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): ByteBuffer? {
val len = IntSerializer.deserialize(buffer, features) val len = IntSerializer.deserialize(buffer, features)
return if (len == -1) { return if (len == -1) {
null null
......
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object ByteSerializer : Serializer<Byte> { object ByteSerializer : Serializer<Byte> {
override fun serialize(buffer: ChainedByteBuffer, data: Byte, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: Byte, features: QuasselFeatures) {
buffer.put(data) buffer.put(data)
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Byte { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): Byte {
return buffer.get() return buffer.get()
} }
} }
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
import java.nio.CharBuffer import java.nio.CharBuffer
object CharSerializer : Serializer<Char> { object CharSerializer : Serializer<Char> {
private val byteBuffer = ByteBuffer.allocateDirect(2) private val byteBufferIn = ByteBuffer.allocateDirect(2)
private val charBuffer = CharBuffer.allocate(1) private val byteBufferOut = ByteBuffer.allocateDirect(2)
private val charBufferIn = CharBuffer.allocate(1)
private val charBufferOut = CharBuffer.allocate(1)
private val encoder = Charsets.UTF_16BE.newEncoder() private val encoder = Charsets.UTF_16BE.newEncoder()
private val decoder = Charsets.UTF_16BE.newDecoder() private val decoder = Charsets.UTF_16BE.newDecoder()
override fun serialize(buffer: ChainedByteBuffer, data: Char, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: Char, features: QuasselFeatures) {
synchronized(this) { charBufferIn.clear()
charBuffer.clear() charBufferIn.put(data)
charBuffer.put(data) charBufferIn.flip()
charBuffer.flip() byteBufferIn.clear()
byteBuffer.clear() encoder.encode(charBufferIn, byteBufferIn, true)
encoder.encode(charBuffer, byteBuffer, true) byteBufferIn.flip()
byteBuffer.flip() if (byteBufferIn.remaining() == 2) {
if (byteBuffer.remaining() == 2) { buffer.put(byteBufferIn)
buffer.put(byteBuffer)
} else { } else {
buffer.putShort(0) buffer.putShort(0)
} }
} }
}
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Char { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): Char {
synchronized(this) { byteBufferOut.clear()
byteBuffer.clear() byteBufferOut.putShort(buffer.short)
byteBuffer.putShort(buffer.short) byteBufferOut.flip()
byteBuffer.flip() charBufferOut.clear()
charBuffer.clear() decoder.decode(byteBufferOut, charBufferOut, true)
decoder.decode(byteBuffer, charBuffer, true) charBufferOut.flip()
charBuffer.flip() return if (charBufferOut.remaining() == 1)
return if (charBuffer.remaining() == 1) charBufferOut.get()
charBuffer.get()
else else
'\u0000' '\u0000'
} }
} }
}
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import org.threeten.bp.* import org.threeten.bp.*
import org.threeten.bp.temporal.ChronoField import org.threeten.bp.temporal.ChronoField
...@@ -21,7 +21,7 @@ object DateTimeSerializer : Serializer<Temporal> { ...@@ -21,7 +21,7 @@ object DateTimeSerializer : Serializer<Temporal> {
} }
} }
override fun serialize(buffer: ChainedByteBuffer, data: Temporal, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: Temporal, features: QuasselFeatures) {
when (data) { when (data) {
is LocalDateTime -> { is LocalDateTime -> {
IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features) IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features)
...@@ -53,7 +53,7 @@ object DateTimeSerializer : Serializer<Temporal> { ...@@ -53,7 +53,7 @@ object DateTimeSerializer : Serializer<Temporal> {
} }
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Temporal { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): Temporal {
val julianDay = IntSerializer.deserialize(buffer, features).toLong() val julianDay = IntSerializer.deserialize(buffer, features).toLong()
val milliOfDay = IntSerializer.deserialize(buffer, features).toLong() val milliOfDay = IntSerializer.deserialize(buffer, features).toLong()
val timeSpec = TimeSpec.of(ByteSerializer.deserialize(buffer, features)) val timeSpec = TimeSpec.of(ByteSerializer.deserialize(buffer, features))
......
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.quassel.syncables.interfaces.IDccConfig import de.kuschku.libquassel.quassel.syncables.interfaces.IDccConfig
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object DccConfig_IpDetectionModeSerializer : Serializer<IDccConfig.IpDetectionMode> { object DccConfig_IpDetectionModeSerializer : Serializer<IDccConfig.IpDetectionMode> {
override fun serialize(buffer: ChainedByteBuffer, data: IDccConfig.IpDetectionMode, override fun serialize(buffer: ChainedByteBuffer, data: IDccConfig.IpDetectionMode,
features: Quassel_Features) { features: QuasselFeatures) {
buffer.put(data.value) buffer.put(data.value)
} }
override fun deserialize(buffer: ByteBuffer, override fun deserialize(buffer: ByteBuffer,
features: Quassel_Features): IDccConfig.IpDetectionMode { features: QuasselFeatures): IDccConfig.IpDetectionMode {
return IDccConfig.IpDetectionMode.of(buffer.get()) return IDccConfig.IpDetectionMode.of(buffer.get())
} }
} }
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.quassel.syncables.interfaces.IDccConfig import de.kuschku.libquassel.quassel.syncables.interfaces.IDccConfig
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object DccConfig_PortSelectionModeSerializer : Serializer<IDccConfig.PortSelectionMode> { object DccConfig_PortSelectionModeSerializer : Serializer<IDccConfig.PortSelectionMode> {
override fun serialize(buffer: ChainedByteBuffer, data: IDccConfig.PortSelectionMode, override fun serialize(buffer: ChainedByteBuffer, data: IDccConfig.PortSelectionMode,
features: Quassel_Features) { features: QuasselFeatures) {
buffer.put(data.value) buffer.put(data.value)
} }
override fun deserialize(buffer: ByteBuffer, override fun deserialize(buffer: ByteBuffer,
features: Quassel_Features): IDccConfig.PortSelectionMode { features: QuasselFeatures): IDccConfig.PortSelectionMode {
return IDccConfig.PortSelectionMode.of(buffer.get()) return IDccConfig.PortSelectionMode.of(buffer.get())
} }
} }
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.* 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
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object HandshakeVariantMapSerializer : Serializer<QVariantMap> { object HandshakeVariantMapSerializer : Serializer<QVariantMap> {
override fun serialize(buffer: ChainedByteBuffer, data: QVariantMap, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: QVariantMap, features: QuasselFeatures) {
IntSerializer.serialize(buffer, data.size * 2, features) IntSerializer.serialize(buffer, data.size * 2, features)
data.entries.forEach { (key, value) -> data.entries.forEach { (key, value) ->
VariantSerializer.serialize(buffer, QVariant_(key, Type.QString), features) VariantSerializer.serialize(buffer, QVariant_(key, Type.QString), features)
...@@ -13,7 +17,7 @@ object HandshakeVariantMapSerializer : Serializer<QVariantMap> { ...@@ -13,7 +17,7 @@ object HandshakeVariantMapSerializer : Serializer<QVariantMap> {
} }
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): QVariantMap { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): QVariantMap {
val range = 0 until IntSerializer.deserialize(buffer, features) / 2 val range = 0 until IntSerializer.deserialize(buffer, features) / 2
val pairs = range.map { val pairs = range.map {
val keyRaw: ByteBuffer? = VariantSerializer.deserialize(buffer, features).value() val keyRaw: ByteBuffer? = VariantSerializer.deserialize(buffer, features).value()
......
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.NetworkLayerProtocol import de.kuschku.libquassel.protocol.NetworkLayerProtocol
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.net.Inet4Address import java.net.Inet4Address
import java.net.Inet6Address import java.net.Inet6Address
...@@ -9,7 +9,7 @@ import java.net.InetAddress ...@@ -9,7 +9,7 @@ import java.net.InetAddress
import java.nio.ByteBuffer import java.nio.ByteBuffer
object HostAddressSerializer : Serializer<InetAddress> { object HostAddressSerializer : Serializer<InetAddress> {
override fun serialize(buffer: ChainedByteBuffer, data: InetAddress, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: InetAddress, features: QuasselFeatures) {
when (data) { when (data) {
is Inet4Address -> { is Inet4Address -> {
ByteSerializer.serialize(buffer, NetworkLayerProtocol.IPv4Protocol.value, features) ByteSerializer.serialize(buffer, NetworkLayerProtocol.IPv4Protocol.value, features)
...@@ -29,7 +29,7 @@ object HostAddressSerializer : Serializer<InetAddress> { ...@@ -29,7 +29,7 @@ object HostAddressSerializer : Serializer<InetAddress> {
} }
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): InetAddress { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): InetAddress {
val type = ByteSerializer.deserialize(buffer, features) val type = ByteSerializer.deserialize(buffer, features)
return when (NetworkLayerProtocol.of(type)) { return when (NetworkLayerProtocol.of(type)) {
NetworkLayerProtocol.IPv4Protocol -> { NetworkLayerProtocol.IPv4Protocol -> {
......
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object IntSerializer : Serializer<Int> { object IntSerializer : Serializer<Int> {
override fun serialize(buffer: ChainedByteBuffer, data: Int, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: Int, features: QuasselFeatures) {
buffer.putInt(data) buffer.putInt(data)
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Int { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): Int {
return buffer.int return buffer.int
} }
} }
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import java.nio.ByteBuffer import java.nio.ByteBuffer
object LongSerializer : Serializer<Long> { object LongSerializer : Serializer<Long> {
override fun serialize(buffer: ChainedByteBuffer, data: Long, features: Quassel_Features) { override fun serialize(buffer: ChainedByteBuffer, data: Long, features: QuasselFeatures) {
buffer.putLong(data) buffer.putLong(data)
} }
override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Long { override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): Long {
return buffer.long return buffer.long
} }
} }
package de.kuschku.libquassel.protocol.primitive.serializer package de.kuschku.libquassel.protocol.primitive.serializer
import de.kuschku.libquassel.protocol.Message import de.kuschku.libquassel.protocol.Message
import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.ExtendedFeature
import de.kuschku.libquassel.quassel.QuasselFeature import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.hasFlag
import de.kuschku.libquassel.util.nio.ChainedByteBuffer import de.kuschku.libquassel.util.nio.ChainedByteBuffer
import org.threeten.bp.Instant import org.threeten.bp.Instant
import java.nio.ByteBuffer import java.nio.ByteBuffer
object MessageSerializer : Serializer<Message> { object MessageSerializer : Serializer<Message> {
override fun serialize(buffer: ChainedByteBuffer, data: Message, override fun serialize(buffer: ChainedByteBuffer, data: Message, features: QuasselFeatures) {
features: Quassel_Features) {
IntSerializer.serialize(buffer, data.messageId, features) IntSerializer.serialize(buffer, data.messageId, features)
IntSerializer.serialize(buffer, data.time.epochSecond.toInt(), features) IntSerializer.serialize(buffer, data.time.epochSecond.toInt(), features)
IntSerializer.serialize(buffer, data.type.toInt(), features) IntSerializer.serialize(buffer, data.type.toInt(), features)
ByteSerializer.serialize(buffer, data.flag.toByte(), features) ByteSerializer.serialize(buffer, data.flag.toByte(), features)
BufferInfoSerializer.serialize(buffer, data.bufferInfo, features) BufferInfoSerializer.serialize(buffer, data.bufferInfo, features)
StringSerializer.UTF8.serialize(buffer, data.sender, features) StringSerializer.UTF8.serialize(buffer, data.sender, features)
if (features.hasFlag(QuasselFeature.SenderPrefixes)) if (features.hasFeature(ExtendedFeature.SenderPrefixes))
StringSerializer.UTF8.serialize(buffer, data.senderPrefixes, features) StringSerializer.UTF8.serialize(buffer, data.senderPrefixes, features)
StringSerializer.UTF8.serialize(buffer, data.content, features) StringSerializer.UTF8.serialize(buffer, data.content, features)
} }
override fun deserialize(buffer: ByteBuffer, override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): Message {
features: Quassel_Features): Message {
return Message( return Message(
messageId = IntSerializer.deserialize(buffer, features), messageId = IntSerializer.deserialize(buffer, features),
time = Instant.ofEpochSecond(IntSerializer.deserialize(buffer, features).toLong()), time = Instant.ofEpochSecond(IntSerializer.deserialize(buffer, features).toLong()),
...@@ -33,7 +30,7 @@ object MessageSerializer : Serializer<Message> { ...@@ -33,7 +30,7 @@ object MessageSerializer : Serializer<Message> {
), ),
bufferInfo = BufferInfoSerializer.deserialize(buffer, features), bufferInfo = BufferInfoSerializer.deserialize(buffer, features),
sender = StringSerializer.UTF8.deserialize(buffer, features) ?: "", sender = StringSerializer.UTF8.deserialize(buffer, features) ?: "",
senderPrefixes = if (features.hasFlag(QuasselFeature.SenderPrefixes)) senderPrefixes = if (features.hasFeature(ExtendedFeature.SenderPrefixes))
StringSerializer.UTF8.deserialize(buffer, features) ?: "" else "", StringSerializer.UTF8.deserialize(buffer, features) ?: "" else "",
content = StringSerializer.UTF8.deserialize(buffer, features) ?: "" content = StringSerializer.UTF8.deserialize(buffer, features) ?: ""
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment