bool BluetoothAdapter::IsAdapterAttributeChanged(BluetoothAdapterAttribute aType, const BluetoothValue& aValue) { switch(aType) { case BluetoothAdapterAttribute::State: MOZ_ASSERT(aValue.type() == BluetoothValue::Tbool); return aValue.get_bool() ? mState != BluetoothAdapterState::Enabled : mState != BluetoothAdapterState::Disabled; case BluetoothAdapterAttribute::Name: MOZ_ASSERT(aValue.type() == BluetoothValue::TnsString); return !mName.Equals(aValue.get_nsString()); case BluetoothAdapterAttribute::Address: MOZ_ASSERT(aValue.type() == BluetoothValue::TnsString); return !mAddress.Equals(aValue.get_nsString()); case BluetoothAdapterAttribute::Discoverable: MOZ_ASSERT(aValue.type() == BluetoothValue::Tbool); return mDiscoverable != aValue.get_bool(); case BluetoothAdapterAttribute::Discovering: MOZ_ASSERT(aValue.type() == BluetoothValue::Tbool); return mDiscovering != aValue.get_bool(); default: BT_WARNING("Type %d is not handled", uint32_t(aType)); return false; } }
void BluetoothManager::HandleAdapterRemoved(const BluetoothValue& aValue) { MOZ_ASSERT(aValue.type() == BluetoothValue::TnsString); MOZ_ASSERT(DefaultAdapterExists()); // Remove the adapter of given address from adapters array nsString addressToRemove = aValue.get_nsString(); uint32_t numAdapters = mAdapters.Length(); for (uint32_t i = 0; i < numAdapters; i++) { nsString address; mAdapters[i]->GetAddress(address); if (address.Equals(addressToRemove)) { mAdapters.RemoveElementAt(i); if (mDefaultAdapterIndex == (int)i) { ReselectDefaultAdapter(); } break; } } // Notify application of removed adapter BluetoothAdapterEventInit init; init.mAddress = addressToRemove; DispatchAdapterEvent(NS_LITERAL_STRING("adapterremoved"), init); }
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; }