diff --git a/app/src/main/java/io/bimmergestalt/bcl/android/EtchProxyService.kt b/app/src/main/java/io/bimmergestalt/bcl/android/EtchProxyService.kt index 079302d..3e80829 100644 --- a/app/src/main/java/io/bimmergestalt/bcl/android/EtchProxyService.kt +++ b/app/src/main/java/io/bimmergestalt/bcl/android/EtchProxyService.kt @@ -2,21 +2,17 @@ package io.bimmergestalt.bcl.android import android.content.Context import android.content.Intent -import io.bimmergestalt.bcl.BclProxyServer import io.bimmergestalt.bcl.ConnectionState import io.bimmergestalt.bcl.MutableConnectionState import io.bimmergestalt.bcl.client.BclClientTransport import io.bimmergestalt.bcl.client.ProxyConnectionOpener -import io.bimmergestalt.bcl.client.ProxyConnectionGrantor import io.bimmergestalt.bcl.protocols.DestProtocolFactory import io.bimmergestalt.bcl.protocols.Protocol -import org.tinylog.kotlin.Logger -import java.io.IOException -import kotlin.concurrent.thread +import io.bimmergestalt.bcl.protocols.TcpProxyProtocol class EtchProxyService(val context: Context, val listenPort: Short, destPort: Short, - brand: String, instanceId: Int, bclProxy: ProxyConnectionOpener, - val state: MutableConnectionState): Protocol { + val brand: String, val instanceId: Int, bclProxy: ProxyConnectionOpener, + state: MutableConnectionState): Protocol { class Factory(val context: Context, val listenPort: Short, val destPort: Short, val brand: String, val state: MutableConnectionState): DestProtocolFactory { override fun onConnect( transport: BclClientTransport, @@ -26,33 +22,14 @@ class EtchProxyService(val context: Context, val listenPort: Short, destPort: Sh } } - private val proxyConnectionGrantor = ProxyConnectionGrantor(destPort, bclProxy) - private val proxyServer = BclProxyServer(listenPort, proxyConnectionGrantor) - private val proxyThread = thread(start = false, isDaemon = true) { - try { - this.proxyServer.run() - } catch (e: IOException) { - Logger.warn(e) { "IOException while running EtchProxyService" } + private val tcpProxy = TcpProxyProtocol(listenPort, destPort, bclProxy, state) { + when (it) { + ConnectionState.ProxyState.WAITING -> unannounceProxy() + ConnectionState.ProxyState.FAILED -> unannounceProxy() + ConnectionState.ProxyState.ACTIVE -> announceProxy(brand, instanceId) } } - init { - startProxy() - announceProxy(brand, instanceId) - } - - @Throws(IOException::class) - private fun startProxy() { - try { - proxyServer.listen() - } catch (e: IOException) { - state.proxyState = ConnectionState.ProxyState.FAILED - throw e - } - state.proxyState = ConnectionState.ProxyState.ACTIVE - proxyThread.start() - } - private fun announceProxy(brand: String, instanceId: Int) { val intent = Intent("com.bmwgroup.connected.accessory.ACTION_CAR_ACCESSORY_ATTACHED") .putExtra("EXTRA_BRAND", brand) @@ -72,9 +49,6 @@ class EtchProxyService(val context: Context, val listenPort: Short, destPort: Sh } override fun shutdown() { - unannounceProxy() - proxyServer.shutdown() - proxyThread.interrupt() - state.proxyState = ConnectionState.ProxyState.WAITING + tcpProxy.shutdown() } } \ No newline at end of file diff --git a/app/src/main/java/io/bimmergestalt/bcl/protocols/TcpProxyProtocol.kt b/app/src/main/java/io/bimmergestalt/bcl/protocols/TcpProxyProtocol.kt new file mode 100644 index 0000000..9589ef6 --- /dev/null +++ b/app/src/main/java/io/bimmergestalt/bcl/protocols/TcpProxyProtocol.kt @@ -0,0 +1,51 @@ +package io.bimmergestalt.bcl.protocols + +import io.bimmergestalt.bcl.BclProxyServer +import io.bimmergestalt.bcl.ConnectionState +import io.bimmergestalt.bcl.MutableConnectionState +import io.bimmergestalt.bcl.client.ProxyConnectionGrantor +import io.bimmergestalt.bcl.client.ProxyConnectionOpener +import org.tinylog.kotlin.Logger +import java.io.IOException +import kotlin.concurrent.thread + +class TcpProxyProtocol(val listenPort: Short, destPort: Short, + bclProxy: ProxyConnectionOpener, + val state: MutableConnectionState, val onStateUpdate: (ConnectionState.ProxyState) -> Unit +): Protocol { + + private val proxyConnectionGrantor = ProxyConnectionGrantor(destPort, bclProxy) + private val proxyServer = BclProxyServer(listenPort, proxyConnectionGrantor) + private val proxyThread = thread(start = false, isDaemon = true) { + try { + this.proxyServer.run() + } catch (e: IOException) { + Logger.warn(e) { "IOException while running EtchProxyService" } + } + } + + init { + startProxy() + } + + @Throws(IOException::class) + private fun startProxy() { + try { + proxyServer.listen() + } catch (e: IOException) { + state.proxyState = ConnectionState.ProxyState.FAILED + onStateUpdate(state.proxyState) + throw e + } + state.proxyState = ConnectionState.ProxyState.ACTIVE + onStateUpdate(state.proxyState) + proxyThread.start() + } + + override fun shutdown() { + proxyServer.shutdown() + proxyThread.interrupt() + state.proxyState = ConnectionState.ProxyState.WAITING + onStateUpdate(state.proxyState) + } +} \ No newline at end of file