Bumping manifests a=b2g-bump
[gecko.git] / dom / icc / Icc.cpp
blob7656fedfc337461cd356bab7349c011801971705
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "mozilla/dom/Icc.h"
7 #include "mozilla/dom/DOMRequest.h"
8 #include "mozilla/dom/IccInfo.h"
9 #include "mozilla/dom/MozStkCommandEvent.h"
10 #include "mozilla/dom/Promise.h"
11 #include "mozilla/dom/ScriptSettings.h"
12 #include "nsIIccInfo.h"
13 #include "nsIIccProvider.h"
14 #include "nsJSON.h"
15 #include "nsRadioInterfaceLayer.h"
16 #include "nsServiceManagerUtils.h"
18 namespace mozilla {
19 namespace dom {
21 namespace {
23 bool
24 IsPukCardLockType(IccLockType aLockType)
26 switch(aLockType) {
27 case IccLockType::Puk:
28 case IccLockType::Puk2:
29 case IccLockType::NckPuk:
30 case IccLockType::Nck1Puk:
31 case IccLockType::Nck2Puk:
32 case IccLockType::HnckPuk:
33 case IccLockType::CckPuk:
34 case IccLockType::SpckPuk:
35 case IccLockType::RcckPuk:
36 case IccLockType::RspckPuk:
37 case IccLockType::NsckPuk:
38 case IccLockType::PckPuk:
39 return true;
40 default:
41 return false;
45 } // anonymous namespace
47 NS_IMPL_CYCLE_COLLECTION_INHERITED(Icc, DOMEventTargetHelper, mIccInfo)
49 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(Icc)
50 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
52 NS_IMPL_ADDREF_INHERITED(Icc, DOMEventTargetHelper)
53 NS_IMPL_RELEASE_INHERITED(Icc, DOMEventTargetHelper)
55 Icc::Icc(nsPIDOMWindow* aWindow, long aClientId, nsIIccInfo* aIccInfo)
56 : mLive(true)
57 , mClientId(aClientId)
59 BindToOwner(aWindow);
61 mProvider = do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
63 if (aIccInfo) {
64 aIccInfo->GetIccid(mIccId);
65 UpdateIccInfo(aIccInfo);
68 // Not being able to acquire the provider isn't fatal since we check
69 // for it explicitly below.
70 if (!mProvider) {
71 NS_WARNING("Could not acquire nsIIccProvider!");
75 void
76 Icc::Shutdown()
78 mIccInfo.SetNull();
79 mProvider = nullptr;
80 mLive = false;
83 nsresult
84 Icc::NotifyEvent(const nsAString& aName)
86 return DispatchTrustedEvent(aName);
89 nsresult
90 Icc::NotifyStkEvent(const nsAString& aName, const nsAString& aMessage)
92 AutoJSAPI jsapi;
93 if (NS_WARN_IF(!jsapi.InitWithLegacyErrorReporting(GetOwner()))) {
94 return NS_ERROR_UNEXPECTED;
96 JSContext* cx = jsapi.cx();
97 JS::Rooted<JS::Value> value(cx);
99 if (!aMessage.IsEmpty()) {
100 nsCOMPtr<nsIJSON> json(new nsJSON());
101 nsresult rv = json->DecodeToJSVal(aMessage, cx, &value);
102 NS_ENSURE_SUCCESS(rv, rv);
103 } else {
104 value = JS::NullValue();
107 MozStkCommandEventInit init;
108 init.mBubbles = false;
109 init.mCancelable = false;
110 init.mCommand = value;
112 nsRefPtr<MozStkCommandEvent> event =
113 MozStkCommandEvent::Constructor(this, aName, init);
115 return DispatchTrustedEvent(event);
118 void
119 Icc::UpdateIccInfo(nsIIccInfo* aIccInfo)
121 if (!aIccInfo) {
122 mIccInfo.SetNull();
123 return;
126 nsCOMPtr<nsIGsmIccInfo> gsmIccInfo(do_QueryInterface(aIccInfo));
127 if (gsmIccInfo) {
128 if (mIccInfo.IsNull() || !mIccInfo.Value().IsMozGsmIccInfo()) {
129 mIccInfo.SetValue().SetAsMozGsmIccInfo() = new GsmIccInfo(GetOwner());
131 mIccInfo.Value().GetAsMozGsmIccInfo().get()->Update(gsmIccInfo);
132 return;
135 nsCOMPtr<nsICdmaIccInfo> cdmaIccInfo(do_QueryInterface(aIccInfo));
136 if (cdmaIccInfo) {
137 if (mIccInfo.IsNull() || !mIccInfo.Value().IsMozCdmaIccInfo()) {
138 mIccInfo.SetValue().SetAsMozCdmaIccInfo() = new CdmaIccInfo(GetOwner());
140 mIccInfo.Value().GetAsMozCdmaIccInfo().get()->Update(cdmaIccInfo);
141 return;
144 if (mIccInfo.IsNull() || !mIccInfo.Value().IsMozIccInfo()) {
145 mIccInfo.SetValue().SetAsMozIccInfo() = new IccInfo(GetOwner());
147 mIccInfo.Value().GetAsMozIccInfo().get()->Update(aIccInfo);
150 // WrapperCache
152 JSObject*
153 Icc::WrapObject(JSContext* aCx)
155 return MozIccBinding::Wrap(aCx, this);
158 // MozIcc WebIDL
160 void
161 Icc::GetIccInfo(Nullable<OwningMozIccInfoOrMozGsmIccInfoOrMozCdmaIccInfo>& aIccInfo) const
163 aIccInfo = mIccInfo;
166 Nullable<IccCardState>
167 Icc::GetCardState() const
169 Nullable<IccCardState> result;
171 uint32_t cardState = nsIIccProvider::CARD_STATE_UNDETECTED;
172 if (mProvider &&
173 NS_SUCCEEDED(mProvider->GetCardState(mClientId, &cardState)) &&
174 cardState != nsIIccProvider::CARD_STATE_UNDETECTED) {
175 MOZ_ASSERT(cardState < static_cast<uint32_t>(IccCardState::EndGuard_));
176 result.SetValue(static_cast<IccCardState>(cardState));
179 return result;
182 void
183 Icc::SendStkResponse(const JSContext* aCx, JS::Handle<JS::Value> aCommand,
184 JS::Handle<JS::Value> aResponse, ErrorResult& aRv)
186 if (!mProvider) {
187 aRv.Throw(NS_ERROR_FAILURE);
188 return;
191 nsresult rv = mProvider->SendStkResponse(mClientId, GetOwner(), aCommand,
192 aResponse);
193 if (NS_FAILED(rv)) {
194 aRv.Throw(rv);
198 void
199 Icc::SendStkMenuSelection(uint16_t aItemIdentifier, bool aHelpRequested,
200 ErrorResult& aRv)
202 if (!mProvider) {
203 aRv.Throw(NS_ERROR_FAILURE);
204 return;
207 nsresult rv = mProvider->SendStkMenuSelection(mClientId,
208 GetOwner(),
209 aItemIdentifier,
210 aHelpRequested);
211 if (NS_FAILED(rv)) {
212 aRv.Throw(rv);
216 void
217 Icc::SendStkTimerExpiration(const JSContext* aCx, JS::Handle<JS::Value> aTimer,
218 ErrorResult& aRv)
220 if (!mProvider) {
221 aRv.Throw(NS_ERROR_FAILURE);
222 return;
225 nsresult rv = mProvider->SendStkTimerExpiration(mClientId, GetOwner(),
226 aTimer);
227 if (NS_FAILED(rv)) {
228 aRv.Throw(rv);
232 void
233 Icc::SendStkEventDownload(const JSContext* aCx, JS::Handle<JS::Value> aEvent,
234 ErrorResult& aRv)
236 if (!mProvider) {
237 aRv.Throw(NS_ERROR_FAILURE);
238 return;
241 nsresult rv = mProvider->SendStkEventDownload(mClientId, GetOwner(), aEvent);
242 if (NS_FAILED(rv)) {
243 aRv.Throw(rv);
247 already_AddRefed<DOMRequest>
248 Icc::GetCardLock(IccLockType aLockType, ErrorResult& aRv)
250 if (!mProvider) {
251 aRv.Throw(NS_ERROR_FAILURE);
252 return nullptr;
255 nsRefPtr<nsIDOMDOMRequest> request;
256 nsresult rv = mProvider->GetCardLockEnabled(mClientId, GetOwner(),
257 static_cast<uint32_t>(aLockType),
258 getter_AddRefs(request));
259 if (NS_FAILED(rv)) {
260 aRv.Throw(rv);
261 return nullptr;
264 return request.forget().downcast<DOMRequest>();
267 already_AddRefed<DOMRequest>
268 Icc::UnlockCardLock(const IccUnlockCardLockOptions& aOptions, ErrorResult& aRv)
270 if (!mProvider) {
271 aRv.Throw(NS_ERROR_FAILURE);
272 return nullptr;
275 nsRefPtr<nsIDOMDOMRequest> request;
276 const nsString& password = IsPukCardLockType(aOptions.mLockType)
277 ? aOptions.mPuk : aOptions.mPin;
278 nsresult rv = mProvider->UnlockCardLock(mClientId, GetOwner(),
279 static_cast<uint32_t>(aOptions.mLockType),
280 password, aOptions.mNewPin,
281 getter_AddRefs(request));
282 if (NS_FAILED(rv)) {
283 aRv.Throw(rv);
284 return nullptr;
287 return request.forget().downcast<DOMRequest>();
290 already_AddRefed<DOMRequest>
291 Icc::SetCardLock(const IccSetCardLockOptions& aOptions, ErrorResult& aRv)
293 if (!mProvider) {
294 aRv.Throw(NS_ERROR_FAILURE);
295 return nullptr;
298 nsresult rv;
299 nsRefPtr<nsIDOMDOMRequest> request;
301 if (aOptions.mEnabled.WasPassed()) {
302 // Enable card lock.
303 const nsString& password = (aOptions.mLockType == IccLockType::Fdn) ?
304 aOptions.mPin2 : aOptions.mPin;
306 rv = mProvider->SetCardLockEnabled(mClientId, GetOwner(),
307 static_cast<uint32_t>(aOptions.mLockType),
308 password, aOptions.mEnabled.Value(),
309 getter_AddRefs(request));
310 } else {
311 // Change card lock password.
312 rv = mProvider->ChangeCardLockPassword(mClientId, GetOwner(),
313 static_cast<uint32_t>(aOptions.mLockType),
314 aOptions.mPin, aOptions.mNewPin,
315 getter_AddRefs(request));
318 if (NS_FAILED(rv)) {
319 aRv.Throw(rv);
320 return nullptr;
323 return request.forget().downcast<DOMRequest>();
326 already_AddRefed<DOMRequest>
327 Icc::GetCardLockRetryCount(IccLockType aLockType, ErrorResult& aRv)
329 if (!mProvider) {
330 aRv.Throw(NS_ERROR_FAILURE);
331 return nullptr;
334 nsRefPtr<nsIDOMDOMRequest> request;
335 nsresult rv = mProvider->GetCardLockRetryCount(mClientId, GetOwner(),
336 static_cast<uint32_t>(aLockType),
337 getter_AddRefs(request));
338 if (NS_FAILED(rv)) {
339 aRv.Throw(rv);
340 return nullptr;
343 return request.forget().downcast<DOMRequest>();
346 already_AddRefed<DOMRequest>
347 Icc::ReadContacts(IccContactType aContactType, ErrorResult& aRv)
349 if (!mProvider) {
350 aRv.Throw(NS_ERROR_FAILURE);
351 return nullptr;
354 nsRefPtr<nsIDOMDOMRequest> request;
355 nsresult rv = mProvider->ReadContacts(mClientId, GetOwner(),
356 static_cast<uint32_t>(aContactType),
357 getter_AddRefs(request));
358 if (NS_FAILED(rv)) {
359 aRv.Throw(rv);
360 return nullptr;
363 return request.forget().downcast<DOMRequest>();
366 already_AddRefed<DOMRequest>
367 Icc::UpdateContact(const JSContext* aCx, IccContactType aContactType,
368 JS::Handle<JS::Value> aContact, const nsAString& aPin2,
369 ErrorResult& aRv)
371 if (!mProvider) {
372 aRv.Throw(NS_ERROR_FAILURE);
373 return nullptr;
376 nsRefPtr<nsIDOMDOMRequest> request;
377 nsresult rv = mProvider->UpdateContact(mClientId, GetOwner(),
378 static_cast<uint32_t>(aContactType),
379 aContact, aPin2,
380 getter_AddRefs(request));
381 if (NS_FAILED(rv)) {
382 aRv.Throw(rv);
383 return nullptr;
386 return request.forget().downcast<DOMRequest>();
389 already_AddRefed<DOMRequest>
390 Icc::MatchMvno(IccMvnoType aMvnoType, const nsAString& aMvnoData,
391 ErrorResult& aRv)
393 if (!mProvider) {
394 aRv.Throw(NS_ERROR_FAILURE);
395 return nullptr;
398 nsRefPtr<nsIDOMDOMRequest> request;
399 nsresult rv = mProvider->MatchMvno(mClientId, GetOwner(),
400 static_cast<uint32_t>(aMvnoType),
401 aMvnoData, getter_AddRefs(request));
402 if (NS_FAILED(rv)) {
403 aRv.Throw(rv);
404 return nullptr;
407 return request.forget().downcast<DOMRequest>();
410 already_AddRefed<Promise>
411 Icc::GetServiceState(IccService aService, ErrorResult& aRv)
413 if (!mProvider) {
414 aRv.Throw(NS_ERROR_FAILURE);
415 return nullptr;
418 nsCOMPtr<nsISupports> supports;
419 nsresult rv = mProvider->GetServiceState(mClientId, GetOwner(),
420 static_cast<uint32_t>(aService),
421 getter_AddRefs(supports));
422 if (NS_FAILED(rv)) {
423 aRv.Throw(rv);
424 return nullptr;
427 nsCOMPtr<Promise> promise = do_QueryInterface(supports);
428 return promise.forget();
431 } // namespace dom
432 } // namespace mozilla