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

44 lines
1.2 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(
private val onDeadObjectException: () -> Unit = {},
private val onRemoteException: () -> Unit = {},
private val messengerName: String = "Unknown"
) {
private var messenger: Messenger? = null
fun set(messenger: Messenger) {
this.messenger = messenger
}
fun reset() {
messenger = null
}
fun send(msg: () -> Message) = messenger?.sendMsg(msg())
fun <T> send(msg: T)
where T : Enum<T>, T : IpcMessage = messenger?.sendMsg(msg.packToMessage())
private fun Messenger.sendMsg(msg: Message) {
try {
send(msg)
} catch (e: DeadObjectException) {
Log.w(TAG, "$messengerName messenger is dead")
messenger = null
onDeadObjectException()
} catch (e: RemoteException) {
Log.w(TAG, "Sending a message to the $messengerName messenger failed: ${e.message}")
onRemoteException()
}
}
}