Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • api-redesign
  • main
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.7.0
  • 0.8.0
  • 0.8.1
  • 0.9.0
  • 0.9.1
  • 0.9.2
11 results

Target

Select target project
  • justJanne/libquassel
1 result
Select Git revision
  • api-redesign
  • main
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.7.0
  • 0.8.0
  • 0.8.1
  • 0.9.0
  • 0.9.1
  • 0.9.2
11 results
Show changes
Showing
with 409 additions and 133 deletions
......@@ -14,7 +14,7 @@ import de.justjanne.libquassel.protocol.variant.QVariantMap
import javax.inject.Inject
class BufferViewManagerPersister @Inject constructor(): BufferViewManagerClientApi {
override fun addBufferViewConfig(bufferViewConfigId: Int) = Unit
override fun deleteBufferViewConfig(bufferViewConfigId: Int) = Unit
override fun update(properties: QVariantMap) = Unit
override suspend fun addBufferViewConfig(bufferViewConfigId: Int) = Unit
override suspend fun deleteBufferViewConfig(bufferViewConfigId: Int) = Unit
override suspend fun update(properties: QVariantMap) = Unit
}
......@@ -16,7 +16,7 @@ import java.nio.ByteBuffer
import javax.inject.Inject
class CertManagerPersister @Inject constructor(): CertManagerClientApi {
override fun setSslCert(objectName: ObjectName, encoded: ByteBuffer) = Unit
override fun setSslKey(objectName: ObjectName, encoded: ByteBuffer) = Unit
override fun update(objectName: ObjectName, properties: QVariantMap) = Unit
override suspend fun setSslCert(objectName: ObjectName, encoded: ByteBuffer) = Unit
override suspend fun setSslKey(objectName: ObjectName, encoded: ByteBuffer) = Unit
override suspend fun update(objectName: ObjectName, properties: QVariantMap) = Unit
}
......@@ -14,6 +14,6 @@ import de.justjanne.libquassel.protocol.variant.QVariantMap
import javax.inject.Inject
class CoreInfoPersister @Inject constructor(): CoreInfoClientApi {
override fun setCoreData(data: QVariantMap) = Unit
override fun update(properties: QVariantMap) = Unit
override suspend fun setCoreData(data: QVariantMap) = Unit
override suspend fun update(properties: QVariantMap) = Unit
}
......@@ -14,10 +14,10 @@ import de.justjanne.libquassel.protocol.variant.QVariantMap
import javax.inject.Inject
class HighlightRuleManagerPersister @Inject constructor(): HighlightRuleManagerClientApi {
override fun removeHighlightRule(highlightRule: Int) = Unit
override fun toggleHighlightRule(highlightRule: Int) = Unit
override fun addHighlightRule(id: Int, content: String?, isRegEx: Boolean, isCaseSensitive: Boolean, isEnabled: Boolean, isInverse: Boolean, sender: String?, channel: String?) = Unit
override fun setHighlightNick(highlightNick: Int) = Unit
override fun setNicksCaseSensitive(nicksCaseSensitive: Boolean) = Unit
override fun update(properties: QVariantMap) = Unit
override suspend fun removeHighlightRule(highlightRule: Int) = Unit
override suspend fun toggleHighlightRule(highlightRule: Int) = Unit
override suspend fun addHighlightRule(id: Int, content: String?, isRegEx: Boolean, isCaseSensitive: Boolean, isEnabled: Boolean, isInverse: Boolean, sender: String?, channel: String?) = Unit
override suspend fun setHighlightNick(highlightNick: Int) = Unit
override suspend fun setNicksCaseSensitive(nicksCaseSensitive: Boolean) = Unit
override suspend fun update(properties: QVariantMap) = Unit
}
......@@ -17,24 +17,24 @@ import de.justjanne.libquassel.protocol.variant.QVariantMap
import javax.inject.Inject
class IdentityPersister @Inject constructor(): IdentityClientApi {
override fun setAutoAwayEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override fun setAutoAwayReason(objectName: ObjectName, reason: String?) = Unit
override fun setAutoAwayReasonEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override fun setAutoAwayTime(objectName: ObjectName, time: Int) = Unit
override fun setAwayNick(objectName: ObjectName, awayNick: String?) = Unit
override fun setAwayNickEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override fun setAwayReason(objectName: ObjectName, awayReason: String?) = Unit
override fun setAwayReasonEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override fun setDetachAwayEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override fun setDetachAwayReason(objectName: ObjectName, reason: String?) = Unit
override fun setDetachAwayReasonEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override fun setId(objectName: ObjectName, id: IdentityId) = Unit
override fun setIdent(objectName: ObjectName, ident: String?) = Unit
override fun setIdentityName(objectName: ObjectName, name: String?) = Unit
override fun setKickReason(objectName: ObjectName, reason: String?) = Unit
override fun setNicks(objectName: ObjectName, nicks: QStringList) = Unit
override fun setPartReason(objectName: ObjectName, reason: String?) = Unit
override fun setQuitReason(objectName: ObjectName, reason: String?) = Unit
override fun setRealName(objectName: ObjectName, realName: String?) = Unit
override fun update(objectName: ObjectName, properties: QVariantMap) = Unit
override suspend fun setAutoAwayEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override suspend fun setAutoAwayReason(objectName: ObjectName, reason: String?) = Unit
override suspend fun setAutoAwayReasonEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override suspend fun setAutoAwayTime(objectName: ObjectName, time: Int) = Unit
override suspend fun setAwayNick(objectName: ObjectName, awayNick: String?) = Unit
override suspend fun setAwayNickEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override suspend fun setAwayReason(objectName: ObjectName, awayReason: String?) = Unit
override suspend fun setAwayReasonEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override suspend fun setDetachAwayEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override suspend fun setDetachAwayReason(objectName: ObjectName, reason: String?) = Unit
override suspend fun setDetachAwayReasonEnabled(objectName: ObjectName, enabled: Boolean) = Unit
override suspend fun setId(objectName: ObjectName, id: IdentityId) = Unit
override suspend fun setIdent(objectName: ObjectName, ident: String?) = Unit
override suspend fun setIdentityName(objectName: ObjectName, name: String?) = Unit
override suspend fun setKickReason(objectName: ObjectName, reason: String?) = Unit
override suspend fun setNicks(objectName: ObjectName, nicks: QStringList) = Unit
override suspend fun setPartReason(objectName: ObjectName, reason: String?) = Unit
override suspend fun setQuitReason(objectName: ObjectName, reason: String?) = Unit
override suspend fun setRealName(objectName: ObjectName, realName: String?) = Unit
override suspend fun update(objectName: ObjectName, properties: QVariantMap) = Unit
}
......@@ -14,8 +14,8 @@ import de.justjanne.libquassel.protocol.variant.QVariantMap
import javax.inject.Inject
class IgnoreListManagerPersister @Inject constructor(): IgnoreListManagerClientApi {
override fun addIgnoreListItem(type: Int, ignoreRule: String?, isRegEx: Boolean, strictness: Int, scope: Int, scopeRule: String?, isActive: Boolean) = Unit
override fun removeIgnoreListItem(ignoreRule: String?) = Unit
override fun toggleIgnoreRule(ignoreRule: String?) = Unit
override fun update(properties: QVariantMap) = Unit
override suspend fun addIgnoreListItem(type: Int, ignoreRule: String?, isRegEx: Boolean, strictness: Int, scope: Int, scopeRule: String?, isActive: Boolean) = Unit
override suspend fun removeIgnoreListItem(ignoreRule: String?) = Unit
override suspend fun toggleIgnoreRule(ignoreRule: String?) = Unit
override suspend fun update(properties: QVariantMap) = Unit
}
......@@ -16,15 +16,15 @@ import de.justjanne.libquassel.protocol.variant.QVariantMap
import javax.inject.Inject
class IrcChannelPersister @Inject constructor(): IrcChannelClientApi {
override fun addChannelMode(objectName: ObjectName, mode: Char, value: String?) = Unit
override fun addUserMode(objectName: ObjectName, nick: String, mode: String?) = Unit
override fun joinIrcUsers(objectName: ObjectName, nicks: QStringList, modes: QStringList) = Unit
override fun part(objectName: ObjectName, nick: String) = Unit
override fun removeChannelMode(objectName: ObjectName, mode: Char, value: String?) = Unit
override fun removeUserMode(objectName: ObjectName, nick: String, mode: String?) = Unit
override fun setEncrypted(objectName: ObjectName, encrypted: Boolean) = Unit
override fun setPassword(objectName: ObjectName, password: String) = Unit
override fun setTopic(objectName: ObjectName, topic: String) = Unit
override fun setUserModes(objectName: ObjectName, nick: String, modes: String?) = Unit
override fun update(objectName: ObjectName, properties: QVariantMap) = Unit
override suspend fun addChannelMode(objectName: ObjectName, mode: Char, value: String?) = Unit
override suspend fun addUserMode(objectName: ObjectName, nick: String, mode: String?) = Unit
override suspend fun joinIrcUsers(objectName: ObjectName, nicks: QStringList, modes: QStringList) = Unit
override suspend fun part(objectName: ObjectName, nick: String) = Unit
override suspend fun removeChannelMode(objectName: ObjectName, mode: Char, value: String?) = Unit
override suspend fun removeUserMode(objectName: ObjectName, nick: String, mode: String?) = Unit
override suspend fun setEncrypted(objectName: ObjectName, encrypted: Boolean) = Unit
override suspend fun setPassword(objectName: ObjectName, password: String) = Unit
override suspend fun setTopic(objectName: ObjectName, topic: String) = Unit
override suspend fun setUserModes(objectName: ObjectName, nick: String, modes: String?) = Unit
override suspend fun update(objectName: ObjectName, properties: QVariantMap) = Unit
}
......@@ -16,7 +16,7 @@ import de.justjanne.libquassel.protocol.variant.QVariantList
import javax.inject.Inject
class IrcListHelperPersister @Inject constructor(): IrcListHelperClientApi {
override fun receiveChannelList(netId: NetworkId, channelFilters: QStringList, channels: QVariantList) = Unit
override fun reportError(error: String?) = Unit
override fun reportFinishedList(netId: NetworkId) = Unit
override suspend fun receiveChannelList(netId: NetworkId, channelFilters: QStringList, channels: QVariantList) = Unit
override suspend fun reportError(error: String?) = Unit
override suspend fun reportFinishedList(netId: NetworkId) = Unit
}
......@@ -16,28 +16,28 @@ import org.threeten.bp.temporal.Temporal
import javax.inject.Inject
class IrcUserPersister @Inject constructor(): IrcUserClientApi {
override fun addUserModes(objectName: ObjectName, modes: String) = Unit
override fun joinChannel(objectName: ObjectName, channelname: String) = Unit
override fun partChannel(objectName: ObjectName, channelname: String) = Unit
override fun quit(objectName: ObjectName) = Unit
override fun removeUserModes(objectName: ObjectName, modes: String) = Unit
override fun setAccount(objectName: ObjectName, account: String) = Unit
override fun setAway(objectName: ObjectName, away: Boolean) = Unit
override fun setAwayMessage(objectName: ObjectName, awayMessage: String) = Unit
override fun setEncrypted(objectName: ObjectName, encrypted: Boolean) = Unit
override fun setHost(objectName: ObjectName, host: String) = Unit
override fun setIdleTime(objectName: ObjectName, idleTime: Temporal) = Unit
override fun setIrcOperator(objectName: ObjectName, ircOperator: String) = Unit
override fun setLastAwayMessage(objectName: ObjectName, lastAwayMessage: Int) = Unit
override fun setLastAwayMessageTime(objectName: ObjectName, lastAwayMessageTime: Temporal) = Unit
override fun setLoginTime(objectName: ObjectName, loginTime: Temporal) = Unit
override fun setNick(objectName: ObjectName, newNick: String) = Unit
override fun setRealName(objectName: ObjectName, realName: String) = Unit
override fun setServer(objectName: ObjectName, server: String) = Unit
override fun setSuserHost(objectName: ObjectName, suserHost: String) = Unit
override fun setUser(objectName: ObjectName, user: String) = Unit
override fun setUserModes(objectName: ObjectName, modes: String) = Unit
override fun setWhoisServiceReply(objectName: ObjectName, whoisServiceReply: String) = Unit
override fun updateHostmask(objectName: ObjectName, mask: String) = Unit
override fun update(objectName: ObjectName, properties: QVariantMap) = Unit
override suspend fun addUserModes(objectName: ObjectName, modes: String) = Unit
override suspend fun joinChannel(objectName: ObjectName, channelname: String) = Unit
override suspend fun partChannel(objectName: ObjectName, channelname: String) = Unit
override suspend fun quit(objectName: ObjectName) = Unit
override suspend fun removeUserModes(objectName: ObjectName, modes: String) = Unit
override suspend fun setAccount(objectName: ObjectName, account: String) = Unit
override suspend fun setAway(objectName: ObjectName, away: Boolean) = Unit
override suspend fun setAwayMessage(objectName: ObjectName, awayMessage: String) = Unit
override suspend fun setEncrypted(objectName: ObjectName, encrypted: Boolean) = Unit
override suspend fun setHost(objectName: ObjectName, host: String) = Unit
override suspend fun setIdleTime(objectName: ObjectName, idleTime: Temporal) = Unit
override suspend fun setIrcOperator(objectName: ObjectName, ircOperator: String) = Unit
override suspend fun setLastAwayMessage(objectName: ObjectName, lastAwayMessage: Int) = Unit
override suspend fun setLastAwayMessageTime(objectName: ObjectName, lastAwayMessageTime: Temporal) = Unit
override suspend fun setLoginTime(objectName: ObjectName, loginTime: Temporal) = Unit
override suspend fun setNick(objectName: ObjectName, newNick: String) = Unit
override suspend fun setRealName(objectName: ObjectName, realName: String) = Unit
override suspend fun setServer(objectName: ObjectName, server: String) = Unit
override suspend fun setSuserHost(objectName: ObjectName, suserHost: String) = Unit
override suspend fun setUser(objectName: ObjectName, user: String) = Unit
override suspend fun setUserModes(objectName: ObjectName, modes: String) = Unit
override suspend fun setWhoisServiceReply(objectName: ObjectName, whoisServiceReply: String) = Unit
override suspend fun updateHostmask(objectName: ObjectName, mask: String) = Unit
override suspend fun update(objectName: ObjectName, properties: QVariantMap) = Unit
}
......@@ -14,13 +14,13 @@ import de.justjanne.libquassel.protocol.variant.QVariantMap
import javax.inject.Inject
class NetworkConfigPersister @Inject constructor(): NetworkConfigClientApi {
override fun setAutoWhoDelay(delay: Int) = Unit
override fun setAutoWhoEnabled(enabled: Boolean) = Unit
override fun setAutoWhoInterval(interval: Int) = Unit
override fun setAutoWhoNickLimit(limit: Int) = Unit
override fun setMaxPingCount(count: Int) = Unit
override fun setPingInterval(interval: Int) = Unit
override fun setPingTimeoutEnabled(enabled: Boolean) = Unit
override fun setStandardCtcp(enabled: Boolean) = Unit
override fun update(properties: QVariantMap) = Unit
override suspend fun setAutoWhoDelay(delay: Int) = Unit
override suspend fun setAutoWhoEnabled(enabled: Boolean) = Unit
override suspend fun setAutoWhoInterval(interval: Int) = Unit
override suspend fun setAutoWhoNickLimit(limit: Int) = Unit
override suspend fun setMaxPingCount(count: Int) = Unit
override suspend fun setPingInterval(interval: Int) = Unit
override suspend fun setPingTimeoutEnabled(enabled: Boolean) = Unit
override suspend fun setStandardCtcp(enabled: Boolean) = Unit
override suspend fun update(properties: QVariantMap) = Unit
}
......@@ -19,42 +19,42 @@ import java.nio.ByteBuffer
import javax.inject.Inject
class NetworkPersister @Inject constructor(): NetworkClientApi {
override fun setNetworkName(objectName: ObjectName, networkName: String) = Unit
override fun setCurrentServer(objectName: ObjectName, currentServer: String?) = Unit
override fun setMyNick(objectName: ObjectName, myNick: String?) = Unit
override fun setLatency(objectName: ObjectName, latency: Int) = Unit
override fun setCodecForServer(objectName: ObjectName, codecForServer: ByteBuffer) = Unit
override fun setCodecForEncoding(objectName: ObjectName, codecForEncoding: ByteBuffer) = Unit
override fun setCodecForDecoding(objectName: ObjectName, codecForDecoding: ByteBuffer) = Unit
override fun setIdentity(objectName: ObjectName, identityId: IdentityId) = Unit
override fun setConnected(objectName: ObjectName, isConnected: Boolean) = Unit
override fun setConnectionState(objectName: ObjectName, connectionState: Int) = Unit
override fun setUseRandomServer(objectName: ObjectName, useRandomServer: Boolean) = Unit
override fun setPerform(objectName: ObjectName, perform: QStringList) = Unit
override fun setSkipCaps(objectName: ObjectName, skipCaps: QStringList) = Unit
override fun setUseAutoIdentify(objectName: ObjectName, useAutoIdentify: Boolean) = Unit
override fun setAutoIdentifyService(objectName: ObjectName, autoIdentifyService: String) = Unit
override fun setAutoIdentifyPassword(objectName: ObjectName, autoIdentifyPassword: String) = Unit
override fun setUseSasl(objectName: ObjectName, useSasl: Boolean) = Unit
override fun setSaslAccount(objectName: ObjectName, saslAccount: String) = Unit
override fun setSaslPassword(objectName: ObjectName, saslPassword: String) = Unit
override fun setUseAutoReconnect(objectName: ObjectName, useAutoReconnect: Boolean) = Unit
override fun setAutoReconnectInterval(objectName: ObjectName, autoReconnectInterval: UInt) = Unit
override fun setAutoReconnectRetries(objectName: ObjectName, autoReconnectRetries: UShort) = Unit
override fun setUnlimitedReconnectRetries(objectName: ObjectName, unlimitedReconnectRetries: Boolean) = Unit
override fun setRejoinChannels(objectName: ObjectName, rejoinChannels: Boolean) = Unit
override fun setUseCustomMessageRate(objectName: ObjectName, useCustomMessageRate: Boolean) = Unit
override fun setMessageRateBurstSize(objectName: ObjectName, messageRateBurstSize: UInt) = Unit
override fun setMessageRateDelay(objectName: ObjectName, messageRateDelay: UInt) = Unit
override fun setUnlimitedMessageRate(objectName: ObjectName, unlimitedMessageRate: Boolean) = Unit
override fun setServerList(objectName: ObjectName, serverList: QVariantList) = Unit
override fun addSupport(objectName: ObjectName, param: String, value: String) = Unit
override fun removeSupport(objectName: ObjectName, param: String) = Unit
override fun addCap(objectName: ObjectName, capability: String, value: String) = Unit
override fun acknowledgeCap(objectName: ObjectName, capability: String) = Unit
override fun removeCap(objectName: ObjectName, capability: String) = Unit
override fun clearCaps(objectName: ObjectName) = Unit
override fun addIrcUser(objectName: ObjectName, hostmask: String) = Unit
override fun addIrcChannel(objectName: ObjectName, channel: String) = Unit
override fun update(objectName: ObjectName, properties: QVariantMap) = Unit
override suspend fun setNetworkName(objectName: ObjectName, networkName: String) = Unit
override suspend fun setCurrentServer(objectName: ObjectName, currentServer: String?) = Unit
override suspend fun setMyNick(objectName: ObjectName, myNick: String?) = Unit
override suspend fun setLatency(objectName: ObjectName, latency: Int) = Unit
override suspend fun setCodecForServer(objectName: ObjectName, codecForServer: ByteBuffer) = Unit
override suspend fun setCodecForEncoding(objectName: ObjectName, codecForEncoding: ByteBuffer) = Unit
override suspend fun setCodecForDecoding(objectName: ObjectName, codecForDecoding: ByteBuffer) = Unit
override suspend fun setIdentity(objectName: ObjectName, identityId: IdentityId) = Unit
override suspend fun setConnected(objectName: ObjectName, isConnected: Boolean) = Unit
override suspend fun setConnectionState(objectName: ObjectName, connectionState: Int) = Unit
override suspend fun setUseRandomServer(objectName: ObjectName, useRandomServer: Boolean) = Unit
override suspend fun setPerform(objectName: ObjectName, perform: QStringList) = Unit
override suspend fun setSkipCaps(objectName: ObjectName, skipCaps: QStringList) = Unit
override suspend fun setUseAutoIdentify(objectName: ObjectName, useAutoIdentify: Boolean) = Unit
override suspend fun setAutoIdentifyService(objectName: ObjectName, autoIdentifyService: String) = Unit
override suspend fun setAutoIdentifyPassword(objectName: ObjectName, autoIdentifyPassword: String) = Unit
override suspend fun setUseSasl(objectName: ObjectName, useSasl: Boolean) = Unit
override suspend fun setSaslAccount(objectName: ObjectName, saslAccount: String) = Unit
override suspend fun setSaslPassword(objectName: ObjectName, saslPassword: String) = Unit
override suspend fun setUseAutoReconnect(objectName: ObjectName, useAutoReconnect: Boolean) = Unit
override suspend fun setAutoReconnectInterval(objectName: ObjectName, autoReconnectInterval: UInt) = Unit
override suspend fun setAutoReconnectRetries(objectName: ObjectName, autoReconnectRetries: UShort) = Unit
override suspend fun setUnlimitedReconnectRetries(objectName: ObjectName, unlimitedReconnectRetries: Boolean) = Unit
override suspend fun setRejoinChannels(objectName: ObjectName, rejoinChannels: Boolean) = Unit
override suspend fun setUseCustomMessageRate(objectName: ObjectName, useCustomMessageRate: Boolean) = Unit
override suspend fun setMessageRateBurstSize(objectName: ObjectName, messageRateBurstSize: UInt) = Unit
override suspend fun setMessageRateDelay(objectName: ObjectName, messageRateDelay: UInt) = Unit
override suspend fun setUnlimitedMessageRate(objectName: ObjectName, unlimitedMessageRate: Boolean) = Unit
override suspend fun setServerList(objectName: ObjectName, serverList: QVariantList) = Unit
override suspend fun addSupport(objectName: ObjectName, param: String, value: String) = Unit
override suspend fun removeSupport(objectName: ObjectName, param: String) = Unit
override suspend fun addCap(objectName: ObjectName, capability: String, value: String) = Unit
override suspend fun acknowledgeCap(objectName: ObjectName, capability: String) = Unit
override suspend fun removeCap(objectName: ObjectName, capability: String) = Unit
override suspend fun clearCaps(objectName: ObjectName) = Unit
override suspend fun addIrcUser(objectName: ObjectName, hostmask: String) = Unit
override suspend fun addIrcChannel(objectName: ObjectName, channel: String) = Unit
override suspend fun update(objectName: ObjectName, properties: QVariantMap) = Unit
}
......@@ -19,14 +19,14 @@ import java.nio.ByteBuffer
import javax.inject.Inject
class RpcPersister @Inject constructor(): RpcClientApi {
override fun objectRenamed(classname: ByteBuffer, newName: String?, oldName: String?) = Unit
override fun displayMsg(message: Message) = Unit
override fun displayStatusMsg(net: String?, msg: String?) = Unit
override fun bufferInfoUpdated(bufferInfo: BufferInfo) = Unit
override fun identityCreated(identity: QVariantMap) = Unit
override fun identityRemoved(identityId: IdentityId) = Unit
override fun networkCreated(networkId: NetworkId) = Unit
override fun networkRemoved(networkId: NetworkId) = Unit
override fun passwordChanged(peer: ULong, success: Boolean) = Unit
override fun disconnectFromCore() = Unit
override suspend fun objectRenamed(classname: ByteBuffer, newName: String?, oldName: String?) = Unit
override suspend fun displayMsg(message: Message) = Unit
override suspend fun displayStatusMsg(net: String?, msg: String?) = Unit
override suspend fun bufferInfoUpdated(bufferInfo: BufferInfo) = Unit
override suspend fun identityCreated(identity: QVariantMap) = Unit
override suspend fun identityRemoved(identityId: IdentityId) = Unit
override suspend fun networkCreated(networkId: NetworkId) = Unit
override suspend fun networkRemoved(networkId: NetworkId) = Unit
override suspend fun passwordChanged(peer: ULong, success: Boolean) = Unit
override suspend fun disconnectFromCore() = Unit
}
/*
* libquassel
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.connection
import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
import de.justjanne.libquassel.protocol.io.CoroutineChannel
import java.nio.ByteBuffer
import javax.net.ssl.SSLContext
class ChannelConnection(
private val channel: CoroutineChannel,
): Connection {
private val sizeBuffer = ByteBuffer.allocateDirect(4)
private val buffer = ChainedByteBuffer()
override suspend fun enableTLS(sslContext: SSLContext) = channel.enableTLS(sslContext)
override suspend fun enableCompression() = channel.enableCompression()
override suspend fun send(sizePrefix: Boolean, handler: (buffer: ChainedByteBuffer) -> Unit) {
handler(buffer)
if (sizePrefix) {
sizeBuffer.clear()
sizeBuffer.putInt(buffer.size)
sizeBuffer.flip()
channel.write(sizeBuffer)
sizeBuffer.clear()
}
channel.write(buffer)
channel.flush()
buffer.clear()
}
override suspend fun <T> read(buffer: ByteBuffer, handler: (buffer: ByteBuffer) -> T): T {
channel.read(buffer)
buffer.flip()
return handler(buffer)
}
override suspend fun <T> read(handler: (buffer: ByteBuffer) -> T): T {
sizeBuffer.clear()
channel.read(sizeBuffer)
sizeBuffer.flip()
val content = ByteBuffer.allocateDirect(sizeBuffer.getInt())
channel.read(content)
content.flip()
return handler(content)
}
}
/*
* libquassel
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.connection
import de.justjanne.libquassel.protocol.exceptions.HandshakeException
import de.justjanne.libquassel.protocol.features.FeatureSet
import de.justjanne.libquassel.protocol.models.HandshakeMessage
import de.justjanne.libquassel.protocol.serializers.HandshakeMessageSerializer
class ClientHandshakeHandler(
private val clientInit: HandshakeMessage.ClientInit,
private val clientLogin: HandshakeMessage.ClientLogin,
) : ConnectionHandler<HandshakeState> {
private suspend fun Connection.request(message: HandshakeMessage): HandshakeMessage {
send(sizePrefix = true) {
HandshakeMessageSerializer.serialize(it, message, FeatureSet.none())
}
return read { HandshakeMessageSerializer.deserialize(it, FeatureSet.none()) }
}
private suspend fun Connection.clientInit(message: HandshakeMessage.ClientInit): Result<HandshakeMessage.ClientInitAck> =
when (val result = request(message)) {
is HandshakeMessage.ClientInitAck -> Result.success(result)
is HandshakeMessage.ClientInitReject -> Result.failure(HandshakeException.InitException(result.errorString ?: "Unknown error"))
else -> Result.failure(HandshakeException.InitException("Unknown error"))
}
private suspend fun Connection.clientLogin(message: HandshakeMessage.ClientLogin): Result<HandshakeMessage.ClientLoginAck> =
when (val result = request(message)) {
is HandshakeMessage.ClientLoginAck -> Result.success(result)
is HandshakeMessage.ClientLoginReject -> Result.failure(HandshakeException.InitException(result.errorString ?: "Unknown error"))
else -> Result.failure(HandshakeException.InitException("Unknown error"))
}
private suspend fun Connection.coreSetup(message: HandshakeMessage.CoreSetupData): Result<HandshakeMessage.CoreSetupAck> =
when (val result = request(message)) {
is HandshakeMessage.CoreSetupAck -> Result.success(result)
is HandshakeMessage.CoreSetupReject -> Result.failure(HandshakeException.InitException(result.errorString ?: "Unknown error"))
else -> Result.failure(HandshakeException.InitException("Unknown error"))
}
override suspend fun handle(connection: Connection) = runCatching {
val init = connection.clientInit(clientInit).getOrThrow()
connection.clientLogin(clientLogin).getOrThrow()
val sessionInit = when (val result = connection.read { HandshakeMessageSerializer.deserialize(it, FeatureSet.none()) }) {
is HandshakeMessage.SessionInit -> Result.success(result)
else -> Result.failure(HandshakeException.InitException("Unknown error"))
}.getOrThrow()
HandshakeState(init, sessionInit)
}
}
/*
* libquassel
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.connection
import de.justjanne.libquassel.protocol.api.ObjectName
import de.justjanne.libquassel.protocol.api.dispatcher.RpcDispatcher
import de.justjanne.libquassel.protocol.api.dispatcher.SyncHandler
import de.justjanne.libquassel.protocol.models.SignalProxyMessage
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.serializers.SignalProxyMessageSerializer
import de.justjanne.libquassel.protocol.variant.qVariant
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
class ClientSessionHandler(
private val handshake: HandshakeState,
private val sync: SyncHandler,
private val rpc: RpcDispatcher,
) : ConnectionHandler<Unit> {
val toInit = MutableStateFlow<List<Pair<String, String>>?>(null)
override suspend fun handle(connection: Connection) = runCatching {
suspend fun Connection.send(message: SignalProxyMessage) = send(true) {
SignalProxyMessageSerializer.serialize(it, message, handshake.clientInitAck.featureSet)
}
toInit.value = listOf(
Pair("AliasManager", "")
)
connection.send(SignalProxyMessage.InitRequest("AliasManager", ""))
while (true) {
when (val message = connection.read { SignalProxyMessageSerializer.deserialize(it, handshake.clientInitAck.featureSet) }) {
is SignalProxyMessage.HeartBeat -> connection.send(SignalProxyMessage.HeartBeatReply(message.timestamp))
is SignalProxyMessage.HeartBeatReply -> Unit
is SignalProxyMessage.InitData -> {
sync.invoke(message.className, ObjectName(message.objectName), "update", listOf(qVariant(message.initData, QtType.QVariantMap)))
toInit.update { it?.minus(Pair(message.className, message.objectName)) }
}
is SignalProxyMessage.InitRequest -> Unit
is SignalProxyMessage.Rpc -> rpc.invoke(message.slotName, message.params)
is SignalProxyMessage.Sync -> sync.invoke(message.className, ObjectName(message.objectName), message.slotName, message.params)
}
}
}
}
/*
* libquassel
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.connection
import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
import java.nio.ByteBuffer
import javax.net.ssl.SSLContext
interface Connection {
suspend fun enableTLS(sslContext: SSLContext)
suspend fun enableCompression()
suspend fun send(sizePrefix: Boolean, handler: (buffer: ChainedByteBuffer) -> Unit)
suspend fun <T> read(buffer: ByteBuffer, handler: (buffer: ByteBuffer) -> T): T
suspend fun <T> read(handler: (buffer: ByteBuffer) -> T): T
}
/*
* libquassel
* Copyright (c) 2021 Janne Mareike Koschinski
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.session
package de.justjanne.libquassel.connection
import java.nio.ByteBuffer
interface ConnectionHandler {
suspend fun init(channel: MessageChannel): Boolean
suspend fun done()
suspend fun read(buffer: ByteBuffer): Boolean
interface ConnectionHandler<T> {
suspend fun handle(connection: Connection): Result<T>
}
/*
* libquassel
* Copyright (c) 2021 Janne Mareike Koschinski
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.session
package de.justjanne.libquassel.connection
import de.justjanne.libquassel.protocol.models.SignalProxyMessage
import de.justjanne.libquassel.protocol.connection.CoreHeader
interface ProxyMessageHandler : ConnectionHandler {
suspend fun emit(message: SignalProxyMessage)
suspend fun dispatch(message: SignalProxyMessage)
}
data class ConnectionSetupState(
val coreHeader: CoreHeader,
)
/*
* libquassel
* Copyright (c) 2021 Janne Mareike Koschinski
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.session
package de.justjanne.libquassel.connection
import de.justjanne.libquassel.protocol.models.setup.BackendInfo
import de.justjanne.libquassel.protocol.models.HandshakeMessage
sealed class CoreState {
object Configured : CoreState()
data class Unconfigured(
val databases: List<BackendInfo>,
val authenticators: List<BackendInfo>,
) : CoreState()
}
data class HandshakeState(
val clientInitAck: HandshakeMessage.ClientInitAck,
val sessionInit: HandshakeMessage.SessionInit,
)
/*
* libquassel
* Copyright (c) 2025 Janne Mareike Koschinski
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.connection
import de.justjanne.libquassel.protocol.connection.ClientHeader
import de.justjanne.libquassel.protocol.connection.ClientHeaderSerializer
import de.justjanne.libquassel.protocol.connection.CoreHeader
import de.justjanne.libquassel.protocol.connection.CoreHeaderSerializer
import de.justjanne.libquassel.protocol.connection.ProtocolFeature
import de.justjanne.libquassel.protocol.features.FeatureSet
import java.nio.ByteBuffer
import javax.net.ssl.SSLContext
class MagicHandler(
private val clientHeader: ClientHeader,
) : ConnectionHandler<ConnectionSetupState> {
override suspend fun handle(connection: Connection) = runCatching {
connection.send(sizePrefix = false) {
ClientHeaderSerializer.serialize(it, clientHeader, FeatureSet.none())
}
val protocol: CoreHeader = connection.read(ByteBuffer.allocateDirect(4)) {
CoreHeaderSerializer.deserialize(it, FeatureSet.none())
}
if (protocol.features.contains(ProtocolFeature.TLS)) {
connection.enableTLS(SSLContext.getDefault())
}
if (protocol.features.contains(ProtocolFeature.Compression)) {
connection.enableCompression()
}
ConnectionSetupState(protocol)
}
}