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 BluetoothDevice::Notify(const BluetoothSignal& aData) { if (aData.name().EqualsLiteral("PropertyChanged")) { NS_ASSERTION(aData.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue, "PropertyChanged: Invalid value type"); InfallibleTArray<BluetoothNamedValue> arr = aData.value().get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 1, "Got more than one property in a change message!"); BluetoothNamedValue v = arr[0]; nsString name = v.name(); SetPropertyByValue(v); if (name.EqualsLiteral("Connected")) { DispatchTrustedEvent(mConnected ? NS_LITERAL_STRING("connected") : NS_LITERAL_STRING("disconnected")); } else { nsRefPtr<BluetoothPropertyEvent> e = BluetoothPropertyEvent::Create(name); e->Dispatch(ToIDOMEventTarget(), NS_LITERAL_STRING("propertychanged")); } } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling device signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } }
void BluetoothHidManager::HandleInputPropertyChanged(const BluetoothSignal& aSignal) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aSignal.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = aSignal.value().get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 1); const nsString& name = arr[0].name(); const BluetoothValue& value = arr[0].value(); if (name.EqualsLiteral("Connected")) { MOZ_ASSERT(value.type() == BluetoothValue::Tbool); MOZ_ASSERT(mConnected != value.get_bool()); mConnected = value.get_bool(); NotifyStatusChanged(); if (mConnected) { OnConnect(EmptyString()); } else { OnDisconnect(EmptyString()); } } }
void BluetoothPairingListener::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr; BluetoothValue value = aData.value(); if (aData.name().EqualsLiteral("PairingRequest")) { MOZ_ASSERT(value.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = value.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 4 && arr[0].value().type() == BluetoothValue::TnsString && // address arr[1].value().type() == BluetoothValue::TnsString && // name arr[2].value().type() == BluetoothValue::TnsString && // passkey arr[3].value().type() == BluetoothValue::TnsString); // type nsString address = arr[0].value().get_nsString(); nsString name = arr[1].value().get_nsString(); nsString passkey = arr[2].value().get_nsString(); nsString type = arr[3].value().get_nsString(); // Notify pairing listener of pairing requests DispatchPairingEvent(name, address, passkey, type); } else { BT_WARNING("Not handling pairing listener signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
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 BluetoothAdapter::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr; if (aData.name().EqualsLiteral("DeviceFound")) { nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(), mPath, aData.value()); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceEvent(NS_LITERAL_STRING("devicefound"), false, false, device); DispatchTrustedEvent(event); } else if (aData.name().EqualsLiteral("DeviceDisappeared")) { const nsAString& deviceAddress = aData.value().get_nsString(); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceAddressEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceAddressEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceAddressEvent(NS_LITERAL_STRING("devicedisappeared"), false, false, deviceAddress); DispatchTrustedEvent(e); } else if (aData.name().EqualsLiteral("DeviceCreated")) { NS_ASSERTION(aData.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue, "DeviceCreated: Invalid value type"); nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(), GetPath(), aData.value()); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceEvent(NS_LITERAL_STRING("devicecreated"), false, false, device); DispatchTrustedEvent(e); } else if (aData.name().EqualsLiteral("PropertyChanged")) { NS_ASSERTION(aData.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue, "PropertyChanged: Invalid value type"); arr = aData.value().get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 1, "Got more than one property in a change message!"); BluetoothNamedValue v = arr[0]; SetPropertyByValue(v); nsRefPtr<BluetoothPropertyEvent> e = BluetoothPropertyEvent::Create(v.name()); e->Dispatch(ToIDOMEventTarget(), NS_LITERAL_STRING("propertychanged")); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling adapter signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } }
void BluetoothAdapter::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr; BT_LOG("[A] %s: %s", __FUNCTION__, NS_ConvertUTF16toUTF8(aData.name()).get()); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("DeviceFound")) { nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(), mPath, aData.value()); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceEvent(getter_AddRefs(event), this, nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceEvent(NS_LITERAL_STRING("devicefound"), false, false, device); DispatchTrustedEvent(event); } else if (aData.name().EqualsLiteral("PropertyChanged")) { MOZ_ASSERT(v.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = v.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 1); SetPropertyByValue(arr[0]); } else if (aData.name().EqualsLiteral(PAIRED_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(HFP_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(SCO_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(A2DP_STATUS_CHANGED_ID)) { MOZ_ASSERT(v.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = v.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 2 && arr[0].value().type() == BluetoothValue::TnsString && arr[1].value().type() == BluetoothValue::Tbool); nsString address = arr[0].value().get_nsString(); bool status = arr[1].value().get_bool(); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothStatusChangedEvent( getter_AddRefs(event), this, nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothStatusChangedEvent> e = do_QueryInterface(event); e->InitBluetoothStatusChangedEvent(aData.name(), false, false, address, status); DispatchTrustedEvent(event); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling adapter signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } }
void BluetoothDiscoveryHandle::Notify(const BluetoothSignal& aData) { BT_LOGD("[DH] %s", NS_ConvertUTF16toUTF8(aData.name()).get()); if (aData.name().EqualsLiteral("DeviceFound")) { DispatchDeviceEvent(aData.value()); } else { BT_WARNING("Not handling discovery handle signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
void BluetoothGatt::Notify(const BluetoothSignal& aData) { BT_LOGD("[D] %s", NS_ConvertUTF16toUTF8(aData.name()).get()); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("ClientRegistered")) { MOZ_ASSERT(v.type() == BluetoothValue::Tuint32_t); mClientIf = v.get_uint32_t(); } else if (aData.name().EqualsLiteral("ClientUnregistered")) { mClientIf = 0; } else if (aData.name().EqualsLiteral(GATT_CONNECTION_STATE_CHANGED_ID)) { MOZ_ASSERT(v.type() == BluetoothValue::Tbool); BluetoothConnectionState state = v.get_bool() ? BluetoothConnectionState::Connected : BluetoothConnectionState::Disconnected; UpdateConnectionState(state); } else if (aData.name().EqualsLiteral("ServicesDiscovered")) { HandleServicesDiscovered(v); } else if (aData.name().EqualsLiteral("DiscoverCompleted")) { MOZ_ASSERT(v.type() == BluetoothValue::Tbool); bool isDiscoverSuccess = v.get_bool(); if (!isDiscoverSuccess) { // Clean all discovered attributes if failed mServices.Clear(); BluetoothGattBinding::ClearCachedServicesValue(this); } mDiscoveringServices = false; } else { BT_WARNING("Not handling GATT signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
void BluetoothGattCharacteristic::Notify(const BluetoothSignal& aData) { BT_LOGD("[D] %s", NS_ConvertUTF16toUTF8(aData.name()).get()); NS_ENSURE_TRUE_VOID(mSignalRegistered); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("CharacteristicValueUpdated")) { HandleCharacteristicValueUpdated(v); } else { BT_WARNING("Not handling GATT Characteristic signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
void BluetoothManager::Notify(const BluetoothSignal& aData) { if (aData.name().EqualsLiteral("AdapterAdded")) { DispatchTrustedEvent(NS_LITERAL_STRING("adapteradded")); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling manager signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } }
void BluetoothService::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr = aData.value().get_ArrayOfBluetoothNamedValue(); nsString type; JSContext* cx = nsContentUtils::GetSafeJSContext(); NS_ASSERTION(!::JS_IsExceptionPending(cx), "Shouldn't get here when an exception is pending!"); JSAutoRequest jsar(cx); JSObject* obj = JS_NewObject(cx, NULL, NULL, NULL); if (!obj) { NS_WARNING("Failed to new JSObject for system message!"); return; } bool ok = SetJsObject(cx, obj, arr); if (!ok) { NS_WARNING("Failed to set properties of system message!"); return; } if (aData.name().EqualsLiteral("RequestConfirmation")) { NS_ASSERTION(arr.Length() == 3, "RequestConfirmation: Wrong length of parameters"); type.AssignLiteral("bluetooth-requestconfirmation"); } else if (aData.name().EqualsLiteral("RequestPinCode")) { NS_ASSERTION(arr.Length() == 2, "RequestPinCode: Wrong length of parameters"); type.AssignLiteral("bluetooth-requestpincode"); } else if (aData.name().EqualsLiteral("RequestPasskey")) { NS_ASSERTION(arr.Length() == 2, "RequestPinCode: Wrong length of parameters"); type.AssignLiteral("bluetooth-requestpasskey"); } else if (aData.name().EqualsLiteral("Authorize")) { NS_ASSERTION(arr.Length() == 2, "Authorize: Wrong length of parameters"); type.AssignLiteral("bluetooth-authorize"); } else if (aData.name().EqualsLiteral("Cancel")) { NS_ASSERTION(arr.Length() == 0, "Cancel: Wrong length of parameters"); type.AssignLiteral("bluetooth-cancel"); } else if (aData.name().EqualsLiteral("PairedStatusChanged")) { NS_ASSERTION(arr.Length() == 1, "PairedStatusChagned: Wrong length of parameters"); type.AssignLiteral("bluetooth-pairingstatuschanged"); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling service signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } nsCOMPtr<nsISystemMessagesInternal> systemMessenger = do_GetService("@mozilla.org/system-message-internal;1"); if (!systemMessenger) { NS_WARNING("Failed to get SystemMessenger service!"); return; } systemMessenger->BroadcastMessage(type, OBJECT_TO_JSVAL(obj)); }
void BluetoothGattService::Notify(const BluetoothSignal& aData) { BT_LOGD("[D] %s", NS_ConvertUTF16toUTF8(aData.name()).get()); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("IncludedServicesDiscovered")) { HandleIncludedServicesDiscovered(v); } else if (aData.name().EqualsLiteral("CharacteristicsDiscovered")) { HandleCharacteristicsDiscovered(v); } else { BT_WARNING("Not handling GATT Service signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
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); }
void BluetoothManager::Notify(const BluetoothSignal& aData) { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling manager signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif }
void BluetoothManager::Notify(const BluetoothSignal& aData) { BT_LOGD("[M] %s: %s", __FUNCTION__, NS_ConvertUTF16toUTF8(aData.name()).get()); if (aData.name().EqualsLiteral("AdapterAdded")) { DispatchTrustedEvent(NS_LITERAL_STRING("adapteradded")); } else if (aData.name().EqualsLiteral("Enabled")) { DispatchTrustedEvent(NS_LITERAL_STRING("enabled")); } else if (aData.name().EqualsLiteral("Disabled")) { DispatchTrustedEvent(NS_LITERAL_STRING("disabled")); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling manager signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); BT_WARNING(warningMsg.get()); #endif } }
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; }
void BluetoothAdapter::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr; BT_LOG("[A] %s: %s", __FUNCTION__, NS_ConvertUTF16toUTF8(aData.name()).get()); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("DeviceFound")) { nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(), mPath, aData.value()); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceEvent(getter_AddRefs(event), this, nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceEvent(NS_LITERAL_STRING("devicefound"), false, false, device); DispatchTrustedEvent(event); } else if (aData.name().EqualsLiteral("PropertyChanged")) { NS_ASSERTION(v.type() == BluetoothValue::TArrayOfBluetoothNamedValue, "PropertyChanged: Invalid value type"); const InfallibleTArray<BluetoothNamedValue>& arr = v.get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 1, "Got more than one property in a change message!"); SetPropertyByValue(arr[0]); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling adapter signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } }
void BluetoothPairingListener::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr; BluetoothValue value = aData.value(); if (aData.name().EqualsLiteral("PairingRequest")) { MOZ_ASSERT(value.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = value.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 4 && arr[0].value().type() == BluetoothValue::TnsString && // address arr[1].value().type() == BluetoothValue::TnsString && // name arr[2].value().type() == BluetoothValue::TnsString && // passkey arr[3].value().type() == BluetoothValue::TnsString); // type nsString deviceAddress = arr[0].value().get_nsString(); nsString deviceName = arr[1].value().get_nsString(); nsString passkey = arr[2].value().get_nsString(); nsString type = arr[3].value().get_nsString(); // Create a temporary device with deviceAddress and deviceName InfallibleTArray<BluetoothNamedValue> props; BT_APPEND_NAMED_VALUE(props, "Address", deviceAddress); BT_APPEND_NAMED_VALUE(props, "Name", deviceName); nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(), props); // Notify pairing listener of pairing requests DispatchPairingEvent(device, passkey, type); } else { BT_WARNING("Not handling pairing listener signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
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; }
void BluetoothDevice::Notify(const BluetoothSignal& aData) { BT_LOGD("[D] %s: %s", __FUNCTION__, NS_ConvertUTF16toUTF8(aData.name()).get()); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("PropertyChanged")) { MOZ_ASSERT(v.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = v.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0, propCount = arr.Length(); i < propCount; ++i) { SetPropertyByValue(arr[i]); } } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling device signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); BT_WARNING(warningMsg.get()); #endif } }
void BluetoothManager::Notify(const BluetoothSignal& aData) { if (aData.name().EqualsLiteral("AdapterAdded")) { nsRefPtr<nsDOMEvent> event = new nsDOMEvent(nullptr, nullptr); nsresult rv = event->InitEvent(NS_LITERAL_STRING("adapteradded"), false, false); if (NS_FAILED(rv)) { NS_WARNING("Failed to init the adapteradded event!!!"); return; } event->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling manager signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } }
void BluetoothManager::Notify(const BluetoothSignal& aData) { BT_LOGD("[M] %s", NS_ConvertUTF16toUTF8(aData.name()).get()); if (aData.name().EqualsLiteral("AdapterAdded")) { HandleAdapterAdded(aData.value()); } else if (aData.name().EqualsLiteral("AdapterRemoved")) { HandleAdapterRemoved(aData.value()); } else { BT_WARNING("Not handling manager signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
void BluetoothService::Notify(const BluetoothSignal& aData) { nsString type = NS_LITERAL_STRING("bluetooth-pairing-request"); BT_LOGD("[S] %s: %s", __FUNCTION__, NS_ConvertUTF16toUTF8(aData.name()).get()); if (aData.name().EqualsLiteral("RequestConfirmation")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 4, "RequestConfirmation: Wrong length of parameters"); } else if (aData.name().EqualsLiteral("RequestPinCode")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 3, "RequestPinCode: Wrong length of parameters"); } else if (aData.name().EqualsLiteral("RequestPasskey")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 3, "RequestPinCode: Wrong length of parameters"); } else if (aData.name().EqualsLiteral("Cancel")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 0, "Cancel: Wrong length of parameters"); type.AssignLiteral("bluetooth-cancel"); } else if (aData.name().EqualsLiteral(PAIRED_STATUS_CHANGED_ID)) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 1, "pairedstatuschanged: Wrong length of parameters"); type.AssignLiteral("bluetooth-pairedstatuschanged"); } else { nsCString warningMsg; warningMsg.AssignLiteral("Not handling service signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); BT_WARNING(warningMsg.get()); return; } BroadcastSystemMessage(type, aData.value()); }
/* 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; } }
void BluetoothAdapter::Notify(const BluetoothSignal& aData) { BT_LOGD("[A] %s", NS_ConvertUTF16toUTF8(aData.name()).get()); NS_ENSURE_TRUE_VOID(mSignalRegistered); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("PropertyChanged")) { HandlePropertyChanged(v); } else if (aData.name().EqualsLiteral("DeviceFound")) { /* * DeviceFound signal will be distributed to all existing adapters while * doing discovery operations. * The signal needs to be handled only if this adapter is holding a valid * discovery handle, which means that the discovery operation is triggered * by this adapter. */ if (mDiscoveryHandleInUse) { HandleDeviceFound(v); } } else if (aData.name().EqualsLiteral(DEVICE_PAIRED_ID)) { HandleDevicePaired(aData.value()); } else if (aData.name().EqualsLiteral(DEVICE_UNPAIRED_ID)) { HandleDeviceUnpaired(aData.value()); } else if (aData.name().EqualsLiteral(HFP_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(SCO_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(A2DP_STATUS_CHANGED_ID)) { MOZ_ASSERT(v.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = v.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 2 && arr[0].value().type() == BluetoothValue::TnsString && arr[1].value().type() == BluetoothValue::Tbool); nsString address = arr[0].value().get_nsString(); bool status = arr[1].value().get_bool(); BluetoothStatusChangedEventInit init; init.mBubbles = false; init.mCancelable = false; init.mAddress = address; init.mStatus = status; nsRefPtr<BluetoothStatusChangedEvent> event = BluetoothStatusChangedEvent::Constructor(this, aData.name(), init); DispatchTrustedEvent(event); } else if (aData.name().EqualsLiteral(PAIRING_ABORTED_ID) || aData.name().EqualsLiteral(REQUEST_MEDIA_PLAYSTATUS_ID)) { DispatchEmptyEvent(aData.name()); } else { BT_WARNING("Not handling adapter signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
void BluetoothGattServer::Notify(const BluetoothSignal& aData) { BT_LOGD("[GattServer] %s", NS_ConvertUTF16toUTF8(aData.name()).get()); NS_ENSURE_TRUE_VOID(mSignalRegistered); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("ServerRegistered")) { HandleServerRegistered(v); } else if (aData.name().EqualsLiteral("ServerUnregistered")) { HandleServerUnregistered(v); } else if (aData.name().EqualsLiteral(GATT_CONNECTION_STATE_CHANGED_ID)) { HandleConnectionStateChanged(v); } else if (aData.name().EqualsLiteral("ServiceHandleUpdated")) { HandleServiceHandleUpdated(v); } else if (aData.name().EqualsLiteral("CharacteristicHandleUpdated")) { HandleCharacteristicHandleUpdated(v); } else if (aData.name().EqualsLiteral("DescriptorHandleUpdated")) { HandleDescriptorHandleUpdated(v); } else if (aData.name().EqualsLiteral("ReadRequested")) { HandleReadWriteRequest(v, NS_LITERAL_STRING(ATTRIBUTE_READ_REQUEST)); } else if (aData.name().EqualsLiteral("WriteRequested")) { HandleReadWriteRequest(v, NS_LITERAL_STRING(ATTRIBUTE_WRITE_REQUEST)); } else { BT_WARNING("Not handling GATT signal: %s", NS_ConvertUTF16toUTF8(aData.name()).get()); } }
void BluetoothAdapter::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr; BT_LOGD("[A] %s: %s", __FUNCTION__, NS_ConvertUTF16toUTF8(aData.name()).get()); BluetoothValue v = aData.value(); if (aData.name().EqualsLiteral("DeviceFound")) { nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(), mPath, aData.value()); BluetoothDeviceEventInit init; init.mBubbles = false; init.mCancelable = false; init.mDevice = device; nsRefPtr<BluetoothDeviceEvent> event = BluetoothDeviceEvent::Constructor(this, NS_LITERAL_STRING("devicefound"), init); DispatchTrustedEvent(event); } else if (aData.name().EqualsLiteral("PropertyChanged")) { MOZ_ASSERT(v.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = v.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0, propCount = arr.Length(); i < propCount; ++i) { SetPropertyByValue(arr[i]); } } else if (aData.name().EqualsLiteral(PAIRED_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(HFP_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(SCO_STATUS_CHANGED_ID) || aData.name().EqualsLiteral(A2DP_STATUS_CHANGED_ID)) { MOZ_ASSERT(v.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = v.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 2 && arr[0].value().type() == BluetoothValue::TnsString && arr[1].value().type() == BluetoothValue::Tbool); nsString address = arr[0].value().get_nsString(); bool status = arr[1].value().get_bool(); BluetoothStatusChangedEventInit init; init.mBubbles = false; init.mCancelable = false; init.mAddress = address; init.mStatus = status; nsRefPtr<BluetoothStatusChangedEvent> event = BluetoothStatusChangedEvent::Constructor(this, aData.name(), init); DispatchTrustedEvent(event); } else if (aData.name().EqualsLiteral(REQUEST_MEDIA_PLAYSTATUS_ID)) { nsCOMPtr<nsIDOMEvent> event; nsresult rv = NS_NewDOMEvent(getter_AddRefs(event), this, nullptr, nullptr); NS_ENSURE_SUCCESS_VOID(rv); rv = event->InitEvent(aData.name(), false, false); NS_ENSURE_SUCCESS_VOID(rv); DispatchTrustedEvent(event); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling adapter signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); BT_WARNING(warningMsg.get()); #endif } }
void BluetoothAdapter::Notify(const BluetoothSignal& aData) { InfallibleTArray<BluetoothNamedValue> arr; if (aData.name().EqualsLiteral("DeviceFound")) { nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(), mPath, aData.value()); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceEvent(NS_LITERAL_STRING("devicefound"), false, false, device); e->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else if (aData.name().EqualsLiteral("DeviceDisappeared")) { const nsAString& deviceAddress = aData.value().get_nsString(); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceAddressEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceAddressEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceAddressEvent(NS_LITERAL_STRING("devicedisappeared"), false, false, deviceAddress); e->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else if (aData.name().EqualsLiteral("PropertyChanged")) { // Get BluetoothNamedValue, make sure array length is 1 arr = aData.value().get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 1, "Got more than one property in a change message!"); NS_ASSERTION(arr[0].value().type() == BluetoothValue::TArrayOfBluetoothNamedValue, "PropertyChanged: Invalid value type"); BluetoothNamedValue v = arr[0]; SetPropertyByValue(v); nsRefPtr<BluetoothPropertyEvent> e = BluetoothPropertyEvent::Create(v.name()); e->Dispatch(ToIDOMEventTarget(), NS_LITERAL_STRING("propertychanged")); } else if (aData.name().EqualsLiteral("RequestConfirmation")) { arr = aData.value().get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 2, "RequestConfirmation: Wrong length of parameters"); NS_ASSERTION(arr[0].value().type() == BluetoothValue::TnsString, "RequestConfirmation: Invalid value type"); NS_ASSERTION(arr[1].value().type() == BluetoothValue::Tuint32_t, "RequestConfirmation: Invalid value type"); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothPairingEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothPairingEvent> e = do_QueryInterface(event); e->InitBluetoothPairingEvent(NS_LITERAL_STRING("requestconfirmation"), false, false, arr[0].value().get_nsString(), arr[1].value().get_uint32_t()); e->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else if (aData.name().EqualsLiteral("RequestPinCode")) { arr = aData.value().get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 1, "RequestPinCode: Wrong length of parameters"); NS_ASSERTION(arr[0].value().type() == BluetoothValue::TnsString, "RequestPinCode: Invalid value type"); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceAddressEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceAddressEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceAddressEvent(NS_LITERAL_STRING("requestpincode"), false, false, arr[0].value().get_nsString()); e->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else if (aData.name().EqualsLiteral("RequestPasskey")) { arr = aData.value().get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 1, "RequestPasskey: Wrong length of parameters"); NS_ASSERTION(arr[0].value().type() == BluetoothValue::TnsString, "RequestPasskey: Invalid value type"); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceAddressEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceAddressEvent> e = do_QueryInterface(event); e->InitBluetoothDeviceAddressEvent(NS_LITERAL_STRING("requestpasskey"), false, false, arr[0].value().get_nsString()); e->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else if (aData.name().EqualsLiteral("Authorize")) { arr = aData.value().get_ArrayOfBluetoothNamedValue(); NS_ASSERTION(arr.Length() == 2, "Authorize: Wrong length of parameters"); NS_ASSERTION(arr[0].value().type() == BluetoothValue::TnsString, "Authorize: Invalid value type"); NS_ASSERTION(arr[1].value().type() == BluetoothValue::TnsString, "Authorize: Invalid value type"); nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothAuthorizeEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothAuthorizeEvent> e = do_QueryInterface(event); e->InitBluetoothAuthorizeEvent(NS_LITERAL_STRING("authorize"), false, false, arr[0].value().get_nsString(), arr[1].value().get_nsString()); e->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else if (aData.name().EqualsLiteral("Cancel")) { nsCOMPtr<nsIDOMEvent> event; NS_NewDOMBluetoothDeviceAddressEvent(getter_AddRefs(event), nullptr, nullptr); nsCOMPtr<nsIDOMBluetoothDeviceAddressEvent> e = do_QueryInterface(event); // Just send a null nsString, won't be used e->InitBluetoothDeviceAddressEvent(NS_LITERAL_STRING("cancel"), false, false, EmptyString()); e->SetTrusted(true); bool dummy; DispatchEvent(event, &dummy); } else { #ifdef DEBUG nsCString warningMsg; warningMsg.AssignLiteral("Not handling adapter signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); NS_WARNING(warningMsg.get()); #endif } }
void BluetoothService::Notify(const BluetoothSignal& aData) { nsString type = NS_LITERAL_STRING("bluetooth-pairing-request"); AutoSafeJSContext cx; JS::Rooted<JSObject*> obj(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr())); NS_ENSURE_TRUE_VOID(obj); if (!SetJsObject(cx, aData.value(), obj)) { BT_WARNING("Failed to set properties of system message!"); return; } BT_LOGD("[S] %s: %s", __FUNCTION__, NS_ConvertUTF16toUTF8(aData.name()).get()); if (aData.name().EqualsLiteral("RequestConfirmation")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 4, "RequestConfirmation: Wrong length of parameters"); } else if (aData.name().EqualsLiteral("RequestPinCode")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 3, "RequestPinCode: Wrong length of parameters"); } else if (aData.name().EqualsLiteral("RequestPasskey")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 3, "RequestPinCode: Wrong length of parameters"); } else if (aData.name().EqualsLiteral("Cancel")) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 0, "Cancel: Wrong length of parameters"); type.AssignLiteral("bluetooth-cancel"); } else if (aData.name().EqualsLiteral(PAIRED_STATUS_CHANGED_ID)) { MOZ_ASSERT(aData.value().get_ArrayOfBluetoothNamedValue().Length() == 1, "pairedstatuschanged: Wrong length of parameters"); type.AssignLiteral("bluetooth-pairedstatuschanged"); } else { nsCString warningMsg; warningMsg.AssignLiteral("Not handling service signal: "); warningMsg.Append(NS_ConvertUTF16toUTF8(aData.name())); BT_WARNING(warningMsg.get()); return; } nsCOMPtr<nsISystemMessagesInternal> systemMessenger = do_GetService("@mozilla.org/system-message-internal;1"); NS_ENSURE_TRUE_VOID(systemMessenger); JS::Rooted<JS::Value> value(cx, JS::ObjectValue(*obj)); systemMessenger->BroadcastMessage(type, value, JS::UndefinedHandleValue); }