init. dbus registration works

This commit is contained in:
2023-10-20 09:26:38 -04:00
commit 9c598a42bb
4 changed files with 104 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
package net.eksb.obsdc
import org.freedesktop.dbus.annotations.DBusInterfaceName
import org.freedesktop.dbus.connections.impl.DBusConnection
import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder
import org.freedesktop.dbus.interfaces.DBusInterface
import org.freedesktop.dbus.interfaces.DBusSigHandler
import org.freedesktop.dbus.messages.DBusSignal
import org.slf4j.LoggerFactory
object Main {
@JvmStatic
fun main(args:Array<String>) {
DBusConnectionBuilder.forSessionBus().build().use { dbus ->
// These lines are not necessary to handle signals, but are necessary to register methods.
dbus.requestBusName("net.eksb.obsdc")
dbus.exportObject("/", ObsdcDBusInterfaceImpl())
dbus.addSigHandler<ObsdcDBusInterface.Signal> { signal -> log.info("signal: ${signal.message}") }
while (true) {
try {
Thread.sleep(60_000)
} catch (e:InterruptedException) {
log.info("interrupted")
break
}
}
}
log.info("done")
}
}
inline fun <reified T:DBusSignal> DBusConnection.addSigHandler(handler:DBusSigHandler<T>) {
addSigHandler(T::class.java, handler)
}
private val log = LoggerFactory.getLogger(Main::class.java)
@DBusInterfaceName("net.eksb.Obsdc")
interface ObsdcDBusInterface: DBusInterface {
fun echo(message:String): String
class Signal(path:String, val message:String): DBusSignal(path, message)
}
class ObsdcDBusInterfaceImpl: ObsdcDBusInterface {
override fun echo(message: String):String {
log.info("echo: ${message}")
return message
}
override fun getObjectPath(): String = "/"
}
/*
Monitor:
`dbus-monitor`
See what is registered:
`qdbus net.eksb.obsdc /`
Send signal:
`dbus-send --session --type=signal --dest=net.eksb.obsdc / net.eksb.Obsdc.Signal string:a`
Call method:
`dbus-send --session --type=method_call --print-reply --dest=net.eksb.obsdc / net.eksb.Obsdc.echo string:b`
`qdbus net.eksb.obsdc / net.eksb.Obsdc.echo hello`
*/