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

Continue invoker implementation

parent 2dcd077e
Branches
Tags
No related merge requests found
Showing
with 154 additions and 98 deletions
/*
* libquassel
* Copyright (c) 2021 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.syncables
data class ObjectRepositoryState(
val syncables: Map<ObjectIdentifier, SyncableStub> = emptyMap(),
val waiting: Set<SyncableStub> = emptySet()
)
......@@ -13,33 +13,49 @@ import de.justjanne.libquassel.annotations.ProtocolSide
import de.justjanne.libquassel.protocol.models.SignalProxyMessage
import de.justjanne.libquassel.protocol.models.ids.IdentityId
import de.justjanne.libquassel.protocol.models.ids.NetworkId
import de.justjanne.libquassel.protocol.syncables.stubs.BacklogManagerStub
import de.justjanne.libquassel.protocol.syncables.stubs.IgnoreListManagerStub
import de.justjanne.libquassel.protocol.syncables.stubs.IrcListHelperStub
import de.justjanne.libquassel.protocol.syncables.stubs.RpcHandlerStub
import de.justjanne.libquassel.protocol.syncables.common.AliasManager
import de.justjanne.libquassel.protocol.syncables.common.BacklogManager
import de.justjanne.libquassel.protocol.syncables.common.BufferSyncer
import de.justjanne.libquassel.protocol.syncables.common.BufferViewManager
import de.justjanne.libquassel.protocol.syncables.common.CoreInfo
import de.justjanne.libquassel.protocol.syncables.common.DccConfig
import de.justjanne.libquassel.protocol.syncables.common.HighlightRuleManager
import de.justjanne.libquassel.protocol.syncables.common.Identity
import de.justjanne.libquassel.protocol.syncables.common.IgnoreListManager
import de.justjanne.libquassel.protocol.syncables.common.IrcListHelper
import de.justjanne.libquassel.protocol.syncables.common.Network
import de.justjanne.libquassel.protocol.syncables.common.NetworkConfig
import de.justjanne.libquassel.protocol.syncables.common.RpcHandler
import de.justjanne.libquassel.protocol.variant.QVariantList
import de.justjanne.libquassel.protocol.variant.QVariantMap
interface Session : RpcHandlerStub {
interface Session {
val protocolSide: ProtocolSide
val objectRepository: ObjectRepository
val rpcHandler: RpcHandler
fun network(id: NetworkId): Network?
fun identity(id: IdentityId): Identity
fun addNetwork(id: NetworkId)
fun removeNetwork(id: NetworkId)
fun aliasManager(): AliasManager
fun bufferSyncer(): BufferSyncer
fun backlogManager(): BacklogManagerStub
fun bufferViewManager(): BufferViewManager
fun ignoreListManager(): IgnoreListManagerStub
fun highlightRuleManager(): HighlightRuleManager
fun ircListHelper(): IrcListHelperStub
fun identity(id: IdentityId): Identity?
fun addIdentity(properties: QVariantMap)
fun removeIdentity(id: IdentityId)
fun coreInfo(): CoreInfo
fun dccConfig(): DccConfig
fun networkConfig(): NetworkConfig
val aliasManager: AliasManager
val backlogManager: BacklogManager
val bufferSyncer: BufferSyncer
val bufferViewManager: BufferViewManager
val highlightRuleManager: HighlightRuleManager
val ignoreListManager: IgnoreListManager
val ircListHelper: IrcListHelper
fun synchronize(it: SyncableObject)
fun stopSynchronize(it: SyncableObject)
val coreInfo: CoreInfo
val dccConfig: DccConfig
val networkConfig: NetworkConfig
fun synchronize(syncable: SyncableStub)
fun stopSynchronize(syncable: SyncableStub)
fun sync(
target: ProtocolSide,
......@@ -77,10 +93,4 @@ interface Session : RpcHandlerStub {
fun emit(message: SignalProxyMessage)
fun dispatch(message: SignalProxyMessage)
fun dispatch(message: SignalProxyMessage.Sync)
fun dispatch(message: SignalProxyMessage.Rpc)
fun dispatch(message: SignalProxyMessage.InitRequest)
fun dispatch(message: SignalProxyMessage.InitData)
fun dispatch(message: SignalProxyMessage.HeartBeat)
fun dispatch(message: SignalProxyMessage.HeartBeatReply)
}
......@@ -9,13 +9,14 @@
package de.justjanne.libquassel.protocol.syncables
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
abstract class StatefulSyncableObject<T>(
session: Session?,
className: String,
state: T
) : SyncableObject(session, className) {
) : SyncableObject(session, className), StatefulSyncableStub {
override fun toString(): String {
return "$className(objectName=$objectName, state=${state()})"
}
......@@ -37,10 +38,10 @@ abstract class StatefulSyncableObject<T>(
}
@Suppress("NOTHING_TO_INLINE")
inline fun state() = flow().value
inline fun state(): T = state.value
@Suppress("NOTHING_TO_INLINE")
inline fun flow() = state
inline fun flow(): Flow<T> = state
@PublishedApi
internal val state = MutableStateFlow(state)
......
......@@ -9,16 +9,29 @@
package de.justjanne.libquassel.protocol.syncables
import de.justjanne.libquassel.annotations.ProtocolSide
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.variant.QVariantMap
import de.justjanne.libquassel.protocol.variant.qVariant
interface ObjectRepository {
fun register(syncable: SyncableStub, batch: Boolean)
fun init(syncable: SyncableStub, data: QVariantMap)
fun rename(syncable: SyncableStub, newName: String)
fun remove(syncable: SyncableStub)
interface StatefulSyncableStub : SyncableStub {
fun fromVariantMap(properties: QVariantMap)
fun toVariantMap(): QVariantMap
fun <T : SyncableStub> find(type: Class<T>, objectName: String): T
fun update(properties: QVariantMap) {
fromVariantMap(properties)
sync(
target = ProtocolSide.CLIENT,
"update",
qVariant(properties, QtType.QVariantMap)
)
}
inline fun <reified T : SyncableStub> ObjectRepository.find(objectName: String): T =
find(T::class.java, objectName)
fun requestUpdate(properties: QVariantMap = toVariantMap()) {
sync(
target = ProtocolSide.CORE,
"requestUpdate",
qVariant(properties, QtType.QVariantMap)
)
}
}
......@@ -18,7 +18,6 @@ abstract class SyncableObject(
final override var objectName: String = ""
internal set
final override var initialized: Boolean = false
internal set
protected fun renameObject(
newName: String
......@@ -29,7 +28,7 @@ abstract class SyncableObject(
} else if (oldName != newName) {
objectName = newName
session?.objectRepository?.rename(this, newName)
session?.objectRenamed(
session?.rpcHandler?.objectRenamed(
StringSerializerUtf8.serializeRaw(className),
oldName,
newName
......
......@@ -10,20 +10,14 @@
package de.justjanne.libquassel.protocol.syncables
import de.justjanne.libquassel.annotations.ProtocolSide
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.variant.QVariantMap
import de.justjanne.libquassel.protocol.variant.QVariant_
import de.justjanne.libquassel.protocol.variant.qVariant
interface SyncableStub {
val className: String
val objectName: String
val initialized: Boolean
var initialized: Boolean
val session: Session?
fun fromVariantMap(properties: QVariantMap)
fun toVariantMap(): QVariantMap
fun sync(target: ProtocolSide, function: String, vararg arg: QVariant_) {
if (initialized) {
session?.sync(target, className, objectName, function, arg.toList())
......@@ -35,21 +29,4 @@ interface SyncableStub {
session?.rpc(target, function, arg.toList())
}
}
fun update(properties: QVariantMap) {
fromVariantMap(properties)
sync(
target = ProtocolSide.CLIENT,
"update",
qVariant(properties, QtType.QVariantMap)
)
}
fun requestUpdate(properties: QVariantMap = toVariantMap()) {
sync(
target = ProtocolSide.CORE,
"requestUpdate",
qVariant(properties, QtType.QVariantMap)
)
}
}
......@@ -7,13 +7,15 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.BufferInfo
import de.justjanne.libquassel.protocol.models.QStringList
import de.justjanne.libquassel.protocol.models.alias.Alias
import de.justjanne.libquassel.protocol.models.alias.Command
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.AliasManagerState
import de.justjanne.libquassel.protocol.syncables.stubs.AliasManagerStub
import de.justjanne.libquassel.protocol.util.update
......@@ -46,8 +48,9 @@ open class AliasManager(
}
state.update {
copy(aliases = names.zip(expansions, ::Alias))
copy(aliases = names.zip(expansions, Alias::of))
}
initialized = true
}
override fun addAlias(name: String, expansion: String) {
......@@ -86,17 +89,4 @@ open class AliasManager(
message,
previousCommands
)
fun expand(
expansion: String,
bufferInfo: BufferInfo,
arguments: String,
previousCommands: MutableList<Command>
) = state().expand(
expansion,
bufferInfo,
session?.network(bufferInfo.networkId)?.state(),
arguments,
previousCommands
)
}
......@@ -7,16 +7,12 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.SyncableObject
import de.justjanne.libquassel.protocol.syncables.stubs.BacklogManagerStub
import de.justjanne.libquassel.protocol.variant.QVariantMap
import de.justjanne.libquassel.protocol.variant.QVariant_
open class BacklogManager(
session: Session? = null
) : SyncableObject(session, "BacklogManager"), BacklogManagerStub {
override fun fromVariantMap(properties: QVariantMap) = Unit
override fun toVariantMap() = mapOf<String, QVariant_>()
}
) : SyncableObject(session, "BacklogManager"), BacklogManagerStub
......@@ -7,7 +7,7 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.bitflags.none
import de.justjanne.bitflags.of
......@@ -20,6 +20,8 @@ import de.justjanne.libquassel.protocol.models.ids.MsgId
import de.justjanne.libquassel.protocol.models.ids.isValid
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.models.types.QuasselType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.BufferSyncerState
import de.justjanne.libquassel.protocol.syncables.stubs.BufferSyncerStub
import de.justjanne.libquassel.protocol.util.collections.pairs
......@@ -102,6 +104,7 @@ open class BufferSyncer(
}?.filterNotNull()?.toMap().orEmpty()
)
}
initialized = true
}
fun lastSeenMsg(buffer: BufferId): MsgId = state().lastSeenMsg[buffer] ?: MsgId(0)
......@@ -178,7 +181,7 @@ open class BufferSyncer(
val bufferInfo = bufferInfo(buffer)
if (bufferInfo != null) {
session?.bufferViewManager()?.handleBuffer(bufferInfo, true)
session?.bufferViewManager?.handleBuffer(bufferInfo, true)
}
}
......@@ -200,7 +203,7 @@ open class BufferSyncer(
}
if (oldInfo != null) {
session?.bufferViewManager()?.handleBuffer(info)
session?.bufferViewManager?.handleBuffer(info)
}
}
}
......
......@@ -7,7 +7,7 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.bitflags.of
import de.justjanne.bitflags.toBits
......@@ -18,6 +18,8 @@ import de.justjanne.libquassel.protocol.models.ids.BufferId
import de.justjanne.libquassel.protocol.models.ids.NetworkId
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.models.types.QuasselType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.BufferViewConfigState
import de.justjanne.libquassel.protocol.syncables.stubs.BufferViewConfigStub
import de.justjanne.libquassel.protocol.util.collections.insert
......@@ -64,6 +66,7 @@ open class BufferViewConfig(
showSearch = properties["showSearch"].into(showSearch),
)
}
initialized = true
}
override fun toVariantMap() = mapOf(
......@@ -248,7 +251,7 @@ open class BufferViewConfig(
.mapNotNull { (index, value) ->
IndexedValue(
index,
session?.bufferSyncer()?.bufferInfo(value)
session?.bufferSyncer?.bufferInfo(value)
?: return@mapNotNull null
)
}
......
......@@ -7,10 +7,12 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.BufferInfo
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.BufferViewConfigState
import de.justjanne.libquassel.protocol.syncables.state.BufferViewManagerState
import de.justjanne.libquassel.protocol.syncables.stubs.BufferViewManagerStub
......@@ -30,6 +32,7 @@ open class BufferViewManager(
properties["BufferViewIds"].into<QVariantList>()
?.mapNotNull<QVariant_, Int>(QVariant_::into)
?.forEach(this::addBufferViewConfig)
initialized = true
}
override fun toVariantMap() = mapOf(
......
......@@ -7,10 +7,12 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.serializers.qt.StringSerializerUtf8
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.CertManagerState
import de.justjanne.libquassel.protocol.syncables.stubs.CertManagerStub
import de.justjanne.libquassel.protocol.util.update
......@@ -43,6 +45,7 @@ open class CertManager(
certificate = readCertificate(certPem)
)
}
initialized = true
}
override fun toVariantMap() = mapOf(
......
......@@ -7,10 +7,12 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.ConnectedClient
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.CoreInfoState
import de.justjanne.libquassel.protocol.syncables.stubs.CoreInfoStub
import de.justjanne.libquassel.protocol.util.update
......@@ -43,6 +45,7 @@ open class CoreInfo(
.orEmpty()
)
}
initialized = true
}
override fun toVariantMap() = mapOf(
......
......@@ -7,12 +7,14 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.dcc.DccIpDetectionMode
import de.justjanne.libquassel.protocol.models.dcc.DccPortSelectionMode
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.models.types.QuasselType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.DccConfigState
import de.justjanne.libquassel.protocol.syncables.stubs.DccConfigStub
import de.justjanne.libquassel.protocol.util.update
......@@ -45,6 +47,7 @@ open class DccConfig(
useFastSend = properties["useFastSend"].into(useFastSend),
)
}
initialized = true
}
override fun toVariantMap() = mapOf(
......
......@@ -7,12 +7,14 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.QStringList
import de.justjanne.libquassel.protocol.models.rules.HighlightNickType
import de.justjanne.libquassel.protocol.models.rules.HighlightRule
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.HighlightRuleManagerState
import de.justjanne.libquassel.protocol.syncables.stubs.HighlightRuleManagerStub
import de.justjanne.libquassel.protocol.util.update
......@@ -80,6 +82,7 @@ open class HighlightRuleManager(
}
)
}
initialized = true
}
override fun toVariantMap() = mapOf(
......
......@@ -7,12 +7,14 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.QStringList
import de.justjanne.libquassel.protocol.models.ids.IdentityId
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.models.types.QuasselType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.IdentityState
import de.justjanne.libquassel.protocol.syncables.stubs.IdentityStub
import de.justjanne.libquassel.protocol.util.update
......@@ -54,6 +56,7 @@ open class Identity(
)
}
renameObject(state().identifier())
initialized = true
}
override fun toVariantMap() = mapOf(
......
......@@ -7,7 +7,7 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.QStringList
import de.justjanne.libquassel.protocol.models.flags.MessageTypes
......@@ -16,6 +16,8 @@ import de.justjanne.libquassel.protocol.models.rules.IgnoreType
import de.justjanne.libquassel.protocol.models.rules.ScopeType
import de.justjanne.libquassel.protocol.models.rules.StrictnessType
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.IgnoreListManagerState
import de.justjanne.libquassel.protocol.syncables.stubs.IgnoreListManagerStub
import de.justjanne.libquassel.protocol.util.collections.removeAt
......@@ -124,6 +126,7 @@ class IgnoreListManager(
}
)
}
initialized = true
}
fun indexOf(ignoreRule: String?): Int = state().indexOf(ignoreRule)
......
......@@ -7,12 +7,14 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.QStringList
import de.justjanne.libquassel.protocol.models.network.ChannelModeType
import de.justjanne.libquassel.protocol.models.network.ChannelModes
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.IrcChannelState
import de.justjanne.libquassel.protocol.syncables.stubs.IrcChannelStub
import de.justjanne.libquassel.protocol.util.update
......@@ -30,7 +32,7 @@ open class IrcChannel(
require(name().isNotEmpty()) {
"IrcChannel: channelName is empty"
}
renameObject("${network().id}/${name()}")
renameObject(state().identifier())
}
override fun fromVariantMap(properties: QVariantMap) =
......@@ -50,6 +52,8 @@ open class IrcChannel(
.orEmpty()
)
}
renameObject(state().identifier())
initialized = true
}
override fun toVariantMap(): QVariantMap {
......
......@@ -7,15 +7,12 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.SyncableObject
import de.justjanne.libquassel.protocol.syncables.stubs.IrcListHelperStub
import de.justjanne.libquassel.protocol.variant.QVariantMap
import de.justjanne.libquassel.protocol.variant.QVariant_
open class IrcListHelper(
session: Session? = null
) : SyncableObject(session, "IrcListHelper"), IrcListHelperStub {
override fun fromVariantMap(properties: QVariantMap) = Unit
override fun toVariantMap() = emptyMap<String, QVariant_>()
}
) : SyncableObject(session, "IrcListHelper"), IrcListHelperStub
......@@ -7,9 +7,11 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
package de.justjanne.libquassel.protocol.syncables
package de.justjanne.libquassel.protocol.syncables.common
import de.justjanne.libquassel.protocol.models.types.QtType
import de.justjanne.libquassel.protocol.syncables.Session
import de.justjanne.libquassel.protocol.syncables.StatefulSyncableObject
import de.justjanne.libquassel.protocol.syncables.state.IrcUserState
import de.justjanne.libquassel.protocol.syncables.stubs.IrcUserStub
import de.justjanne.libquassel.protocol.util.irc.HostmaskHelper
......@@ -59,6 +61,7 @@ open class IrcUser(
)
}
renameObject(state().identifier())
initialized = true
}
override fun toVariantMap() = mapOf(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment