diff --git a/README.md b/README.md index 1ad1a80..56468dc 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,9 @@ Supported record type 3. SRV 4. TXT +Supported features +1. Event hooking(Kotlin only) + > AAAA is not supported AirPlay2(_airplay._tcp.local.) is tested @@ -53,7 +56,21 @@ val service = registerService( bindAddress = "192.168.10.104", mdnsPort = 5356, txtRecords = listOf("key1=value1", "key2=value2") -) +) { + // This block is optional + // Event hooking in this block + onBroadcast { + println("broadcasted") + } + + onRegister { + println("reg") + } + + onUnregistered { + println("unreg") + } +} while (true) { service.broadcast() delay(2000L) // or use cn.rtast.nmdns.sleep1(2) sleep 2 seconds, this function is not a suspended function diff --git a/gradle.properties b/gradle.properties index 452be1f..1aebdcf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.native.enableKlibsCrossCompilation=true -libVersion=0.1.1 \ No newline at end of file +libVersion=0.1.2 \ No newline at end of file diff --git a/src/commonMain/kotlin/cn/rtast/nmdns/nmdns_announcer.kt b/src/commonMain/kotlin/cn/rtast/nmdns/nmdns_announcer.kt index 7226b73..434bff7 100644 --- a/src/commonMain/kotlin/cn/rtast/nmdns/nmdns_announcer.kt +++ b/src/commonMain/kotlin/cn/rtast/nmdns/nmdns_announcer.kt @@ -12,6 +12,17 @@ package cn.rtast.nmdns import kotlin.experimental.ExperimentalNativeApi import kotlin.native.CName +public fun NMDNSAnnouncer.onRegister(callback: () -> Unit) { + onRegisterCallback = callback +} + +public fun NMDNSAnnouncer.onBroadcast(callback: () -> Unit) { + onBroadcastCallback = callback +} + +public fun NMDNSAnnouncer.onUnregistered(callback: () -> Unit) { + onUnregisterCallback = callback +} public data class NMDNSAnnouncer( /** @@ -52,6 +63,11 @@ public data class NMDNSAnnouncer( */ internal val packet: ByteArray, ) { + + internal var onRegisterCallback: (() -> Unit)? = null + internal var onBroadcastCallback: (() -> Unit)? = null + internal var onUnregisterCallback: (() -> Unit)? = null + override fun equals(other: Any?): Boolean { if (this === other) return true if (other == null || this::class != other::class) return false @@ -88,6 +104,7 @@ public data class NMDNSAnnouncer( * broadcast packet */ public fun broadcast() { + this.onBroadcastCallback?.invoke() this.server.send(packet) } @@ -95,6 +112,7 @@ public data class NMDNSAnnouncer( * unregister service */ public fun unregister() { + this.onUnregisterCallback?.invoke() this.server.destroy() } } @@ -140,10 +158,12 @@ public fun registerService( mdnsPort: Int = 9872, bindAddress: String, txtRecords: List, + callback: NMDNSAnnouncer.() -> Unit = {}, ): NMDNSAnnouncer { - val server = createSocket() + val socket = createSocket() .bind(bindAddress, port) - return NMDNSAnnouncer( + + val server = NMDNSAnnouncer( serviceType, serviceName, hostname, @@ -151,9 +171,12 @@ public fun registerService( port, mdnsPort, txtRecords, - server, + socket, buildPacket(serviceType, "$serviceName.$serviceType", hostname, ipAddress, port, txtRecords), ) + server.callback() + server.onRegisterCallback?.invoke() + return server } internal fun buildPacket( diff --git a/src/linuxTest/kotlin/test/TestLinux.kt b/src/linuxTest/kotlin/test/TestLinux.kt index 40032f9..b75b869 100644 --- a/src/linuxTest/kotlin/test/TestLinux.kt +++ b/src/linuxTest/kotlin/test/TestLinux.kt @@ -7,6 +7,9 @@ package test +import cn.rtast.nmdns.onBroadcast +import cn.rtast.nmdns.onRegister +import cn.rtast.nmdns.onUnregistered import cn.rtast.nmdns.randomMacAddress import cn.rtast.nmdns.registerService import cn.rtast.nmdns.sleep1 @@ -30,7 +33,19 @@ class TestLinux { "srcvers=220.68", "pk=f3769a660475d27b4f6040381d784645e13e21c53e6d2da6a8c3d757086fc336" ) - ) + ) { + onBroadcast { + println(111) + } + + onRegister { + println("reg") + } + + onUnregistered { + println("unreg") + } + } while (true) { service.broadcast() sleep1(2)