From 8e1ad7975afd5878ac9c6a00c11c6561f23f3d5f Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Mon, 20 Apr 2015 12:56:49 +0200 Subject: [PATCH] Bug 1155718: Share BlueoothRilListener.{cpp,h} between Bluetooth v1 and v2, r=btian This patch uses the v1 implementation, which include a fix for bug 1137151. --- .../{bluetooth1 => }/BluetoothRilListener.cpp | 0 .../{bluetooth1 => }/BluetoothRilListener.h | 0 .../bluetooth2/BluetoothRilListener.cpp | 452 ------------------ .../bluetooth2/BluetoothRilListener.h | 134 ------ dom/bluetooth/moz.build | 13 +- 5 files changed, 5 insertions(+), 594 deletions(-) rename dom/bluetooth/{bluetooth1 => }/BluetoothRilListener.cpp (100%) rename dom/bluetooth/{bluetooth1 => }/BluetoothRilListener.h (100%) delete mode 100644 dom/bluetooth/bluetooth2/BluetoothRilListener.cpp delete mode 100644 dom/bluetooth/bluetooth2/BluetoothRilListener.h diff --git a/dom/bluetooth/bluetooth1/BluetoothRilListener.cpp b/dom/bluetooth/BluetoothRilListener.cpp similarity index 100% rename from dom/bluetooth/bluetooth1/BluetoothRilListener.cpp rename to dom/bluetooth/BluetoothRilListener.cpp diff --git a/dom/bluetooth/bluetooth1/BluetoothRilListener.h b/dom/bluetooth/BluetoothRilListener.h similarity index 100% rename from dom/bluetooth/bluetooth1/BluetoothRilListener.h rename to dom/bluetooth/BluetoothRilListener.h diff --git a/dom/bluetooth/bluetooth2/BluetoothRilListener.cpp b/dom/bluetooth/bluetooth2/BluetoothRilListener.cpp deleted file mode 100644 index a13f1520c26..00000000000 --- a/dom/bluetooth/bluetooth2/BluetoothRilListener.cpp +++ /dev/null @@ -1,452 +0,0 @@ -/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "BluetoothRilListener.h" - -#include "BluetoothHfpManager.h" -#include "nsIIccService.h" -#include "nsIMobileConnectionInfo.h" -#include "nsIMobileConnectionService.h" -#include "nsITelephonyService.h" -#include "nsServiceManagerUtils.h" -#include "nsString.h" - -USING_BLUETOOTH_NAMESPACE - -/** - * IccListener - */ -NS_IMPL_ISUPPORTS(IccListener, nsIIccListener) - -NS_IMETHODIMP -IccListener::NotifyIccInfoChanged() -{ - // mOwner would be set to nullptr only in the dtor of BluetoothRilListener - NS_ENSURE_TRUE(mOwner, NS_ERROR_FAILURE); - - BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); - NS_ENSURE_TRUE(hfp, NS_ERROR_FAILURE); - - hfp->HandleIccInfoChanged(mOwner->mClientId); - - return NS_OK; -} - -NS_IMETHODIMP -IccListener::NotifyStkCommand(const nsAString & aMessage) -{ - return NS_OK; -} - -NS_IMETHODIMP -IccListener::NotifyStkSessionEnd() -{ - return NS_OK; -} - -NS_IMETHODIMP -IccListener::NotifyCardStateChanged() -{ - return NS_OK; -} - -bool -IccListener::Listen(bool aStart) -{ - NS_ENSURE_TRUE(mOwner, false); - - nsCOMPtr service = - do_GetService(ICC_SERVICE_CONTRACTID); - NS_ENSURE_TRUE(service, false); - - nsCOMPtr icc; - service->GetIccByServiceId(mOwner->mClientId, getter_AddRefs(icc)); - NS_ENSURE_TRUE(icc, false); - - nsresult rv; - if (aStart) { - rv = icc->RegisterListener(this); - } else { - rv = icc->UnregisterListener(this); - } - - return NS_SUCCEEDED(rv); -} - -void -IccListener::SetOwner(BluetoothRilListener *aOwner) -{ - mOwner = aOwner; -} - -/** - * MobileConnectionListener - */ -NS_IMPL_ISUPPORTS(MobileConnectionListener, nsIMobileConnectionListener) - -NS_IMETHODIMP -MobileConnectionListener::NotifyVoiceChanged() -{ - BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); - NS_ENSURE_TRUE(hfp, NS_OK); - - hfp->HandleVoiceConnectionChanged(mClientId); - - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyDataChanged() -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyDataError(const nsAString & message) -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyCFStateChanged(uint16_t action, - uint16_t reason, - const nsAString& number, - uint16_t timeSeconds, - uint16_t serviceClass) -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyEmergencyCbModeChanged(bool active, - uint32_t timeoutMs) -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyOtaStatusChanged(const nsAString & status) -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyRadioStateChanged() -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyClirModeChanged(uint32_t aMode) -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyLastKnownNetworkChanged() -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyLastKnownHomeNetworkChanged() -{ - return NS_OK; -} - -NS_IMETHODIMP -MobileConnectionListener::NotifyNetworkSelectionModeChanged() -{ - return NS_OK; -} - -bool -MobileConnectionListener::Listen(bool aStart) -{ - nsCOMPtr service = - do_GetService(NS_MOBILE_CONNECTION_SERVICE_CONTRACTID); - NS_ENSURE_TRUE(service, false); - - nsCOMPtr connection; - service->GetItemByServiceId(mClientId, getter_AddRefs(connection)); - NS_ENSURE_TRUE(connection, false); - - nsresult rv; - if (aStart) { - rv = connection->RegisterListener(this); - } else { - rv = connection->UnregisterListener(this); - } - - return NS_SUCCEEDED(rv); -} - -/** - * TelephonyListener Implementation - */ -NS_IMPL_ISUPPORTS(TelephonyListener, nsITelephonyListener) - -/** - * @param aSend A boolean indicates whether we need to notify headset or not - */ -nsresult -TelephonyListener::HandleCallInfo(nsITelephonyCallInfo* aInfo, bool aSend) -{ - BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); - NS_ENSURE_TRUE(hfp, NS_ERROR_FAILURE); - - uint32_t callIndex; - uint16_t callState; - nsAutoString number; - bool isOutgoing; - bool isConference; - - aInfo->GetCallIndex(&callIndex); - aInfo->GetCallState(&callState); - aInfo->GetNumber(number); - aInfo->GetIsOutgoing(&isOutgoing); - aInfo->GetIsConference(&isConference); - - hfp->HandleCallStateChanged(callIndex, callState, EmptyString(), number, - isOutgoing, isConference, aSend); - return NS_OK; -} - -NS_IMETHODIMP -TelephonyListener::CallStateChanged(nsITelephonyCallInfo* aInfo) -{ - return HandleCallInfo(aInfo, true); -} - -NS_IMETHODIMP -TelephonyListener::EnumerateCallState(nsITelephonyCallInfo* aInfo) -{ - return HandleCallInfo(aInfo, false); -} - -NS_IMETHODIMP -TelephonyListener::NotifyError(uint32_t aServiceId, - int32_t aCallIndex, - const nsAString& aError) -{ - BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); - NS_ENSURE_TRUE(hfp, NS_ERROR_FAILURE); - - if (aCallIndex > 0) { - // In order to not miss any related call state transition. - // It's possible that 3G network signal lost for unknown reason. - // If a call is released abnormally, NotifyError() will be called, - // instead of CallStateChanged(). We need to reset the call array state - // via setting CALL_STATE_DISCONNECTED - hfp->HandleCallStateChanged(aCallIndex, - nsITelephonyService::CALL_STATE_DISCONNECTED, - aError, EmptyString(), false, false, true); - BT_WARNING("Reset the call state due to call transition ends abnormally"); - } - - BT_WARNING(NS_ConvertUTF16toUTF8(aError).get()); - return NS_OK; -} - -NS_IMETHODIMP -TelephonyListener::ConferenceCallStateChanged(uint16_t aCallState) -{ - return NS_OK; -} - -NS_IMETHODIMP -TelephonyListener::EnumerateCallStateComplete() -{ - return NS_OK; -} - -NS_IMETHODIMP -TelephonyListener::SupplementaryServiceNotification(uint32_t aServiceId, - int32_t aCallIndex, - uint16_t aNotification) -{ - return NS_OK; -} - -NS_IMETHODIMP -TelephonyListener::NotifyConferenceError(const nsAString& aName, - const nsAString& aMessage) -{ - BT_WARNING(NS_ConvertUTF16toUTF8(aName).get()); - BT_WARNING(NS_ConvertUTF16toUTF8(aMessage).get()); - - return NS_OK; -} - -NS_IMETHODIMP -TelephonyListener::NotifyCdmaCallWaiting(uint32_t aServiceId, - const nsAString& aNumber, - uint16_t aNumberPresentation, - const nsAString& aName, - uint16_t aNamePresentation) -{ - BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); - NS_ENSURE_TRUE(hfp, NS_ERROR_FAILURE); - - hfp->UpdateSecondNumber(aNumber); - - return NS_OK; -} - -bool -TelephonyListener::Listen(bool aStart) -{ - nsCOMPtr service = - do_GetService(TELEPHONY_SERVICE_CONTRACTID); - NS_ENSURE_TRUE(service, false); - - nsresult rv; - if (aStart) { - rv = service->RegisterListener(this); - } else { - rv = service->UnregisterListener(this); - } - - return NS_SUCCEEDED(rv); -} - -/** - * BluetoothRilListener - */ -BluetoothRilListener::BluetoothRilListener() -{ - nsCOMPtr service = - do_GetService(NS_MOBILE_CONNECTION_SERVICE_CONTRACTID); - NS_ENSURE_TRUE_VOID(service); - - // Query number of total clients (sim slots) - uint32_t numItems = 0; - if (NS_SUCCEEDED(service->GetNumItems(&numItems))) { - // Init MobileConnectionListener array and IccInfoListener - for (uint32_t i = 0; i < numItems; i++) { - mMobileConnListeners.AppendElement(new MobileConnectionListener(i)); - } - } - - mTelephonyListener = new TelephonyListener(); - mIccListener = new IccListener(); - mIccListener->SetOwner(this); - - // Probe for available client - SelectClient(); -} - -BluetoothRilListener::~BluetoothRilListener() -{ - mIccListener->SetOwner(nullptr); -} - -bool -BluetoothRilListener::Listen(bool aStart) -{ - NS_ENSURE_TRUE(ListenMobileConnAndIccInfo(aStart), false); - NS_ENSURE_TRUE(mTelephonyListener->Listen(aStart), false); - - return true; -} - -void -BluetoothRilListener::SelectClient() -{ - // Reset mClientId - mClientId = mMobileConnListeners.Length(); - - nsCOMPtr service = - do_GetService(NS_MOBILE_CONNECTION_SERVICE_CONTRACTID); - NS_ENSURE_TRUE_VOID(service); - - for (uint32_t i = 0; i < mMobileConnListeners.Length(); i++) { - nsCOMPtr connection; - service->GetItemByServiceId(i, getter_AddRefs(connection)); - if (!connection) { - BT_WARNING("%s: Failed to get mobile connection", __FUNCTION__); - continue; - } - - nsCOMPtr voiceInfo; - connection->GetVoice(getter_AddRefs(voiceInfo)); - if (!voiceInfo) { - BT_WARNING("%s: Failed to get voice connection info", __FUNCTION__); - continue; - } - - nsString regState; - voiceInfo->GetState(regState); - if (regState.EqualsLiteral("registered")) { - // Found available client - mClientId = i; - return; - } - } -} - -void -BluetoothRilListener::ServiceChanged(uint32_t aClientId, bool aRegistered) -{ - // Stop listening - ListenMobileConnAndIccInfo(false); - - /** - * aRegistered: - * - TRUE: service becomes registered. We were listening to all clients - * and one of them becomes available. Select it to listen. - * - FALSE: service becomes un-registered. The client we were listening - * becomes unavailable. Select another registered one to listen. - */ - if (aRegistered) { - mClientId = aClientId; - } else { - SelectClient(); - } - - // Restart listening - ListenMobileConnAndIccInfo(true); - - BT_LOGR("%d client %d. new mClientId %d", aRegistered, aClientId, - (mClientId < mMobileConnListeners.Length()) ? mClientId : -1); -} - -void -BluetoothRilListener::EnumerateCalls() -{ - nsCOMPtr service = - do_GetService(TELEPHONY_SERVICE_CONTRACTID); - NS_ENSURE_TRUE_VOID(service); - - nsCOMPtr listener( - do_QueryObject(mTelephonyListener)); - - service->EnumerateCalls(listener); -} - -bool -BluetoothRilListener::ListenMobileConnAndIccInfo(bool aStart) -{ - /** - * mClientId < number of total clients: - * The client with mClientId is available. Start/Stop listening - * mobile connection and icc info of this client only. - * - * mClientId >= number of total clients: - * All clients are unavailable. Start/Stop listening mobile - * connections of all clients. - */ - if (mClientId < mMobileConnListeners.Length()) { - NS_ENSURE_TRUE(mMobileConnListeners[mClientId]->Listen(aStart), false); - NS_ENSURE_TRUE(mIccListener->Listen(aStart), false); - } else { - for (uint32_t i = 0; i < mMobileConnListeners.Length(); i++) { - NS_ENSURE_TRUE(mMobileConnListeners[i]->Listen(aStart), false); - } - } - - return true; -} diff --git a/dom/bluetooth/bluetooth2/BluetoothRilListener.h b/dom/bluetooth/bluetooth2/BluetoothRilListener.h deleted file mode 100644 index 1768528d686..00000000000 --- a/dom/bluetooth/bluetooth2/BluetoothRilListener.h +++ /dev/null @@ -1,134 +0,0 @@ -/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_dom_bluetooth_bluetoothrillistener_h__ -#define mozilla_dom_bluetooth_bluetoothrillistener_h__ - -#include "BluetoothCommon.h" - -#include "nsAutoPtr.h" - -#include "nsIIccService.h" -#include "nsIMobileConnectionService.h" -#include "nsITelephonyCallInfo.h" -#include "nsITelephonyService.h" - -BEGIN_BLUETOOTH_NAMESPACE - -class BluetoothRilListener; - -class IccListener : public nsIIccListener -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSIICCLISTENER - - IccListener() { } - virtual ~IccListener() { } - - bool Listen(bool aStart); - void SetOwner(BluetoothRilListener *aOwner); - -private: - BluetoothRilListener* mOwner; -}; - -class MobileConnectionListener : public nsIMobileConnectionListener -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSIMOBILECONNECTIONLISTENER - - MobileConnectionListener(uint32_t aClientId) - : mClientId(aClientId) { } - virtual ~MobileConnectionListener() { } - - bool Listen(bool aStart); - -private: - uint32_t mClientId; -}; - -class TelephonyListener : public nsITelephonyListener -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSITELEPHONYLISTENER - - TelephonyListener() { } - virtual ~TelephonyListener() { } - - bool Listen(bool aStart); - -private: - nsresult HandleCallInfo(nsITelephonyCallInfo* aInfo, bool aSend); -}; - -class BluetoothRilListener -{ -public: - BluetoothRilListener(); - ~BluetoothRilListener(); - - /** - * Start/Stop listening. - * - * @param aStart [in] whether to start/stop listening - */ - bool Listen(bool aStart); - - /** - * Be informed that certain client's service has changed. - * - * @param aClientId [in] the client id with service change - * @param aRegistered [in] whether changed service is registered - */ - void ServiceChanged(uint32_t aClientId, bool aRegistered); - - /** - * Enumerate current calls. - */ - void EnumerateCalls(); - - /** - * The id of client that mobile connection and icc info listeners - * are listening to. - * - * mClientId equals to number of total clients (array length of - * mobile connection listeners) if there is no available client to listen. - */ - uint32_t mClientId; - -private: - /** - * Start/Stop listening of mobile connection and icc info. - * - * @param aStart [in] whether to start/stop listening - */ - bool ListenMobileConnAndIccInfo(bool aStart); - - /** - * Select available client to listen and assign mClientId. - * - * mClientId is assigned to number of total clients (array length of - * mobile connection listeners) if there is no available client to listen. - */ - void SelectClient(); - - /** - * Array of mobile connection listeners. - * - * The length equals to number of total clients. - */ - nsTArray > mMobileConnListeners; - - nsRefPtr mIccListener; - nsRefPtr mTelephonyListener; -}; - -END_BLUETOOTH_NAMESPACE - -#endif diff --git a/dom/bluetooth/moz.build b/dom/bluetooth/moz.build index 5787bef3081..fa251fa892f 100644 --- a/dom/bluetooth/moz.build +++ b/dom/bluetooth/moz.build @@ -18,6 +18,11 @@ if CONFIG['MOZ_B2G_BT']: 'BluetoothUuid.cpp' ] + if CONFIG['MOZ_B2G_RIL']: + SOURCES += [ + 'BluetoothRilListener.cpp' + ] + if CONFIG['MOZ_B2G_BT_API_V2']: SOURCES += [ 'bluetooth2/BluetoothAdapter.cpp', @@ -39,10 +44,6 @@ if CONFIG['MOZ_B2G_BT']: 'bluetooth2/ipc/BluetoothServiceChildProcess.cpp', 'bluetooth2/ObexBase.cpp' ] - if CONFIG['MOZ_B2G_RIL']: - SOURCES += [ - 'bluetooth2/BluetoothRilListener.cpp', - ] LOCAL_INCLUDES += [ 'bluetooth2', 'bluetooth2/ipc', @@ -62,10 +63,6 @@ if CONFIG['MOZ_B2G_BT']: 'bluetooth1/ipc/BluetoothServiceChildProcess.cpp', 'bluetooth1/ObexBase.cpp' ] - if CONFIG['MOZ_B2G_RIL']: - SOURCES += [ - 'bluetooth1/BluetoothRilListener.cpp', - ] LOCAL_INCLUDES += [ 'bluetooth1', 'bluetooth1/ipc',