NS_IMETHOD Run() { MOZ_ASSERT(NS_IsMainThread()); // Bluetooth scan mode is NONE by default bt_scan_mode_t mode = BT_SCAN_MODE_CONNECTABLE; bt_property_t prop; prop.type = BT_PROPERTY_ADAPTER_SCAN_MODE; prop.val = (void*)&mode; prop.len = sizeof(mode); NS_ENSURE_TRUE(sBtInterface, NS_ERROR_FAILURE); int ret = sBtInterface->set_adapter_property(&prop); if (ret != BT_STATUS_SUCCESS) { BT_LOGR("Fail to set: BT_SCAN_MODE_CONNECTABLE"); } // Try to fire event 'AdapterAdded' to fit the original behaviour when // we used BlueZ as backend. BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE(bs, NS_ERROR_FAILURE); bs->AdapterAddedReceived(); bs->TryFiringAdapterAdded(); // Trigger BluetoothOppManager to listen BluetoothOppManager* opp = BluetoothOppManager::Get(); if (!opp || !opp->Listen()) { BT_LOGR("Fail to start BluetoothOppManager listening"); } return NS_OK; }
void BluetoothServiceBluedroid::SendFile(const nsAString& aDeviceAddress, BlobParent* aBlobParent, BlobChild* aBlobChild, BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); // Force to stop discovery, otherwise socket connecting would fail if (!IsReady() || BT_STATUS_SUCCESS != sBtInterface->cancel_discovery()) { NS_NAMED_LITERAL_STRING(errorStr, "Calling cancel_discovery() failed"); DispatchBluetoothReply(aRunnable, BluetoothValue(true), errorStr); return; } // Currently we only support one device sending one file at a time, // so we don't need aDeviceAddress here because the target device // has been determined when calling 'Connect()'. Nevertheless, keep // it for future use. BluetoothOppManager* opp = BluetoothOppManager::Get(); nsAutoString errorStr; if (!opp || !opp->SendFile(aDeviceAddress, aBlobParent)) { errorStr.AssignLiteral("Calling SendFile() failed"); } DispatchBluetoothReply(aRunnable, BluetoothValue(true), errorStr); }
void BluetoothServiceBluedroid::StopSendingFile(const nsAString& aDeviceAddress, BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); // Currently we only support one device sending one file at a time, // so we don't need aDeviceAddress here because the target device // has been determined when calling 'Connect()'. Nevertheless, keep // it for future use. BluetoothOppManager* opp = BluetoothOppManager::Get(); nsAutoString errorStr; if (!opp || !opp->StopSendingFile()) { errorStr.AssignLiteral("Calling StopSendingFile() failed"); } DispatchBluetoothReply(aRunnable, BluetoothValue(true), errorStr); }
void BluetoothServiceBluedroid::StopSendingFile(const nsAString& aDeviceAddress, BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); // Currently we only support one device sending one file at a time, // so we don't need aDeviceAddress here because the target device // has been determined when calling 'Connect()'. Nevertheless, keep // it for future use. BluetoothOppManager* opp = BluetoothOppManager::Get(); nsAutoString errorStr; if (!opp || !opp->StopSendingFile()) { DispatchReplyError(aRunnable, NS_LITERAL_STRING("StopSendingFile failed")); return; } DispatchReplySuccess(aRunnable); }
nsresult BluetoothService::StartStopBluetooth(bool aStart, bool aIsStartup) { MOZ_ASSERT(NS_IsMainThread()); if (gInShutdown) { if (aStart) { // Don't try to start if we're already shutting down. MOZ_ASSERT(false, "Start called while in shutdown!"); return NS_ERROR_FAILURE; } if (!mBluetoothCommandThread) { // Don't create a new thread after we've begun shutdown since bluetooth // can't be running. return NS_OK; } } nsresult rv; if (!mBluetoothCommandThread) { MOZ_ASSERT(!gInShutdown); rv = NS_NewNamedThread("BluetoothCmd", getter_AddRefs(mBluetoothCommandThread)); NS_ENSURE_SUCCESS(rv, rv); } if (!aStart) { BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); hfp->Disconnect(); BluetoothOppManager* opp = BluetoothOppManager::Get(); opp->Disconnect(); } nsCOMPtr<nsIRunnable> runnable = new ToggleBtTask(aStart, aIsStartup); rv = mBluetoothCommandThread->Dispatch(runnable, NS_DISPATCH_NORMAL); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
void BluetoothServiceBluedroid::AdapterStateChangedNotification(bool aState) { MOZ_ASSERT(NS_IsMainThread()); BT_LOGR("BT_STATE: %d", aState); sAdapterEnabled = aState; if (!sAdapterEnabled) { static void (* const sDeinitManager[])(BluetoothProfileResultHandler*) = { BluetoothHfpManager::DeinitHfpInterface, BluetoothA2dpManager::DeinitA2dpInterface, BluetoothGattManager::DeinitGattInterface }; // Return error if BluetoothService is unavailable BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE_VOID(bs); // Cleanup static adapter properties and notify adapter. sAdapterBdAddress.Truncate(); sAdapterBdName.Truncate(); InfallibleTArray<BluetoothNamedValue> props; BT_APPEND_NAMED_VALUE(props, "Name", sAdapterBdName); BT_APPEND_NAMED_VALUE(props, "Address", sAdapterBdAddress); if (sAdapterDiscoverable) { sAdapterDiscoverable = false; BT_APPEND_NAMED_VALUE(props, "Discoverable", false); } if (sAdapterDiscovering) { sAdapterDiscovering = false; BT_APPEND_NAMED_VALUE(props, "Discovering", false); } bs->DistributeSignal(NS_LITERAL_STRING("PropertyChanged"), NS_LITERAL_STRING(KEY_ADAPTER), BluetoothValue(props)); // Cleanup bluetooth interfaces after BT state becomes BT_STATE_OFF. nsRefPtr<ProfileDeinitResultHandler> res = new ProfileDeinitResultHandler(MOZ_ARRAY_LENGTH(sDeinitManager)); for (size_t i = 0; i < MOZ_ARRAY_LENGTH(sDeinitManager); ++i) { sDeinitManager[i](res); } } BluetoothService::AcknowledgeToggleBt(sAdapterEnabled); if (sAdapterEnabled) { // Bluetooth just enabled, clear profile controllers and runnable arrays. sControllerArray.Clear(); sChangeDiscoveryRunnableArray.Clear(); sSetPropertyRunnableArray.Clear(); sGetDeviceRunnableArray.Clear(); sFetchUuidsRunnableArray.Clear(); sBondingRunnableArray.Clear(); sUnbondingRunnableArray.Clear(); sPairingNameTable.Clear(); // Bluetooth scan mode is SCAN_MODE_CONNECTABLE by default, i.e., it should // be connectable and non-discoverable. NS_ENSURE_TRUE_VOID(sBtInterface); sBtInterface->SetAdapterProperty( BluetoothNamedValue(NS_ConvertUTF8toUTF16("Discoverable"), false), new SetAdapterPropertyDiscoverableResultHandler()); // Trigger BluetoothOppManager to listen BluetoothOppManager* opp = BluetoothOppManager::Get(); if (!opp || !opp->Listen()) { BT_LOGR("Fail to start BluetoothOppManager listening"); } } // Resolve promise if existed if (!sChangeAdapterStateRunnableArray.IsEmpty()) { DispatchReplySuccess(sChangeAdapterStateRunnableArray[0]); sChangeAdapterStateRunnableArray.RemoveElementAt(0); } }