From 9c598a42bb84ddc5e0424d45c7c1904769306255 Mon Sep 17 00:00:00 2001 From: stephen Date: Fri, 20 Oct 2023 09:26:38 -0400 Subject: [PATCH] init. dbus registration works --- .gitignore | 7 +++ build.gradle.kts | 28 +++++++++++ settings.gradle.kts | 1 + src/main/kotlin/net/eksb/obsdc/Main.kt | 68 ++++++++++++++++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle.kts create mode 100644 settings.gradle.kts create mode 100644 src/main/kotlin/net/eksb/obsdc/Main.kt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4641d22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# Ignore Gradle project-specific cache directory +.gradle +gradle +gradlew* + +# Ignore Gradle build output directory +build diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..fa266fa --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("org.jetbrains.kotlin.jvm") version "1.9.0" + application +} + +dependencies { + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.3") + implementation("com.github.hypfvieh:dbus-java-core:4.3.1") + runtimeOnly("com.github.hypfvieh:dbus-java-transport-native-unixsocket:4.3.1") + implementation("org.slf4j:slf4j-api:2.0.9") + runtimeOnly("org.slf4j:slf4j-simple:2.0.9") +} + +// Apply a specific Java toolchain to ease working on different environments. +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } +} + +application { + mainClass.set("net.eksb.obsdc.Main") +} + +tasks.named("test") { + useJUnitPlatform() +} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..56cd9f3 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "obsdc" diff --git a/src/main/kotlin/net/eksb/obsdc/Main.kt b/src/main/kotlin/net/eksb/obsdc/Main.kt new file mode 100644 index 0000000..fad2dbd --- /dev/null +++ b/src/main/kotlin/net/eksb/obsdc/Main.kt @@ -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) { + + 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 { 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 DBusConnection.addSigHandler(handler:DBusSigHandler) { + 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` + */ \ No newline at end of file