1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/icc/src/Icc.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,381 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.6 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#include "Icc.h" 1.9 + 1.10 +#include "mozilla/dom/MozIccBinding.h" 1.11 +#include "mozilla/dom/MozStkCommandEvent.h" 1.12 +#include "nsIDOMDOMRequest.h" 1.13 +#include "nsIDOMIccInfo.h" 1.14 +#include "nsJSON.h" 1.15 +#include "nsRadioInterfaceLayer.h" 1.16 +#include "nsServiceManagerUtils.h" 1.17 + 1.18 +using namespace mozilla::dom; 1.19 + 1.20 +Icc::Icc(nsPIDOMWindow* aWindow, long aClientId, const nsAString& aIccId) 1.21 + : mLive(true) 1.22 + , mClientId(aClientId) 1.23 + , mIccId(aIccId) 1.24 +{ 1.25 + SetIsDOMBinding(); 1.26 + BindToOwner(aWindow); 1.27 + 1.28 + mProvider = do_GetService(NS_RILCONTENTHELPER_CONTRACTID); 1.29 + 1.30 + // Not being able to acquire the provider isn't fatal since we check 1.31 + // for it explicitly below. 1.32 + if (!mProvider) { 1.33 + NS_WARNING("Could not acquire nsIIccProvider!"); 1.34 + } 1.35 +} 1.36 + 1.37 +void 1.38 +Icc::Shutdown() 1.39 +{ 1.40 + mProvider = nullptr; 1.41 + mLive = false; 1.42 +} 1.43 + 1.44 +nsresult 1.45 +Icc::NotifyEvent(const nsAString& aName) 1.46 +{ 1.47 + return DispatchTrustedEvent(aName); 1.48 +} 1.49 + 1.50 +nsresult 1.51 +Icc::NotifyStkEvent(const nsAString& aName, const nsAString& aMessage) 1.52 +{ 1.53 + nsresult rv; 1.54 + nsIScriptContext* sc = GetContextForEventHandlers(&rv); 1.55 + NS_ENSURE_SUCCESS(rv, rv); 1.56 + 1.57 + AutoPushJSContext cx(sc->GetNativeContext()); 1.58 + JS::Rooted<JS::Value> value(cx); 1.59 + 1.60 + if (!aMessage.IsEmpty()) { 1.61 + nsCOMPtr<nsIJSON> json(new nsJSON()); 1.62 + nsresult rv = json->DecodeToJSVal(aMessage, cx, &value); 1.63 + NS_ENSURE_SUCCESS(rv, rv); 1.64 + } else { 1.65 + value = JS::NullValue(); 1.66 + } 1.67 + 1.68 + MozStkCommandEventInit init; 1.69 + init.mBubbles = false; 1.70 + init.mCancelable = false; 1.71 + init.mCommand = value; 1.72 + 1.73 + nsRefPtr<MozStkCommandEvent> event = 1.74 + MozStkCommandEvent::Constructor(this, aName, init); 1.75 + 1.76 + return DispatchTrustedEvent(event); 1.77 +} 1.78 + 1.79 +// WrapperCache 1.80 + 1.81 +JSObject* 1.82 +Icc::WrapObject(JSContext* aCx) 1.83 +{ 1.84 + return MozIccBinding::Wrap(aCx, this); 1.85 +} 1.86 + 1.87 +// MozIcc WebIDL 1.88 + 1.89 +already_AddRefed<nsIDOMMozIccInfo> 1.90 +Icc::GetIccInfo() const 1.91 +{ 1.92 + if (!mProvider) { 1.93 + return nullptr; 1.94 + } 1.95 + 1.96 + nsCOMPtr<nsIDOMMozIccInfo> iccInfo; 1.97 + nsresult rv = mProvider->GetIccInfo(mClientId, getter_AddRefs(iccInfo)); 1.98 + if (NS_FAILED(rv)) { 1.99 + return nullptr; 1.100 + } 1.101 + 1.102 + return iccInfo.forget(); 1.103 +} 1.104 + 1.105 +void 1.106 +Icc::GetCardState(nsString& aCardState) const 1.107 +{ 1.108 + aCardState.SetIsVoid(true); 1.109 + 1.110 + if (!mProvider) { 1.111 + return; 1.112 + } 1.113 + 1.114 + nsresult rv = mProvider->GetCardState(mClientId, aCardState); 1.115 + if (NS_FAILED(rv)) { 1.116 + aCardState.SetIsVoid(true); 1.117 + } 1.118 +} 1.119 + 1.120 +void 1.121 +Icc::SendStkResponse(const JSContext* aCx, JS::Handle<JS::Value> aCommand, 1.122 + JS::Handle<JS::Value> aResponse, ErrorResult& aRv) 1.123 +{ 1.124 + if (!mProvider) { 1.125 + aRv.Throw(NS_ERROR_FAILURE); 1.126 + return; 1.127 + } 1.128 + 1.129 + nsresult rv = mProvider->SendStkResponse(mClientId, GetOwner(), aCommand, 1.130 + aResponse); 1.131 + if (NS_FAILED(rv)) { 1.132 + aRv.Throw(rv); 1.133 + } 1.134 +} 1.135 + 1.136 +void 1.137 +Icc::SendStkMenuSelection(uint16_t aItemIdentifier, bool aHelpRequested, 1.138 + ErrorResult& aRv) 1.139 +{ 1.140 + if (!mProvider) { 1.141 + aRv.Throw(NS_ERROR_FAILURE); 1.142 + return; 1.143 + } 1.144 + 1.145 + nsresult rv = mProvider->SendStkMenuSelection(mClientId, 1.146 + GetOwner(), 1.147 + aItemIdentifier, 1.148 + aHelpRequested); 1.149 + if (NS_FAILED(rv)) { 1.150 + aRv.Throw(rv); 1.151 + } 1.152 +} 1.153 + 1.154 +void 1.155 +Icc::SendStkTimerExpiration(const JSContext* aCx, JS::Handle<JS::Value> aTimer, 1.156 + ErrorResult& aRv) 1.157 +{ 1.158 + if (!mProvider) { 1.159 + aRv.Throw(NS_ERROR_FAILURE); 1.160 + return; 1.161 + } 1.162 + 1.163 + nsresult rv = mProvider->SendStkTimerExpiration(mClientId, GetOwner(), 1.164 + aTimer); 1.165 + if (NS_FAILED(rv)) { 1.166 + aRv.Throw(rv); 1.167 + } 1.168 +} 1.169 + 1.170 +void 1.171 +Icc::SendStkEventDownload(const JSContext* aCx, JS::Handle<JS::Value> aEvent, 1.172 + ErrorResult& aRv) 1.173 +{ 1.174 + if (!mProvider) { 1.175 + aRv.Throw(NS_ERROR_FAILURE); 1.176 + return; 1.177 + } 1.178 + 1.179 + nsresult rv = mProvider->SendStkEventDownload(mClientId, GetOwner(), aEvent); 1.180 + if (NS_FAILED(rv)) { 1.181 + aRv.Throw(rv); 1.182 + } 1.183 +} 1.184 + 1.185 +already_AddRefed<nsISupports> 1.186 +Icc::GetCardLock(const nsAString& aLockType, ErrorResult& aRv) 1.187 +{ 1.188 + if (!mProvider) { 1.189 + aRv.Throw(NS_ERROR_FAILURE); 1.190 + return nullptr; 1.191 + } 1.192 + 1.193 + nsRefPtr<nsIDOMDOMRequest> request; 1.194 + nsresult rv = mProvider->GetCardLockState(mClientId, GetOwner(), aLockType, 1.195 + getter_AddRefs(request)); 1.196 + if (NS_FAILED(rv)) { 1.197 + aRv.Throw(rv); 1.198 + return nullptr; 1.199 + } 1.200 + 1.201 + return request.forget(); 1.202 +} 1.203 + 1.204 +already_AddRefed<nsISupports> 1.205 +Icc::UnlockCardLock(const JSContext* aCx, JS::Handle<JS::Value> aInfo, 1.206 + ErrorResult& aRv) 1.207 +{ 1.208 + if (!mProvider) { 1.209 + aRv.Throw(NS_ERROR_FAILURE); 1.210 + return nullptr; 1.211 + } 1.212 + 1.213 + nsRefPtr<nsIDOMDOMRequest> request; 1.214 + nsresult rv = mProvider->UnlockCardLock(mClientId, GetOwner(), aInfo, 1.215 + getter_AddRefs(request)); 1.216 + if (NS_FAILED(rv)) { 1.217 + aRv.Throw(rv); 1.218 + return nullptr; 1.219 + } 1.220 + 1.221 + return request.forget(); 1.222 +} 1.223 + 1.224 +already_AddRefed<nsISupports> 1.225 +Icc::SetCardLock(const JSContext* aCx, JS::Handle<JS::Value> aInfo, 1.226 + ErrorResult& aRv) 1.227 +{ 1.228 + if (!mProvider) { 1.229 + aRv.Throw(NS_ERROR_FAILURE); 1.230 + return nullptr; 1.231 + } 1.232 + 1.233 + nsRefPtr<nsIDOMDOMRequest> request; 1.234 + nsresult rv = mProvider->SetCardLock(mClientId, GetOwner(), aInfo, 1.235 + getter_AddRefs(request)); 1.236 + if (NS_FAILED(rv)) { 1.237 + aRv.Throw(rv); 1.238 + return nullptr; 1.239 + } 1.240 + 1.241 + return request.forget(); 1.242 +} 1.243 + 1.244 +already_AddRefed<nsISupports> 1.245 +Icc::GetCardLockRetryCount(const nsAString& aLockType, ErrorResult& aRv) 1.246 +{ 1.247 + if (!mProvider) { 1.248 + aRv.Throw(NS_ERROR_FAILURE); 1.249 + return nullptr; 1.250 + } 1.251 + 1.252 + nsRefPtr<nsIDOMDOMRequest> request; 1.253 + nsresult rv = mProvider->GetCardLockRetryCount(mClientId, 1.254 + GetOwner(), 1.255 + aLockType, 1.256 + getter_AddRefs(request)); 1.257 + if (NS_FAILED(rv)) { 1.258 + aRv.Throw(rv); 1.259 + return nullptr; 1.260 + } 1.261 + 1.262 + return request.forget(); 1.263 +} 1.264 + 1.265 +already_AddRefed<nsISupports> 1.266 +Icc::ReadContacts(const nsAString& aContactType, ErrorResult& aRv) 1.267 +{ 1.268 + if (!mProvider) { 1.269 + aRv.Throw(NS_ERROR_FAILURE); 1.270 + return nullptr; 1.271 + } 1.272 + 1.273 + nsRefPtr<nsIDOMDOMRequest> request; 1.274 + nsresult rv = mProvider->ReadContacts(mClientId, GetOwner(), aContactType, 1.275 + getter_AddRefs(request)); 1.276 + if (NS_FAILED(rv)) { 1.277 + aRv.Throw(rv); 1.278 + return nullptr; 1.279 + } 1.280 + 1.281 + return request.forget(); 1.282 +} 1.283 + 1.284 +already_AddRefed<nsISupports> 1.285 +Icc::UpdateContact(const JSContext* aCx, const nsAString& aContactType, 1.286 + JS::Handle<JS::Value> aContact, const nsAString& aPin2, 1.287 + ErrorResult& aRv) 1.288 +{ 1.289 + if (!mProvider) { 1.290 + aRv.Throw(NS_ERROR_FAILURE); 1.291 + return nullptr; 1.292 + } 1.293 + 1.294 + nsRefPtr<nsIDOMDOMRequest> request; 1.295 + nsresult rv = mProvider->UpdateContact(mClientId, GetOwner(), aContactType, 1.296 + aContact, aPin2, 1.297 + getter_AddRefs(request)); 1.298 + if (NS_FAILED(rv)) { 1.299 + aRv.Throw(rv); 1.300 + return nullptr; 1.301 + } 1.302 + 1.303 + return request.forget(); 1.304 +} 1.305 + 1.306 +already_AddRefed<nsISupports> 1.307 +Icc::IccOpenChannel(const nsAString& aAid, ErrorResult& aRv) 1.308 +{ 1.309 + if (!mProvider) { 1.310 + aRv.Throw(NS_ERROR_FAILURE); 1.311 + return nullptr; 1.312 + } 1.313 + 1.314 + nsRefPtr<nsIDOMDOMRequest> request; 1.315 + nsresult rv = mProvider->IccOpenChannel(mClientId, GetOwner(), aAid, 1.316 + getter_AddRefs(request)); 1.317 + if (NS_FAILED(rv)) { 1.318 + aRv.Throw(rv); 1.319 + return nullptr; 1.320 + } 1.321 + 1.322 + return request.forget(); 1.323 +} 1.324 + 1.325 +already_AddRefed<nsISupports> 1.326 +Icc::IccExchangeAPDU(const JSContext* aCx, int32_t aChannel, 1.327 + JS::Handle<JS::Value> aApdu, ErrorResult& aRv) 1.328 +{ 1.329 + if (!mProvider) { 1.330 + aRv.Throw(NS_ERROR_FAILURE); 1.331 + return nullptr; 1.332 + } 1.333 + 1.334 + nsRefPtr<nsIDOMDOMRequest> request; 1.335 + nsresult rv = mProvider->IccExchangeAPDU(mClientId, GetOwner(), aChannel, 1.336 + aApdu, getter_AddRefs(request)); 1.337 + if (NS_FAILED(rv)) { 1.338 + aRv.Throw(rv); 1.339 + return nullptr; 1.340 + } 1.341 + 1.342 + return request.forget(); 1.343 +} 1.344 + 1.345 +already_AddRefed<nsISupports> 1.346 +Icc::IccCloseChannel(int32_t aChannel, ErrorResult& aRv) 1.347 +{ 1.348 + if (!mProvider) { 1.349 + aRv.Throw(NS_ERROR_FAILURE); 1.350 + return nullptr; 1.351 + } 1.352 + 1.353 + nsRefPtr<nsIDOMDOMRequest> request; 1.354 + nsresult rv = mProvider->IccCloseChannel(mClientId, GetOwner(), aChannel, 1.355 + getter_AddRefs(request)); 1.356 + if (NS_FAILED(rv)) { 1.357 + aRv.Throw(rv); 1.358 + return nullptr; 1.359 + } 1.360 + 1.361 + return request.forget(); 1.362 +} 1.363 + 1.364 +already_AddRefed<nsISupports> 1.365 +Icc::MatchMvno(const nsAString& aMvnoType, 1.366 + const nsAString& aMvnoData, 1.367 + ErrorResult& aRv) 1.368 +{ 1.369 + if (!mProvider) { 1.370 + aRv.Throw(NS_ERROR_FAILURE); 1.371 + return nullptr; 1.372 + } 1.373 + 1.374 + nsRefPtr<nsIDOMDOMRequest> request; 1.375 + nsresult rv = mProvider->MatchMvno(mClientId, GetOwner(), 1.376 + aMvnoType, aMvnoData, 1.377 + getter_AddRefs(request)); 1.378 + if (NS_FAILED(rv)) { 1.379 + aRv.Throw(rv); 1.380 + return nullptr; 1.381 + } 1.382 + 1.383 + return request.forget(); 1.384 +}