void BluetoothGattCharacteristic::HandleCharacteristicValueUpdated( const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfuint8_t); mValue = aValue.get_ArrayOfuint8_t(); }
void BluetoothGattDescriptor::HandleDescriptorValueUpdated( const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfuint8_t); mValue = aValue.get_ArrayOfuint8_t(); }
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 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()); } }
BEGIN_BLUETOOTH_NAMESPACE bool SetJsObject(JSContext* aContext, const BluetoothValue& aValue, JSObject* aObj) { MOZ_ASSERT(aContext && aObj); if (aValue.type() != BluetoothValue::TArrayOfBluetoothNamedValue) { NS_WARNING("SetJsObject: Invalid parameter type"); return false; } const nsTArray<BluetoothNamedValue>& arr = aValue.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0; i < arr.Length(); i++) { jsval val; const BluetoothValue& v = arr[i].value(); JSString* jsData; switch(v.type()) { case BluetoothValue::TnsString: jsData = JS_NewUCStringCopyN(aContext, v.get_nsString().BeginReading(), v.get_nsString().Length()); NS_ENSURE_TRUE(jsData, false); val = STRING_TO_JSVAL(jsData); break; case BluetoothValue::Tuint32_t: val = INT_TO_JSVAL(v.get_uint32_t()); break; case BluetoothValue::Tbool: val = BOOLEAN_TO_JSVAL(v.get_bool()); break; default: NS_WARNING("SetJsObject: Parameter is not handled"); break; } if (!JS_SetProperty(aContext, aObj, NS_ConvertUTF16toUTF8(arr[i].name()).get(), &val)) { NS_WARNING("Failed to set property"); return false; } } return true; }
/** * |SetJsObject| is an internal function used by |BroadcastSystemMessage| only */ static bool SetJsObject(JSContext* aContext, const BluetoothValue& aValue, JS::Handle<JSObject*> aObj) { MOZ_ASSERT(aContext && aObj); if (aValue.type() != BluetoothValue::TArrayOfBluetoothNamedValue) { BT_WARNING("SetJsObject: Invalid parameter type"); return false; } const nsTArray<BluetoothNamedValue>& arr = aValue.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0; i < arr.Length(); i++) { JS::Rooted<JS::Value> val(aContext); const BluetoothValue& v = arr[i].value(); switch(v.type()) { case BluetoothValue::TnsString: { JSString* jsData = JS_NewUCStringCopyN(aContext, v.get_nsString().BeginReading(), v.get_nsString().Length()); NS_ENSURE_TRUE(jsData, false); val.setString(jsData); break; } case BluetoothValue::Tuint32_t: val.setInt32(v.get_uint32_t()); break; case BluetoothValue::Tbool: val.setBoolean(v.get_bool()); break; default: BT_WARNING("SetJsObject: Parameter is not handled"); break; } if (!JS_SetProperty(aContext, aObj, NS_ConvertUTF16toUTF8(arr[i].name()).get(), val)) { BT_WARNING("Failed to set property"); return false; } } return true; }
virtual bool ParseSuccessfulReply(JS::MutableHandle<JS::Value> aValue) { aValue.setUndefined(); const BluetoothValue& v = mReply->get_BluetoothReplySuccess().value(); if (v.type() != BluetoothValue::TArrayOfBluetoothNamedValue) { BT_WARNING("Not a BluetoothNamedValue array!"); SetError(NS_LITERAL_STRING("BluetoothReplyTypeError")); return false; } const InfallibleTArray<BluetoothNamedValue>& values = v.get_ArrayOfBluetoothNamedValue(); nsTArray<nsRefPtr<BluetoothDevice> > devices; for (uint32_t i = 0; i < values.Length(); i++) { const BluetoothValue properties = values[i].value(); if (properties.type() != BluetoothValue::TArrayOfBluetoothNamedValue) { BT_WARNING("Not a BluetoothNamedValue array!"); SetError(NS_LITERAL_STRING("BluetoothReplyTypeError")); return false; } nsRefPtr<BluetoothDevice> d = BluetoothDevice::Create(mAdapterPtr->GetOwner(), mAdapterPtr->GetPath(), properties); devices.AppendElement(d); } nsresult rv; nsIScriptContext* sc = mAdapterPtr->GetContextForEventHandlers(&rv); if (!sc) { BT_WARNING("Cannot create script context!"); SetError(NS_LITERAL_STRING("BluetoothScriptContextError")); return false; } AutoPushJSContext cx(sc->GetNativeContext()); JSObject* JsDevices = nullptr; rv = nsTArrayToJSArray(cx, devices, &JsDevices); if (!JsDevices) { BT_WARNING("Cannot create JS array!"); SetError(NS_LITERAL_STRING("BluetoothError")); return false; } aValue.setObject(*JsDevices); return true; }
void BluetoothGatt::HandleServicesDiscovered(const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfBluetoothGattServiceId); const InfallibleTArray<BluetoothGattServiceId>& serviceIds = aValue.get_ArrayOfBluetoothGattServiceId(); for (uint32_t i = 0; i < serviceIds.Length(); i++) { mServices.AppendElement(new BluetoothGattService( GetParentObject(), mAppUuid, serviceIds[i])); } BluetoothGattBinding::ClearCachedServicesValue(this); }
void BluetoothGattService::HandleCharacteristicsDiscovered( const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfBluetoothGattId); const InfallibleTArray<BluetoothGattId>& characteristicIds = aValue.get_ArrayOfBluetoothGattId(); for (uint32_t i = 0; i < characteristicIds.Length(); i++) { mCharacteristics.AppendElement(new BluetoothGattCharacteristic( GetParentObject(), this, characteristicIds[i])); } BluetoothGattServiceBinding::ClearCachedCharacteristicsValue(this); }
BluetoothAdapter::BluetoothAdapter(nsPIDOMWindow* aWindow, const BluetoothValue& aValue) : nsDOMEventTargetHelper(aWindow) , BluetoothPropertyContainer(BluetoothObjectType::TYPE_ADAPTER) , mJsUuids(nullptr) , mJsDeviceAddresses(nullptr) , mDiscoverable(false) , mDiscovering(false) , mPairable(false) , mPowered(false) , mIsRooted(false) { MOZ_ASSERT(aWindow); MOZ_ASSERT(IsDOMBinding()); BindToOwner(aWindow); const InfallibleTArray<BluetoothNamedValue>& values = aValue.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0; i < values.Length(); ++i) { SetPropertyByValue(values[i]); } BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE_VOID(bs); bs->RegisterBluetoothSignalHandler(NS_LITERAL_STRING(KEY_ADAPTER), this); }
virtual bool ParseSuccessfulReply(JS::MutableHandle<JS::Value> aValue) { aValue.setUndefined(); const BluetoothValue& v = mReply->get_BluetoothReplySuccess().value(); if (v.type() != BluetoothValue::TArrayOfBluetoothNamedValue) { BT_WARNING("Not a BluetoothNamedValue array!"); SetError(NS_LITERAL_STRING("BluetoothReplyTypeError")); return false; } const InfallibleTArray<BluetoothNamedValue>& values = v.get_ArrayOfBluetoothNamedValue(); nsTArray<nsRefPtr<BluetoothDevice> > devices; for (uint32_t i = 0; i < values.Length(); i++) { const BluetoothValue properties = values[i].value(); if (properties.type() != BluetoothValue::TArrayOfBluetoothNamedValue) { BT_WARNING("Not a BluetoothNamedValue array!"); SetError(NS_LITERAL_STRING("BluetoothReplyTypeError")); return false; } nsRefPtr<BluetoothDevice> d = BluetoothDevice::Create(mAdapterPtr->GetOwner(), mAdapterPtr->GetPath(), properties); devices.AppendElement(d); } AutoJSAPI jsapi; if (!jsapi.Init(mAdapterPtr->GetOwner())) { BT_WARNING("Failed to initialise AutoJSAPI!"); SetError(NS_LITERAL_STRING("BluetoothAutoJSAPIInitError")); return false; } JSContext* cx = jsapi.cx(); JS::Rooted<JSObject*> JsDevices(cx); if (NS_FAILED(nsTArrayToJSArray(cx, devices, &JsDevices))) { BT_WARNING("Cannot create JS array!"); SetError(NS_LITERAL_STRING("BluetoothError")); return false; } aValue.setObject(*JsDevices); return true; }
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 BluetoothManager::AppendAdapter(const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfBluetoothNamedValue); // Create a new BluetoothAdapter and append it to adapters array const InfallibleTArray<BluetoothNamedValue>& values = aValue.get_ArrayOfBluetoothNamedValue(); nsRefPtr<BluetoothAdapter> adapter = BluetoothAdapter::Create(GetOwner(), values); mAdapters.AppendElement(adapter); // Set this adapter as default adapter if no adapter exists if (!DefaultAdapterExists()) { MOZ_ASSERT(mAdapters.Length() == 1); ReselectDefaultAdapter(); } }
bool BroadcastSystemMessage(const nsAString& aType, const BluetoothValue& aData) { mozilla::AutoSafeJSContext cx; MOZ_ASSERT(!::JS_IsExceptionPending(cx), "Shouldn't get here when an exception is pending!"); nsCOMPtr<nsISystemMessagesInternal> systemMessenger = do_GetService("@mozilla.org/system-message-internal;1"); NS_ENSURE_TRUE(systemMessenger, false); JS::Rooted<JS::Value> value(cx); if (aData.type() == BluetoothValue::TnsString) { JSString* jsData = JS_NewUCStringCopyN(cx, aData.get_nsString().BeginReading(), aData.get_nsString().Length()); value.setString(jsData); } else if (aData.type() == BluetoothValue::TArrayOfBluetoothNamedValue) { JS::Rooted<JSObject*> obj(cx, JS_NewPlainObject(cx)); if (!obj) { BT_WARNING("Failed to new JSObject for system message!"); return false; } if (!SetJsObject(cx, aData, obj)) { BT_WARNING("Failed to set properties of system message!"); return false; } value = JS::ObjectValue(*obj); } else { BT_WARNING("Not support the unknown BluetoothValue type"); return false; } nsCOMPtr<nsISupports> promise; systemMessenger->BroadcastMessage(aType, value, JS::UndefinedHandleValue, getter_AddRefs(promise)); return true; }
void BluetoothGattServer::HandleServiceHandleUpdated(const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = aValue.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 2 && arr[0].value().type() == BluetoothValue::TBluetoothGattServiceId && arr[1].value().type() == BluetoothValue::TBluetoothAttributeHandle); BluetoothGattServiceId serviceId = arr[0].value().get_BluetoothGattServiceId(); BluetoothAttributeHandle serviceHandle = arr[1].value().get_BluetoothAttributeHandle(); NS_ENSURE_TRUE_VOID(mPendingService); NS_ENSURE_TRUE_VOID(mPendingService->GetServiceId() == serviceId); mPendingService->AssignServiceHandle(serviceHandle); }
void DispatchReplySuccess(BluetoothReplyRunnable* aRunnable, const BluetoothValue& aValue) { MOZ_ASSERT(aRunnable); MOZ_ASSERT(aValue.type() != BluetoothValue::T__None); BluetoothReply* reply = new BluetoothReply(BluetoothReplySuccess(aValue)); aRunnable->SetReply(reply); // runnable will delete reply after Run() NS_WARN_IF(NS_FAILED(NS_DispatchToMainThread(aRunnable))); }
void BluetoothManager::HandleAdapterAdded(const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfBluetoothNamedValue); AppendAdapter(aValue); // Notify application of added adapter BluetoothAdapterEventInit init; init.mAdapter = mAdapters.LastElement(); DispatchAdapterEvent(NS_LITERAL_STRING("adapteradded"), init); }
void BluetoothGattServer::HandleConnectionStateChanged( const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& arr = aValue.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(arr.Length() == 2 && arr[0].value().type() == BluetoothValue::Tbool && arr[1].value().type() == BluetoothValue::TnsString); BluetoothStatusChangedEventInit init; init.mStatus = arr[0].value().get_bool(); init.mAddress = arr[1].value().get_nsString(); RefPtr<BluetoothStatusChangedEvent> event = BluetoothStatusChangedEvent::Constructor( this, NS_LITERAL_STRING(GATT_CONNECTION_STATE_CHANGED_ID), init); DispatchTrustedEvent(event); }
nsresult BluetoothServiceBluedroid::GetDefaultAdapterPathInternal( BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); BluetoothValue v = InfallibleTArray<BluetoothNamedValue>(); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Address", sAdapterBdAddress); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Name", sAdapterBdName); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Discoverable", sAdapterDiscoverable); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "DiscoverableTimeout", sAdapterDiscoverableTimeout); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Devices", sAdapterBondedAddressArray); DispatchBluetoothReply(aRunnable, v, EmptyString()); return NS_OK; }
nsresult BluetoothServiceBluedroid::GetDefaultAdapterPathInternal( BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); nsRefPtr<BluetoothReplyRunnable> runnable(aRunnable); BluetoothValue v = InfallibleTArray<BluetoothNamedValue>(); v.get_ArrayOfBluetoothNamedValue().AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Address"), sAdapterBdAddress)); v.get_ArrayOfBluetoothNamedValue().AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Name"), sAdapterBdName)); v.get_ArrayOfBluetoothNamedValue().AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Discoverable"), sAdapterDiscoverable)); v.get_ArrayOfBluetoothNamedValue().AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("DiscoverableTimeout"), sAdapterDiscoverableTimeout)); v.get_ArrayOfBluetoothNamedValue().AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Devices"), sAdapterBondedAddressArray)); nsAutoString replyError; DispatchBluetoothReply(runnable.get(), v, replyError); runnable.forget(); return NS_OK; }
nsresult BluetoothServiceBluedroid::GetDefaultAdapterPathInternal( BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); nsRefPtr<BluetoothReplyRunnable> runnable(aRunnable); BluetoothValue v = InfallibleTArray<BluetoothNamedValue>(); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Address", sAdapterBdAddress); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Name", sAdapterBdName); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Discoverable", sAdapterDiscoverable); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "DiscoverableTimeout", sAdapterDiscoverableTimeout); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), "Devices", sAdapterBondedAddressArray); nsAutoString replyError; DispatchBluetoothReply(runnable.get(), v, replyError); unused << runnable.forget(); // picked up in DispatchBluetoothReply return NS_OK; }
void BluetoothGatt::HandleCharacteristicsDiscovered(const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TArrayOfBluetoothNamedValue); const InfallibleTArray<BluetoothNamedValue>& values = aValue.get_ArrayOfBluetoothNamedValue(); MOZ_ASSERT(values.Length() == 2); // ServiceId, Characteristics MOZ_ASSERT(values[0].name().EqualsLiteral("serviceId")); MOZ_ASSERT(values[0].value().type() == BluetoothValue::TBluetoothGattServiceId); MOZ_ASSERT(values[1].name().EqualsLiteral("characteristics")); MOZ_ASSERT(values[1].value().type() == BluetoothValue::TArrayOfBluetoothGattCharAttribute); size_t index = mServices.IndexOf( values[0].value().get_BluetoothGattServiceId()); NS_ENSURE_TRUE_VOID(index != mServices.NoIndex); nsRefPtr<BluetoothGattService> service = mServices.ElementAt(index); service->AssignCharacteristics( values[1].value().get_ArrayOfBluetoothGattCharAttribute()); }
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 BluetoothServiceBluedroid::GetAdaptersInternal( BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); /** * Wrap BluetoothValue = * BluetoothNamedValue[] * | * |__ BluetoothNamedValue = * | {"Adapter", BluetoothValue = BluetoothNamedValue[]} * | * |__ BluetoothNamedValue = * | {"Adapter", BluetoothValue = BluetoothNamedValue[]} * ... */ BluetoothValue adaptersProperties = InfallibleTArray<BluetoothNamedValue>(); uint32_t numAdapters = 1; // Bluedroid supports single adapter only for (uint32_t i = 0; i < numAdapters; i++) { BluetoothValue properties = InfallibleTArray<BluetoothNamedValue>(); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), "State", sAdapterEnabled); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), "Address", sAdapterBdAddress); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), "Name", sAdapterBdName); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), "Discoverable", sAdapterDiscoverable); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), "Discovering", sAdapterDiscovering); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), "PairedDevices", sAdapterBondedAddressArray); BT_APPEND_NAMED_VALUE(adaptersProperties.get_ArrayOfBluetoothNamedValue(), "Adapter", properties); } DispatchReplySuccess(aRunnable, adaptersProperties); 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 } }
BluetoothDevice::BluetoothDevice(nsPIDOMWindow* aOwner, const nsAString& aAdapterPath, const BluetoothValue& aValue) : BluetoothPropertyContainer(BluetoothObjectType::TYPE_DEVICE), mJsUuids(nullptr), mJsServices(nullptr), mAdapterPath(aAdapterPath), mIsRooted(false) { BindToOwner(aOwner); const InfallibleTArray<BluetoothNamedValue>& values = aValue.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0; i < values.Length(); ++i) { SetPropertyByValue(values[i]); } }
BluetoothAdapter::BluetoothAdapter(nsPIDOMWindow* aOwner, const BluetoothValue& aValue) : BluetoothPropertyContainer(BluetoothObjectType::TYPE_ADAPTER) , mEnabled(false) , mDiscoverable(false) , mDiscovering(false) , mPairable(false) , mPowered(false) , mJsUuids(nullptr) , mJsDeviceAddresses(nullptr) , mIsRooted(false) { BindToOwner(aOwner); const InfallibleTArray<BluetoothNamedValue>& values = aValue.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0; i < values.Length(); ++i) { SetPropertyByValue(values[i]); } }
void DispatchBluetoothReply(BluetoothReplyRunnable* aRunnable, const BluetoothValue& aValue, const enum BluetoothStatus aStatusCode) { // Reply will be deleted by the runnable after running on main thread BluetoothReply* reply; if (aStatusCode != STATUS_SUCCESS) { reply = new BluetoothReply(BluetoothReplyError(aStatusCode, EmptyString())); } else { MOZ_ASSERT(aValue.type() != BluetoothValue::T__None); reply = new BluetoothReply(BluetoothReplySuccess(aValue)); } aRunnable->SetReply(reply); if (NS_FAILED(NS_DispatchToMainThread(aRunnable))) { BT_WARNING("Failed to dispatch to main thread!"); } }
void DispatchBluetoothReply(BluetoothReplyRunnable* aRunnable, const BluetoothValue& aValue, const nsAString& aErrorStr) { // Reply will be deleted by the runnable after running on main thread BluetoothReply* reply; if (!aErrorStr.IsEmpty()) { nsString err(aErrorStr); reply = new BluetoothReply(BluetoothReplyError(err)); } else { MOZ_ASSERT(aValue.type() != BluetoothValue::T__None); reply = new BluetoothReply(BluetoothReplySuccess(aValue)); } aRunnable->SetReply(reply); if (NS_FAILED(NS_DispatchToMainThread(aRunnable))) { NS_WARNING("Failed to dispatch to main thread!"); } }
BluetoothDevice::BluetoothDevice(nsPIDOMWindow* aWindow, const BluetoothValue& aValue) : DOMEventTargetHelper(aWindow) , mJsUuids(nullptr) , mJsServices(nullptr) , mIsRooted(false) { MOZ_ASSERT(aWindow); MOZ_ASSERT(IsDOMBinding()); const InfallibleTArray<BluetoothNamedValue>& values = aValue.get_ArrayOfBluetoothNamedValue(); for (uint32_t i = 0; i < values.Length(); ++i) { SetPropertyByValue(values[i]); } BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE_VOID(bs); bs->RegisterBluetoothSignalHandler(mAddress, this); }