summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/pandora/server/src/L2cap.kt43
1 files changed, 42 insertions, 1 deletions
diff --git a/android/pandora/server/src/L2cap.kt b/android/pandora/server/src/L2cap.kt
index 1d1e9c8a21..d54cb3bec0 100644
--- a/android/pandora/server/src/L2cap.kt
+++ b/android/pandora/server/src/L2cap.kt
@@ -25,6 +25,7 @@ import com.google.protobuf.Any
import com.google.protobuf.ByteString
import io.grpc.stub.StreamObserver
import java.io.Closeable
+import java.io.IOException
import java.util.concurrent.atomic.AtomicLong
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -128,6 +129,44 @@ class L2cap(val context: Context) : L2CAPImplBase(), Closeable {
}
}
+ override fun disconnect(
+ request: DisconnectRequest,
+ responseObserver: StreamObserver<DisconnectResponse>,
+ ) {
+ grpcUnary(scope, responseObserver) {
+ val channel = request.channel
+ val bluetoothSocket = channel.toBluetoothSocket(channels)
+ Log.i(TAG, "disconnect: ${channel.id()} ")
+
+ try {
+ bluetoothSocket.close()
+ DisconnectResponse.getDefaultInstance()
+ } catch (e: IOException) {
+ Log.e(TAG, "disconnect: exception while closing the socket: $e")
+
+ DisconnectResponse.newBuilder()
+ .setErrorValue(CommandRejectReason.COMMAND_NOT_UNDERSTOOD_VALUE)
+ .build()
+ } finally {
+ channels.remove(channel.id())
+ }
+ }
+ }
+
+ override fun waitDisconnection(
+ request: WaitDisconnectionRequest,
+ responseObserver: StreamObserver<WaitDisconnectionResponse>,
+ ) {
+ grpcUnary(scope, responseObserver) {
+ Log.i(TAG, "waitDisconnection: ${request.channel.id()}")
+ val bluetoothSocket = request.channel.toBluetoothSocket(channels)
+
+ while (bluetoothSocket.isConnected()) Thread.sleep(100)
+
+ WaitDisconnectionResponse.getDefaultInstance()
+ }
+ }
+
override fun send(request: SendRequest, responseObserver: StreamObserver<SendResponse>) {
grpcUnary(scope, responseObserver) {
Log.i(TAG, "send")
@@ -167,6 +206,8 @@ class L2cap(val context: Context) : L2CAPImplBase(), Closeable {
return channel
}
+ fun Channel.id(): Long = this.cookie.value.toStringUtf8().toLong()
+
fun Channel.toBluetoothSocket(channels: HashMap<Long, BluetoothSocket>): BluetoothSocket =
- channels.get(this.cookie.value.toStringUtf8().toLong())!!
+ channels.get(this.id())!!
}