Bumping gaia.json for 2 gaia revision(s) a=gaia-bump
[gecko.git] / dom / icc / Icc.cpp
blobd99bc7948fd9a19434a8c8bb4dd1089c4a470b01
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 "Icc.h"
7 #include "mozilla/dom/MozIccBinding.h"
8 #include "mozilla/dom/MozStkCommandEvent.h"
9 #include "mozilla/dom/DOMRequest.h"
10 #include "mozilla/dom/ScriptSettings.h"
11 #include "nsIDOMIccInfo.h"
12 #include "nsJSON.h"
13 #include "nsRadioInterfaceLayer.h"
14 #include "nsServiceManagerUtils.h"
16 using namespace mozilla::dom;
18 Icc::Icc(nsPIDOMWindow* aWindow, long aClientId, const nsAString& aIccId)
19 : mLive(true)
20 , mClientId(aClientId)
21 , mIccId(aIccId)
23 SetIsDOMBinding();
24 BindToOwner(aWindow);
26 mProvider = do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
28 // Not being able to acquire the provider isn't fatal since we check
29 // for it explicitly below.
30 if (!mProvider) {
31 NS_WARNING("Could not acquire nsIIccProvider!");
35 void
36 Icc::Shutdown()
38 mProvider = nullptr;
39 mLive = false;
42 nsresult
43 Icc::NotifyEvent(const nsAString& aName)
45 return DispatchTrustedEvent(aName);
48 nsresult
49 Icc::NotifyStkEvent(const nsAString& aName, const nsAString& aMessage)
51 AutoJSAPI jsapi;
52 if (NS_WARN_IF(!jsapi.InitWithLegacyErrorReporting(GetOwner()))) {
53 return NS_ERROR_UNEXPECTED;
55 JSContext* cx = jsapi.cx();
56 JS::Rooted<JS::Value> value(cx);
58 if (!aMessage.IsEmpty()) {
59 nsCOMPtr<nsIJSON> json(new nsJSON());
60 nsresult rv = json->DecodeToJSVal(aMessage, cx, &value);
61 NS_ENSURE_SUCCESS(rv, rv);
62 } else {
63 value = JS::NullValue();
66 MozStkCommandEventInit init;
67 init.mBubbles = false;
68 init.mCancelable = false;
69 init.mCommand = value;
71 nsRefPtr<MozStkCommandEvent> event =
72 MozStkCommandEvent::Constructor(this, aName, init);
74 return DispatchTrustedEvent(event);
77 // WrapperCache
79 JSObject*
80 Icc::WrapObject(JSContext* aCx)
82 return MozIccBinding::Wrap(aCx, this);
85 // MozIcc WebIDL
87 already_AddRefed<nsIDOMMozIccInfo>
88 Icc::GetIccInfo() const
90 if (!mProvider) {
91 return nullptr;
94 nsCOMPtr<nsIDOMMozIccInfo> iccInfo;
95 nsresult rv = mProvider->GetIccInfo(mClientId, getter_AddRefs(iccInfo));
96 if (NS_FAILED(rv)) {
97 return nullptr;
100 return iccInfo.forget();
103 void
104 Icc::GetCardState(nsString& aCardState) const
106 aCardState.SetIsVoid(true);
108 if (!mProvider) {
109 return;
112 nsresult rv = mProvider->GetCardState(mClientId, aCardState);
113 if (NS_FAILED(rv)) {
114 aCardState.SetIsVoid(true);
118 void
119 Icc::SendStkResponse(const JSContext* aCx, JS::Handle<JS::Value> aCommand,
120 JS::Handle<JS::Value> aResponse, ErrorResult& aRv)
122 if (!mProvider) {
123 aRv.Throw(NS_ERROR_FAILURE);
124 return;
127 nsresult rv = mProvider->SendStkResponse(mClientId, GetOwner(), aCommand,
128 aResponse);
129 if (NS_FAILED(rv)) {
130 aRv.Throw(rv);
134 void
135 Icc::SendStkMenuSelection(uint16_t aItemIdentifier, bool aHelpRequested,
136 ErrorResult& aRv)
138 if (!mProvider) {
139 aRv.Throw(NS_ERROR_FAILURE);
140 return;
143 nsresult rv = mProvider->SendStkMenuSelection(mClientId,
144 GetOwner(),
145 aItemIdentifier,
146 aHelpRequested);
147 if (NS_FAILED(rv)) {
148 aRv.Throw(rv);
152 void
153 Icc::SendStkTimerExpiration(const JSContext* aCx, JS::Handle<JS::Value> aTimer,
154 ErrorResult& aRv)
156 if (!mProvider) {
157 aRv.Throw(NS_ERROR_FAILURE);
158 return;
161 nsresult rv = mProvider->SendStkTimerExpiration(mClientId, GetOwner(),
162 aTimer);
163 if (NS_FAILED(rv)) {
164 aRv.Throw(rv);
168 void
169 Icc::SendStkEventDownload(const JSContext* aCx, JS::Handle<JS::Value> aEvent,
170 ErrorResult& aRv)
172 if (!mProvider) {
173 aRv.Throw(NS_ERROR_FAILURE);
174 return;
177 nsresult rv = mProvider->SendStkEventDownload(mClientId, GetOwner(), aEvent);
178 if (NS_FAILED(rv)) {
179 aRv.Throw(rv);
183 already_AddRefed<DOMRequest>
184 Icc::GetCardLock(const nsAString& aLockType, ErrorResult& aRv)
186 if (!mProvider) {
187 aRv.Throw(NS_ERROR_FAILURE);
188 return nullptr;
191 nsRefPtr<nsIDOMDOMRequest> request;
192 nsresult rv = mProvider->GetCardLockState(mClientId, GetOwner(), aLockType,
193 getter_AddRefs(request));
194 if (NS_FAILED(rv)) {
195 aRv.Throw(rv);
196 return nullptr;
199 return request.forget().downcast<DOMRequest>();
202 already_AddRefed<DOMRequest>
203 Icc::UnlockCardLock(const JSContext* aCx, JS::Handle<JS::Value> aInfo,
204 ErrorResult& aRv)
206 if (!mProvider) {
207 aRv.Throw(NS_ERROR_FAILURE);
208 return nullptr;
211 nsRefPtr<nsIDOMDOMRequest> request;
212 nsresult rv = mProvider->UnlockCardLock(mClientId, GetOwner(), aInfo,
213 getter_AddRefs(request));
214 if (NS_FAILED(rv)) {
215 aRv.Throw(rv);
216 return nullptr;
219 return request.forget().downcast<DOMRequest>();
222 already_AddRefed<DOMRequest>
223 Icc::SetCardLock(const JSContext* aCx, JS::Handle<JS::Value> aInfo,
224 ErrorResult& aRv)
226 if (!mProvider) {
227 aRv.Throw(NS_ERROR_FAILURE);
228 return nullptr;
231 nsRefPtr<nsIDOMDOMRequest> request;
232 nsresult rv = mProvider->SetCardLock(mClientId, GetOwner(), aInfo,
233 getter_AddRefs(request));
234 if (NS_FAILED(rv)) {
235 aRv.Throw(rv);
236 return nullptr;
239 return request.forget().downcast<DOMRequest>();
242 already_AddRefed<DOMRequest>
243 Icc::GetCardLockRetryCount(const nsAString& aLockType, ErrorResult& aRv)
245 if (!mProvider) {
246 aRv.Throw(NS_ERROR_FAILURE);
247 return nullptr;
250 nsRefPtr<nsIDOMDOMRequest> request;
251 nsresult rv = mProvider->GetCardLockRetryCount(mClientId,
252 GetOwner(),
253 aLockType,
254 getter_AddRefs(request));
255 if (NS_FAILED(rv)) {
256 aRv.Throw(rv);
257 return nullptr;
260 return request.forget().downcast<DOMRequest>();
263 already_AddRefed<DOMRequest>
264 Icc::ReadContacts(const nsAString& aContactType, ErrorResult& aRv)
266 if (!mProvider) {
267 aRv.Throw(NS_ERROR_FAILURE);
268 return nullptr;
271 nsRefPtr<nsIDOMDOMRequest> request;
272 nsresult rv = mProvider->ReadContacts(mClientId, GetOwner(), aContactType,
273 getter_AddRefs(request));
274 if (NS_FAILED(rv)) {
275 aRv.Throw(rv);
276 return nullptr;
279 return request.forget().downcast<DOMRequest>();
282 already_AddRefed<DOMRequest>
283 Icc::UpdateContact(const JSContext* aCx, const nsAString& aContactType,
284 JS::Handle<JS::Value> aContact, const nsAString& aPin2,
285 ErrorResult& aRv)
287 if (!mProvider) {
288 aRv.Throw(NS_ERROR_FAILURE);
289 return nullptr;
292 nsRefPtr<nsIDOMDOMRequest> request;
293 nsresult rv = mProvider->UpdateContact(mClientId, GetOwner(), aContactType,
294 aContact, aPin2,
295 getter_AddRefs(request));
296 if (NS_FAILED(rv)) {
297 aRv.Throw(rv);
298 return nullptr;
301 return request.forget().downcast<DOMRequest>();
304 already_AddRefed<DOMRequest>
305 Icc::IccOpenChannel(const nsAString& aAid, ErrorResult& aRv)
307 if (!mProvider) {
308 aRv.Throw(NS_ERROR_FAILURE);
309 return nullptr;
312 nsRefPtr<nsIDOMDOMRequest> request;
313 nsresult rv = mProvider->IccOpenChannel(mClientId, GetOwner(), aAid,
314 getter_AddRefs(request));
315 if (NS_FAILED(rv)) {
316 aRv.Throw(rv);
317 return nullptr;
320 return request.forget().downcast<DOMRequest>();
323 already_AddRefed<DOMRequest>
324 Icc::IccExchangeAPDU(const JSContext* aCx, int32_t aChannel,
325 JS::Handle<JS::Value> aApdu, ErrorResult& aRv)
327 if (!mProvider) {
328 aRv.Throw(NS_ERROR_FAILURE);
329 return nullptr;
332 nsRefPtr<nsIDOMDOMRequest> request;
333 nsresult rv = mProvider->IccExchangeAPDU(mClientId, GetOwner(), aChannel,
334 aApdu, getter_AddRefs(request));
335 if (NS_FAILED(rv)) {
336 aRv.Throw(rv);
337 return nullptr;
340 return request.forget().downcast<DOMRequest>();
343 already_AddRefed<DOMRequest>
344 Icc::IccCloseChannel(int32_t aChannel, ErrorResult& aRv)
346 if (!mProvider) {
347 aRv.Throw(NS_ERROR_FAILURE);
348 return nullptr;
351 nsRefPtr<nsIDOMDOMRequest> request;
352 nsresult rv = mProvider->IccCloseChannel(mClientId, GetOwner(), aChannel,
353 getter_AddRefs(request));
354 if (NS_FAILED(rv)) {
355 aRv.Throw(rv);
356 return nullptr;
359 return request.forget().downcast<DOMRequest>();
362 already_AddRefed<DOMRequest>
363 Icc::MatchMvno(const nsAString& aMvnoType,
364 const nsAString& aMvnoData,
365 ErrorResult& aRv)
367 if (!mProvider) {
368 aRv.Throw(NS_ERROR_FAILURE);
369 return nullptr;
372 nsRefPtr<nsIDOMDOMRequest> request;
373 nsresult rv = mProvider->MatchMvno(mClientId, GetOwner(),
374 aMvnoType, aMvnoData,
375 getter_AddRefs(request));
376 if (NS_FAILED(rv)) {
377 aRv.Throw(rv);
378 return nullptr;
381 return request.forget().downcast<DOMRequest>();