зеркало из https://github.com/mozilla/gecko-dev.git
Bug 942712 - Ensure event 'AdapterAdded' will be fired after 'Enabled' being fired, r=gyeh
This commit is contained in:
Родитель
38dab1b81d
Коммит
198dd216ad
|
@ -164,6 +164,9 @@ public:
|
|||
BluetoothSignal signal(signalName, NS_LITERAL_STRING(KEY_MANAGER), true);
|
||||
gBluetoothService->DistributeSignal(signal);
|
||||
|
||||
// Event 'AdapterAdded' has to be fired after firing 'Enabled'
|
||||
gBluetoothService->TryFiringAdapterAdded();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -508,6 +511,8 @@ BluetoothService::StartStopBluetooth(bool aStart, bool aIsStartup)
|
|||
LazyIdleThread::ManualShutdown);
|
||||
}
|
||||
|
||||
mAdapterAddedReceived = false;
|
||||
|
||||
nsCOMPtr<nsIRunnable> runnable = new ToggleBtTask(aStart, aIsStartup);
|
||||
nsresult rv = mBluetoothThread->Dispatch(runnable, NS_DISPATCH_NORMAL);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
@ -786,6 +791,20 @@ BluetoothService::Observe(nsISupports* aSubject, const char* aTopic,
|
|||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
void
|
||||
BluetoothService::TryFiringAdapterAdded()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
if (IsToggling() || !mAdapterAddedReceived) {
|
||||
return;
|
||||
}
|
||||
|
||||
BluetoothSignal signal(NS_LITERAL_STRING("AdapterAdded"),
|
||||
NS_LITERAL_STRING(KEY_MANAGER), true);
|
||||
DistributeSignal(signal);
|
||||
}
|
||||
|
||||
void
|
||||
BluetoothService::Notify(const BluetoothSignal& aData)
|
||||
{
|
||||
|
|
|
@ -317,9 +317,23 @@ public:
|
|||
void
|
||||
RemoveObserverFromTable(const nsAString& key);
|
||||
|
||||
/**
|
||||
* Below 2 function/variable are used for ensuring event 'AdapterAdded' will
|
||||
* be fired after event 'Enabled'.
|
||||
*/
|
||||
void TryFiringAdapterAdded();
|
||||
|
||||
void
|
||||
AdapterAddedReceived()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
mAdapterAddedReceived = true;
|
||||
}
|
||||
|
||||
protected:
|
||||
BluetoothService()
|
||||
: mEnabled(false)
|
||||
BluetoothService() : mEnabled(false)
|
||||
, mAdapterAddedReceived(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -408,6 +422,8 @@ private:
|
|||
* Bluetooth operations though.
|
||||
*/
|
||||
nsCOMPtr<nsIThread> mBluetoothThread;
|
||||
|
||||
bool mAdapterAddedReceived;
|
||||
};
|
||||
|
||||
END_BLUETOOTH_NAMESPACE
|
||||
|
|
|
@ -35,6 +35,43 @@ using namespace mozilla;
|
|||
using namespace mozilla::ipc;
|
||||
USING_BLUETOOTH_NAMESPACE
|
||||
|
||||
class SetupAfterEnabledTask : public nsRunnable
|
||||
{
|
||||
public:
|
||||
SetupAfterEnabledTask()
|
||||
{ }
|
||||
|
||||
NS_IMETHOD
|
||||
Run()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
// Bluetooth scan mode is NONE by default
|
||||
bt_scan_mode_t mode = BT_SCAN_MODE_CONNECTABLE;
|
||||
bt_property_t prop;
|
||||
prop.type = BT_PROPERTY_ADAPTER_SCAN_MODE;
|
||||
prop.val = (void*)&mode;
|
||||
prop.len = sizeof(mode);
|
||||
|
||||
NS_ENSURE_TRUE(sBtInterface, NS_ERROR_FAILURE);
|
||||
|
||||
int ret = sBtInterface->set_adapter_property(&prop);
|
||||
if (ret != BT_STATUS_SUCCESS) {
|
||||
BT_LOGR("%s: Fail to set: BT_SCAN_MODE_CONNECTABLE", __FUNCTION__);
|
||||
}
|
||||
|
||||
// Try to fire event 'AdapterAdded' to fit the original behaviour when
|
||||
// we used BlueZ as backend.
|
||||
BluetoothService* bs = BluetoothService::Get();
|
||||
NS_ENSURE_TRUE(bs, NS_ERROR_FAILURE);
|
||||
|
||||
bs->AdapterAddedReceived();
|
||||
bs->TryFiringAdapterAdded();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Classes only used in this file
|
||||
*/
|
||||
|
@ -51,6 +88,8 @@ public:
|
|||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
BluetoothService* bs = BluetoothService::Get();
|
||||
NS_ENSURE_TRUE(bs, NS_ERROR_FAILURE);
|
||||
|
||||
bs->DistributeSignal(mSignal);
|
||||
|
||||
return NS_OK;
|
||||
|
@ -222,34 +261,6 @@ BdAddressTypeToString(bt_bdaddr_t* aBdAddressType, nsAString& aRetBdAddress)
|
|||
aRetBdAddress = NS_ConvertUTF8toUTF16((char*)bdstr);
|
||||
}
|
||||
|
||||
static void
|
||||
Setup()
|
||||
{
|
||||
// Bluetooth scan mode is NONE by default
|
||||
bt_scan_mode_t mode = BT_SCAN_MODE_CONNECTABLE;
|
||||
bt_property_t prop;
|
||||
prop.type = BT_PROPERTY_ADAPTER_SCAN_MODE;
|
||||
prop.val = (void*)&mode;
|
||||
prop.len = sizeof(mode);
|
||||
|
||||
NS_ENSURE_TRUE_VOID(sBtInterface);
|
||||
|
||||
int ret = sBtInterface->set_adapter_property(&prop);
|
||||
if (ret != BT_STATUS_SUCCESS) {
|
||||
BT_LOGR("%s: Fail to set: BT_SCAN_MODE_CONNECTABLE", __FUNCTION__);
|
||||
}
|
||||
|
||||
// Event 'AdapterAdded' has to be fired after enabled to notify Gaia
|
||||
// that BluetoothAdapter is ready.
|
||||
BluetoothSignal signal(NS_LITERAL_STRING("AdapterAdded"),
|
||||
NS_LITERAL_STRING(KEY_MANAGER), true);
|
||||
nsRefPtr<DistributeBluetoothSignalTask>
|
||||
t = new DistributeBluetoothSignalTask(signal);
|
||||
if (NS_FAILED(NS_DispatchToMainThread(t))) {
|
||||
BT_WARNING("Failed to dispatch to main thread!");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
AdapterStateChangeCallback(bt_state_t aStatus)
|
||||
{
|
||||
|
@ -264,8 +275,9 @@ AdapterStateChangeCallback(bt_state_t aStatus)
|
|||
lock.Notify();
|
||||
}
|
||||
|
||||
if (sIsBtEnabled) {
|
||||
Setup();
|
||||
if (sIsBtEnabled &&
|
||||
NS_FAILED(NS_DispatchToMainThread(new SetupAfterEnabledTask()))) {
|
||||
BT_WARNING("Failed to dispatch to main thread!");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -335,6 +335,24 @@ private:
|
|||
BluetoothSignal mSignal;
|
||||
};
|
||||
|
||||
class TryFiringAdapterAddedTask : public nsRunnable
|
||||
{
|
||||
public:
|
||||
NS_IMETHOD
|
||||
Run()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
BluetoothService* bs = BluetoothService::Get();
|
||||
NS_ENSURE_TRUE(bs, NS_ERROR_FAILURE);
|
||||
|
||||
bs->AdapterAddedReceived();
|
||||
bs->TryFiringAdapterAdded();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
};
|
||||
|
||||
static bool
|
||||
IsDBusMessageError(DBusMessage* aMsg, DBusError* aErr, nsAString& aErrorStr)
|
||||
{
|
||||
|
@ -709,11 +727,7 @@ GetProperty(DBusMessageIter aIter, Properties* aPropertyTypes,
|
|||
// Notify BluetoothManager whenever adapter name is ready.
|
||||
if (!propertyValue.get_nsString().IsEmpty()) {
|
||||
sAdapterNameIsReady = true;
|
||||
BluetoothSignal signal(NS_LITERAL_STRING("AdapterAdded"),
|
||||
NS_LITERAL_STRING(KEY_MANAGER), sAdapterPath);
|
||||
nsRefPtr<DistributeBluetoothSignalTask> task =
|
||||
new DistributeBluetoothSignalTask(signal);
|
||||
NS_DispatchToMainThread(task);
|
||||
NS_DispatchToMainThread(new TryFiringAdapterAddedTask());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче