Skip to content

Commit

Permalink
Split TcpProxyProtocol out
Browse files Browse the repository at this point in the history
  • Loading branch information
hufman committed Nov 3, 2024
1 parent 777086b commit 048f73e
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 35 deletions.
44 changes: 9 additions & 35 deletions app/src/main/java/io/bimmergestalt/bcl/android/EtchProxyService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)
Expand All @@ -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()
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
}

0 comments on commit 048f73e

Please sign in to comment.