michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "IccManager.h" michael@0: #include "mozilla/dom/MozIccManagerBinding.h" michael@0: #include "GeneratedEvents.h" michael@0: #include "Icc.h" michael@0: #include "IccListener.h" michael@0: #include "mozilla/dom/IccChangeEvent.h" michael@0: #include "mozilla/Preferences.h" michael@0: #include "nsIDOMIccInfo.h" michael@0: michael@0: using namespace mozilla::dom; michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_CLASS(IccManager) michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IccManager, michael@0: DOMEventTargetHelper) michael@0: NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IccManager, michael@0: DOMEventTargetHelper) michael@0: NS_IMPL_CYCLE_COLLECTION_UNLINK_END michael@0: michael@0: // QueryInterface implementation for IccManager michael@0: NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IccManager) michael@0: NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) michael@0: michael@0: NS_IMPL_ADDREF_INHERITED(IccManager, DOMEventTargetHelper) michael@0: NS_IMPL_RELEASE_INHERITED(IccManager, DOMEventTargetHelper) michael@0: michael@0: IccManager::IccManager(nsPIDOMWindow* aWindow) michael@0: : DOMEventTargetHelper(aWindow) michael@0: { michael@0: uint32_t numberOfServices = michael@0: mozilla::Preferences::GetUint("ril.numRadioInterfaces", 1); michael@0: michael@0: for (uint32_t i = 0; i < numberOfServices; i++) { michael@0: nsRefPtr iccListener = new IccListener(this, i); michael@0: mIccListeners.AppendElement(iccListener); michael@0: } michael@0: } michael@0: michael@0: IccManager::~IccManager() michael@0: { michael@0: Shutdown(); michael@0: } michael@0: michael@0: JSObject* michael@0: IccManager::WrapObject(JSContext* aCx) michael@0: { michael@0: return MozIccManagerBinding::Wrap(aCx, this); michael@0: } michael@0: michael@0: void michael@0: IccManager::Shutdown() michael@0: { michael@0: for (uint32_t i = 0; i < mIccListeners.Length(); i++) { michael@0: mIccListeners[i]->Shutdown(); michael@0: mIccListeners[i] = nullptr; michael@0: } michael@0: mIccListeners.Clear(); michael@0: } michael@0: michael@0: nsresult michael@0: IccManager::NotifyIccAdd(const nsAString& aIccId) michael@0: { michael@0: MozIccManagerBinding::ClearCachedIccIdsValue(this); michael@0: michael@0: IccChangeEventInit init; michael@0: init.mBubbles = false; michael@0: init.mCancelable = false; michael@0: init.mIccId = aIccId; michael@0: michael@0: nsRefPtr event = michael@0: IccChangeEvent::Constructor(this, NS_LITERAL_STRING("iccdetected"), init); michael@0: michael@0: return DispatchTrustedEvent(event); michael@0: } michael@0: michael@0: nsresult michael@0: IccManager::NotifyIccRemove(const nsAString& aIccId) michael@0: { michael@0: MozIccManagerBinding::ClearCachedIccIdsValue(this); michael@0: michael@0: IccChangeEventInit init; michael@0: init.mBubbles = false; michael@0: init.mCancelable = false; michael@0: init.mIccId = aIccId; michael@0: michael@0: nsRefPtr event = michael@0: IccChangeEvent::Constructor(this, NS_LITERAL_STRING("iccundetected"), init); michael@0: michael@0: return DispatchTrustedEvent(event); michael@0: } michael@0: michael@0: // MozIccManager michael@0: michael@0: void michael@0: IccManager::GetIccIds(nsTArray& aIccIds) michael@0: { michael@0: nsTArray>::size_type i; michael@0: for (i = 0; i < mIccListeners.Length(); ++i) { michael@0: nsRefPtr icc = mIccListeners[i]->GetIcc(); michael@0: if (icc) { michael@0: aIccIds.AppendElement(icc->GetIccId()); michael@0: } michael@0: } michael@0: } michael@0: michael@0: already_AddRefed michael@0: IccManager::GetIccById(const nsAString& aIccId) const michael@0: { michael@0: nsTArray>::size_type i; michael@0: for (i = 0; i < mIccListeners.Length(); ++i) { michael@0: nsRefPtr icc = mIccListeners[i]->GetIcc(); michael@0: if (icc && aIccId == icc->GetIccId()) { michael@0: return icc.forget(); michael@0: } michael@0: } michael@0: return nullptr; michael@0: }