dom/icc/src/Icc.cpp

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:b366ed879050
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/. */
4
5 #include "Icc.h"
6
7 #include "mozilla/dom/MozIccBinding.h"
8 #include "mozilla/dom/MozStkCommandEvent.h"
9 #include "nsIDOMDOMRequest.h"
10 #include "nsIDOMIccInfo.h"
11 #include "nsJSON.h"
12 #include "nsRadioInterfaceLayer.h"
13 #include "nsServiceManagerUtils.h"
14
15 using namespace mozilla::dom;
16
17 Icc::Icc(nsPIDOMWindow* aWindow, long aClientId, const nsAString& aIccId)
18 : mLive(true)
19 , mClientId(aClientId)
20 , mIccId(aIccId)
21 {
22 SetIsDOMBinding();
23 BindToOwner(aWindow);
24
25 mProvider = do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
26
27 // Not being able to acquire the provider isn't fatal since we check
28 // for it explicitly below.
29 if (!mProvider) {
30 NS_WARNING("Could not acquire nsIIccProvider!");
31 }
32 }
33
34 void
35 Icc::Shutdown()
36 {
37 mProvider = nullptr;
38 mLive = false;
39 }
40
41 nsresult
42 Icc::NotifyEvent(const nsAString& aName)
43 {
44 return DispatchTrustedEvent(aName);
45 }
46
47 nsresult
48 Icc::NotifyStkEvent(const nsAString& aName, const nsAString& aMessage)
49 {
50 nsresult rv;
51 nsIScriptContext* sc = GetContextForEventHandlers(&rv);
52 NS_ENSURE_SUCCESS(rv, rv);
53
54 AutoPushJSContext cx(sc->GetNativeContext());
55 JS::Rooted<JS::Value> value(cx);
56
57 if (!aMessage.IsEmpty()) {
58 nsCOMPtr<nsIJSON> json(new nsJSON());
59 nsresult rv = json->DecodeToJSVal(aMessage, cx, &value);
60 NS_ENSURE_SUCCESS(rv, rv);
61 } else {
62 value = JS::NullValue();
63 }
64
65 MozStkCommandEventInit init;
66 init.mBubbles = false;
67 init.mCancelable = false;
68 init.mCommand = value;
69
70 nsRefPtr<MozStkCommandEvent> event =
71 MozStkCommandEvent::Constructor(this, aName, init);
72
73 return DispatchTrustedEvent(event);
74 }
75
76 // WrapperCache
77
78 JSObject*
79 Icc::WrapObject(JSContext* aCx)
80 {
81 return MozIccBinding::Wrap(aCx, this);
82 }
83
84 // MozIcc WebIDL
85
86 already_AddRefed<nsIDOMMozIccInfo>
87 Icc::GetIccInfo() const
88 {
89 if (!mProvider) {
90 return nullptr;
91 }
92
93 nsCOMPtr<nsIDOMMozIccInfo> iccInfo;
94 nsresult rv = mProvider->GetIccInfo(mClientId, getter_AddRefs(iccInfo));
95 if (NS_FAILED(rv)) {
96 return nullptr;
97 }
98
99 return iccInfo.forget();
100 }
101
102 void
103 Icc::GetCardState(nsString& aCardState) const
104 {
105 aCardState.SetIsVoid(true);
106
107 if (!mProvider) {
108 return;
109 }
110
111 nsresult rv = mProvider->GetCardState(mClientId, aCardState);
112 if (NS_FAILED(rv)) {
113 aCardState.SetIsVoid(true);
114 }
115 }
116
117 void
118 Icc::SendStkResponse(const JSContext* aCx, JS::Handle<JS::Value> aCommand,
119 JS::Handle<JS::Value> aResponse, ErrorResult& aRv)
120 {
121 if (!mProvider) {
122 aRv.Throw(NS_ERROR_FAILURE);
123 return;
124 }
125
126 nsresult rv = mProvider->SendStkResponse(mClientId, GetOwner(), aCommand,
127 aResponse);
128 if (NS_FAILED(rv)) {
129 aRv.Throw(rv);
130 }
131 }
132
133 void
134 Icc::SendStkMenuSelection(uint16_t aItemIdentifier, bool aHelpRequested,
135 ErrorResult& aRv)
136 {
137 if (!mProvider) {
138 aRv.Throw(NS_ERROR_FAILURE);
139 return;
140 }
141
142 nsresult rv = mProvider->SendStkMenuSelection(mClientId,
143 GetOwner(),
144 aItemIdentifier,
145 aHelpRequested);
146 if (NS_FAILED(rv)) {
147 aRv.Throw(rv);
148 }
149 }
150
151 void
152 Icc::SendStkTimerExpiration(const JSContext* aCx, JS::Handle<JS::Value> aTimer,
153 ErrorResult& aRv)
154 {
155 if (!mProvider) {
156 aRv.Throw(NS_ERROR_FAILURE);
157 return;
158 }
159
160 nsresult rv = mProvider->SendStkTimerExpiration(mClientId, GetOwner(),
161 aTimer);
162 if (NS_FAILED(rv)) {
163 aRv.Throw(rv);
164 }
165 }
166
167 void
168 Icc::SendStkEventDownload(const JSContext* aCx, JS::Handle<JS::Value> aEvent,
169 ErrorResult& aRv)
170 {
171 if (!mProvider) {
172 aRv.Throw(NS_ERROR_FAILURE);
173 return;
174 }
175
176 nsresult rv = mProvider->SendStkEventDownload(mClientId, GetOwner(), aEvent);
177 if (NS_FAILED(rv)) {
178 aRv.Throw(rv);
179 }
180 }
181
182 already_AddRefed<nsISupports>
183 Icc::GetCardLock(const nsAString& aLockType, ErrorResult& aRv)
184 {
185 if (!mProvider) {
186 aRv.Throw(NS_ERROR_FAILURE);
187 return nullptr;
188 }
189
190 nsRefPtr<nsIDOMDOMRequest> request;
191 nsresult rv = mProvider->GetCardLockState(mClientId, GetOwner(), aLockType,
192 getter_AddRefs(request));
193 if (NS_FAILED(rv)) {
194 aRv.Throw(rv);
195 return nullptr;
196 }
197
198 return request.forget();
199 }
200
201 already_AddRefed<nsISupports>
202 Icc::UnlockCardLock(const JSContext* aCx, JS::Handle<JS::Value> aInfo,
203 ErrorResult& aRv)
204 {
205 if (!mProvider) {
206 aRv.Throw(NS_ERROR_FAILURE);
207 return nullptr;
208 }
209
210 nsRefPtr<nsIDOMDOMRequest> request;
211 nsresult rv = mProvider->UnlockCardLock(mClientId, GetOwner(), aInfo,
212 getter_AddRefs(request));
213 if (NS_FAILED(rv)) {
214 aRv.Throw(rv);
215 return nullptr;
216 }
217
218 return request.forget();
219 }
220
221 already_AddRefed<nsISupports>
222 Icc::SetCardLock(const JSContext* aCx, JS::Handle<JS::Value> aInfo,
223 ErrorResult& aRv)
224 {
225 if (!mProvider) {
226 aRv.Throw(NS_ERROR_FAILURE);
227 return nullptr;
228 }
229
230 nsRefPtr<nsIDOMDOMRequest> request;
231 nsresult rv = mProvider->SetCardLock(mClientId, GetOwner(), aInfo,
232 getter_AddRefs(request));
233 if (NS_FAILED(rv)) {
234 aRv.Throw(rv);
235 return nullptr;
236 }
237
238 return request.forget();
239 }
240
241 already_AddRefed<nsISupports>
242 Icc::GetCardLockRetryCount(const nsAString& aLockType, ErrorResult& aRv)
243 {
244 if (!mProvider) {
245 aRv.Throw(NS_ERROR_FAILURE);
246 return nullptr;
247 }
248
249 nsRefPtr<nsIDOMDOMRequest> request;
250 nsresult rv = mProvider->GetCardLockRetryCount(mClientId,
251 GetOwner(),
252 aLockType,
253 getter_AddRefs(request));
254 if (NS_FAILED(rv)) {
255 aRv.Throw(rv);
256 return nullptr;
257 }
258
259 return request.forget();
260 }
261
262 already_AddRefed<nsISupports>
263 Icc::ReadContacts(const nsAString& aContactType, ErrorResult& aRv)
264 {
265 if (!mProvider) {
266 aRv.Throw(NS_ERROR_FAILURE);
267 return nullptr;
268 }
269
270 nsRefPtr<nsIDOMDOMRequest> request;
271 nsresult rv = mProvider->ReadContacts(mClientId, GetOwner(), aContactType,
272 getter_AddRefs(request));
273 if (NS_FAILED(rv)) {
274 aRv.Throw(rv);
275 return nullptr;
276 }
277
278 return request.forget();
279 }
280
281 already_AddRefed<nsISupports>
282 Icc::UpdateContact(const JSContext* aCx, const nsAString& aContactType,
283 JS::Handle<JS::Value> aContact, const nsAString& aPin2,
284 ErrorResult& aRv)
285 {
286 if (!mProvider) {
287 aRv.Throw(NS_ERROR_FAILURE);
288 return nullptr;
289 }
290
291 nsRefPtr<nsIDOMDOMRequest> request;
292 nsresult rv = mProvider->UpdateContact(mClientId, GetOwner(), aContactType,
293 aContact, aPin2,
294 getter_AddRefs(request));
295 if (NS_FAILED(rv)) {
296 aRv.Throw(rv);
297 return nullptr;
298 }
299
300 return request.forget();
301 }
302
303 already_AddRefed<nsISupports>
304 Icc::IccOpenChannel(const nsAString& aAid, ErrorResult& aRv)
305 {
306 if (!mProvider) {
307 aRv.Throw(NS_ERROR_FAILURE);
308 return nullptr;
309 }
310
311 nsRefPtr<nsIDOMDOMRequest> request;
312 nsresult rv = mProvider->IccOpenChannel(mClientId, GetOwner(), aAid,
313 getter_AddRefs(request));
314 if (NS_FAILED(rv)) {
315 aRv.Throw(rv);
316 return nullptr;
317 }
318
319 return request.forget();
320 }
321
322 already_AddRefed<nsISupports>
323 Icc::IccExchangeAPDU(const JSContext* aCx, int32_t aChannel,
324 JS::Handle<JS::Value> aApdu, ErrorResult& aRv)
325 {
326 if (!mProvider) {
327 aRv.Throw(NS_ERROR_FAILURE);
328 return nullptr;
329 }
330
331 nsRefPtr<nsIDOMDOMRequest> request;
332 nsresult rv = mProvider->IccExchangeAPDU(mClientId, GetOwner(), aChannel,
333 aApdu, getter_AddRefs(request));
334 if (NS_FAILED(rv)) {
335 aRv.Throw(rv);
336 return nullptr;
337 }
338
339 return request.forget();
340 }
341
342 already_AddRefed<nsISupports>
343 Icc::IccCloseChannel(int32_t aChannel, ErrorResult& aRv)
344 {
345 if (!mProvider) {
346 aRv.Throw(NS_ERROR_FAILURE);
347 return nullptr;
348 }
349
350 nsRefPtr<nsIDOMDOMRequest> request;
351 nsresult rv = mProvider->IccCloseChannel(mClientId, GetOwner(), aChannel,
352 getter_AddRefs(request));
353 if (NS_FAILED(rv)) {
354 aRv.Throw(rv);
355 return nullptr;
356 }
357
358 return request.forget();
359 }
360
361 already_AddRefed<nsISupports>
362 Icc::MatchMvno(const nsAString& aMvnoType,
363 const nsAString& aMvnoData,
364 ErrorResult& aRv)
365 {
366 if (!mProvider) {
367 aRv.Throw(NS_ERROR_FAILURE);
368 return nullptr;
369 }
370
371 nsRefPtr<nsIDOMDOMRequest> request;
372 nsresult rv = mProvider->MatchMvno(mClientId, GetOwner(),
373 aMvnoType, aMvnoData,
374 getter_AddRefs(request));
375 if (NS_FAILED(rv)) {
376 aRv.Throw(rv);
377 return nullptr;
378 }
379
380 return request.forget();
381 }

mercurial