author | Eric Chou <echou@mozilla.com> |
Mon, 14 Oct 2013 17:29:21 +0800 | |
changeset 164455 | 90869b0d8c91c73b9dc805851eda45d1f8cd4f6f |
parent 164454 | d0dabc36dfc56ee33c5f5d3215ba01c7e983832f |
child 164456 | 60c53c7c916d891c143e9f49615497a066d36434 |
push id | 3066 |
push user | akeybl@mozilla.com |
push date | Mon, 09 Dec 2013 19:58:46 +0000 |
treeherder | mozilla-beta@a31a0dce83aa [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | gyeh |
bugs | 925663 |
milestone | 27.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/bluetooth/BluetoothHfpManager.cpp +++ b/dom/bluetooth/BluetoothHfpManager.cpp @@ -984,28 +984,21 @@ BluetoothHfpManager::Connect(const nsASt if (mDeviceAddress == aDeviceAddress) { aController->OnConnect(NS_LITERAL_STRING(ERR_ALREADY_CONNECTED)); } else { aController->OnConnect(NS_LITERAL_STRING(ERR_REACHED_CONNECTION_LIMIT)); } return; } - mNeedsUpdatingSdpRecords = true; - mIsHandsfree = !IS_HEADSET(aController->GetCod()); - nsString uuid; - if (mIsHandsfree) { - BluetoothUuidHelper::GetString(BluetoothServiceClass::HANDSFREE, uuid); - } else { - BluetoothUuidHelper::GetString(BluetoothServiceClass::HEADSET, uuid); - } + BluetoothUuidHelper::GetString(BluetoothServiceClass::HANDSFREE, uuid); if (NS_FAILED(bs->GetServiceChannel(aDeviceAddress, uuid, this))) { - aController->OnConnect(NS_LITERAL_STRING(ERR_SERVICE_CHANNEL_NOT_FOUND)); + aController->OnConnect(NS_LITERAL_STRING(ERR_NO_AVAILABLE_RESOURCE)); return; } // Stop listening because currently we only support one connection at a time. if (mHandsfreeSocket) { mHandsfreeSocket->Disconnect(); mHandsfreeSocket = nullptr; } @@ -1504,56 +1497,43 @@ BluetoothHfpManager::OnSocketDisconnect( OnDisconnect(EmptyString()); Reset(); } void BluetoothHfpManager::OnUpdateSdpRecords(const nsAString& aDeviceAddress) { - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(!aDeviceAddress.IsEmpty()); - MOZ_ASSERT(mRunnable); - - BluetoothService* bs = BluetoothService::Get(); - NS_ENSURE_TRUE_VOID(bs); - - nsString uuid; - if (mIsHandsfree) { - BluetoothUuidHelper::GetString(BluetoothServiceClass::HANDSFREE, uuid); - } else { - BluetoothUuidHelper::GetString(BluetoothServiceClass::HEADSET, uuid); - } - - // Since we have updated SDP records of the target device, we should - // try to get the channel of target service again. - if (NS_FAILED(bs->GetServiceChannel(aDeviceAddress, uuid, this))) { - OnConnect(NS_LITERAL_STRING(ERR_SERVICE_CHANNEL_NOT_FOUND)); - } + // UpdateSdpRecord() is not called so this callback function should not + // be invoked. + MOZ_ASSUME_UNREACHABLE("UpdateSdpRecords() should be called somewhere"); } void BluetoothHfpManager::OnGetServiceChannel(const nsAString& aDeviceAddress, const nsAString& aServiceUuid, int aChannel) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(!aDeviceAddress.IsEmpty()); BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE_VOID(bs); - BluetoothValue v; + if (aChannel < 0) { + // If we can't find Handsfree server channel number on the remote device, + // try to create HSP connection instead. + nsString hspUuid; + BluetoothUuidHelper::GetString(BluetoothServiceClass::HEADSET, hspUuid); - if (aChannel < 0) { - if (mNeedsUpdatingSdpRecords) { - mNeedsUpdatingSdpRecords = false; - bs->UpdateSdpRecords(aDeviceAddress, this); - } else { + if (aServiceUuid.Equals(hspUuid)) { OnConnect(NS_LITERAL_STRING(ERR_SERVICE_CHANNEL_NOT_FOUND)); + } else if (NS_FAILED(bs->GetServiceChannel(aDeviceAddress, + hspUuid, this))) { + OnConnect(NS_LITERAL_STRING(ERR_NO_AVAILABLE_RESOURCE)); } return; } if (!mSocket->Connect(NS_ConvertUTF16toUTF8(aDeviceAddress), aChannel)) { OnConnect(NS_LITERAL_STRING("SocketConnectionError")); }
--- a/dom/bluetooth/BluetoothHfpManager.h +++ b/dom/bluetooth/BluetoothHfpManager.h @@ -142,18 +142,16 @@ private: bool mCCWA; bool mCLIP; bool mCMEE; bool mCMER; bool mFirstCKPD; int mNetworkSelectionMode; bool mReceiveVgsFlag; bool mDialingRequestProcessed; - bool mIsHandsfree; - bool mNeedsUpdatingSdpRecords; nsString mDeviceAddress; nsString mMsisdn; nsString mOperatorName; nsTArray<Call> mCurrentCallArray; nsAutoPtr<BluetoothRilListener> mListener; nsRefPtr<BluetoothReplyRunnable> mRunnable; nsRefPtr<BluetoothProfileController> mController;
--- a/dom/bluetooth/BluetoothProfileController.h +++ b/dom/bluetooth/BluetoothProfileController.h @@ -41,21 +41,16 @@ BEGIN_BLUETOOTH_NAMESPACE #define HAS_OBJECT_TRANSFER(cod) (cod & 0x100000) // Bit 18: Major service class = 0x20, Rendering #define HAS_RENDERING(cod) (cod & 0x40000) // Major device class = 0xA, Peripheral #define IS_PERIPHERAL(cod) (GET_MAJOR_DEVICE_CLASS(cod) == 0xa) -// Major device class = 0x4, Audio/Video -// Minor device class = 0x1, Wearable Headset device -#define IS_HEADSET(cod) ((GET_MAJOR_DEVICE_CLASS(cod) == 0x4) && \ - (GET_MINOR_DEVICE_CLASS(cod) == 0x1)) - class BluetoothProfileManagerBase; class BluetoothReplyRunnable; typedef void (*BluetoothProfileControllerCallback)(); class BluetoothProfileController : public RefCounted<BluetoothProfileController> { public: BluetoothProfileController(const nsAString& aDeviceAddress,