void BluetoothGattManager::Connect(const nsAString& aAppUuid, const nsAString& aDeviceAddr, BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aRunnable); ENSURE_GATT_CLIENT_INTF_IS_READY_VOID(aRunnable); size_t index = sClients->IndexOf(aAppUuid, 0 /* Start */, UuidComparator()); if (index == sClients->NoIndex) { index = sClients->Length(); sClients->AppendElement(new BluetoothGattClient(aAppUuid, aDeviceAddr)); } nsRefPtr<BluetoothGattClient> client = sClients->ElementAt(index); client->mConnectRunnable = aRunnable; if (client->mClientIf > 0) { sBluetoothGattClientInterface->Connect(client->mClientIf, aDeviceAddr, true, // direct connect new ConnectResultHandler(client)); } else { BluetoothUuid uuid; StringToUuid(NS_ConvertUTF16toUTF8(aAppUuid).get(), uuid); // connect will be proceeded after client registered sBluetoothGattClientInterface->RegisterClient( uuid, new RegisterClientResultHandler(client)); } }
void BluetoothGattManager::Disconnect(const nsAString& aAppUuid, const nsAString& aDeviceAddr, BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aRunnable); ENSURE_GATT_CLIENT_INTF_IS_READY_VOID(aRunnable); size_t index = sClients->IndexOf(aAppUuid, 0 /* Start */, UuidComparator()); // Reject the disconnect request if the client is not found if (index == sClients->NoIndex) { NS_NAMED_LITERAL_STRING(errorStr, "Disconnect failed"); DispatchBluetoothReply(aRunnable, BluetoothValue(), errorStr); return; } nsRefPtr<BluetoothGattClient> client = sClients->ElementAt(index); client->mDisconnectRunnable = aRunnable; sBluetoothGattClientInterface->Disconnect( client->mClientIf, aDeviceAddr, client->mConnId, new DisconnectResultHandler(client)); }
void BluetoothGattManager::UnregisterClient(int aClientIf, BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aRunnable); ENSURE_GATT_CLIENT_INTF_IS_READY_VOID(aRunnable); size_t index = sClients->IndexOf(aClientIf, 0 /* Start */, ClientIfComparator()); // Reject the unregister request if the client is not found if (index == sClients->NoIndex) { NS_NAMED_LITERAL_STRING(errorStr, "Unregister GATT client failed"); DispatchBluetoothReply(aRunnable, BluetoothValue(), errorStr); return; } nsRefPtr<BluetoothGattClient> client = sClients->ElementAt(index); client->mUnregisterClientRunnable = aRunnable; sBluetoothGattClientInterface->UnregisterClient( aClientIf, new UnregisterClientResultHandler(client)); }
// // Notification Handlers // void BluetoothGattManager::RegisterClientNotification(int aStatus, int aClientIf, const BluetoothUuid& aAppUuid) { BT_API2_LOGR("Client Registered, clientIf = %d", aClientIf); MOZ_ASSERT(NS_IsMainThread()); nsString uuid; UuidToString(aAppUuid, uuid); size_t index = sClients->IndexOf(uuid, 0 /* Start */, UuidComparator()); NS_ENSURE_TRUE_VOID(index != sClients->NoIndex); nsRefPtr<BluetoothGattClient> client = sClients->ElementAt(index); BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE_VOID(bs); if (aStatus) { // operation failed BT_API2_LOGR( "RegisterClient failed, clientIf = %d, status = %d, appUuid = %s", aClientIf, aStatus, NS_ConvertUTF16toUTF8(uuid).get()); // Notify BluetoothGatt for client disconnected BluetoothSignal signal( NS_LITERAL_STRING(GATT_CONNECTION_STATE_CHANGED_ID), uuid, BluetoothValue(false)); // Disconnected bs->DistributeSignal(signal); // Reject the connect request if (client->mConnectRunnable) { NS_NAMED_LITERAL_STRING(errorStr, "Connect failed due to registration failed"); DispatchBluetoothReply(client->mConnectRunnable, BluetoothValue(), errorStr); client->mConnectRunnable = nullptr; } sClients->RemoveElement(client); return; } client->mClientIf = aClientIf; // Notify BluetoothGatt to update the clientIf BluetoothSignal signal( NS_LITERAL_STRING("ClientRegistered"), uuid, BluetoothValue(uint32_t(aClientIf))); bs->DistributeSignal(signal); // Client just registered, proceed remaining connect request. if (client->mConnectRunnable) { sBluetoothGattClientInterface->Connect( aClientIf, client->mDeviceAddr, true /* direct connect */, new ConnectResultHandler(client)); } }
void BluetoothGattManager::ConnectNotification(int aConnId, int aStatus, int aClientIf, const nsAString& aDeviceAddr) { BT_API2_LOGR(); MOZ_ASSERT(NS_IsMainThread()); BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE_VOID(bs); size_t index = sClients->IndexOf(aClientIf, 0 /* Start */, ClientIfComparator()); NS_ENSURE_TRUE_VOID(index != sClients->NoIndex); nsRefPtr<BluetoothGattClient> client = sClients->ElementAt(index); if (aStatus) { // operation failed BT_API2_LOGR("Connect failed, clientIf = %d, connId = %d, status = %d", aClientIf, aConnId, aStatus); // Notify BluetoothGatt that the client remains disconnected BluetoothSignal signal( NS_LITERAL_STRING(GATT_CONNECTION_STATE_CHANGED_ID), client->mAppUuid, BluetoothValue(false)); // Disconnected bs->DistributeSignal(signal); // Reject the connect request if (client->mConnectRunnable) { NS_NAMED_LITERAL_STRING(errorStr, "Connect failed"); DispatchBluetoothReply(client->mConnectRunnable, BluetoothValue(), errorStr); client->mConnectRunnable = nullptr; } return; } client->mConnId = aConnId; // Notify BluetoothGatt for client connected BluetoothSignal signal( NS_LITERAL_STRING(GATT_CONNECTION_STATE_CHANGED_ID), client->mAppUuid, BluetoothValue(true)); // Connected bs->DistributeSignal(signal); // Resolve the connect request if (client->mConnectRunnable) { DispatchBluetoothReply(client->mConnectRunnable, BluetoothValue(true), EmptyString()); client->mConnectRunnable = nullptr; } }