Files
amnezia-client/client/android/src/org/amnezia/vpn/IpcMessenger.kt
T

64 lines
1.9 KiB
Kotlin
Raw Normal View History

2023-11-24 17:10:08 +03:00
package org.amnezia.vpn
import android.os.DeadObjectException
import android.os.Message
import android.os.Messenger
import android.os.RemoteException
import org.amnezia.vpn.util.Log
2023-11-24 17:10:08 +03:00
private const val TAG = "IpcMessenger"
class IpcMessenger(
2024-03-04 18:08:55 +03:00
messengerName: String? = null,
2023-11-24 17:10:08 +03:00
private val onDeadObjectException: () -> Unit = {},
2024-03-04 18:08:55 +03:00
private val onRemoteException: () -> Unit = {}
2023-11-24 17:10:08 +03:00
) {
private var messenger: Messenger? = null
2024-03-04 18:08:55 +03:00
val name = messengerName ?: "Unknown"
constructor(
messenger: Messenger,
messengerName: String? = null,
onDeadObjectException: () -> Unit = {},
onRemoteException: () -> Unit = {}
) : this(messengerName, onDeadObjectException, onRemoteException) {
this.messenger = messenger
}
2023-11-24 17:10:08 +03:00
fun set(messenger: Messenger) {
this.messenger = messenger
}
fun reset() {
messenger = null
}
fun send(msg: () -> Message) = messenger?.sendMsg(msg())
2024-03-04 18:08:55 +03:00
fun send(msg: Message, replyTo: Messenger) = messenger?.sendMsg(msg.apply { this.replyTo = replyTo })
2023-11-24 17:10:08 +03:00
fun <T> send(msg: T)
where T : Enum<T>, T : IpcMessage = messenger?.sendMsg(msg.packToMessage())
2024-03-04 18:08:55 +03:00
fun <T> send(msg: T, replyTo: Messenger)
where T : Enum<T>, T : IpcMessage = messenger?.sendMsg(msg.packToMessage().apply { this.replyTo = replyTo })
2023-11-24 17:10:08 +03:00
private fun Messenger.sendMsg(msg: Message) {
try {
send(msg)
} catch (e: DeadObjectException) {
2024-03-04 18:08:55 +03:00
Log.w(TAG, "$name messenger is dead")
2023-11-24 17:10:08 +03:00
messenger = null
onDeadObjectException()
} catch (e: RemoteException) {
2024-03-04 18:08:55 +03:00
Log.w(TAG, "Sending a message to the $name messenger failed: ${e.message}")
2023-11-24 17:10:08 +03:00
onRemoteException()
}
}
}
2024-03-04 18:08:55 +03:00
fun Map<Messenger, IpcMessenger>.send(msg: () -> Message) = this.values.forEach { it.send(msg) }
fun <T> Map<Messenger, IpcMessenger>.send(msg: T)
where T : Enum<T>, T : IpcMessage = this.values.forEach { it.send(msg) }