diff --git a/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.cpp b/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.cpp index c8cacdf0d41a..db77ae9c4ce3 100644 --- a/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.cpp +++ b/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.cpp @@ -89,15 +89,6 @@ using namespace mozilla; using namespace mozilla::ipc; USING_BLUETOOTH_NAMESPACE -static nsString sAdapterBdAddress; -static nsString sAdapterBdName; - -static bool sAdapterDiscoverable(false); -static bool sAdapterDiscovering(false); - -// InfallibleTArray is an alias for nsTArray. -static InfallibleTArray sAdapterBondedAddressArray; - static BluetoothInterface* sBtInterface; static nsTArray > sControllerArray; @@ -113,8 +104,6 @@ static bool sIsRestart(false); static bool sIsFirstTimeToggleOffBt(false); #ifndef MOZ_B2G_BT_API_V1 -static bool sAdapterEnabled(false); - // Static hash table to map device name from address static nsDataHashtable sDeviceNameMap; @@ -125,12 +114,6 @@ static nsTArray > sFetchUuidsRunnableArray; // Missing in Bluetooth v1 #endif -#ifndef MOZ_B2G_BT_API_V1 -// Missing in Bluetooth v2 -#else -static uint32_t sAdapterDiscoverableTimeout(0); -#endif - /* * Static methods */ @@ -435,6 +418,14 @@ BluetoothServiceBluedroid::StopGonkBluetooth() */ BluetoothServiceBluedroid::BluetoothServiceBluedroid() + : mEnabled(false) + , mDiscoverable(false) + , mDiscovering(false) +#ifndef MOZ_B2G_BT_API_V1 + // Missing in Bluetooth v2 +#else + , mDiscoverableTimeout(0) +#endif { sBtInterface = BluetoothInterface::GetInstance(); if (!sBtInterface) { @@ -795,17 +786,17 @@ BluetoothServiceBluedroid::GetAdaptersInternal( BluetoothValue properties = InfallibleTArray(); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), - "State", sAdapterEnabled); + "State", mEnabled); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), - "Address", sAdapterBdAddress); + "Address", mBdAddress); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), - "Name", sAdapterBdName); + "Name", mBdName); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), - "Discoverable", sAdapterDiscoverable); + "Discoverable", mDiscoverable); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), - "Discovering", sAdapterDiscovering); + "Discovering", mDiscovering); BT_APPEND_NAMED_VALUE(properties.get_ArrayOfBluetoothNamedValue(), - "PairedDevices", sAdapterBondedAddressArray); + "PairedDevices", mBondedAddresses); BT_APPEND_NAMED_VALUE(adaptersProperties.get_ArrayOfBluetoothNamedValue(), "Adapter", properties); @@ -821,27 +812,22 @@ BluetoothServiceBluedroid::GetDefaultAdapterPathInternal( { MOZ_ASSERT(NS_IsMainThread()); - // Since Atomic<*> is not acceptable for BT_APPEND_NAMED_VALUE(), - // create another variable to store data. - bool discoverable = sAdapterDiscoverable; - uint32_t discoverableTimeout = sAdapterDiscoverableTimeout; - BluetoothValue v = InfallibleTArray(); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), - "Address", sAdapterBdAddress); + "Address", mBdAddress); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), - "Name", sAdapterBdName); + "Name", mBdName); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), - "Discoverable", discoverable); + "Discoverable", mDiscoverable); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), - "DiscoverableTimeout", discoverableTimeout); + "DiscoverableTimeout", mDiscoverableTimeout); BT_APPEND_NAMED_VALUE(v.get_ArrayOfBluetoothNamedValue(), - "Devices", sAdapterBondedAddressArray); + "Devices", mBondedAddresses); DispatchReplySuccess(aRunnable, v); @@ -1075,7 +1061,7 @@ BluetoothServiceBluedroid::FetchUuidsInternal( * get_remote_services request will not be performed by bluedroid * if it is currently discovering nearby remote devices. */ - if (sAdapterDiscovering) { + if (mDiscovering) { sBtInterface->CancelDiscovery(new CancelDiscoveryResultHandler(aRunnable)); } @@ -1830,9 +1816,9 @@ BluetoothServiceBluedroid::AdapterStateChangedNotification(bool aState) sIsFirstTimeToggleOffBt = false; } - sAdapterEnabled = aState; + mEnabled = aState; - if (!sAdapterEnabled) { + if (!mEnabled) { static void (* const sDeinitManager[])(BluetoothProfileResultHandler*) = { BluetoothHfpManager::DeinitHfpInterface, BluetoothA2dpManager::DeinitA2dpInterface, @@ -1844,18 +1830,18 @@ BluetoothServiceBluedroid::AdapterStateChangedNotification(bool aState) NS_ENSURE_TRUE_VOID(bs); // Cleanup static adapter properties and notify adapter. - sAdapterBdAddress.Truncate(); - sAdapterBdName.Truncate(); + mBdAddress.Truncate(); + mBdName.Truncate(); InfallibleTArray props; - BT_APPEND_NAMED_VALUE(props, "Name", sAdapterBdName); - BT_APPEND_NAMED_VALUE(props, "Address", sAdapterBdAddress); - if (sAdapterDiscoverable) { - sAdapterDiscoverable = false; + BT_APPEND_NAMED_VALUE(props, "Name", mBdName); + BT_APPEND_NAMED_VALUE(props, "Address", mBdAddress); + if (mDiscoverable) { + mDiscoverable = false; BT_APPEND_NAMED_VALUE(props, "Discoverable", false); } - if (sAdapterDiscovering) { - sAdapterDiscovering = false; + if (mDiscovering) { + mDiscovering = false; BT_APPEND_NAMED_VALUE(props, "Discovering", false); } @@ -1873,7 +1859,7 @@ BluetoothServiceBluedroid::AdapterStateChangedNotification(bool aState) } } - if (sAdapterEnabled) { + if (mEnabled) { // We enable the Bluetooth adapter here. Disabling is implemented // in |CleanupResultHandler|, which runs at the end of the shutdown @@ -1942,8 +1928,8 @@ BluetoothServiceBluedroid::AdapterStateChangedNotification(bool aState) }; // Set discoverable cache to default value after state becomes BT_STATE_OFF. - if (sAdapterDiscoverable) { - sAdapterDiscoverable = false; + if (mDiscoverable) { + mDiscoverable = false; } // Cleanup bluetooth interfaces after BT state becomes BT_STATE_OFF. @@ -2021,23 +2007,21 @@ BluetoothServiceBluedroid::AdapterPropertiesNotification( const BluetoothProperty& p = aProperties[i]; if (p.mType == PROPERTY_BDADDR) { - sAdapterBdAddress = p.mString; - BT_APPEND_NAMED_VALUE(propertiesArray, "Address", sAdapterBdAddress); + mBdAddress = p.mString; + BT_APPEND_NAMED_VALUE(propertiesArray, "Address", mBdAddress); } else if (p.mType == PROPERTY_BDNAME) { - sAdapterBdName = p.mString; - BT_APPEND_NAMED_VALUE(propertiesArray, "Name", sAdapterBdName); + mBdName = p.mString; + BT_APPEND_NAMED_VALUE(propertiesArray, "Name", mBdName); } else if (p.mType == PROPERTY_ADAPTER_SCAN_MODE) { // If BT is not enabled, Bluetooth scan mode should be non-discoverable - // by defalut. 'AdapterStateChangedNotification' would set the default + // by defalut. |AdapterStateChangedNotification| would set default // properties to bluetooth backend once Bluetooth is enabled. if (IsEnabled()) { - sAdapterDiscoverable = - (p.mScanMode == SCAN_MODE_CONNECTABLE_DISCOVERABLE); - BT_APPEND_NAMED_VALUE(propertiesArray, "Discoverable", - sAdapterDiscoverable); + mDiscoverable = (p.mScanMode == SCAN_MODE_CONNECTABLE_DISCOVERABLE); + BT_APPEND_NAMED_VALUE(propertiesArray, "Discoverable", mDiscoverable); } } else if (p.mType == PROPERTY_ADAPTER_BONDED_DEVICES) { // We have to cache addresses of bonded devices. Unlike BlueZ, @@ -2047,11 +2031,11 @@ BluetoothServiceBluedroid::AdapterPropertiesNotification( p.mStringArray.Length()); // Whenever reloading paired devices, force refresh - sAdapterBondedAddressArray.Clear(); - sAdapterBondedAddressArray.AppendElements(p.mStringArray); + mBondedAddresses.Clear(); + mBondedAddresses.AppendElements(p.mStringArray); BT_APPEND_NAMED_VALUE(propertiesArray, "PairedDevices", - sAdapterBondedAddressArray); + mBondedAddresses); } else if (p.mType == PROPERTY_UNKNOWN) { /* Bug 1065999: working around unknown properties */ } else { @@ -2074,7 +2058,6 @@ BluetoothServiceBluedroid::AdapterPropertiesNotification( #else MOZ_ASSERT(NS_IsMainThread()); - BluetoothValue propertyValue; InfallibleTArray props; for (int i = 0; i < aNumProperties; i++) { @@ -2082,14 +2065,12 @@ BluetoothServiceBluedroid::AdapterPropertiesNotification( const BluetoothProperty& p = aProperties[i]; if (p.mType == PROPERTY_BDADDR) { - sAdapterBdAddress = p.mString; - propertyValue = sAdapterBdAddress; - BT_APPEND_NAMED_VALUE(props, "Address", propertyValue); + mBdAddress = p.mString; + BT_APPEND_NAMED_VALUE(props, "Address", mBdAddress); } else if (p.mType == PROPERTY_BDNAME) { - sAdapterBdName = p.mString; - propertyValue = sAdapterBdName; - BT_APPEND_NAMED_VALUE(props, "Name", propertyValue); + mBdName = p.mString; + BT_APPEND_NAMED_VALUE(props, "Name", mBdName); } else if (p.mType == PROPERTY_ADAPTER_SCAN_MODE) { BluetoothScanMode newMode = p.mScanMode; @@ -2097,17 +2078,14 @@ BluetoothServiceBluedroid::AdapterPropertiesNotification( // If BT is not enabled, Bluetooth scan mode should be non-discoverable // by defalut. 'AdapterStateChangedNotification' would set the default // properties to bluetooth backend once Bluetooth is enabled. - if (newMode == SCAN_MODE_CONNECTABLE_DISCOVERABLE && IsEnabled()) { - propertyValue = sAdapterDiscoverable = true; - } else { - propertyValue = sAdapterDiscoverable = false; - } - - BT_APPEND_NAMED_VALUE(props, "Discoverable", propertyValue); + mDiscoverable = + (newMode == SCAN_MODE_CONNECTABLE_DISCOVERABLE && IsEnabled()); + BT_APPEND_NAMED_VALUE(props, "Discoverable", mDiscoverable); } else if (p.mType == PROPERTY_ADAPTER_DISCOVERY_TIMEOUT) { - propertyValue = sAdapterDiscoverableTimeout = p.mUint32; - BT_APPEND_NAMED_VALUE(props, "DiscoverableTimeout", propertyValue); + mDiscoverableTimeout = p.mUint32; + BT_APPEND_NAMED_VALUE(props, "DiscoverableTimeout", + mDiscoverableTimeout); } else if (p.mType == PROPERTY_ADAPTER_BONDED_DEVICES) { // We have to cache addresses of bonded devices. Unlike BlueZ, @@ -2117,14 +2095,10 @@ BluetoothServiceBluedroid::AdapterPropertiesNotification( p.mStringArray.Length()); // Whenever reloading paired devices, force refresh - sAdapterBondedAddressArray.Clear(); + mBondedAddresses.Clear(); + mBondedAddresses.AppendElements(p.mStringArray); - for (size_t index = 0; index < p.mStringArray.Length(); index++) { - sAdapterBondedAddressArray.AppendElement(p.mStringArray[index]); - } - - propertyValue = sAdapterBondedAddressArray; - BT_APPEND_NAMED_VALUE(props, "Devices", propertyValue); + BT_APPEND_NAMED_VALUE(props, "Devices", mBondedAddresses); } else if (p.mType == PROPERTY_UUIDS) { //FIXME: This will be implemented in the later patchset @@ -2341,7 +2315,7 @@ BluetoothServiceBluedroid::RemoteDevicePropertiesNotification( * (2) remote device properties get updated during discovery, or * (3) as result of CreateBond */ - if (sAdapterDiscovering) { + if (mDiscovering) { // Fire 'devicefound' again to update device name for (2). // See bug 1076553 for more information. DistributeSignal(BluetoothSignal(NS_LITERAL_STRING("DeviceFound"), @@ -2471,11 +2445,11 @@ BluetoothServiceBluedroid::DiscoveryStateChangedNotification(bool aState) #ifndef MOZ_B2G_BT_API_V1 MOZ_ASSERT(NS_IsMainThread()); - sAdapterDiscovering = aState; + mDiscovering = aState; // Fire PropertyChanged of Discovering InfallibleTArray propertiesArray; - BT_APPEND_NAMED_VALUE(propertiesArray, "Discovering", sAdapterDiscovering); + BT_APPEND_NAMED_VALUE(propertiesArray, "Discovering", mDiscovering); DistributeSignal(NS_LITERAL_STRING("PropertyChanged"), NS_LITERAL_STRING(KEY_ADAPTER), @@ -2489,17 +2463,16 @@ BluetoothServiceBluedroid::DiscoveryStateChangedNotification(bool aState) #else MOZ_ASSERT(NS_IsMainThread()); - sAdapterDiscovering = aState; + mDiscovering = aState; DistributeSignal( BluetoothSignal(NS_LITERAL_STRING(DISCOVERY_STATE_CHANGED_ID), - NS_LITERAL_STRING(KEY_ADAPTER), sAdapterDiscovering)); + NS_LITERAL_STRING(KEY_ADAPTER), mDiscovering)); // Distribute "PropertyChanged" signal to notice adapter this change since // Bluedroid don' treat "discovering" as a property of adapter. InfallibleTArray props; - BT_APPEND_NAMED_VALUE(props, "Discovering", - BluetoothValue(sAdapterDiscovering)); + BT_APPEND_NAMED_VALUE(props, "Discovering", mDiscovering); DistributeSignal(BluetoothSignal(NS_LITERAL_STRING("PropertyChanged"), NS_LITERAL_STRING(KEY_ADAPTER), BluetoothValue(props))); @@ -2669,10 +2642,10 @@ BluetoothServiceBluedroid::BondStateChangedNotification( // Update bonded address array and append pairing device name InfallibleTArray propertiesArray; if (!bonded) { - sAdapterBondedAddressArray.RemoveElement(remoteBdAddr); + mBondedAddresses.RemoveElement(remoteBdAddr); } else { - if (!sAdapterBondedAddressArray.Contains(remoteBdAddr)) { - sAdapterBondedAddressArray.AppendElement(remoteBdAddr); + if (!mBondedAddresses.Contains(remoteBdAddr)) { + mBondedAddresses.AppendElement(remoteBdAddr); } // We don't assert |!remotebdName.IsEmpty()| since empty string is also @@ -2705,7 +2678,7 @@ BluetoothServiceBluedroid::BondStateChangedNotification( } #else if (aState == BOND_STATE_BONDED && - sAdapterBondedAddressArray.Contains(aRemoteBdAddr)) { + mBondedAddresses.Contains(aRemoteBdAddr)) { // See bug 940271 for more details about this case. return; } @@ -2716,10 +2689,10 @@ BluetoothServiceBluedroid::BondStateChangedNotification( bool bonded; if (aState == BOND_STATE_NONE) { bonded = false; - sAdapterBondedAddressArray.RemoveElement(aRemoteBdAddr); + mBondedAddresses.RemoveElement(aRemoteBdAddr); } else if (aState == BOND_STATE_BONDED) { bonded = true; - sAdapterBondedAddressArray.AppendElement(aRemoteBdAddr); + mBondedAddresses.AppendElement(aRemoteBdAddr); } else { return; } @@ -2727,7 +2700,7 @@ BluetoothServiceBluedroid::BondStateChangedNotification( // Update bonded address list to BluetoothAdapter InfallibleTArray propertiesChangeArray; BT_APPEND_NAMED_VALUE(propertiesChangeArray, "Devices", - sAdapterBondedAddressArray); + mBondedAddresses); DistributeSignal(BluetoothSignal(NS_LITERAL_STRING("PropertyChanged"), NS_LITERAL_STRING(KEY_ADAPTER), diff --git a/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.h b/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.h index 73f036feb143..e9e2fa349620 100644 --- a/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.h +++ b/dom/bluetooth/bluedroid/BluetoothServiceBluedroid.h @@ -390,6 +390,19 @@ protected: static bool IsConnected(const nsAString& aRemoteBdAddr); #endif + + // Adapter properties + nsString mBdAddress; + nsString mBdName; + bool mEnabled; + bool mDiscoverable; + bool mDiscovering; + nsTArray mBondedAddresses; +#ifndef MOZ_B2G_BT_API_V1 + // Missing in Bluetooth v2 +#else + uint32_t mDiscoverableTimeout; +#endif }; END_BLUETOOTH_NAMESPACE