void BluetoothService::DistributeSignal(const BluetoothSignal& aSignal) { MOZ_ASSERT(NS_IsMainThread()); if (aSignal.path().EqualsLiteral(KEY_LOCAL_AGENT)) { Notify(aSignal); return; } else if (aSignal.path().EqualsLiteral(KEY_REMOTE_AGENT)) { Notify(aSignal); return; } BluetoothSignalObserverList* ol; if (!mBluetoothSignalObserverTable.Get(aSignal.path(), &ol)) { #if DEBUG nsAutoCString msg("No observer registered for path "); msg.Append(NS_ConvertUTF16toUTF8(aSignal.path())); NS_WARNING(msg.get()); #endif return; } MOZ_ASSERT(ol->Length()); ol->Broadcast(aSignal); }
void BluetoothService::DistributeSignal(const BluetoothSignal& aSignal) { MOZ_ASSERT(NS_IsMainThread()); BluetoothSignalObserverList* ol; if (!mBluetoothSignalObserverTable.Get(aSignal.path(), &ol)) { // If there is no BluetoohPairingListener in observer table, put the signal // into a pending queue of pairing requests and send a system message to // launch bluetooth certified app. if (aSignal.path().EqualsLiteral(KEY_PAIRING_LISTENER)) { mPendingPairReqSignals.AppendElement(aSignal); BT_ENSURE_TRUE_VOID_BROADCAST_SYSMSG( NS_LITERAL_STRING(SYS_MSG_BT_PAIRING_REQ), BluetoothValue(EmptyString())); } else { BT_WARNING("No observer registered for path %s", NS_ConvertUTF16toUTF8(aSignal.path()).get()); } return; } MOZ_ASSERT(ol->Length()); ol->Broadcast(aSignal); }
void BluetoothService::DistributeSignal(const BluetoothSignal& aSignal) { MOZ_ASSERT(NS_IsMainThread()); // Notify observers that a message has been sent BluetoothSignalObserverList* ol; if (!mBluetoothSignalObserverTable.Get(aSignal.path(), &ol)) { #if DEBUG nsAutoCString msg("No observer registered for path "); msg.Append(NS_ConvertUTF16toUTF8(aSignal.path())); NS_WARNING(msg.get()); #endif return; } MOZ_ASSERT(ol->Length()); ol->Broadcast(aSignal); }
nsresult BluetoothService::DistributeSignal(const BluetoothSignal& signal) { MOZ_ASSERT(NS_IsMainThread()); // Notify observers that a message has been sent BluetoothSignalObserverList* ol; if (!mBluetoothSignalObserverTable.Get(signal.path(), &ol)) { return NS_OK; } ol->Broadcast(signal); return NS_OK; }
nsresult BluetoothService::DistributeSignal(const BluetoothSignal& signal) { MOZ_ASSERT(NS_IsMainThread()); // Notify observers that a message has been sent BluetoothSignalObserverList* ol; if (!mBluetoothSignalObserverTable.Get(signal.path(), &ol)) { #if DEBUG nsString msg; msg.AssignLiteral("No observer registered for path"); msg.Append(signal.path()); NS_WARNING(NS_ConvertUTF16toUTF8(msg).get()); #endif return NS_OK; } #if DEBUG if (ol->Length() == 0) { NS_WARNING("Distributing to observer list of 0"); } #endif ol->Broadcast(signal); return NS_OK; }
/* HandleSinkPropertyChanged update sink state in A2dp * * Possible values: "disconnected", "connecting", "connected", "playing" * * 1. "disconnected" -> "connecting" * Either an incoming or outgoing connection attempt ongoing * 2. "connecting" -> "disconnected" * Connection attempt failed * 3. "connecting" -> "connected" * Successfully connected * 4. "connected" -> "playing" * Audio stream active * 5. "playing" -> "connected" * Audio stream suspended * 6. "connected" -> "disconnected" * "playing" -> "disconnected" * Disconnected from local or the remote device */ void BluetoothA2dpManager::HandleSinkPropertyChanged(const BluetoothSignal& aSignal) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aSignal.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue); const nsString& address = aSignal.path(); /** * Update sink property only if * - mDeviceAddress is empty (A2dp is disconnected), or * - this property change is from the connected sink. */ NS_ENSURE_TRUE_VOID(mDeviceAddress.IsEmpty() || mDeviceAddress.Equals(address)); const InfallibleTArray<BluetoothNamedValue>& arr = aSignal.value().get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 1); /** * There are three properties: * - "State": a string * - "Connected": a boolean value * - "Playing": a boolean value * * Note that only "State" is handled in this function. */ const nsString& name = arr[0].name(); NS_ENSURE_TRUE_VOID(name.EqualsLiteral("State")); const BluetoothValue& value = arr[0].value(); MOZ_ASSERT(value.type() == BluetoothValue::TnsString); SinkState newState = StatusStringToSinkState(value.get_nsString()); NS_ENSURE_TRUE_VOID((newState != SinkState::SINK_UNKNOWN) && (newState != mSinkState)); SinkState prevState = mSinkState; mSinkState = newState; switch(mSinkState) { case SinkState::SINK_CONNECTING: // case 1: Either an incoming or outgoing connection attempt ongoing MOZ_ASSERT(prevState == SinkState::SINK_DISCONNECTED); break; case SinkState::SINK_PLAYING: // case 4: Audio stream active MOZ_ASSERT(prevState == SinkState::SINK_CONNECTED); break; case SinkState::SINK_CONNECTED: // case 5: Audio stream suspended if (prevState == SinkState::SINK_PLAYING || prevState == SinkState::SINK_CONNECTED) { break; } // case 3: Successfully connected mA2dpConnected = true; mDeviceAddress = address; NotifyConnectionStatusChanged(); OnConnect(EmptyString()); break; case SinkState::SINK_DISCONNECTED: // case 2: Connection attempt failed if (prevState == SinkState::SINK_CONNECTING) { OnConnect(NS_LITERAL_STRING(ERR_CONNECTION_FAILED)); break; } // case 6: Disconnected from the remote device MOZ_ASSERT(prevState == SinkState::SINK_CONNECTED || prevState == SinkState::SINK_PLAYING) ; mA2dpConnected = false; NotifyConnectionStatusChanged(); mDeviceAddress.Truncate(); OnDisconnect(EmptyString()); break; default: break; } }