Merge b2g-inbound to m-c a=merge CLOSED TREE

This commit is contained in:
Wes Kocher 2015-03-18 15:53:00 -07:00
commit d3a01938c3
103 changed files with 1663 additions and 3507 deletions

View File

@ -522,6 +522,7 @@ let settingsToObserve = {
'layers.effect.invert': false,
'layers.effect.grayscale': false,
'layers.effect.contrast': "0.0",
'network.debugging.enabled': false,
'privacy.donottrackheader.enabled': false,
'ril.debugging.enabled': false,
'ril.radio.disabled': false,

View File

@ -11,9 +11,9 @@ const PREF_DEBUG = "dom.payment.debug";
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyServiceGetter(this, "gIccService",
"@mozilla.org/icc/iccservice;1",
"nsIIccService");
XPCOMUtils.defineLazyServiceGetter(this, "iccProvider",
"@mozilla.org/ril/content-helper;1",
"nsIIccProvider");
XPCOMUtils.defineLazyServiceGetter(this, "gRil",
"@mozilla.org/ril;1",
@ -148,8 +148,7 @@ PaymentProviderStrategy.prototype = {
if (!this._iccInfo) {
this._iccInfo = [];
for (let i = 0; i < gRil.numRadioInterfaces; i++) {
let icc = gIccService.getIccByServiceId(i);
let info = icc && icc.iccInfo;
let info = iccProvider.getIccInfo(i);
if (!info) {
LOGE("Tried to get the ICC info for an invalid service ID " + i);
continue;

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

View File

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="93f9ba577f68d772093987c2f1c0a4ae293e1802"/>

View File

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ed2cf97a6c37a4bbd0bbbbffe06ec7136d8c79ff"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="40f5ce12859076b63307480ff2f0bbdf42bbf258"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="52775e03a2d8532429dff579cb2cd56718e488c3">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

View File

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="93f9ba577f68d772093987c2f1c0a4ae293e1802"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

View File

@ -17,7 +17,7 @@
</project>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ed2cf97a6c37a4bbd0bbbbffe06ec7136d8c79ff"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="40f5ce12859076b63307480ff2f0bbdf42bbf258"/>

View File

@ -1,9 +1,9 @@
{
"git": {
"git_revision": "b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39",
"git_revision": "c39e15f631de80c69467fda0d4ea0bcda9e194ca",
"remote": "https://git.mozilla.org/releases/gaia.git",
"branch": ""
},
"revision": "18a7681ac7c78cd21cc22de6ea1746fcab1c2f62",
"revision": "a7732a117f9499b15cc27c022a11cd75ef71f477",
"repo_path": "integration/gaia-central"
}

View File

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ed2cf97a6c37a4bbd0bbbbffe06ec7136d8c79ff"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="40f5ce12859076b63307480ff2f0bbdf42bbf258"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="52775e03a2d8532429dff579cb2cd56718e488c3">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b8051d370ddf4e5bd8e7d8a19fb9eeb5fd6ffb39"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c39e15f631de80c69467fda0d4ea0bcda9e194ca"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="86cd7486d8e50eaac8ef6fe2f51f09d25194577b"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

View File

@ -178,6 +178,7 @@
@RESPATH@/components/dom_system_gonk.xpt
#endif
#ifdef MOZ_B2G_RIL
@RESPATH@/components/dom_icc.xpt
@RESPATH@/components/dom_wappush.xpt
@RESPATH@/components/dom_mobileconnection.xpt
#endif
@ -217,7 +218,6 @@
@RESPATH@/components/dom_permissionsettings.xpt
@RESPATH@/components/dom_sidebar.xpt
@RESPATH@/components/dom_cellbroadcast.xpt
@RESPATH@/components/dom_icc.xpt
@RESPATH@/components/dom_mobilemessage.xpt
@RESPATH@/components/dom_storage.xpt
@RESPATH@/components/dom_stylesheets.xpt
@ -483,8 +483,6 @@
#if defined(MOZ_WIDGET_GONK) && defined(MOZ_B2G_RIL)
@RESPATH@/components/CellBroadcastService.js
@RESPATH@/components/CellBroadcastService.manifest
@BINPATH@/components/IccService.js
@BINPATH@/components/IccService.manifest
@RESPATH@/components/MmsService.js
@RESPATH@/components/MmsService.manifest
@RESPATH@/components/MobileMessageDatabaseService.js

View File

@ -215,7 +215,6 @@
@RESPATH@/components/dom_network.xpt
@RESPATH@/components/dom_notification.xpt
@RESPATH@/components/dom_html.xpt
@RESPATH@/components/dom_icc.xpt
@RESPATH@/components/dom_offline.xpt
@RESPATH@/components/dom_json.xpt
@RESPATH@/components/dom_power.xpt

View File

@ -21,9 +21,9 @@ Cu.import("resource://gre/modules/Task.jsm");
let Path = OS.Path;
#ifdef MOZ_B2G_RIL
XPCOMUtils.defineLazyServiceGetter(this, "gIccService",
"@mozilla.org/icc/iccservice;1",
"nsIIccService");
XPCOMUtils.defineLazyServiceGetter(this, "iccProvider",
"@mozilla.org/ril/content-helper;1",
"nsIIccProvider");
#endif
function debug(aMsg) {
@ -69,18 +69,17 @@ let iccListener = {
notifyIccInfoChanged: function() {
// TODO: Bug 927709 - OperatorApps for multi-sim
// In Multi-sim, there is more than one client in IccService. Each
// client represents a icc handle. To maintain the backward compatibility
// In Multi-sim, there is more than one client in iccProvider. Each
// client represents a icc service. To maintain the backward compatibility
// with single sim, we always use client 0 for now. Adding support for
// multiple sim will be addressed in bug 927709, if needed.
let clientId = 0;
let icc = gIccService.getIccByServiceId(clientId);
let iccInfo = icc && icc.iccInfo;
let iccInfo = iccProvider.getIccInfo(clientId);
if (iccInfo && iccInfo.mcc && iccInfo.mnc) {
let mcc = iccInfo.mcc;
let mnc = iccInfo.mnc;
debug("******* iccListener cardIccInfo MCC-MNC: " + mcc + "-" + mnc);
icc.unregisterListener(this);
iccProvider.unregisterIccMsg(clientId, this);
OperatorAppsRegistry._installOperatorApps(mcc, mnc);
debug("Broadcast message first-run-with-sim");
@ -106,14 +105,13 @@ this.OperatorAppsRegistry = {
try {
yield this._initializeSourceDir();
// TODO: Bug 927709 - OperatorApps for multi-sim
// In Multi-sim, there is more than one client in IccService. Each
// client represents a icc handle. To maintain the backward
// In Multi-sim, there is more than one client in iccProvider. Each
// client represents a icc service. To maintain the backward
// compatibility with single sim, we always use client 0 for now.
// Adding support for multiple sim will be addressed in bug 927709, if
// needed.
let clientId = 0;
let icc = gIccService.getIccByServiceId(clientId);
let iccInfo = icc && icc.iccInfo;
let iccInfo = iccProvider.getIccInfo(clientId);
let mcc = 0;
let mnc = 0;
if (iccInfo && iccInfo.mcc) {
@ -130,7 +128,7 @@ this.OperatorAppsRegistry = {
mnc: mnc });
} else {
icc.registerListener(iccListener);
iccProvider.registerIccMsg(clientId, iccListener);
}
} catch (e) {
debug("Error Initializing OperatorApps. " + e);

View File

@ -36,7 +36,6 @@
#include "mozilla/dom/WakeLock.h"
#include "mozilla/dom/power/PowerManagerService.h"
#include "mozilla/dom/CellBroadcast.h"
#include "mozilla/dom/IccManager.h"
#include "mozilla/dom/MobileMessageManager.h"
#include "mozilla/dom/ServiceWorkerContainer.h"
#include "mozilla/dom/Telephony.h"
@ -54,6 +53,7 @@
#include "nsIMobileIdentityService.h"
#endif
#ifdef MOZ_B2G_RIL
#include "mozilla/dom/IccManager.h"
#include "mozilla/dom/MobileConnectionArray.h"
#endif
#include "nsIIdleObserver.h"
@ -177,7 +177,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Navigator)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBatteryManager)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPowerManager)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCellBroadcast)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mIccManager)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMobileMessageManager)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTelephony)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVoicemail)
@ -185,6 +184,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Navigator)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConnection)
#ifdef MOZ_B2G_RIL
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMobileConnections)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mIccManager)
#endif
#ifdef MOZ_B2G_BT
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBluetooth)
@ -250,11 +250,6 @@ Navigator::Invalidate()
mCellBroadcast = nullptr;
}
if (mIccManager) {
mIccManager->Shutdown();
mIccManager = nullptr;
}
if (mMobileMessageManager) {
mMobileMessageManager->Shutdown();
mMobileMessageManager = nullptr;
@ -282,6 +277,11 @@ Navigator::Invalidate()
if (mMobileConnections) {
mMobileConnections = nullptr;
}
if (mIccManager) {
mIccManager->Shutdown();
mIccManager = nullptr;
}
#endif
#ifdef MOZ_B2G_BT
@ -1707,6 +1707,8 @@ Navigator::GetMozVoicemail(ErrorResult& aRv)
return mVoicemail;
}
#ifdef MOZ_B2G_RIL
IccManager*
Navigator::GetMozIccManager(ErrorResult& aRv)
{
@ -1722,6 +1724,7 @@ Navigator::GetMozIccManager(ErrorResult& aRv)
return mIccManager;
}
#endif // MOZ_B2G_RIL
#ifdef MOZ_GAMEPAD
void

View File

@ -44,6 +44,10 @@ class ServiceWorkerContainer;
}
}
#ifdef MOZ_B2G_RIL
class nsIDOMMozIccManager;
#endif // MOZ_B2G_RIL
//*****************************************************************************
// Navigator: Script "navigator" object
//*****************************************************************************
@ -84,12 +88,12 @@ class BluetoothManager;
#endif // MOZ_B2G_BT
#ifdef MOZ_B2G_RIL
class IccManager;
class MobileConnectionArray;
#endif
class PowerManager;
class CellBroadcast;
class IccManager;
class Telephony;
class Voicemail;
class TVManager;
@ -220,7 +224,6 @@ public:
ErrorResult& aRv);
DesktopNotificationCenter* GetMozNotification(ErrorResult& aRv);
CellBroadcast* GetMozCellBroadcast(ErrorResult& aRv);
IccManager* GetMozIccManager(ErrorResult& aRv);
MobileMessageManager* GetMozMobileMessage();
Telephony* GetMozTelephony(ErrorResult& aRv);
Voicemail* GetMozVoicemail(ErrorResult& aRv);
@ -240,6 +243,7 @@ public:
#endif
#ifdef MOZ_B2G_RIL
MobileConnectionArray* GetMozMobileConnections(ErrorResult& aRv);
IccManager* GetMozIccManager(ErrorResult& aRv);
#endif // MOZ_B2G_RIL
#ifdef MOZ_GAMEPAD
void GetGamepads(nsTArray<nsRefPtr<Gamepad> >& aGamepads, ErrorResult& aRv);
@ -349,7 +353,6 @@ private:
#endif
nsRefPtr<PowerManager> mPowerManager;
nsRefPtr<CellBroadcast> mCellBroadcast;
nsRefPtr<IccManager> mIccManager;
nsRefPtr<MobileMessageManager> mMobileMessageManager;
nsRefPtr<Telephony> mTelephony;
nsRefPtr<Voicemail> mVoicemail;
@ -357,6 +360,7 @@ private:
nsRefPtr<network::Connection> mConnection;
#ifdef MOZ_B2G_RIL
nsRefPtr<MobileConnectionArray> mMobileConnections;
nsRefPtr<IccManager> mIccManager;
#endif
#ifdef MOZ_B2G_BT
nsRefPtr<bluetooth::BluetoothManager> mBluetooth;

View File

@ -7,11 +7,12 @@
#include "BluetoothRilListener.h"
#include "BluetoothHfpManager.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionInfo.h"
#include "nsIMobileConnectionService.h"
#include "nsITelephonyCallInfo.h"
#include "nsITelephonyService.h"
#include "nsRadioInterfaceLayer.h" // For NS_RILCONTENTHELPER_CONTRACTID.
#include "nsServiceManagerUtils.h"
#include "nsString.h"
@ -59,19 +60,15 @@ IccListener::Listen(bool aStart)
{
NS_ENSURE_TRUE(mOwner, false);
nsCOMPtr<nsIIccService> service =
do_GetService(ICC_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(service, false);
nsCOMPtr<nsIIcc> icc;
service->GetIccByServiceId(mOwner->mClientId, getter_AddRefs(icc));
NS_ENSURE_TRUE(icc, false);
nsCOMPtr<nsIIccProvider> provider =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
NS_ENSURE_TRUE(provider, false);
nsresult rv;
if (aStart) {
rv = icc->RegisterListener(this);
rv = provider->RegisterIccMsg(mOwner->mClientId, this);
} else {
rv = icc->UnregisterListener(this);
rv = provider->UnregisterIccMsg(mOwner->mClientId, this);
}
return NS_SUCCEEDED(rv);

View File

@ -11,7 +11,7 @@
#include "nsAutoPtr.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionService.h"
#include "nsITelephonyCallInfo.h"
#include "nsITelephonyService.h"

View File

@ -26,7 +26,7 @@ DispatchBluetoothA2dpHALResult(
{
MOZ_ASSERT(aRes);
nsRunnable* runnable;
nsRefPtr<nsRunnable> runnable;
if (aStatus == STATUS_SUCCESS) {
runnable = new BluetoothA2dpHALResultRunnable(aRes, aMethod);

View File

@ -26,7 +26,7 @@ DispatchBluetoothAvrcpHALResult(
{
MOZ_ASSERT(aRes);
nsRunnable* runnable;
nsRefPtr<nsRunnable> runnable;
if (aStatus == STATUS_SUCCESS) {
runnable = new BluetoothAvrcpHALResultRunnable(aRes, aMethod);

View File

@ -79,7 +79,7 @@ DispatchBluetoothHALResult(BluetoothResultHandler* aRes,
{
MOZ_ASSERT(aRes);
nsRunnable* runnable;
nsRefPtr<nsRunnable> runnable;
if (aStatus == STATUS_SUCCESS) {
runnable = new BluetoothHALResultRunnable(aRes, aMethod);

View File

@ -26,7 +26,7 @@ DispatchBluetoothHandsfreeHALResult(
{
MOZ_ASSERT(aRes);
nsRunnable* runnable;
nsRefPtr<nsRunnable> runnable;
if (aStatus == STATUS_SUCCESS) {
runnable = new BluetoothHandsfreeHALResultRunnable(aRes, aMethod);

View File

@ -37,7 +37,7 @@ DispatchBluetoothSocketHALResult(
{
MOZ_ASSERT(aRes);
nsRunnable* runnable;
nsRefPtr<nsRunnable> runnable;
if (aStatus == STATUS_SUCCESS) {
runnable = new BluetoothSocketHALIntResultRunnable(aRes, aMethod, aArg);
@ -60,7 +60,7 @@ DispatchBluetoothSocketHALResult(
{
MOZ_ASSERT(aRes);
nsRunnable* runnable;
nsRefPtr<nsRunnable> runnable;
if (aStatus == STATUS_SUCCESS) {
runnable = new BluetoothSocketHALIntStringIntResultRunnable(

View File

@ -17,13 +17,14 @@
#include "nsContentUtils.h"
#include "nsIAudioManager.h"
#include "nsIIccInfo.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionInfo.h"
#include "nsIMobileConnectionService.h"
#include "nsIMobileNetworkInfo.h"
#include "nsIObserverService.h"
#include "nsISettingsService.h"
#include "nsITelephonyService.h"
#include "nsRadioInterfaceLayer.h"
#include "nsServiceManagerUtils.h"
#include "nsThreadUtils.h"
#include "mozilla/dom/BindingUtils.h"
@ -724,16 +725,12 @@ BluetoothHfpManager::HandleVoiceConnectionChanged(uint32_t aClientId)
void
BluetoothHfpManager::HandleIccInfoChanged(uint32_t aClientId)
{
nsCOMPtr<nsIIccService> service =
do_GetService(ICC_SERVICE_CONTRACTID);
NS_ENSURE_TRUE_VOID(service);
nsCOMPtr<nsIIcc> icc;
service->GetIccByServiceId(aClientId, getter_AddRefs(icc));
nsCOMPtr<nsIIccProvider> icc =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
NS_ENSURE_TRUE_VOID(icc);
nsCOMPtr<nsIIccInfo> iccInfo;
icc->GetIccInfo(getter_AddRefs(iccInfo));
icc->GetIccInfo(aClientId, getter_AddRefs(iccInfo));
NS_ENSURE_TRUE_VOID(iccInfo);
nsCOMPtr<nsIGsmIccInfo> gsmIccInfo = do_QueryInterface(iccInfo);

View File

@ -28,11 +28,12 @@
#ifdef MOZ_B2G_RIL
#include "nsIIccInfo.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionInfo.h"
#include "nsIMobileConnectionService.h"
#include "nsIMobileNetworkInfo.h"
#include "nsITelephonyService.h"
#include "nsRadioInterfaceLayer.h"
#endif
/**
@ -663,16 +664,12 @@ BluetoothHfpManager::HandleVoiceConnectionChanged(uint32_t aClientId)
void
BluetoothHfpManager::HandleIccInfoChanged(uint32_t aClientId)
{
nsCOMPtr<nsIIccService> service =
do_GetService(ICC_SERVICE_CONTRACTID);
NS_ENSURE_TRUE_VOID(service);
nsCOMPtr<nsIIcc> icc;
service->GetIccByServiceId(aClientId, getter_AddRefs(icc));
nsCOMPtr<nsIIccProvider> icc =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
NS_ENSURE_TRUE_VOID(icc);
nsCOMPtr<nsIIccInfo> iccInfo;
icc->GetIccInfo(getter_AddRefs(iccInfo));
icc->GetIccInfo(aClientId, getter_AddRefs(iccInfo));
NS_ENSURE_TRUE_VOID(iccInfo);
nsCOMPtr<nsIGsmIccInfo> gsmIccInfo = do_QueryInterface(iccInfo);

View File

@ -7,10 +7,11 @@
#include "BluetoothRilListener.h"
#include "BluetoothHfpManager.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionInfo.h"
#include "nsIMobileConnectionService.h"
#include "nsITelephonyService.h"
#include "nsRadioInterfaceLayer.h" // For NS_RILCONTENTHELPER_CONTRACTID.
#include "nsServiceManagerUtils.h"
#include "nsString.h"
@ -58,19 +59,15 @@ IccListener::Listen(bool aStart)
{
NS_ENSURE_TRUE(mOwner, false);
nsCOMPtr<nsIIccService> service =
do_GetService(ICC_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(service, false);
nsCOMPtr<nsIIcc> icc;
service->GetIccByServiceId(mOwner->mClientId, getter_AddRefs(icc));
NS_ENSURE_TRUE(icc, false);
nsCOMPtr<nsIIccProvider> provider =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
NS_ENSURE_TRUE(provider, false);
nsresult rv;
if (aStart) {
rv = icc->RegisterListener(this);
rv = provider->RegisterIccMsg(mOwner->mClientId, this);
} else {
rv = icc->UnregisterListener(this);
rv = provider->UnregisterIccMsg(mOwner->mClientId, this);
}
return NS_SUCCEEDED(rv);

View File

@ -11,7 +11,7 @@
#include "nsAutoPtr.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionService.h"
#include "nsITelephonyCallInfo.h"
#include "nsITelephonyService.h"

View File

@ -17,13 +17,14 @@
#include "nsContentUtils.h"
#include "nsIAudioManager.h"
#include "nsIIccInfo.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionInfo.h"
#include "nsIMobileConnectionService.h"
#include "nsIMobileNetworkInfo.h"
#include "nsIObserverService.h"
#include "nsISettingsService.h"
#include "nsITelephonyService.h"
#include "nsRadioInterfaceLayer.h"
#include "nsServiceManagerUtils.h"
#include "nsThreadUtils.h"
#include "mozilla/dom/BindingUtils.h"
@ -709,16 +710,12 @@ BluetoothHfpManager::HandleVoiceConnectionChanged(uint32_t aClientId)
void
BluetoothHfpManager::HandleIccInfoChanged(uint32_t aClientId)
{
nsCOMPtr<nsIIccService> service =
do_GetService(ICC_SERVICE_CONTRACTID);
NS_ENSURE_TRUE_VOID(service);
nsCOMPtr<nsIIcc> icc;
service->GetIccByServiceId(aClientId, getter_AddRefs(icc));
nsCOMPtr<nsIIccProvider> icc =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
NS_ENSURE_TRUE_VOID(icc);
nsCOMPtr<nsIIccInfo> iccInfo;
icc->GetIccInfo(getter_AddRefs(iccInfo));
icc->GetIccInfo(aClientId, getter_AddRefs(iccInfo));
NS_ENSURE_TRUE_VOID(iccInfo);
nsCOMPtr<nsIGsmIccInfo> gsmIccInfo = do_QueryInterface(iccInfo);

View File

@ -28,11 +28,12 @@
#ifdef MOZ_B2G_RIL
#include "nsIIccInfo.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
#include "nsIMobileConnectionInfo.h"
#include "nsIMobileConnectionService.h"
#include "nsIMobileNetworkInfo.h"
#include "nsITelephonyService.h"
#include "nsRadioInterfaceLayer.h"
#endif
/**
@ -663,16 +664,12 @@ BluetoothHfpManager::HandleVoiceConnectionChanged(uint32_t aClientId)
void
BluetoothHfpManager::HandleIccInfoChanged(uint32_t aClientId)
{
nsCOMPtr<nsIIccService> service =
do_GetService(ICC_SERVICE_CONTRACTID);
NS_ENSURE_TRUE_VOID(service);
nsCOMPtr<nsIIcc> icc;
service->GetIccByServiceId(aClientId, getter_AddRefs(icc));
nsCOMPtr<nsIIccProvider> icc =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
NS_ENSURE_TRUE_VOID(icc);
nsCOMPtr<nsIIccInfo> iccInfo;
icc->GetIccInfo(getter_AddRefs(iccInfo));
icc->GetIccInfo(aClientId, getter_AddRefs(iccInfo));
NS_ENSURE_TRUE_VOID(iccInfo);
nsCOMPtr<nsIGsmIccInfo> gsmIccInfo = do_QueryInterface(iccInfo);

View File

@ -3,15 +3,15 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/MozIccBinding.h"
#include "nsIIccService.h"
#include "nsIIccProvider.h"
namespace mozilla {
namespace dom {
namespace icc {
#define ASSERT_EQUALITY(webidlType, webidlState, xpidlState) \
static_assert(static_cast<uint32_t>(webidlType::webidlState) == nsIIcc::xpidlState, \
#webidlType "::" #webidlState " should equal to nsIIccService::" #xpidlState)
static_assert(static_cast<uint32_t>(webidlType::webidlState) == nsIIccProvider::xpidlState, \
#webidlType "::" #webidlState " should equal to nsIIccProvider::" #xpidlState)
/**
* Enum IccCardState

View File

@ -4,7 +4,6 @@
#include "mozilla/dom/Icc.h"
#include "IccCallback.h"
#include "mozilla/dom/DOMRequest.h"
#include "mozilla/dom/IccInfo.h"
#include "mozilla/dom/MozStkCommandEvent.h"
@ -12,13 +11,10 @@
#include "mozilla/dom/ScriptSettings.h"
#include "nsIIccInfo.h"
#include "nsIIccProvider.h"
#include "nsIIccService.h"
#include "nsJSON.h"
#include "nsRadioInterfaceLayer.h"
#include "nsServiceManagerUtils.h"
using mozilla::dom::icc::IccCallback;
namespace mozilla {
namespace dom {
@ -54,10 +50,9 @@ NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
NS_IMPL_ADDREF_INHERITED(Icc, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(Icc, DOMEventTargetHelper)
Icc::Icc(nsPIDOMWindow* aWindow, long aClientId, nsIIcc* aHandler, nsIIccInfo* aIccInfo)
Icc::Icc(nsPIDOMWindow* aWindow, long aClientId, nsIIccInfo* aIccInfo)
: mLive(true)
, mClientId(aClientId)
, mHandler(aHandler)
{
BindToOwner(aWindow);
@ -84,7 +79,6 @@ Icc::Shutdown()
{
mIccInfo.SetNull();
mProvider = nullptr;
mHandler = nullptr;
mLive = false;
}
@ -176,10 +170,10 @@ Icc::GetCardState() const
{
Nullable<IccCardState> result;
uint32_t cardState = nsIIcc::CARD_STATE_UNDETECTED;
if (mHandler &&
NS_SUCCEEDED(mHandler->GetCardState(&cardState)) &&
cardState != nsIIcc::CARD_STATE_UNDETECTED) {
uint32_t cardState = nsIIccProvider::CARD_STATE_UNDETECTED;
if (mProvider &&
NS_SUCCEEDED(mProvider->GetCardState(mClientId, &cardState)) &&
cardState != nsIIccProvider::CARD_STATE_UNDETECTED) {
MOZ_ASSERT(cardState < static_cast<uint32_t>(IccCardState::EndGuard_));
result.SetValue(static_cast<IccCardState>(cardState));
}
@ -255,78 +249,72 @@ Icc::SendStkEventDownload(const JSContext* aCx, JS::Handle<JS::Value> aEvent,
already_AddRefed<DOMRequest>
Icc::GetCardLock(IccLockType aLockType, ErrorResult& aRv)
{
if (!mHandler) {
if (!mProvider) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
// TODO: Bug 1125018 - Simplify The Result of GetCardLock and
// getCardLockRetryCount in MozIcc.webidl without a wrapper object.
nsRefPtr<IccCallback> requestCallback =
new IccCallback(GetOwner(), request, true);
nsresult rv = mHandler->GetCardLockEnabled(static_cast<uint32_t>(aLockType),
requestCallback);
nsRefPtr<nsIDOMDOMRequest> request;
nsresult rv = mProvider->GetCardLockEnabled(mClientId, GetOwner(),
static_cast<uint32_t>(aLockType),
getter_AddRefs(request));
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
return request.forget().downcast<DOMRequest>();
}
already_AddRefed<DOMRequest>
Icc::UnlockCardLock(const IccUnlockCardLockOptions& aOptions, ErrorResult& aRv)
{
if (!mHandler) {
if (!mProvider) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
nsRefPtr<IccCallback> requestCallback =
new IccCallback(GetOwner(), request);
nsRefPtr<nsIDOMDOMRequest> request;
const nsString& password = IsPukCardLockType(aOptions.mLockType)
? aOptions.mPuk : aOptions.mPin;
nsresult rv =
mHandler->UnlockCardLock(static_cast<uint32_t>(aOptions.mLockType),
password, aOptions.mNewPin, requestCallback);
nsresult rv = mProvider->UnlockCardLock(mClientId, GetOwner(),
static_cast<uint32_t>(aOptions.mLockType),
password, aOptions.mNewPin,
getter_AddRefs(request));
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
return request.forget().downcast<DOMRequest>();
}
already_AddRefed<DOMRequest>
Icc::SetCardLock(const IccSetCardLockOptions& aOptions, ErrorResult& aRv)
{
if (!mHandler) {
if (!mProvider) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsresult rv;
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
nsRefPtr<IccCallback> requestCallback =
new IccCallback(GetOwner(), request);
nsRefPtr<nsIDOMDOMRequest> request;
if (aOptions.mEnabled.WasPassed()) {
// Enable card lock.
const nsString& password = (aOptions.mLockType == IccLockType::Fdn) ?
aOptions.mPin2 : aOptions.mPin;
rv =
mHandler->SetCardLockEnabled(static_cast<uint32_t>(aOptions.mLockType),
password, aOptions.mEnabled.Value(),
requestCallback);
rv = mProvider->SetCardLockEnabled(mClientId, GetOwner(),
static_cast<uint32_t>(aOptions.mLockType),
password, aOptions.mEnabled.Value(),
getter_AddRefs(request));
} else {
// Change card lock password.
rv =
mHandler->ChangeCardLockPassword(static_cast<uint32_t>(aOptions.mLockType),
aOptions.mPin, aOptions.mNewPin,
requestCallback);
rv = mProvider->ChangeCardLockPassword(mClientId, GetOwner(),
static_cast<uint32_t>(aOptions.mLockType),
aOptions.mPin, aOptions.mNewPin,
getter_AddRefs(request));
}
if (NS_FAILED(rv)) {
@ -334,28 +322,27 @@ Icc::SetCardLock(const IccSetCardLockOptions& aOptions, ErrorResult& aRv)
return nullptr;
}
return request.forget();
return request.forget().downcast<DOMRequest>();
}
already_AddRefed<DOMRequest>
Icc::GetCardLockRetryCount(IccLockType aLockType, ErrorResult& aRv)
{
if (!mHandler) {
if (!mProvider) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
nsRefPtr<IccCallback> requestCallback =
new IccCallback(GetOwner(), request);
nsresult rv = mHandler->GetCardLockRetryCount(static_cast<uint32_t>(aLockType),
requestCallback);
nsRefPtr<nsIDOMDOMRequest> request;
nsresult rv = mProvider->GetCardLockRetryCount(mClientId, GetOwner(),
static_cast<uint32_t>(aLockType),
getter_AddRefs(request));
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
return request.forget().downcast<DOMRequest>();
}
already_AddRefed<DOMRequest>
@ -405,54 +392,41 @@ already_AddRefed<DOMRequest>
Icc::MatchMvno(IccMvnoType aMvnoType, const nsAString& aMvnoData,
ErrorResult& aRv)
{
if (!mHandler) {
if (!mProvider) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
nsRefPtr<IccCallback> requestCallback =
new IccCallback(GetOwner(), request);
nsresult rv = mHandler->MatchMvno(static_cast<uint32_t>(aMvnoType),
aMvnoData, requestCallback);
nsRefPtr<nsIDOMDOMRequest> request;
nsresult rv = mProvider->MatchMvno(mClientId, GetOwner(),
static_cast<uint32_t>(aMvnoType),
aMvnoData, getter_AddRefs(request));
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
return request.forget().downcast<DOMRequest>();
}
already_AddRefed<Promise>
Icc::GetServiceState(IccService aService, ErrorResult& aRv)
{
if (!mHandler) {
if (!mProvider) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner());
if (!global) {
return nullptr;
}
nsRefPtr<Promise> promise = Promise::Create(global, aRv);
if (aRv.Failed()) {
return nullptr;
}
nsRefPtr<IccCallback> requestCallback =
new IccCallback(GetOwner(), promise);
nsresult rv =
mHandler->GetServiceStateEnabled(static_cast<uint32_t>(aService),
requestCallback);
nsCOMPtr<nsISupports> supports;
nsresult rv = mProvider->GetServiceState(mClientId, GetOwner(),
static_cast<uint32_t>(aService),
getter_AddRefs(supports));
if (NS_FAILED(rv)) {
promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
// fall-through to return promise.
aRv.Throw(rv);
return nullptr;
}
nsCOMPtr<Promise> promise = do_QueryInterface(supports);
return promise.forget();
}

View File

@ -8,7 +8,6 @@
#include "mozilla/dom/MozIccBinding.h"
#include "mozilla/DOMEventTargetHelper.h"
class nsIIcc;
class nsIIccInfo;
class nsIIccProvider;
@ -26,8 +25,7 @@ public:
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Icc, DOMEventTargetHelper)
NS_REALLY_FORWARD_NSIDOMEVENTTARGET(DOMEventTargetHelper)
Icc(nsPIDOMWindow* aWindow, long aClientId,
nsIIcc* aHandler, nsIIccInfo* aIccInfo);
Icc(nsPIDOMWindow* aWindow, long aClientId, nsIIccInfo* aIccInfo);
void
Shutdown();
@ -113,20 +111,14 @@ public:
IMPL_EVENT_HANDLER(stksessionend)
private:
// Put definition of the destructor in Icc.cpp to ensure forward declaration
// of nsIIccProvider, nsIIcc for the auto-generated .cpp file (i.e.,
// MozIccManagerBinding.cpp) that includes this header.
~Icc();
bool mLive;
uint32_t mClientId;
nsString mIccId;
// mProvider is a xpcom service and will be released at Shutdown(), so it
// mProvider is a xpcom service and will be released at shutdown, so it
// doesn't need to be cycle collected.
nsCOMPtr<nsIIccProvider> mProvider;
// mHandler will be released at Shutdown(), so there is no need to join cycle
// collection.
nsCOMPtr<nsIIcc> mHandler;
Nullable<OwningMozIccInfoOrMozGsmIccInfoOrMozCdmaIccInfo> mIccInfo;
};

View File

@ -1,135 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "IccCallback.h"
#include "mozilla/dom/IccCardLockError.h"
#include "mozilla/dom/MozIccBinding.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/ToJSValue.h"
#include "nsJSUtils.h"
#include "nsServiceManagerUtils.h"
namespace mozilla {
namespace dom {
namespace icc {
NS_IMPL_ISUPPORTS(IccCallback, nsIIccCallback)
IccCallback::IccCallback(nsPIDOMWindow* aWindow, DOMRequest* aRequest,
bool aIsCardLockEnabled)
: mWindow(aWindow)
, mRequest(aRequest)
, mIsCardLockEnabled(aIsCardLockEnabled)
{
}
IccCallback::IccCallback(nsPIDOMWindow* aWindow, Promise* aPromise)
: mWindow(aWindow)
, mPromise(aPromise)
{
}
nsresult
IccCallback::NotifySuccess(JS::Handle<JS::Value> aResult)
{
nsCOMPtr<nsIDOMRequestService> rs =
do_GetService(DOMREQUEST_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(rs, NS_ERROR_FAILURE);
return rs->FireSuccessAsync(mRequest, aResult);
}
nsresult
IccCallback::NotifyGetCardLockEnabled(bool aResult)
{
IccCardLockStatus result;
result.mEnabled.Construct(aResult);
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> jsResult(cx);
if (!ToJSValue(cx, result, &jsResult)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
return NotifySuccess(jsResult);
}
NS_IMETHODIMP
IccCallback::NotifySuccess()
{
return NotifySuccess(JS::UndefinedHandleValue);
}
NS_IMETHODIMP
IccCallback::NotifySuccessWithBoolean(bool aResult)
{
if (mPromise) {
mPromise->MaybeResolve(aResult ? JS::TrueHandleValue : JS::FalseHandleValue);
return NS_OK;
}
return mIsCardLockEnabled
? NotifyGetCardLockEnabled(aResult)
: NotifySuccess(aResult ? JS::TrueHandleValue : JS::FalseHandleValue);
}
NS_IMETHODIMP
IccCallback::NotifyGetCardLockRetryCount(int32_t aCount)
{
// TODO: Bug 1125018 - Simplify The Result of GetCardLock and
// getCardLockRetryCount in MozIcc.webidl without a wrapper object.
IccCardLockRetryCount result;
result.mRetryCount.Construct(aCount);
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> jsResult(cx);
if (!ToJSValue(cx, result, &jsResult)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
return NotifySuccess(jsResult);
}
NS_IMETHODIMP
IccCallback::NotifyError(const nsAString & aErrorMsg)
{
if (mPromise) {
mPromise->MaybeRejectBrokenly(aErrorMsg);
return NS_OK;
}
nsCOMPtr<nsIDOMRequestService> rs =
do_GetService(DOMREQUEST_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(rs, NS_ERROR_FAILURE);
return rs->FireErrorAsync(mRequest, aErrorMsg);
}
NS_IMETHODIMP
IccCallback::NotifyCardLockError(const nsAString & aErrorMsg,
int32_t aRetryCount)
{
nsRefPtr<IccCardLockError> error =
new IccCardLockError(mWindow, aErrorMsg, aRetryCount);
mRequest->FireDetailedError(error);
return NS_OK;
}
} // namespace icc
} // namespace dom
} // namespace mozilla

View File

@ -1,64 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_icc_IccCallback_h
#define mozilla_dom_icc_IccCallback_h
#include "nsCOMPtr.h"
#include "nsIIccService.h"
namespace mozilla {
namespace dom {
class DOMRequest;
class Promise;
namespace icc {
/**
* A callback object for handling asynchronous request/response. This object is
* created when an asynchronous request is made and should be destroyed after
* Notify*Success/Error is called.
* The modules hold the reference of IccCallback in OOP mode and non-OOP mode
* are different.
* - OOP mode: IccRequestChild
* - non-OOP mode: IccService
* The reference should be released after Notify*Success/Error is called.
*/
class IccCallback MOZ_FINAL : public nsIIccCallback
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIICCCALLBACK
// TODO: Bug 1125018 - Simplify The Result of GetCardLock and
// getCardLockRetryCount in MozIcc.webidl without a wrapper object.
IccCallback(nsPIDOMWindow* aWindow, DOMRequest* aRequest,
bool aIsCardLockEnabled = false);
IccCallback(nsPIDOMWindow* aWindow, Promise* aPromise);
private:
~IccCallback() {}
nsresult
NotifySuccess(JS::Handle<JS::Value> aResult);
// TODO: Bug 1125018 - Simplify The Result of GetCardLock and
// getCardLockRetryCount in MozIcc.webidl without a wrapper object.
nsresult
NotifyGetCardLockEnabled(bool aResult);
nsCOMPtr<nsPIDOMWindow> mWindow;
nsRefPtr<DOMRequest> mRequest;
nsRefPtr<Promise> mPromise;
// TODO: Bug 1125018 - Simplify The Result of GetCardLock and
// getCardLockRetryCount in MozIcc.webidl without a wrapper object.
bool mIsCardLockEnabled;
};
} // namespace icc
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_icc_IccCallback_h

View File

@ -4,7 +4,6 @@
#include "mozilla/dom/IccInfo.h"
#include "mozilla/dom/icc/PIccTypes.h"
#include "nsPIDOMWindow.h"
#define CONVERT_STRING_TO_NULLABLE_ENUM(_string, _enumType, _enum) \
@ -21,110 +20,29 @@
using namespace mozilla::dom;
using mozilla::dom::icc::IccInfoData;
// IccInfo
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(IccInfo, mWindow)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(IccInfo, mWindow, mIccInfo)
NS_IMPL_CYCLE_COLLECTING_ADDREF(IccInfo)
NS_IMPL_CYCLE_COLLECTING_RELEASE(IccInfo)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IccInfo)
NS_INTERFACE_MAP_ENTRY(nsIIccInfo)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
IccInfo::IccInfo(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
mIccType.SetIsVoid(true);
mIccid.SetIsVoid(true);
mMcc.SetIsVoid(true);
mMnc.SetIsVoid(true);
mSpn.SetIsVoid(true);
}
IccInfo::IccInfo(const IccInfoData& aData)
{
mIccType = aData.iccType();
mIccid = aData.iccid();
mMcc = aData.mcc();
mMnc = aData.mnc();
mSpn = aData.spn();
mIsDisplayNetworkNameRequired = aData.isDisplayNetworkNameRequired();
mIsDisplaySpnRequired = aData.isDisplaySpnRequired();
}
// nsIIccInfo
NS_IMETHODIMP
IccInfo::GetIccType(nsAString & aIccType)
{
aIccType = mIccType;
return NS_OK;
}
NS_IMETHODIMP
IccInfo::GetIccid(nsAString & aIccid)
{
aIccid = mIccid;
return NS_OK;
}
NS_IMETHODIMP
IccInfo::GetMcc(nsAString & aMcc)
{
aMcc = mMcc;
return NS_OK;
}
NS_IMETHODIMP
IccInfo::GetMnc(nsAString & aMnc)
{
aMnc = mMnc;
return NS_OK;
}
NS_IMETHODIMP
IccInfo::GetSpn(nsAString & aSpn)
{
aSpn = mSpn;
return NS_OK;
}
NS_IMETHODIMP
IccInfo::GetIsDisplayNetworkNameRequired(bool *aIsDisplayNetworkNameRequired)
{
*aIsDisplayNetworkNameRequired = mIsDisplayNetworkNameRequired;
return NS_OK;
}
NS_IMETHODIMP
IccInfo::GetIsDisplaySpnRequired(bool *aIsDisplaySpnRequired)
{
*aIsDisplaySpnRequired = mIsDisplaySpnRequired;
return NS_OK;
}
void
IccInfo::Update(nsIIccInfo* aInfo)
{
NS_ASSERTION(aInfo, "aInfo is null");
aInfo->GetIccType(mIccType);
aInfo->GetIccid(mIccid);
aInfo->GetMcc(mMcc);
aInfo->GetMnc(mMnc);
aInfo->GetSpn(mSpn);
aInfo->GetIsDisplayNetworkNameRequired(
&mIsDisplayNetworkNameRequired);
aInfo->GetIsDisplaySpnRequired(
&mIsDisplaySpnRequired);
mIccInfo = aInfo;
}
// WebIDL implementation
JSObject*
IccInfo::WrapObject(JSContext* aCx)
{
@ -134,9 +52,15 @@ IccInfo::WrapObject(JSContext* aCx)
Nullable<IccType>
IccInfo::GetIccType() const
{
if (!mIccInfo) {
return Nullable<IccType>();
}
nsAutoString type;
Nullable<IccType> iccType;
CONVERT_STRING_TO_NULLABLE_ENUM(mIccType, IccType, iccType);
mIccInfo->GetIccType(type);
CONVERT_STRING_TO_NULLABLE_ENUM(type, IccType, iccType);
return iccType;
}
@ -144,77 +68,96 @@ IccInfo::GetIccType() const
void
IccInfo::GetIccid(nsAString& aIccId) const
{
aIccId = mIccid;
if (!mIccInfo) {
aIccId.SetIsVoid(true);
return;
}
mIccInfo->GetIccid(aIccId);
}
void
IccInfo::GetMcc(nsAString& aMcc) const
{
aMcc = mMcc;
if (!mIccInfo) {
aMcc.SetIsVoid(true);
return;
}
mIccInfo->GetMcc(aMcc);
}
void
IccInfo::GetMnc(nsAString& aMnc) const
{
aMnc = mMnc;
if (!mIccInfo) {
aMnc.SetIsVoid(true);
return;
}
mIccInfo->GetMnc(aMnc);
}
void
IccInfo::GetSpn(nsAString& aSpn) const
{
aSpn = mSpn;
if (!mIccInfo) {
aSpn.SetIsVoid(true);
return;
}
mIccInfo->GetSpn(aSpn);
}
bool
IccInfo::IsDisplayNetworkNameRequired() const
{
return mIsDisplayNetworkNameRequired;
if (!mIccInfo) {
return false;
}
bool isDisplayNetworkNameRequired;
mIccInfo->GetIsDisplayNetworkNameRequired(&isDisplayNetworkNameRequired);
return isDisplayNetworkNameRequired;
}
bool
IccInfo::IsDisplaySpnRequired() const
{
if (!mIccInfo) {
return false;
}
return mIsDisplaySpnRequired;
bool isDisplaySpnRequired;
mIccInfo->GetIsDisplaySpnRequired(&isDisplaySpnRequired);
return isDisplaySpnRequired;
}
// GsmIccInfo
NS_IMPL_ISUPPORTS_INHERITED(GsmIccInfo, IccInfo, nsIGsmIccInfo)
NS_IMPL_CYCLE_COLLECTION_INHERITED(GsmIccInfo, IccInfo, mGsmIccInfo)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(GsmIccInfo)
NS_INTERFACE_MAP_END_INHERITING(IccInfo)
NS_IMPL_ADDREF_INHERITED(GsmIccInfo, IccInfo)
NS_IMPL_RELEASE_INHERITED(GsmIccInfo, IccInfo)
GsmIccInfo::GsmIccInfo(nsPIDOMWindow* aWindow)
: IccInfo(aWindow)
{
mPhoneNumber.SetIsVoid(true);
}
GsmIccInfo::GsmIccInfo(const IccInfoData& aData)
: IccInfo(aData)
{
mPhoneNumber = aData.phoneNumber();
}
// nsIGsmIccInfo
NS_IMETHODIMP
GsmIccInfo::GetMsisdn(nsAString & aMsisdn)
{
aMsisdn = mPhoneNumber;
return NS_OK;
}
// WebIDL implementation
void
GsmIccInfo::Update(nsIGsmIccInfo* aInfo)
{
MOZ_ASSERT(aInfo);
nsCOMPtr<nsIIccInfo> iccInfo = do_QueryInterface(aInfo);
MOZ_ASSERT(iccInfo);
IccInfo::Update(iccInfo);
aInfo->GetMsisdn(mPhoneNumber);
mGsmIccInfo = aInfo;
}
JSObject*
@ -226,57 +169,39 @@ GsmIccInfo::WrapObject(JSContext* aCx)
void
GsmIccInfo::GetMsisdn(nsAString& aMsisdn) const
{
aMsisdn = mPhoneNumber;
if (!mGsmIccInfo) {
aMsisdn.SetIsVoid(true);
return;
}
mGsmIccInfo->GetMsisdn(aMsisdn);
}
// CdmaIccInfo
NS_IMPL_ISUPPORTS_INHERITED(CdmaIccInfo, IccInfo, nsICdmaIccInfo)
NS_IMPL_CYCLE_COLLECTION_INHERITED(CdmaIccInfo, IccInfo, mCdmaIccInfo)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(CdmaIccInfo)
NS_INTERFACE_MAP_END_INHERITING(IccInfo)
NS_IMPL_ADDREF_INHERITED(CdmaIccInfo, IccInfo)
NS_IMPL_RELEASE_INHERITED(CdmaIccInfo, IccInfo)
CdmaIccInfo::CdmaIccInfo(nsPIDOMWindow* aWindow)
: IccInfo(aWindow)
{
mPhoneNumber.SetIsVoid(true);
}
CdmaIccInfo::CdmaIccInfo(const IccInfoData& aData)
: IccInfo(aData)
{
mPhoneNumber = aData.phoneNumber();
mPrlVersion = aData.prlVersion();
}
// nsICdmaIccInfo
NS_IMETHODIMP
CdmaIccInfo::GetMdn(nsAString & aMdn)
{
aMdn = mPhoneNumber;
return NS_OK;
}
NS_IMETHODIMP
CdmaIccInfo::GetPrlVersion(int32_t *aPrlVersion)
{
*aPrlVersion = mPrlVersion;
return NS_OK;
}
void
CdmaIccInfo::Update(nsICdmaIccInfo* aInfo)
{
MOZ_ASSERT(aInfo);
nsCOMPtr<nsIIccInfo> iccInfo = do_QueryInterface(aInfo);
MOZ_ASSERT(iccInfo);
IccInfo::Update(iccInfo);
aInfo->GetMdn(mPhoneNumber);
aInfo->GetPrlVersion(&mPrlVersion);
mCdmaIccInfo = aInfo;
}
// WebIDL implementation
JSObject*
CdmaIccInfo::WrapObject(JSContext* aCx)
{
@ -286,11 +211,23 @@ CdmaIccInfo::WrapObject(JSContext* aCx)
void
CdmaIccInfo::GetMdn(nsAString& aMdn) const
{
aMdn = mPhoneNumber;
if (!mCdmaIccInfo) {
aMdn.SetIsVoid(true);
return;
}
mCdmaIccInfo->GetMdn(aMdn);
}
int32_t
CdmaIccInfo::PrlVersion() const
{
return mPrlVersion;
if (!mCdmaIccInfo) {
return 0;
}
int32_t prlVersion;
mCdmaIccInfo->GetPrlVersion(&prlVersion);
return prlVersion;
}

View File

@ -14,20 +14,14 @@ class nsPIDOMWindow;
namespace mozilla {
namespace dom {
namespace icc {
class IccInfoData;
} // namespace icc
class IccInfo : public nsIIccInfo
class IccInfo : public nsISupports
, public nsWrapperCache
{
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(IccInfo)
NS_DECL_NSIICCINFO
explicit IccInfo(nsPIDOMWindow* aWindow);
explicit IccInfo(const icc::IccInfoData& aData);
void
Update(nsIIccInfo* aInfo);
@ -67,30 +61,18 @@ public:
protected:
virtual ~IccInfo() {}
protected:
nsCOMPtr<nsPIDOMWindow> mWindow;
// To prevent compiling error in OS_WIN in auto-generated UnifiedBindingsXX.cpp,
// we have all data fields expended here instead of having a data member of
// |IccInfoData| defined in PIccTypes.h which indirectly includes "windows.h"
// See 925382 for the restriction of including "windows.h" in UnifiedBindings.cpp.
nsString mIccType;
nsString mIccid;
nsString mMcc;
nsString mMnc;
nsString mSpn;
bool mIsDisplayNetworkNameRequired;
bool mIsDisplaySpnRequired;
nsCOMPtr<nsIIccInfo> mIccInfo;
};
class GsmIccInfo MOZ_FINAL : public IccInfo
, public nsIGsmIccInfo
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIICCINFO(IccInfo::)
NS_DECL_NSIGSMICCINFO
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(GsmIccInfo, IccInfo)
explicit GsmIccInfo(nsPIDOMWindow* aWindow);
explicit GsmIccInfo(const icc::IccInfoData& aData);
void
Update(nsIGsmIccInfo* aInfo);
@ -106,19 +88,17 @@ public:
private:
~GsmIccInfo() {}
nsString mPhoneNumber;
private:
nsCOMPtr<nsIGsmIccInfo> mGsmIccInfo;
};
class CdmaIccInfo MOZ_FINAL : public IccInfo
, public nsICdmaIccInfo
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIICCINFO(IccInfo::)
NS_DECL_NSICDMAICCINFO
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(CdmaIccInfo, IccInfo)
explicit CdmaIccInfo(nsPIDOMWindow* aWindow);
explicit CdmaIccInfo(const icc::IccInfoData& aData);
void
Update(nsICdmaIccInfo* aInfo);
@ -137,8 +117,8 @@ public:
private:
~CdmaIccInfo() {}
nsString mPhoneNumber;
int32_t mPrlVersion;
private:
nsCOMPtr<nsICdmaIccInfo> mCdmaIccInfo;
};
} // namespace dom

View File

@ -20,8 +20,6 @@ IccListener::IccListener(IccManager* aIccManager, uint32_t aClientId)
{
MOZ_ASSERT(mIccManager);
// TODO: Bug 1114938, Refactor STK in MozIcc.webidl with IPDL.
// Remove the registration to IccProvider.
mProvider = do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
if (!mProvider) {
@ -29,34 +27,17 @@ IccListener::IccListener(IccManager* aIccManager, uint32_t aClientId)
return;
}
nsCOMPtr<nsIIccService> iccService = do_GetService(ICC_SERVICE_CONTRACTID);
if (!iccService) {
NS_WARNING("Could not acquire nsIIccService!");
return;
}
iccService->GetIccByServiceId(mClientId, getter_AddRefs(mHandler));
if (!mHandler) {
NS_WARNING("Could not acquire nsIIcc!");
return;
}
nsCOMPtr<nsIIccInfo> iccInfo;
mHandler->GetIccInfo(getter_AddRefs(iccInfo));
mProvider->GetIccInfo(mClientId, getter_AddRefs(iccInfo));
if (iccInfo) {
nsString iccId;
iccInfo->GetIccid(iccId);
if (!iccId.IsEmpty()) {
mIcc = new Icc(mIccManager->GetOwner(), mClientId, mHandler, iccInfo);
mIcc = new Icc(mIccManager->GetOwner(), mClientId, iccInfo);
}
}
DebugOnly<nsresult> rv = mHandler->RegisterListener(this);
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
"Failed registering icc listener with Icc Handler");
rv = mProvider->RegisterIccMsg(mClientId, this);
DebugOnly<nsresult> rv = mProvider->RegisterIccMsg(mClientId, this);
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
"Failed registering icc messages with provider");
}
@ -69,18 +50,11 @@ IccListener::~IccListener()
void
IccListener::Shutdown()
{
// TODO: Bug 1114938, Refactor STK in MozIcc.webidl with IPDL.
// Remove the unregistration to IccProvider.
if (mProvider) {
mProvider->UnregisterIccMsg(mClientId, this);
mProvider = nullptr;
}
if (mHandler) {
mHandler->UnregisterListener(this);
mHandler = nullptr;
}
if (mIcc) {
mIcc->Shutdown();
mIcc = nullptr;
@ -124,12 +98,8 @@ IccListener::NotifyCardStateChanged()
NS_IMETHODIMP
IccListener::NotifyIccInfoChanged()
{
if (!mHandler) {
return NS_OK;
}
nsCOMPtr<nsIIccInfo> iccInfo;
mHandler->GetIccInfo(getter_AddRefs(iccInfo));
mProvider->GetIccInfo(mClientId, getter_AddRefs(iccInfo));
// Create/delete icc object based on current iccInfo.
// 1. If the mIcc is nullptr and iccInfo has valid data, create icc object and
@ -141,7 +111,7 @@ IccListener::NotifyIccInfoChanged()
nsString iccId;
iccInfo->GetIccid(iccId);
if (!iccId.IsEmpty()) {
mIcc = new Icc(mIccManager->GetOwner(), mClientId, mHandler, iccInfo);
mIcc = new Icc(mIccManager->GetOwner(), mClientId, iccInfo);
mIccManager->NotifyIccAdd(iccId);
mIcc->NotifyEvent(NS_LITERAL_STRING("iccinfochange"));
}

View File

@ -7,7 +7,6 @@
#include "nsAutoPtr.h"
#include "nsIIccProvider.h"
#include "nsIIccService.h"
namespace mozilla {
namespace dom {
@ -43,12 +42,9 @@ private:
// IccListener, this will release the reference and break the cycle.
nsRefPtr<Icc> mIcc;
nsRefPtr<IccManager> mIccManager;
// mProvider is a xpcom service and will be released at Shutdown(), so it
// mProvider is a xpcom service and will be released at shutdown, so it
// doesn't need to be cycle collected.
nsCOMPtr<nsIIccProvider> mProvider;
// mHandler will be released at Shutdown(), there is no need to join cycle
// collection.
nsCOMPtr<nsIIcc> mHandler;
};
} // namespace dom

View File

@ -10,15 +10,6 @@
#include "mozilla/dom/IccChangeEvent.h"
#include "mozilla/Preferences.h"
#include "nsIIccInfo.h"
// Service instantiation
#include "ipc/IccIPCService.h"
#if defined(MOZ_WIDGET_GONK) && defined(MOZ_B2G_RIL)
// TODO: Bug 815526, deprecate RILContentHelper.
#include "nsIRadioInterfaceLayer.h"
#include "nsRadioInterfaceLayer.h"
#include "nsIGonkIccService.h"
#endif
#include "nsXULAppAPI.h" // For XRE_GetProcessType()
using namespace mozilla::dom;
@ -138,25 +129,3 @@ IccManager::GetIccById(const nsAString& aIccId) const
}
return nullptr;
}
already_AddRefed<nsIIccService>
NS_CreateIccService()
{
nsCOMPtr<nsIIccService> service;
if (XRE_GetProcessType() == GeckoProcessType_Content) {
service = new mozilla::dom::icc::IccIPCService();
#if defined(MOZ_WIDGET_GONK) && defined(MOZ_B2G_RIL)
} else {
// TODO: Bug 815526, deprecate RILContentHelper.
nsCOMPtr <nsIRadioInterfaceLayer> ril =
do_GetService(NS_RADIOINTERFACELAYER_CONTRACTID);
nsCOMPtr <nsIRadioInterfaceLayer_new> ril_new(do_QueryInterface(ril));
service = (ril_new) ? do_GetService(GONK_ICC_SERVICE_CONTRACTID)
: do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
#endif
}
return service.forget();
}

View File

@ -7,6 +7,7 @@
#include "mozilla/DOMEventTargetHelper.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIIccProvider.h"
#include "nsTArrayHelpers.h"
namespace mozilla {
@ -24,7 +25,7 @@ public:
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IccManager, DOMEventTargetHelper)
explicit IccManager(nsPIDOMWindow* aWindow);
IccManager(nsPIDOMWindow* aWindow);
void
Shutdown();

View File

@ -1,437 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
var RIL = {};
Cu.import("resource://gre/modules/ril_consts.js", RIL);
const GONK_ICCSERVICE_CONTRACTID = "@mozilla.org/icc/gonkiccservice;1";
const GONK_ICCSERVICE_CID = Components.ID("{df854256-9554-11e4-a16c-c39e8d106c26}");
const NS_XPCOM_SHUTDOWN_OBSERVER_ID = "xpcom-shutdown";
const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
const kPrefRilDebuggingEnabled = "ril.debugging.enabled";
const kPrefRilNumRadioInterfaces = "ril.numRadioInterfaces";
XPCOMUtils.defineLazyServiceGetter(this, "gRadioInterfaceLayer",
"@mozilla.org/ril;1",
"nsIRadioInterfaceLayer");
let DEBUG = RIL.DEBUG_RIL;
function debug(s) {
dump("IccService: " + s);
}
function IccInfo() {}
IccInfo.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIIccInfo]),
// nsIIccInfo
iccType: null,
iccid: null,
mcc: null,
mnc: null,
spn: null,
isDisplayNetworkNameRequired: false,
isDisplaySpnRequired: false
};
function GsmIccInfo() {}
GsmIccInfo.prototype = {
__proto__: IccInfo.prototype,
QueryInterface: XPCOMUtils.generateQI([Ci.nsIGsmIccInfo,
Ci.nsIIccInfo]),
// nsIGsmIccInfo
msisdn: null
};
function CdmaIccInfo() {}
CdmaIccInfo.prototype = {
__proto__: IccInfo.prototype,
QueryInterface: XPCOMUtils.generateQI([Ci.nsICdmaIccInfo,
Ci.nsIIccInfo]),
// nsICdmaIccInfo
mdn: null,
prlVersion: 0
};
function IccService() {
this._iccs = [];
let numClients = gRadioInterfaceLayer.numRadioInterfaces;
for (let i = 0; i < numClients; i++) {
this._iccs.push(new Icc(gRadioInterfaceLayer.getRadioInterface(i)));
}
this._updateDebugFlag();
Services.prefs.addObserver(kPrefRilDebuggingEnabled, this, false);
Services.obs.addObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
}
IccService.prototype = {
classID: GONK_ICCSERVICE_CID,
classInfo: XPCOMUtils.generateCI({classID: GONK_ICCSERVICE_CID,
contractID: GONK_ICCSERVICE_CONTRACTID,
classDescription: "IccService",
interfaces: [Ci.nsIIccService,
Ci.nsIGonkIccService],
flags: Ci.nsIClassInfo.SINGLETON}),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIIccService,
Ci.nsIGonkIccService,
Ci.nsIObserver]),
// An array of Icc instances.
_iccs: null,
_updateDebugFlag: function() {
try {
DEBUG = DEBUG ||
Services.prefs.getBoolPref(kPrefRilDebuggingEnabled);
} catch (e) {}
},
/**
* nsIIccService interface.
*/
getIccByServiceId: function(aServiceId) {
let icc = this._iccs[aServiceId];
if (!icc) {
throw Cr.NS_ERROR_UNEXPECTED;
}
return icc;
},
/**
* nsIGonkIccService interface.
*/
notifyCardStateChanged: function(aServiceId, aCardState) {
if (DEBUG) {
debug("notifyCardStateChanged for service Id: " + aServiceId +
", CardState: " + aCardState);
}
this.getIccByServiceId(aServiceId)._updateCardState(aCardState);
},
notifyIccInfoChanged: function(aServiceId, aIccInfo) {
if (DEBUG) {
debug("notifyIccInfoChanged for service Id: " + aServiceId +
", IccInfo: " + JSON.stringify(aIccInfo));
}
this.getIccByServiceId(aServiceId)._updateIccInfo(aIccInfo);
},
notifyImsiChanged: function(aServiceId, aImsi) {
if (DEBUG) {
debug("notifyImsiChanged for service Id: " + aServiceId +
", Imsi: " + aImsi);
}
let icc = this.getIccByServiceId(aServiceId);
icc._imsi = aImsi;
},
/**
* nsIObserver interface.
*/
observe: function(aSubject, aTopic, aData) {
switch (aTopic) {
case NS_PREFBRANCH_PREFCHANGE_TOPIC_ID:
if (aData === kPrefRilDebuggingEnabled) {
this._updateDebugFlag();
}
break;
case NS_XPCOM_SHUTDOWN_OBSERVER_ID:
Services.prefs.removeObserver(kPrefRilDebuggingEnabled, this);
Services.obs.removeObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID);
break;
}
}
};
function Icc(aRadioInterface) {
this._radioInterface = aRadioInterface;
this._listeners = [];
}
Icc.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIIcc]),
_radioInterface: null,
_imsi: null,
_listeners: null,
_updateCardState: function(aCardState) {
if (this.cardState != aCardState) {
this.cardState = aCardState;
}
this._deliverListenerEvent("notifyCardStateChanged");
},
// An utility function to copy objects.
_updateInfo: function(aSrcInfo, aDestInfo) {
for (let key in aSrcInfo) {
aDestInfo[key] = aSrcInfo[key];
}
},
/**
* We need to consider below cases when update iccInfo:
* 1. Should clear iccInfo to null if there is no card detected.
* 2. Need to create corresponding object based on iccType.
*/
_updateIccInfo: function(aIccInfo) {
// Card is not detected, clear iccInfo to null.
if (!aIccInfo || !aIccInfo.iccid) {
if (this.iccInfo) {
if (DEBUG) {
debug("Card is not detected, clear iccInfo to null.");
}
this.iccInfo = null;
this._deliverListenerEvent("notifyIccInfoChanged");
}
return;
}
// If iccInfo is null, new corresponding object based on iccType.
if (!this.iccInfo ||
this.iccInfo.iccType != aIccInfo.iccType) {
if (aIccInfo.iccType === "ruim" || aIccInfo.iccType === "csim") {
this.iccInfo = new CdmaIccInfo();
} else if (aIccInfo.iccType === "sim" || aIccInfo.iccType === "usim") {
this.iccInfo = new GsmIccInfo();
} else {
this.iccInfo = new IccInfo();
}
}
this._updateInfo(aIccInfo, this.iccInfo);
this._deliverListenerEvent("notifyIccInfoChanged");
// Update lastKnownSimMcc.
if (aIccInfo.mcc) {
try {
Services.prefs.setCharPref("ril.lastKnownSimMcc",
aIccInfo.mcc.toString());
} catch (e) {}
}
},
_deliverListenerEvent: function(aName, aArgs) {
let listeners = this._listeners.slice();
for (let listener of listeners) {
if (this._listeners.indexOf(listener) === -1) {
continue;
}
let handler = listener[aName];
if (typeof handler != "function") {
throw new Error("No handler for " + aName);
}
try {
handler.apply(listener, aArgs);
} catch (e) {
if (DEBUG) {
debug("listener for " + aName + " threw an exception: " + e);
}
}
}
},
_modifyCardLock: function(aOperation, aOptions, aCallback) {
this._radioInterface.sendWorkerMessage(aOperation,
aOptions,
(aResponse) => {
if (aResponse.errorMsg) {
let retryCount =
(aResponse.retryCount !== undefined) ? aResponse.retryCount : -1;
aCallback.notifyCardLockError(aResponse.errorMsg, retryCount);
return;
}
aCallback.notifySuccess();
});
},
/**
* Helper to match the MVNO pattern with IMSI.
*
* Note: Characters 'x' and 'X' in MVNO are skipped and not compared.
* E.g., if the aMvnoData passed is '310260x10xxxxxx', then the
* function returns true only if imsi has the same first 6 digits, 8th
* and 9th digit.
*
* @param aMvnoData
* MVNO pattern.
* @param aImsi
* IMSI of this ICC.
*
* @return true if matched.
*/
_isImsiMatches: function(aMvnoData, aImsi) {
// This should not be an error, but a mismatch.
if (aMvnoData.length > aImsi.length) {
return false;
}
for (let i = 0; i < aMvnoData.length; i++) {
let c = aMvnoData[i];
if ((c !== 'x') && (c !== 'X') && (c !== aImsi[i])) {
return false;
}
}
return true;
},
/**
* nsIIcc interface.
*/
iccInfo: null,
cardState: Ci.nsIIcc.CARD_STATE_UNKNOWN,
registerListener: function(aListener) {
if (this._listeners.indexOf(aListener) >= 0) {
throw Cr.NS_ERROR_UNEXPECTED;
}
this._listeners.push(aListener);
},
unregisterListener: function(aListener) {
let index = this._listeners.indexOf(aListener);
if (index >= 0) {
this._listeners.splice(index, 1);
}
},
getCardLockEnabled: function(aLockType, aCallback) {
this._radioInterface.sendWorkerMessage("iccGetCardLockEnabled",
{ lockType: aLockType },
(aResponse) => {
if (aResponse.errorMsg) {
aCallback.notifyError(aResponse.errorMsg);
return;
}
aCallback.notifySuccessWithBoolean(aResponse.enabled);
});
},
unlockCardLock: function(aLockType, aPassword, aNewPin, aCallback) {
this._modifyCardLock("iccUnlockCardLock",
{ lockType: aLockType,
password: aPassword,
newPin: aNewPin },
aCallback);
},
setCardLockEnabled: function(aLockType, aPassword, aEnabled, aCallback) {
this._modifyCardLock("iccSetCardLockEnabled",
{ lockType: aLockType,
password: aPassword,
enabled: aEnabled },
aCallback);
},
changeCardLockPassword: function(aLockType, aPassword, aNewPassword, aCallback) {
this._modifyCardLock("iccChangeCardLockPassword",
{ lockType: aLockType,
password: aPassword,
newPassword: aNewPassword, },
aCallback);
},
getCardLockRetryCount: function(aLockType, aCallback) {
this._radioInterface.sendWorkerMessage("iccGetCardLockRetryCount",
{ lockType: aLockType },
(aResponse) => {
if (aResponse.errorMsg) {
aCallback.notifyError(aResponse.errorMsg);
return;
}
aCallback.notifyGetCardLockRetryCount(aResponse.retryCount);
});
},
matchMvno: function(aMvnoType, aMvnoData, aCallback) {
if (!aMvnoData) {
aCallback.notifyError(RIL.GECKO_ERROR_INVALID_PARAMETER);
return;
}
switch (aMvnoType) {
case Ci.nsIIcc.CARD_MVNO_TYPE_IMSI:
let imsi = this._imsi;
if (!imsi) {
aCallback.notifyError(RIL.GECKO_ERROR_GENERIC_FAILURE);
break;
}
aCallback.notifySuccessWithBoolean(
this._isImsiMatches(aMvnoData, imsi));
break;
case Ci.nsIIcc.CARD_MVNO_TYPE_SPN:
let spn = this.iccInfo && this.iccInfo.spn;
if (!spn) {
aCallback.notifyError(RIL.GECKO_ERROR_GENERIC_FAILURE);
break;
}
aCallback.notifySuccessWithBoolean(spn == aMvnoData);
break;
case Ci.nsIIcc.CARD_MVNO_TYPE_GID:
this._radioInterface.sendWorkerMessage("getGID1",
null,
(aResponse) => {
let gid = aResponse.gid1;
let mvnoDataLength = aMvnoData.length;
if (!gid) {
aCallback.notifyError(RIL.GECKO_ERROR_GENERIC_FAILURE);
} else if (mvnoDataLength > gid.length) {
aCallback.notifySuccessWithBoolean(false);
} else {
let result =
gid.substring(0, mvnoDataLength).toLowerCase() ==
aMvnoData.toLowerCase();
aCallback.notifySuccessWithBoolean(result);
}
});
break;
default:
aCallback.notifyError(RIL.GECKO_ERROR_MODE_NOT_SUPPORTED);
break;
}
},
getServiceStateEnabled: function(aService, aCallback) {
this._radioInterface.sendWorkerMessage("getIccServiceState",
{ service: aService },
(aResponse) => {
if (aResponse.errorMsg) {
aCallback.notifyError(aResponse.errorMsg);
return;
}
aCallback.notifySuccessWithBoolean(aResponse.result);
});
}
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([IccService]);

View File

@ -1,6 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
component {df854256-9554-11e4-a16c-c39e8d106c26} IccService.js
contract @mozilla.org/icc/gonkiccservice;1 {df854256-9554-11e4-a16c-c39e8d106c26}

View File

@ -6,13 +6,11 @@
XPIDL_SOURCES += [
'nsIIccInfo.idl',
'nsIIccProvider.idl', # TODO: Bug 815526, deprecate RILContentHelper.
'nsIIccService.idl',
'nsIIccProvider.idl',
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' and CONFIG['MOZ_B2G_RIL']:
XPIDL_SOURCES += [
'nsIGonkIccService.idl',
'nsIIccMessenger.idl',
]

View File

@ -1,21 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsIIccService.idl"
%{C++
#define GONK_ICC_SERVICE_CONTRACTID \
"@mozilla.org/icc/gonkiccservice;1"
%}
[scriptable, uuid(a037b8a2-b027-11e4-9496-c3b7af59a512)]
interface nsIGonkIccService : nsIIccService
{
// TODO: Bug 1114938 - Refactor STK in MozIcc.webidl with IPDL:
// void notifyStkCommand(in unsigned long aServiceId, in jsval aStkcommand);
// void notifyStkSessionEnd(in unsigned long aServiceId);
void notifyCardStateChanged(in unsigned long aServiceId, in unsigned long aCardState);
void notifyIccInfoChanged(in unsigned long aServiceId, in jsval aIccInfo);
void notifyImsiChanged(in unsigned long aServiceId, in DOMString aImsi);
};

View File

@ -7,7 +7,15 @@
interface nsIDOMDOMRequest;
interface nsIDOMWindow;
interface nsIIccInfo;
interface nsIIccListener;
[scriptable, uuid(7c0ada3d-d8d4-493e-9243-fa3df39855e4)]
interface nsIIccListener : nsISupports
{
void notifyStkCommand(in DOMString aMessage);
void notifyStkSessionEnd();
void notifyCardStateChanged();
void notifyIccInfoChanged();
};
[scriptable, uuid(6136acab-b50e-494a-a86d-df392a032897)]
interface nsIIccChannelCallback : nsISupports
@ -50,9 +58,83 @@ interface nsIIccChannelCallback : nsISupports
/**
* XPCOM component (in the content process) that provides the ICC information.
*/
[scriptable, uuid(7dd6e186-b007-11e4-9b7e-7717d7863cb8)]
[scriptable, uuid(a203cd2e-2280-4d8e-a687-42b745d322c1)]
interface nsIIccProvider : nsISupports
{
// MUST match enum IccCardState in MozIcc.webidl!
const unsigned long CARD_STATE_UNKNOWN = 0;
const unsigned long CARD_STATE_READY = 1;
const unsigned long CARD_STATE_PIN_REQUIRED = 2;
const unsigned long CARD_STATE_PUK_REQUIRED = 3;
const unsigned long CARD_STATE_PERMANENT_BLOCKED = 4;
const unsigned long CARD_STATE_PERSONALIZATION_IN_PROGRESS = 5;
const unsigned long CARD_STATE_PERSONALIZATION_READY = 6;
const unsigned long CARD_STATE_NETWORK_LOCKED = 7;
const unsigned long CARD_STATE_NETWORK_SUBSET_LOCKED = 8;
const unsigned long CARD_STATE_CORPORATE_LOCKED = 9;
const unsigned long CARD_STATE_SERVICE_PROVIDER_LOCKED = 10;
const unsigned long CARD_STATE_SIM_LOCKED = 11;
const unsigned long CARD_STATE_NETWORK_PUK_REQUIRED = 12;
const unsigned long CARD_STATE_NETWORK_SUBSET_PUK_REQUIRED = 13;
const unsigned long CARD_STATE_CORPORATE_PUK_REQUIRED = 14;
const unsigned long CARD_STATE_SERVICE_PROVIDER_PUK_REQUIRED = 15;
const unsigned long CARD_STATE_SIM_PUK_REQUIRED = 16;
const unsigned long CARD_STATE_NETWORK1_LOCKED = 17;
const unsigned long CARD_STATE_NETWORK2_LOCKED = 18;
const unsigned long CARD_STATE_HRPD_NETWORK_LOCKED = 19;
const unsigned long CARD_STATE_RUIM_CORPORATE_LOCKED = 20;
const unsigned long CARD_STATE_RUIM_SERVICE_PROVIDER_LOCKED = 21;
const unsigned long CARD_STATE_RUIM_LOCKED = 22;
const unsigned long CARD_STATE_NETWORK1_PUK_REQUIRED = 23;
const unsigned long CARD_STATE_NETWORK2_PUK_REQUIRED = 24;
const unsigned long CARD_STATE_HRPD_NETWORK_PUK_REQUIRED = 25;
const unsigned long CARD_STATE_RUIM_CORPORATE_PUK_REQUIRED = 26;
const unsigned long CARD_STATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED = 27;
const unsigned long CARD_STATE_RUIM_PUK_REQUIRED = 28;
const unsigned long CARD_STATE_ILLEGAL = 29;
const unsigned long CARD_STATE_UNDETECTED = 4294967295; // UINT32_MAX
// MUST match with enum IccLockType in MozIcc.webidl
const unsigned long CARD_LOCK_TYPE_PIN = 0;
const unsigned long CARD_LOCK_TYPE_PIN2 = 1;
const unsigned long CARD_LOCK_TYPE_PUK = 2;
const unsigned long CARD_LOCK_TYPE_PUK2 = 3;
const unsigned long CARD_LOCK_TYPE_NCK = 4;
const unsigned long CARD_LOCK_TYPE_NSCK = 5;
const unsigned long CARD_LOCK_TYPE_NCK1 = 6;
const unsigned long CARD_LOCK_TYPE_NCK2 = 7;
const unsigned long CARD_LOCK_TYPE_HNCK = 8;
const unsigned long CARD_LOCK_TYPE_CCK = 9;
const unsigned long CARD_LOCK_TYPE_SPCK = 10;
const unsigned long CARD_LOCK_TYPE_PCK = 11;
const unsigned long CARD_LOCK_TYPE_RCCK = 12;
const unsigned long CARD_LOCK_TYPE_RSPCK = 13;
const unsigned long CARD_LOCK_TYPE_NCK_PUK = 14;
const unsigned long CARD_LOCK_TYPE_NSCK_PUK = 15;
const unsigned long CARD_LOCK_TYPE_NCK1_PUK = 16;
const unsigned long CARD_LOCK_TYPE_NCK2_PUK = 17;
const unsigned long CARD_LOCK_TYPE_HNCK_PUK = 18;
const unsigned long CARD_LOCK_TYPE_CCK_PUK = 19;
const unsigned long CARD_LOCK_TYPE_SPCK_PUK = 20;
const unsigned long CARD_LOCK_TYPE_PCK_PUK = 21;
const unsigned long CARD_LOCK_TYPE_RCCK_PUK = 22;
const unsigned long CARD_LOCK_TYPE_RSPCK_PUK = 23;
const unsigned long CARD_LOCK_TYPE_FDN = 24;
// MUST match with enum IccContactType in MozIcc.webidl
const unsigned long CARD_CONTACT_TYPE_ADN = 0;
const unsigned long CARD_CONTACT_TYPE_FDN = 1;
const unsigned long CARD_CONTACT_TYPE_SDN = 2;
// MUST match with enum IccMvnoType in MozIcc.webidl
const unsigned long CARD_MVNO_TYPE_IMSI = 0;
const unsigned long CARD_MVNO_TYPE_SPN = 1;
const unsigned long CARD_MVNO_TYPE_GID = 2;
// MUST match with enum IccService in MozIcc.webidl
const unsigned long CARD_SERVICE_FDN = 0;
/**
* Called when a content process registers receiving unsolicited messages from
* RadioInterfaceLayer in the chrome process. Only a content process that has
@ -61,6 +143,18 @@ interface nsIIccProvider : nsISupports
void registerIccMsg(in unsigned long clientId, in nsIIccListener listener);
void unregisterIccMsg(in unsigned long clientId, in nsIIccListener listener);
/**
* UICC Information
*/
nsIIccInfo getIccInfo(in unsigned long clientId);
/**
* Card State
*
* One of the nsIIccProvider.CARD_STATE_* values.
*/
unsigned long getCardState(in unsigned long clientId);
/**
* STK interfaces.
*/
@ -79,6 +173,31 @@ interface nsIIccProvider : nsISupports
in nsIDOMWindow window,
in jsval event);
/**
* Card lock interfaces.
*/
nsIDOMDOMRequest getCardLockEnabled(in unsigned long clientId,
in nsIDOMWindow window,
in unsigned long lockType);
nsIDOMDOMRequest unlockCardLock(in unsigned long clientId,
in nsIDOMWindow window,
in unsigned long lockType,
in DOMString password,
[optional] in DOMString newPin);
nsIDOMDOMRequest setCardLockEnabled(in unsigned long clientId,
in nsIDOMWindow window,
in unsigned long lockType,
in DOMString password,
in boolean enabled);
nsIDOMDOMRequest changeCardLockPassword(in unsigned long clientId,
in nsIDOMWindow window,
in unsigned long lockType,
in DOMString password,
in DOMString newPassword);
nsIDOMDOMRequest getCardLockRetryCount(in unsigned long clientId,
in nsIDOMWindow window,
in unsigned long lockType);
/**
* Phonebook interfaces.
*/
@ -92,7 +211,7 @@ interface nsIIccProvider : nsISupports
in jsval contact,
in DOMString pin2);
/**
/**
* Secure Card Icc communication channel
*/
void iccOpenChannel(in unsigned long clientId,
@ -119,4 +238,16 @@ interface nsIIccProvider : nsISupports
void iccCloseChannel(in unsigned long clientId,
in long channel,
in nsIIccChannelCallback callback);
/**
* Helpers
*/
nsIDOMDOMRequest matchMvno(in unsigned long clientId,
in nsIDOMWindow window,
in unsigned long mvnoType,
in DOMString mvnoData);
nsISupports getServiceState(in unsigned long clientId,
in nsIDOMWindow window,
in unsigned long service);
};

View File

@ -1,329 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsISupports.idl"
interface nsIIcc;
interface nsIIccInfo;
[scriptable, uuid(7c0ada3d-d8d4-493e-9243-fa3df39855e4)]
interface nsIIccListener : nsISupports
{
void notifyStkCommand(in DOMString aMessage);
void notifyStkSessionEnd();
void notifyCardStateChanged();
void notifyIccInfoChanged();
};
/**
* A callback interface for handling asynchronous response.
*/
[scriptable, uuid(b0e2899a-adc3-11e4-89cf-1b60eaa35b06)]
interface nsIIccCallback : nsISupports
{
/**
* The success callback with no result required:
* |unlockCardLock|, |setCardLockEnabled| and |changeCardLockPassword|.
*/
void notifySuccess();
/**
* The success callback with boolean response:
* |getCardLockEnabled|, |matchMvno|, and |getServiceStateEnabled|.
*/
void notifySuccessWithBoolean(in boolean aResult);
/**
* The success callback of |getCardLockRetryCount|.
*
* @param aCount
* The number of remaining retries. -1 if unknown.
*/
void notifyGetCardLockRetryCount(in long aCount);
/**
* The error callback of |getCardLockEnabled|, |getCardLockRetryCount|,
* |matchMvno|, and |getServiceStateEnabled|.
*
* @param aErrorMsg
* The error message.
*/
void notifyError(in DOMString aErrorMsg);
/**
* The error callback of |unlockCardLock|, |setCardLockEnabled| and
* |changeCardLockPassword|.
*
* @param aErrorMsg
* The error message.
* @param aRetryCount
* The number of remaining retries. -1 if unknown.
*/
void notifyCardLockError(in DOMString aErrorMsg, in long aRetryCount);
};
%{C++
#define ICC_SERVICE_CID \
{ 0xbab0277a, 0x900e, 0x11e4, { 0x80, 0xc7, 0xdb, 0xd7, 0xad, 0x05, 0x24, 0x01 } }
#define ICC_SERVICE_CONTRACTID \
"@mozilla.org/icc/iccservice;1"
template<typename T> struct already_AddRefed;
%}
/**
* XPCOM Service for the selection of the ICC to be accessed.
*/
[scriptable, uuid(6590a04c-9ca4-11e4-ae95-570876ecc428)]
interface nsIIccService : nsISupports
{
/**
* Get Icc instance with specified Service Id.
*
* @param aServiceId
* Started from 0 to nsIMobileConnectionService.numItems - 1;
*
* @return a nsIcc instance.
*/
nsIIcc getIccByServiceId(in unsigned long aServiceId);
};
%{C++
already_AddRefed<nsIIccService>
NS_CreateIccService();
%}
/**
* XPCOM component that provides the access to the selected ICC.
*/
[scriptable, uuid(38a5bbe2-add6-11e4-ba9e-e390d1d19195)]
interface nsIIcc : nsISupports
{
/**
* Card State Constants
*
* Note: MUST be matched with enum IccCardState in MozIcc.webidl!
*/
const unsigned long CARD_STATE_UNKNOWN = 0;
const unsigned long CARD_STATE_READY = 1;
const unsigned long CARD_STATE_PIN_REQUIRED = 2;
const unsigned long CARD_STATE_PUK_REQUIRED = 3;
const unsigned long CARD_STATE_PERMANENT_BLOCKED = 4;
const unsigned long CARD_STATE_PERSONALIZATION_IN_PROGRESS = 5;
const unsigned long CARD_STATE_PERSONALIZATION_READY = 6;
const unsigned long CARD_STATE_NETWORK_LOCKED = 7;
const unsigned long CARD_STATE_NETWORK_SUBSET_LOCKED = 8;
const unsigned long CARD_STATE_CORPORATE_LOCKED = 9;
const unsigned long CARD_STATE_SERVICE_PROVIDER_LOCKED = 10;
const unsigned long CARD_STATE_SIM_LOCKED = 11;
const unsigned long CARD_STATE_NETWORK_PUK_REQUIRED = 12;
const unsigned long CARD_STATE_NETWORK_SUBSET_PUK_REQUIRED = 13;
const unsigned long CARD_STATE_CORPORATE_PUK_REQUIRED = 14;
const unsigned long CARD_STATE_SERVICE_PROVIDER_PUK_REQUIRED = 15;
const unsigned long CARD_STATE_SIM_PUK_REQUIRED = 16;
const unsigned long CARD_STATE_NETWORK1_LOCKED = 17;
const unsigned long CARD_STATE_NETWORK2_LOCKED = 18;
const unsigned long CARD_STATE_HRPD_NETWORK_LOCKED = 19;
const unsigned long CARD_STATE_RUIM_CORPORATE_LOCKED = 20;
const unsigned long CARD_STATE_RUIM_SERVICE_PROVIDER_LOCKED = 21;
const unsigned long CARD_STATE_RUIM_LOCKED = 22;
const unsigned long CARD_STATE_NETWORK1_PUK_REQUIRED = 23;
const unsigned long CARD_STATE_NETWORK2_PUK_REQUIRED = 24;
const unsigned long CARD_STATE_HRPD_NETWORK_PUK_REQUIRED = 25;
const unsigned long CARD_STATE_RUIM_CORPORATE_PUK_REQUIRED = 26;
const unsigned long CARD_STATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED = 27;
const unsigned long CARD_STATE_RUIM_PUK_REQUIRED = 28;
const unsigned long CARD_STATE_ILLEGAL = 29;
const unsigned long CARD_STATE_UNDETECTED = 4294967295; // UINT32_MAX
/**
* Card Lock Constants
*
* Note: MUST be matched with enum IccLockType in MozIcc.webidl!
*/
const unsigned long CARD_LOCK_TYPE_PIN = 0;
const unsigned long CARD_LOCK_TYPE_PIN2 = 1;
const unsigned long CARD_LOCK_TYPE_PUK = 2;
const unsigned long CARD_LOCK_TYPE_PUK2 = 3;
const unsigned long CARD_LOCK_TYPE_NCK = 4;
const unsigned long CARD_LOCK_TYPE_NSCK = 5;
const unsigned long CARD_LOCK_TYPE_NCK1 = 6;
const unsigned long CARD_LOCK_TYPE_NCK2 = 7;
const unsigned long CARD_LOCK_TYPE_HNCK = 8;
const unsigned long CARD_LOCK_TYPE_CCK = 9;
const unsigned long CARD_LOCK_TYPE_SPCK = 10;
const unsigned long CARD_LOCK_TYPE_PCK = 11;
const unsigned long CARD_LOCK_TYPE_RCCK = 12;
const unsigned long CARD_LOCK_TYPE_RSPCK = 13;
const unsigned long CARD_LOCK_TYPE_NCK_PUK = 14;
const unsigned long CARD_LOCK_TYPE_NSCK_PUK = 15;
const unsigned long CARD_LOCK_TYPE_NCK1_PUK = 16;
const unsigned long CARD_LOCK_TYPE_NCK2_PUK = 17;
const unsigned long CARD_LOCK_TYPE_HNCK_PUK = 18;
const unsigned long CARD_LOCK_TYPE_CCK_PUK = 19;
const unsigned long CARD_LOCK_TYPE_SPCK_PUK = 20;
const unsigned long CARD_LOCK_TYPE_PCK_PUK = 21;
const unsigned long CARD_LOCK_TYPE_RCCK_PUK = 22;
const unsigned long CARD_LOCK_TYPE_RSPCK_PUK = 23;
const unsigned long CARD_LOCK_TYPE_FDN = 24;
/**
* Contact Type Constants
*
* Note: MUST be matched with enum IccContactType in MozIcc.webidl!
*/
const unsigned long CARD_CONTACT_TYPE_ADN = 0;
const unsigned long CARD_CONTACT_TYPE_FDN = 1;
const unsigned long CARD_CONTACT_TYPE_SDN = 2;
/**
* MVNO Type Constants
*
* Note: MUST be matched with enum IccMvnoType in MozIcc.webidl!
*/
const unsigned long CARD_MVNO_TYPE_IMSI = 0;
const unsigned long CARD_MVNO_TYPE_SPN = 1;
const unsigned long CARD_MVNO_TYPE_GID = 2;
/**
* Card Service Constants
*
* Note: MUST be matched with enum IccService in MozIcc.webidl!
*/
const unsigned long CARD_SERVICE_FDN = 0;
/**
* Called to register icc-related changes.
*
* 'mobileconnection' permission is required to register.
*/
void registerListener(in nsIIccListener aListener);
void unregisterListener(in nsIIccListener aListener);
/**
* Information stored in this ICC.
*/
readonly attribute nsIIccInfo iccInfo;
/**
* Indicates the state of this ICC.
*
* One of the CARD_STATE_* values.
*/
readonly attribute unsigned long cardState;
/**
* Get the status of an ICC lock (e.g. the PIN lock).
*
* @param aLockType
* One of the CARD_LOCK_TYPE_* values.
* @param aCallback
* An instance of nsIIccCallback:
* nsIIccCallback::notifySuccessWithBoolean() if success.
* nsIIccCallback::notifyError(), otherwise.
*/
void getCardLockEnabled(in unsigned long aLockType,
in nsIIccCallback aCallback);
/**
* Unlock a card lock.
*
* @param aLockType
* One of the CARD_LOCK_TYPE_* values.
* @param aPassword
* The password of this lock.
* @param aNewPin (Optional)
* The new PIN to be set after PUK/PUK2 is unlock.
* @param aCallback
* An instance of nsIIccCallback:
* nsIIccCallback::notifySuccess() if success.
* nsIIccCallback::notifyCardLockError(), otherwise.
*/
void unlockCardLock(in unsigned long aLockType,
in DOMString aPassword,
in DOMString aNewPin,
in nsIIccCallback aCallback);
/**
* Enable/Disable a card lock.
*
* @param aLockType
* One of the CARD_LOCK_TYPE_* values.
* @param aPassword
* The password of this lock.
* @param aEnabled.
* True to enable the lock. False to disable, otherwise.
* @param aCallback
* An instance of nsIIccCallback:
* nsIIccCallback::notifySuccess() if success.
* nsIIccCallback::notifyCardLockError(), otherwise.
*/
void setCardLockEnabled(in unsigned long aLockType,
in DOMString aPassword,
in boolean aEnabled,
in nsIIccCallback aCallback);
/**
* Change the password of a card lock.
*
* @param aLockType
* One of the CARD_LOCK_TYPE_* values.
* @param aPassword
* The password of this lock.
* @param aNewPassword.
* The new password of this lock.
* @param aCallback
* An instance of nsIIccCallback:
* nsIIccCallback::notifySuccess() if success.
* nsIIccCallback::notifyCardLockError(), otherwise.
*/
void changeCardLockPassword(in unsigned long aLockType,
in DOMString aPassword,
in DOMString aNewPassword,
in nsIIccCallback aCallback);
/**
* Get the number of remaining tries of a lock.
*
* @param aLockType
* One of the CARD_LOCK_TYPE_* values.
* @param aCallback
* An instance of nsIIccCallback:
* nsIIccCallback::notifyGetCardLockRetryCount() if success.
* nsIIccCallback::notifyError(), otherwise.
*/
void getCardLockRetryCount(in unsigned long aLockType,
in nsIIccCallback aCallback);
/**
* Verify whether the passed data (matchData) matches with some ICC's field
* according to the mvno type (mvnoType).
*
* @param aMvnoType
* One of CARD_MVNO_TYPE_* values.
* @param aMvnoData
* Data to be compared with ICC's field.
* @param aCallback
* An instance of nsIIccCallback:
* nsIIccCallback::notifySuccessWithBoolean() if success.
* nsIIccCallback::notifyError(), otherwise.
*/
void matchMvno(in unsigned long aMvnoType,
in DOMString aMvnoData,
in nsIIccCallback aCallback);
/**
* Retrieve the the availability of an icc service.
*
* @param aService
* One of CARD_SERVICE_* values.
* @param aCallback
* An instance of nsIIccCallback:
* nsIIccCallback::notifySuccessWithBoolean() if success.
* nsIIccCallback::notifyError(), otherwise.
*/
void getServiceStateEnabled(in unsigned long aService,
in nsIIccCallback aCallback);
};

View File

@ -1,310 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/icc/IccChild.h"
#include "IccInfo.h"
using mozilla::dom::IccInfo;
namespace mozilla {
namespace dom {
namespace icc {
/**
* PIccChild Implementation.
*/
IccChild::IccChild()
: mCardState(nsIIcc::CARD_STATE_UNKNOWN)
, mIsAlive(true)
{
MOZ_COUNT_CTOR(IccChild);
}
IccChild::~IccChild()
{
MOZ_COUNT_DTOR(IccChild);
}
void
IccChild::Init()
{
OptionalIccInfoData infoData;
bool rv = SendInit(&infoData, &mCardState);
NS_ENSURE_TRUE_VOID(rv);
UpdateIccInfo(infoData);
}
void
IccChild::Shutdown(){
if (mIsAlive) {
mIsAlive = false;
Send__delete__(this);
}
mListeners.Clear();
mIccInfo = nullptr;
mCardState = nsIIcc::CARD_STATE_UNKNOWN;
}
void
IccChild::ActorDestroy(ActorDestroyReason why)
{
mIsAlive = false;
}
bool
IccChild::RecvNotifyCardStateChanged(const uint32_t& aCardState)
{
mCardState = aCardState;
for (int32_t i = 0; i < mListeners.Count(); i++) {
mListeners[i]->NotifyCardStateChanged();
}
return true;
}
bool
IccChild::RecvNotifyIccInfoChanged(const OptionalIccInfoData& aInfoData)
{
UpdateIccInfo(aInfoData);
for (int32_t i = 0; i < mListeners.Count(); i++) {
mListeners[i]->NotifyIccInfoChanged();
}
return true;
}
PIccRequestChild*
IccChild::AllocPIccRequestChild(const IccRequest& aRequest)
{
MOZ_CRASH("Caller is supposed to manually construct a request!");
}
bool
IccChild::DeallocPIccRequestChild(PIccRequestChild* aActor)
{
delete aActor;
return true;
}
bool
IccChild::SendRequest(const IccRequest& aRequest, nsIIccCallback* aRequestReply)
{
NS_ENSURE_TRUE(mIsAlive, false);
// Deallocated in IccChild::DeallocPIccRequestChild().
IccRequestChild* actor = new IccRequestChild(aRequestReply);
SendPIccRequestConstructor(actor, aRequest);
return true;
}
void
IccChild::UpdateIccInfo(const OptionalIccInfoData& aInfoData) {
if (aInfoData.type() == OptionalIccInfoData::Tvoid_t) {
mIccInfo = nullptr;
return;
}
NS_ENSURE_TRUE_VOID(aInfoData.type() == OptionalIccInfoData::TIccInfoData);
nsRefPtr<IccInfo> iccInfo;
const IccInfoData& infoData = aInfoData.get_IccInfoData();
if (infoData.iccType().EqualsLiteral("sim")
|| infoData.iccType().EqualsLiteral("usim")) {
iccInfo = new GsmIccInfo(infoData);
} else if (infoData.iccType().EqualsLiteral("ruim")
|| infoData.iccType().EqualsLiteral("csim")){
iccInfo = new CdmaIccInfo(infoData);
} else {
iccInfo = new IccInfo(infoData);
}
// We update the orignal one instead of replacing with a new one
// if the IccType is the same.
if (mIccInfo) {
nsString oldIccType;
nsString newIccType;
mIccInfo->GetIccType(oldIccType);
iccInfo->GetIccType(newIccType);
if (oldIccType.Equals(newIccType)) {
mIccInfo->Update(iccInfo);
return;
}
}
mIccInfo = iccInfo;
}
/**
* nsIIcc Implementation.
*/
NS_IMPL_ISUPPORTS(IccChild, nsIIcc)
NS_IMETHODIMP
IccChild::RegisterListener(nsIIccListener *aListener)
{
NS_ENSURE_TRUE(!mListeners.Contains(aListener), NS_ERROR_UNEXPECTED);
mListeners.AppendObject(aListener);
return NS_OK;
}
NS_IMETHODIMP
IccChild::UnregisterListener(nsIIccListener *aListener)
{
NS_ENSURE_TRUE(mListeners.Contains(aListener), NS_ERROR_UNEXPECTED);
mListeners.RemoveObject(aListener);
return NS_OK;
}
NS_IMETHODIMP
IccChild::GetIccInfo(nsIIccInfo** aIccInfo)
{
nsCOMPtr<nsIIccInfo> info(mIccInfo);
info.forget(aIccInfo);
return NS_OK;
}
NS_IMETHODIMP
IccChild::GetCardState(uint32_t* aCardState)
{
*aCardState = mCardState;
return NS_OK;
}
NS_IMETHODIMP
IccChild::GetCardLockEnabled(uint32_t aLockType,
nsIIccCallback* aRequestReply)
{
return SendRequest(GetCardLockEnabledRequest(aLockType), aRequestReply)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
IccChild::UnlockCardLock(uint32_t aLockType,
const nsAString& aPassword,
const nsAString& aNewPin,
nsIIccCallback* aRequestReply)
{
return SendRequest(UnlockCardLockRequest(aLockType,
nsString(aPassword),
nsString(aNewPin)),
aRequestReply)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
IccChild::SetCardLockEnabled(uint32_t aLockType,
const nsAString& aPassword,
bool aEnabled,
nsIIccCallback* aRequestReply)
{
return SendRequest(SetCardLockEnabledRequest(aLockType,
nsString(aPassword),
aEnabled),
aRequestReply)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
IccChild::ChangeCardLockPassword(uint32_t aLockType,
const nsAString& aPassword,
const nsAString& aNewPassword,
nsIIccCallback* aRequestReply)
{
return SendRequest(ChangeCardLockPasswordRequest(aLockType,
nsString(aPassword),
nsString(aNewPassword)),
aRequestReply)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
IccChild::GetCardLockRetryCount(uint32_t aLockType,
nsIIccCallback* aRequestReply)
{
return SendRequest(GetCardLockRetryCountRequest(aLockType), aRequestReply)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
IccChild::MatchMvno(uint32_t aMvnoType,
const nsAString& aMvnoData,
nsIIccCallback* aRequestReply)
{
return SendRequest(MatchMvnoRequest(aMvnoType, nsString(aMvnoData)),
aRequestReply)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
IccChild::GetServiceStateEnabled(uint32_t aService,
nsIIccCallback* aRequestReply)
{
return SendRequest(GetServiceStateEnabledRequest(aService),
aRequestReply)
? NS_OK : NS_ERROR_FAILURE;
}
/**
* PIccRequestChild Implementation.
*/
IccRequestChild::IccRequestChild(nsIIccCallback* aRequestReply)
: mRequestReply(aRequestReply)
{
MOZ_COUNT_CTOR(IccRequestChild);
MOZ_ASSERT(aRequestReply);
}
bool
IccRequestChild::Recv__delete__(const IccReply& aResponse)
{
MOZ_ASSERT(mRequestReply);
switch(aResponse.type()) {
case IccReply::TIccReplySuccess:
return NS_SUCCEEDED(mRequestReply->NotifySuccess());
case IccReply::TIccReplySuccessWithBoolean: {
const IccReplySuccessWithBoolean& resultWithBoolean
= aResponse.get_IccReplySuccessWithBoolean();
return NS_SUCCEEDED(
mRequestReply->NotifySuccessWithBoolean(resultWithBoolean.result()));
}
case IccReply::TIccReplyCardLockRetryCount: {
const IccReplyCardLockRetryCount& retryCount
= aResponse.get_IccReplyCardLockRetryCount();
return NS_SUCCEEDED(
mRequestReply->NotifyGetCardLockRetryCount(retryCount.count()));
}
case IccReply::TIccReplyError: {
const IccReplyError& error = aResponse.get_IccReplyError();
return NS_SUCCEEDED(mRequestReply->NotifyError(error.message()));
}
case IccReply::TIccReplyCardLockError: {
const IccReplyCardLockError& error
= aResponse.get_IccReplyCardLockError();
return NS_SUCCEEDED(
mRequestReply->NotifyCardLockError(error.message(),
error.retryCount()));
}
default:
MOZ_CRASH("Received invalid response type!");
}
return true;
}
} // namespace icc
} // namespace dom
} // namespace mozilla

View File

@ -1,88 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_icc_IccChild_h
#define mozilla_dom_icc_IccChild_h
#include "mozilla/dom/icc/PIccChild.h"
#include "mozilla/dom/icc/PIccRequestChild.h"
#include "nsIIccService.h"
namespace mozilla {
namespace dom {
class IccInfo;
namespace icc {
class IccChild MOZ_FINAL : public PIccChild
, public nsIIcc
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIICC
explicit IccChild();
void
Init();
void
Shutdown();
protected:
virtual void
ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
virtual PIccRequestChild*
AllocPIccRequestChild(const IccRequest& aRequest) MOZ_OVERRIDE;
virtual bool
DeallocPIccRequestChild(PIccRequestChild* aActor) MOZ_OVERRIDE;
virtual bool
RecvNotifyCardStateChanged(const uint32_t& aCardState) MOZ_OVERRIDE;
virtual bool
RecvNotifyIccInfoChanged(const OptionalIccInfoData& aInfoData) MOZ_OVERRIDE;
private:
// MOZ_FINAL suppresses -Werror,-Wdelete-non-virtual-dtor
~IccChild();
void
UpdateIccInfo(const OptionalIccInfoData& aInfoData);
bool
SendRequest(const IccRequest& aRequest, nsIIccCallback* aRequestReply);
nsCOMArray<nsIIccListener> mListeners;
nsRefPtr<IccInfo> mIccInfo;
uint32_t mCardState;
bool mIsAlive;
};
class IccRequestChild MOZ_FINAL : public PIccRequestChild
{
public:
explicit IccRequestChild(nsIIccCallback* aRequestReply);
protected:
virtual bool
Recv__delete__(const IccReply& aReply) MOZ_OVERRIDE;
private:
// MOZ_FINAL suppresses -Werror,-Wdelete-non-virtual-dtor
virtual ~IccRequestChild() {
MOZ_COUNT_DTOR(IccRequestChild);
}
nsCOMPtr<nsIIccCallback> mRequestReply;
};
} // namespace icc
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_icc_IccChild_h

View File

@ -1,56 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "IccIPCService.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/Preferences.h"
namespace mozilla {
namespace dom {
namespace icc {
NS_IMPL_ISUPPORTS(IccIPCService, nsIIccService)
IccIPCService::IccIPCService()
{
int32_t numRil = Preferences::GetInt("ril.numRadioInterfaces", 1);
mIccs.SetLength(numRil);
}
IccIPCService::~IccIPCService()
{
uint32_t count = mIccs.Length();
for (uint32_t i = 0; i < count; i++) {
if (mIccs[i]) {
mIccs[i]->Shutdown();
}
}
}
NS_IMETHODIMP
IccIPCService::GetIccByServiceId(uint32_t aServiceId, nsIIcc** aIcc)
{
NS_ENSURE_TRUE(aServiceId < mIccs.Length(), NS_ERROR_INVALID_ARG);
if (!mIccs[aServiceId]) {
nsRefPtr<IccChild> child = new IccChild();
// |SendPIccConstructor| adds another reference to the child
// actor and removes in |DeallocPIccChild|.
ContentChild::GetSingleton()->SendPIccConstructor(child, aServiceId);
child->Init();
mIccs[aServiceId] = child;
}
nsCOMPtr<nsIIcc> icc(mIccs[aServiceId]);
icc.forget(aIcc);
return NS_OK;
}
} // namespace icc
} // namespace dom
} // namespace mozilla

View File

@ -1,36 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_icc_IccIPCService_h
#define mozilla_dom_icc_IccIPCService_h
#include "nsCOMPtr.h"
#include "nsIIccService.h"
namespace mozilla {
namespace dom {
namespace icc {
class IccChild;
class IccIPCService MOZ_FINAL : public nsIIccService
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIICCSERVICE
IccIPCService();
private:
// MOZ_FINAL suppresses -Werror,-Wdelete-non-virtual-dtor
~IccIPCService();
nsTArray<nsRefPtr<IccChild>> mIccs;
};
} // namespace icc
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_icc_IccIPCService_h

View File

@ -1,320 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/icc/IccParent.h"
#include "nsIIccService.h"
#include "IccInfo.h"
using mozilla::dom::IccInfo;
namespace mozilla {
namespace dom {
namespace icc {
namespace {
static void
GetIccInfoDataFromIccInfo(nsIIccInfo* aInInfo, IccInfoData& aOutData) {
aInInfo->GetIccType(aOutData.iccType());
aInInfo->GetIccid(aOutData.iccid());
aInInfo->GetMcc(aOutData.mcc());
aInInfo->GetMnc(aOutData.mnc());
aInInfo->GetSpn(aOutData.spn());
aInInfo->GetIsDisplayNetworkNameRequired(
&aOutData.isDisplayNetworkNameRequired());
aInInfo->GetIsDisplaySpnRequired(
&aOutData.isDisplaySpnRequired());
nsCOMPtr<nsIGsmIccInfo> gsmIccInfo(do_QueryInterface(aInInfo));
if (gsmIccInfo) {
gsmIccInfo->GetMsisdn(aOutData.phoneNumber());
}
nsCOMPtr<nsICdmaIccInfo> cdmaIccInfo(do_QueryInterface(aInInfo));
if (cdmaIccInfo) {
cdmaIccInfo->GetMdn(aOutData.phoneNumber());
cdmaIccInfo->GetPrlVersion(&aOutData.prlVersion());
}
}
} // anonymous namespace
/**
* PIccParent Implementation.
*/
IccParent::IccParent(uint32_t aServiceId)
{
MOZ_COUNT_CTOR(IccParent);
nsCOMPtr<nsIIccService> service =
do_GetService(ICC_SERVICE_CONTRACTID);
NS_ASSERTION(service, "Failed to get IccService!");
service->GetIccByServiceId(aServiceId, getter_AddRefs(mIcc));
NS_ASSERTION(mIcc, "Failed to get Icc with specified serviceId.");
mIcc->RegisterListener(this);
}
void
IccParent::ActorDestroy(ActorDestroyReason aWhy)
{
if (mIcc) {
mIcc->UnregisterListener(this);
mIcc = nullptr;
}
}
bool
IccParent::RecvInit(OptionalIccInfoData* aInfoData,
uint32_t* aCardState)
{
NS_ENSURE_TRUE(mIcc, false);
nsresult rv = mIcc->GetCardState(aCardState);
NS_ENSURE_SUCCESS(rv, false);
nsCOMPtr<nsIIccInfo> iccInfo;
rv = mIcc->GetIccInfo(getter_AddRefs(iccInfo));
NS_ENSURE_SUCCESS(rv, false);
if (iccInfo) {
IccInfoData data;
GetIccInfoDataFromIccInfo(iccInfo, data);
*aInfoData = OptionalIccInfoData(data);
return true;
}
*aInfoData = OptionalIccInfoData(void_t());
return true;
}
PIccRequestParent*
IccParent::AllocPIccRequestParent(const IccRequest& aRequest)
{
NS_ASSERTION(mIcc, "AllocPIccRequestParent after actor was destroyed!");
IccRequestParent* actor = new IccRequestParent(mIcc);
// Add an extra ref for IPDL. Will be released in
// IccParent::DeallocPIccRequestParent().
actor->AddRef();
return actor;
}
bool
IccParent::DeallocPIccRequestParent(PIccRequestParent* aActor)
{
// IccRequestParent is refcounted, must not be freed manually.
static_cast<IccRequestParent*>(aActor)->Release();
return true;
}
bool
IccParent::RecvPIccRequestConstructor(PIccRequestParent* aActor,
const IccRequest& aRequest)
{
NS_ASSERTION(mIcc, "RecvPIccRequestConstructor after actor was destroyed!");
IccRequestParent* actor = static_cast<IccRequestParent*>(aActor);
switch (aRequest.type()) {
case IccRequest::TGetCardLockEnabledRequest:
return actor->DoRequest(aRequest.get_GetCardLockEnabledRequest());
case IccRequest::TUnlockCardLockRequest:
return actor->DoRequest(aRequest.get_UnlockCardLockRequest());
case IccRequest::TSetCardLockEnabledRequest:
return actor->DoRequest(aRequest.get_SetCardLockEnabledRequest());
case IccRequest::TChangeCardLockPasswordRequest:
return actor->DoRequest(aRequest.get_ChangeCardLockPasswordRequest());
case IccRequest::TGetCardLockRetryCountRequest:
return actor->DoRequest(aRequest.get_GetCardLockRetryCountRequest());
case IccRequest::TMatchMvnoRequest:
return actor->DoRequest(aRequest.get_MatchMvnoRequest());
case IccRequest::TGetServiceStateEnabledRequest:
return actor->DoRequest(aRequest.get_GetServiceStateEnabledRequest());
default:
MOZ_CRASH("Received invalid request type!");
}
return true;
}
/**
* nsIIccListener Implementation.
*/
NS_IMPL_ISUPPORTS(IccParent, nsIIccListener)
NS_IMETHODIMP
IccParent::NotifyStkCommand(const nsAString & aMessage)
{
// Bug 1114938 - [B2G][ICC] Refactor STK in MozIcc.webidl with IPDL.
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
IccParent::NotifyStkSessionEnd()
{
// Bug 1114938 - [B2G][ICC] Refactor STK in MozIcc.webidl with IPDL.
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
IccParent::NotifyCardStateChanged()
{
NS_ENSURE_TRUE(mIcc, NS_ERROR_FAILURE);
uint32_t cardState;
nsresult rv = mIcc->GetCardState(&cardState);
NS_ENSURE_SUCCESS(rv, rv);
return SendNotifyCardStateChanged(cardState) ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
IccParent::NotifyIccInfoChanged()
{
NS_ENSURE_TRUE(mIcc, NS_ERROR_FAILURE);
nsCOMPtr<nsIIccInfo> iccInfo;
nsresult rv = mIcc->GetIccInfo(getter_AddRefs(iccInfo));
NS_ENSURE_SUCCESS(rv, rv);
if (!iccInfo) {
return SendNotifyIccInfoChanged(OptionalIccInfoData(void_t()))
? NS_OK : NS_ERROR_FAILURE;
}
IccInfoData data;
GetIccInfoDataFromIccInfo(iccInfo, data);
return SendNotifyIccInfoChanged(OptionalIccInfoData(data))
? NS_OK : NS_ERROR_FAILURE;
}
/**
* PIccRequestParent Implementation.
*/
IccRequestParent::IccRequestParent(nsIIcc* aIcc)
: mIcc(aIcc)
{
MOZ_COUNT_CTOR(IccRequestParent);
}
void
IccRequestParent::ActorDestroy(ActorDestroyReason aWhy)
{
mIcc = nullptr;
}
bool
IccRequestParent::DoRequest(const GetCardLockEnabledRequest& aRequest)
{
return NS_SUCCEEDED(mIcc->GetCardLockEnabled(aRequest.lockType(),
this));
}
bool
IccRequestParent::DoRequest(const UnlockCardLockRequest& aRequest)
{
return NS_SUCCEEDED(mIcc->UnlockCardLock(aRequest.lockType(),
aRequest.password(),
aRequest.newPin(),
this));
}
bool
IccRequestParent::DoRequest(const SetCardLockEnabledRequest& aRequest)
{
return NS_SUCCEEDED(mIcc->SetCardLockEnabled(aRequest.lockType(),
aRequest.password(),
aRequest.enabled(),
this));
}
bool
IccRequestParent::DoRequest(const ChangeCardLockPasswordRequest& aRequest)
{
return NS_SUCCEEDED(mIcc->ChangeCardLockPassword(aRequest.lockType(),
aRequest.password(),
aRequest.newPassword(),
this));
}
bool
IccRequestParent::DoRequest(const GetCardLockRetryCountRequest& aRequest)
{
return NS_SUCCEEDED(mIcc->GetCardLockRetryCount(aRequest.lockType(),
this));
}
bool
IccRequestParent::DoRequest(const MatchMvnoRequest& aRequest)
{
return NS_SUCCEEDED(mIcc->MatchMvno(aRequest.mvnoType(),
aRequest.mvnoData(),
this));
}
bool
IccRequestParent::DoRequest(const GetServiceStateEnabledRequest& aRequest)
{
return NS_SUCCEEDED(mIcc->GetServiceStateEnabled(aRequest.service(),
this));
}
nsresult
IccRequestParent::SendReply(const IccReply& aReply)
{
NS_ENSURE_TRUE(mIcc, NS_ERROR_FAILURE);
return Send__delete__(this, aReply) ? NS_OK : NS_ERROR_FAILURE;
}
/**
* nsIIccCallback Implementation.
*/
NS_IMPL_ISUPPORTS(IccRequestParent, nsIIccCallback)
NS_IMETHODIMP
IccRequestParent::NotifySuccess()
{
return SendReply(IccReplySuccess());
}
NS_IMETHODIMP
IccRequestParent::NotifySuccessWithBoolean(bool aResult)
{
return SendReply(IccReplySuccessWithBoolean(aResult));
}
NS_IMETHODIMP
IccRequestParent::NotifyGetCardLockRetryCount(int32_t aCount)
{
return SendReply(IccReplyCardLockRetryCount(aCount));
}
NS_IMETHODIMP
IccRequestParent::NotifyError(const nsAString & aErrorMsg)
{
return SendReply(IccReplyError(nsString(aErrorMsg)));
}
NS_IMETHODIMP
IccRequestParent::NotifyCardLockError(const nsAString & aErrorMsg,
int32_t aRetryCount)
{
return SendReply(IccReplyCardLockError(aRetryCount, nsString(aErrorMsg)));
}
} // namespace icc
} // namespace dom
} // namespace mozilla

View File

@ -1,109 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_icc_IccParent_h
#define mozilla_dom_icc_IccParent_h
#include "mozilla/dom/icc/PIccParent.h"
#include "mozilla/dom/icc/PIccRequestParent.h"
#include "nsIIccService.h"
namespace mozilla {
namespace dom {
namespace icc {
class IccParent MOZ_FINAL : public PIccParent
, public nsIIccListener
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIICCLISTENER
explicit IccParent(uint32_t aServiceId);
protected:
virtual
// MOZ_FINAL suppresses -Werror,-Wdelete-non-virtual-dtor
~IccParent()
{
MOZ_COUNT_DTOR(IccParent);
}
virtual void
ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
virtual bool
RecvInit(
OptionalIccInfoData* aInfoData,
uint32_t* aCardState) MOZ_OVERRIDE;
virtual PIccRequestParent*
AllocPIccRequestParent(const IccRequest& aRequest) MOZ_OVERRIDE;
virtual bool
DeallocPIccRequestParent(PIccRequestParent* aActor) MOZ_OVERRIDE;
virtual bool
RecvPIccRequestConstructor(PIccRequestParent* aActor,
const IccRequest& aRequest) MOZ_OVERRIDE;
private:
IccParent();
nsCOMPtr<nsIIcc> mIcc;
};
class IccRequestParent MOZ_FINAL : public PIccRequestParent
, public nsIIccCallback
{
friend class IccParent;
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIICCCALLBACK
explicit IccRequestParent(nsIIcc* icc);
protected:
virtual void
ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
private:
// MOZ_FINAL suppresses -Werror,-Wdelete-non-virtual-dtor
~IccRequestParent()
{
MOZ_COUNT_DTOR(IccRequestParent);
}
bool
DoRequest(const GetCardLockEnabledRequest& aRequest);
bool
DoRequest(const UnlockCardLockRequest& aRequest);
bool
DoRequest(const SetCardLockEnabledRequest& aRequest);
bool
DoRequest(const ChangeCardLockPasswordRequest& aRequest);
bool
DoRequest(const GetCardLockRetryCountRequest& aRequest);
bool
DoRequest(const MatchMvnoRequest& aRequest);
bool
DoRequest(const GetServiceStateEnabledRequest& aRequest);
nsresult
SendReply(const IccReply& aReply);
nsCOMPtr<nsIIcc> mIcc;
};
} // namespace icc
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_icc_IccParent_h

View File

@ -1,111 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
include protocol PContent;
include protocol PIccRequest;
include PIccTypes;
using struct mozilla::void_t from "ipc/IPCMessageUtils.h";
namespace mozilla {
namespace dom {
namespace icc {
union OptionalIccInfoData
{
void_t;
IccInfoData;
};
struct GetCardLockEnabledRequest
{
uint32_t lockType;
};
struct UnlockCardLockRequest
{
uint32_t lockType;
nsString password;
nsString newPin;
};
struct SetCardLockEnabledRequest
{
uint32_t lockType;
nsString password;
bool enabled;
};
struct ChangeCardLockPasswordRequest
{
uint32_t lockType;
nsString password;
nsString newPassword;
};
struct GetCardLockRetryCountRequest
{
uint32_t lockType;
};
struct MatchMvnoRequest
{
uint32_t mvnoType;
nsString mvnoData;
};
struct GetServiceStateEnabledRequest
{
uint32_t service;
};
union IccRequest
{
GetCardLockEnabledRequest;
UnlockCardLockRequest;
SetCardLockEnabledRequest;
ChangeCardLockPasswordRequest;
GetCardLockRetryCountRequest;
MatchMvnoRequest;
GetServiceStateEnabledRequest;
};
sync protocol PIcc
{
manager PContent;
manages PIccRequest;
child:
/**
* Notify CardStateChanged with updated CardState.
*/
NotifyCardStateChanged(uint32_t aCardState);
/**
* Notify IccInfoChanged with updated IccInfo.
*/
NotifyIccInfoChanged(OptionalIccInfoData aInfoData);
parent:
/**
* Sent when the child no longer needs to use PIcc.
*/
__delete__();
/**
* Sent when the child makes an asynchronous request to the parent.
*/
PIccRequest(IccRequest aRequest);
/**
* Sync call to initialize the updated IccInfo/CardState.
*/
sync Init()
returns (OptionalIccInfoData aInfoData, uint32_t aCardState);
};
} // namespace icc
} // namespace dom
} // namespace mozilla

View File

@ -1,61 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
include protocol PIcc;
include PIccTypes;
namespace mozilla {
namespace dom {
namespace icc {
struct IccReplySuccess
{
};
struct IccReplySuccessWithBoolean
{
bool result;
};
struct IccReplyCardLockRetryCount
{
int32_t count;
};
struct IccReplyError
{
nsString message;
};
struct IccReplyCardLockError
{
int32_t retryCount;
nsString message;
};
union IccReply
{
// Success
IccReplySuccess;
IccReplySuccessWithBoolean;
IccReplyCardLockRetryCount;
// Error
IccReplyError;
IccReplyCardLockError;
};
protocol PIccRequest
{
manager PIcc;
child:
/**
* Sent when the asynchronous request has completed.
*/
__delete__(IccReply response);
};
} // namespace icc
} // namespace dom
} // namespace mozilla

View File

@ -1,24 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
namespace mozilla {
namespace dom {
namespace icc {
struct IccInfoData
{
nsString iccType;
nsString iccid;
nsString mcc;
nsString mnc;
nsString spn;
bool isDisplayNetworkNameRequired;
bool isDisplaySpnRequired;
nsString phoneNumber;
int32_t prlVersion;
};
} // namespace icc
} // namespace dom
} // namespace mozilla

View File

@ -13,38 +13,19 @@ EXPORTS.mozilla.dom += [
'IccManager.h',
]
EXPORTS.mozilla.dom.icc += [
'ipc/IccChild.h',
'ipc/IccParent.h',
]
UNIFIED_SOURCES += [
'Assertions.cpp',
'Icc.cpp',
'IccCallback.cpp',
'IccCardLockError.cpp',
"IccInfo.cpp",
'IccListener.cpp',
'IccManager.cpp',
'ipc/IccChild.cpp',
'ipc/IccIPCService.cpp',
'ipc/IccParent.cpp',
]
IPDL_SOURCES += [
'ipc/PIcc.ipdl',
'ipc/PIccRequest.ipdl',
'ipc/PIccTypes.ipdlh',
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' and CONFIG['MOZ_B2G_RIL']:
EXTRA_JS_MODULES += [
'gonk/StkProactiveCmdFactory.jsm',
]
EXTRA_COMPONENTS += [
'gonk/IccService.js',
'gonk/IccService.manifest',
]
FAIL_ON_WARNINGS = True

View File

@ -148,7 +148,6 @@
#include "mozilla/dom/File.h"
#include "mozilla/dom/cellbroadcast/CellBroadcastIPCService.h"
#include "mozilla/dom/icc/IccChild.h"
#include "mozilla/dom/mobileconnection/MobileConnectionChild.h"
#include "mozilla/dom/mobilemessage/SmsChild.h"
#include "mozilla/dom/devicestorage/DeviceStorageRequestChild.h"
@ -181,7 +180,6 @@ using namespace mozilla::docshell;
using namespace mozilla::dom::bluetooth;
using namespace mozilla::dom::cellbroadcast;
using namespace mozilla::dom::devicestorage;
using namespace mozilla::dom::icc;
using namespace mozilla::dom::ipc;
using namespace mozilla::dom::mobileconnection;
using namespace mozilla::dom::mobilemessage;
@ -1455,31 +1453,6 @@ ContentChild::DeallocPHalChild(PHalChild* aHal)
return true;
}
PIccChild*
ContentChild::SendPIccConstructor(PIccChild* aActor,
const uint32_t& aServiceId)
{
// Add an extra ref for IPDL. Will be released in
// ContentChild::DeallocPIccChild().
static_cast<IccChild*>(aActor)->AddRef();
return PContentChild::SendPIccConstructor(aActor, aServiceId);
}
PIccChild*
ContentChild::AllocPIccChild(const uint32_t& aServiceId)
{
NS_NOTREACHED("No one should be allocating PIccChild actors");
return nullptr;
}
bool
ContentChild::DeallocPIccChild(PIccChild* aActor)
{
// IccChild is refcounted, must not be freed manually.
static_cast<IccChild*>(aActor)->Release();
return true;
}
asmjscache::PAsmJSCacheEntryChild*
ContentChild::AllocPAsmJSCacheEntryChild(
const asmjscache::OpenMode& aOpenMode,

View File

@ -172,13 +172,6 @@ public:
virtual PHalChild* AllocPHalChild() MOZ_OVERRIDE;
virtual bool DeallocPHalChild(PHalChild*) MOZ_OVERRIDE;
PIccChild*
SendPIccConstructor(PIccChild* aActor, const uint32_t& aServiceId);
virtual PIccChild*
AllocPIccChild(const uint32_t& aClientId) MOZ_OVERRIDE;
virtual bool
DeallocPIccChild(PIccChild* aActor) MOZ_OVERRIDE;
virtual PMemoryReportRequestChild*
AllocPMemoryReportRequestChild(const uint32_t& aGeneration,
const bool& aAnonymize,

View File

@ -51,7 +51,6 @@
#include "mozilla/dom/bluetooth/PBluetoothParent.h"
#include "mozilla/dom/cellbroadcast/CellBroadcastParent.h"
#include "mozilla/dom/devicestorage/DeviceStorageRequestParent.h"
#include "mozilla/dom/icc/IccParent.h"
#include "mozilla/dom/mobileconnection/MobileConnectionParent.h"
#include "mozilla/dom/mobilemessage/SmsParent.h"
#include "mozilla/dom/power/PowerManagerService.h"
@ -225,7 +224,6 @@ using namespace CrashReporter;
using namespace mozilla::dom::bluetooth;
using namespace mozilla::dom::cellbroadcast;
using namespace mozilla::dom::devicestorage;
using namespace mozilla::dom::icc;
using namespace mozilla::dom::indexedDB;
using namespace mozilla::dom::power;
using namespace mozilla::dom::mobileconnection;
@ -3382,27 +3380,6 @@ ContentParent::DeallocPHalParent(hal_sandbox::PHalParent* aHal)
return true;
}
PIccParent*
ContentParent::AllocPIccParent(const uint32_t& aServiceId)
{
if (!AssertAppProcessPermission(this, "mobileconnection")) {
return nullptr;
}
IccParent* parent = new IccParent(aServiceId);
// We release this ref in DeallocPIccParent().
parent->AddRef();
return parent;
}
bool
ContentParent::DeallocPIccParent(PIccParent* aActor)
{
// IccParent is refcounted, must not be freed manually.
static_cast<IccParent*>(aActor)->Release();
return true;
}
PMemoryReportRequestParent*
ContentParent::AllocPMemoryReportRequestParent(const uint32_t& aGeneration,
const bool &aAnonymize,

View File

@ -549,9 +549,6 @@ private:
virtual bool DeallocPHalParent(PHalParent*) MOZ_OVERRIDE;
virtual PIccParent* AllocPIccParent(const uint32_t& aServiceId) MOZ_OVERRIDE;
virtual bool DeallocPIccParent(PIccParent* aActor) MOZ_OVERRIDE;
virtual PMemoryReportRequestParent*
AllocPMemoryReportRequestParent(const uint32_t& aGeneration,
const bool &aAnonymize,

View File

@ -21,7 +21,6 @@ include protocol PFileDescriptorSet;
include protocol PFMRadio;
include protocol PFileSystemRequest;
include protocol PHal;
include protocol PIcc;
include protocol PProcessHangMonitor;
include protocol PImageBridge;
include protocol PMemoryReportRequest;
@ -371,7 +370,6 @@ prio(normal upto urgent) sync protocol PContent
manages PFileDescriptorSet;
manages PFMRadio;
manages PHal;
manages PIcc;
manages PMemoryReportRequest;
manages PMobileConnection;
manages PNecko;
@ -646,8 +644,6 @@ parent:
PHal();
PIcc(uint32_t serviceId);
PMobileConnection(uint32_t clientId);
PNecko();

View File

@ -75,6 +75,7 @@ const BrowserElementIsPreloaded = true;
Cc["@mozilla.org/uriloader;1"].getService(Ci["nsIURILoader"]);
Cc["@mozilla.org/cspcontext;1"].createInstance(Ci["nsIContentSecurityPolicy"]);
Cc["@mozilla.org/settingsManager;1"].createInstance(Ci["nsISupports"]);
Cc["@mozilla.org/webapps;1"].createInstance(Ci["nsISupports"]);
/* Applications Specific Helper */
try {

View File

@ -15,7 +15,6 @@
#include "mozilla/Preferences.h"
#include "mozilla/Services.h"
#include "nsIDOMDOMRequest.h"
#include "nsIIccInfo.h"
#include "nsIPermissionManager.h"
#include "nsIVariant.h"
#include "nsJSON.h"
@ -23,6 +22,10 @@
#include "nsRadioInterfaceLayer.h"
#include "nsServiceManagerUtils.h"
#ifdef MOZ_B2G_RIL
#include "nsIIccInfo.h"
#endif // MOZ_B2G_RIL
#define MOBILECONN_ERROR_INVALID_PARAMETER NS_LITERAL_STRING("InvalidParameter")
#define MOBILECONN_ERROR_INVALID_PASSWORD NS_LITERAL_STRING("InvalidPassword")
@ -46,14 +49,18 @@ using namespace mozilla::dom;
using namespace mozilla::dom::mobileconnection;
class MobileConnection::Listener MOZ_FINAL : public nsIMobileConnectionListener
#ifdef MOZ_B2G_RIL
, public nsIIccListener
#endif // MOZ_B2G_RIL
{
MobileConnection* mMobileConnection;
public:
NS_DECL_ISUPPORTS
NS_FORWARD_SAFE_NSIMOBILECONNECTIONLISTENER(mMobileConnection)
#ifdef MOZ_B2G_RIL
NS_FORWARD_SAFE_NSIICCLISTENER(mMobileConnection)
#endif // MOZ_B2G_RIL
explicit Listener(MobileConnection* aMobileConnection)
: mMobileConnection(aMobileConnection)
@ -74,8 +81,12 @@ private:
}
};
#ifdef MOZ_B2G_RIL
NS_IMPL_ISUPPORTS(MobileConnection::Listener, nsIMobileConnectionListener,
nsIIccListener)
#else
NS_IMPL_ISUPPORTS(MobileConnection::Listener, nsIMobileConnectionListener)
#endif // MOZ_B2G_RIL
NS_IMPL_CYCLE_COLLECTION_CLASS(MobileConnection)
@ -87,7 +98,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MobileConnection,
// down.
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVoice)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mData)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mIccHandler)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MobileConnection,
@ -95,7 +105,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MobileConnection,
tmp->Shutdown();
NS_IMPL_CYCLE_COLLECTION_UNLINK(mVoice)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mData)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mIccHandler)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MobileConnection)
@ -127,15 +136,15 @@ MobileConnection::MobileConnection(nsPIDOMWindow* aWindow, uint32_t aClientId)
nsresult rv = service->GetItemByServiceId(mClientId,
getter_AddRefs(mMobileConnection));
#ifdef MOZ_B2G_RIL
mIcc = do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
nsCOMPtr<nsIIccService> iccService = do_GetService(ICC_SERVICE_CONTRACTID);
if (iccService) {
iccService->GetIccByServiceId(mClientId, getter_AddRefs(mIccHandler));
}
if (NS_FAILED(rv) || !mMobileConnection || !mIccHandler) {
NS_WARNING("Could not acquire nsIMobileConnection or nsIIcc!");
if (NS_FAILED(rv) || !mMobileConnection || !mIcc) {
NS_WARNING("Could not acquire nsIMobileConnection or nsIIccProvider!");
#else
if (NS_FAILED(rv) || !mMobileConnection) {
NS_WARNING("Could not acquire nsIMobileConnection!");
#endif // MOZ_B2G_RIL
return;
}
@ -150,10 +159,12 @@ MobileConnection::MobileConnection(nsPIDOMWindow* aWindow, uint32_t aClientId)
UpdateVoice();
UpdateData();
rv = mIccHandler->RegisterListener(mListener);
#ifdef MOZ_B2G_RIL
rv = mIcc->RegisterIccMsg(mClientId, mListener);
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
"Failed registering icc messages with service");
UpdateIccId();
#endif // MOZ_B2G_RIL
}
}
@ -165,9 +176,11 @@ MobileConnection::Shutdown()
mMobileConnection->UnregisterListener(mListener);
}
if (mIccHandler) {
mIccHandler->UnregisterListener(mListener);
#ifdef MOZ_B2G_RIL
if (mIcc) {
mIcc->UnregisterIccMsg(mClientId, mListener);
}
#endif // MOZ_B2G_RIL
mListener->Disconnect();
mListener = nullptr;
@ -233,10 +246,11 @@ MobileConnection::UpdateData()
bool
MobileConnection::UpdateIccId()
{
#ifdef MOZ_B2G_RIL
nsAutoString iccId;
nsCOMPtr<nsIIccInfo> iccInfo;
if (mIccHandler &&
NS_SUCCEEDED(mIccHandler->GetIccInfo(getter_AddRefs(iccInfo))) &&
if (mIcc &&
NS_SUCCEEDED(mIcc->GetIccInfo(mClientId, getter_AddRefs(iccInfo))) &&
iccInfo) {
iccInfo->GetIccid(iccId);
} else {
@ -247,6 +261,7 @@ MobileConnection::UpdateIccId()
mIccId = iccId;
return true;
}
#endif // MOZ_B2G_RIL
return false;
}
@ -1119,6 +1134,7 @@ MobileConnection::NotifyNetworkSelectionModeChanged()
return NS_OK;
}
#ifdef MOZ_B2G_RIL
// nsIIccListener
NS_IMETHODIMP
@ -1155,3 +1171,4 @@ MobileConnection::NotifyIccInfoChanged()
return asyncDispatcher->PostDOMEvent();
}
#endif // MOZ_B2G_RIL

View File

@ -11,16 +11,21 @@
#include "mozilla/dom/MobileNetworkInfo.h"
#include "mozilla/dom/MozMobileConnectionBinding.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIIccService.h"
#include "nsIMobileConnectionService.h"
#include "nsWeakPtr.h"
#ifdef MOZ_B2G_RIL
#include "nsIIccProvider.h"
#endif // MOZ_B2G_RIL
namespace mozilla {
namespace dom {
class MobileConnection MOZ_FINAL : public DOMEventTargetHelper
, private nsIMobileConnectionListener
#ifdef MOZ_B2G_RIL
, private nsIIccListener
#endif // MOZ_B2G_RIL
{
/**
* Class MobileConnection doesn't actually expose
@ -35,7 +40,9 @@ class MobileConnection MOZ_FINAL : public DOMEventTargetHelper
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIMOBILECONNECTIONLISTENER
#ifdef MOZ_B2G_RIL
NS_DECL_NSIICCLISTENER
#endif // MOZ_B2G_RIL
NS_REALLY_FORWARD_NSIDOMEVENTTARGET(DOMEventTargetHelper)
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MobileConnection,
DOMEventTargetHelper)
@ -162,7 +169,9 @@ private:
uint32_t mClientId;
nsString mIccId;
nsCOMPtr<nsIMobileConnection> mMobileConnection;
nsCOMPtr<nsIIcc> mIccHandler;
#ifdef MOZ_B2G_RIL
nsCOMPtr<nsIIccProvider> mIcc;
#endif // MOZ_B2G_RIL
nsRefPtr<Listener> mListener;
nsRefPtr<MobileConnectionInfo> mVoice;
nsRefPtr<MobileConnectionInfo> mData;

View File

@ -406,7 +406,7 @@ MmsConnection.prototype = {
if (DEBUG) debug("Error! Radio is disabled when sending MMS.");
errorStatus = _HTTP_STATUS_RADIO_DISABLED;
} else if (this.radioInterface.rilContext.cardState !=
Ci.nsIIcc.CARD_STATE_READY) {
Ci.nsIIccProvider.CARD_STATE_READY) {
if (DEBUG) debug("Error! SIM card is not ready when sending MMS.");
errorStatus = _HTTP_STATUS_NO_SIM_CARD;
}

View File

@ -880,7 +880,7 @@ SmsService.prototype = {
if (DEBUG) debug("Error! Radio is disabled when sending SMS.");
errorCode = Ci.nsIMobileMessageCallback.RADIO_DISABLED_ERROR;
} else if (gRadioInterfaces[aServiceId].rilContext.cardState !=
Ci.nsIIcc.CARD_STATE_READY) {
Ci.nsIIccProvider.CARD_STATE_READY) {
if (DEBUG) debug("Error! SIM card is not ready when sending SMS.");
errorCode = Ci.nsIMobileMessageCallback.NO_SIM_CARD_ERROR;
}

View File

@ -110,33 +110,6 @@ function waitForManagerEvent(aEventName, aMatchFunc) {
return deferred.promise;
}
/**
* Wrap DOMRequest onsuccess/onerror events to Promise resolve/reject.
*
* Fulfill params: A DOMEvent.
* Reject params: A DOMEvent.
*
* @param aRequest
* A DOMRequest instance.
*
* @return A deferred promise.
*/
function wrapDomRequestAsPromise(aRequest) {
let deferred = Promise.defer();
ok(aRequest instanceof DOMRequest,
"aRequest is instanceof " + aRequest.constructor);
aRequest.addEventListener("success", function(aEvent) {
deferred.resolve(aEvent);
});
aRequest.addEventListener("error", function(aEvent) {
deferred.reject(aEvent);
});
return deferred.promise;
}
/**
* Send a SMS message to a single receiver. Resolve if it succeeds, reject
* otherwise.
@ -153,10 +126,7 @@ function wrapDomRequestAsPromise(aRequest) {
* @return A deferred promise.
*/
function sendSmsWithSuccess(aReceiver, aText) {
let request = manager.send(aReceiver, aText);
return wrapDomRequestAsPromise(request)
.then((aEvent) => { return aEvent.target.result; },
(aEvent) => { throw aEvent.target.error; });
return manager.send(aReceiver, aText);
}
/**
@ -180,11 +150,9 @@ function sendSmsWithFailure(aReceiver, aText) {
let promises = [];
promises.push(waitForManagerEvent("failed")
.then((aEvent) => { return aEvent.message; }));
let request = manager.send(aReceiver, aText);
promises.push(wrapDomRequestAsPromise(request)
.then((aEvent) => { throw aEvent; },
(aEvent) => { return aEvent.target.error; }));
promises.push(manager.send(aReceiver, aText)
.then((aResult) => { throw aResult; },
(aError) => { return aError; }));
return Promise.all(promises)
.then((aResults) => { return { message: aResults[0],
@ -213,11 +181,9 @@ function sendMmsWithFailure(aMmsParameters, aSendParameters) {
let promises = [];
promises.push(waitForManagerEvent("failed")
.then((aEvent) => { return aEvent.message; }));
let request = manager.sendMMS(aMmsParameters, aSendParameters);
promises.push(wrapDomRequestAsPromise(request)
.then((aEvent) => { throw aEvent; },
(aEvent) => { return aEvent.target.error; }));
promises.push(manager.sendMMS(aMmsParameters, aSendParameters)
.then((aResult) => { throw aResult; },
(aError) => { return aError; }));
return Promise.all(promises)
.then((aResults) => { return { message: aResults[0],
@ -237,9 +203,7 @@ function sendMmsWithFailure(aMmsParameters, aSendParameters) {
* @return A deferred promise.
*/
function getMessage(aId) {
let request = manager.getMessage(aId);
return wrapDomRequestAsPromise(request)
.then((aEvent) => { return aEvent.target.result; });
return manager.getMessage(aId);
}
/**
@ -371,14 +335,12 @@ function deleteMessagesById(aMessageIds) {
let promises = [];
promises.push(waitForManagerEvent("deleted"));
let request = manager.delete(aMessageIds);
promises.push(wrapDomRequestAsPromise(request));
promises.push(manager.delete(aMessageIds));
return Promise.all(promises)
.then((aResults) => {
return { deletedInfo: aResults[0],
deletedFlags: aResults[1].target.result };
deletedFlags: aResults[1] };
});
}

View File

@ -13,10 +13,9 @@ function getNonExistentMsg(aId) {
return getMessage(aId)
.then(function onresolve() {
ok(false, "request succeeded when tried to get non-existent sms");
}, function onreject(aEvent) {
let error = aEvent.target.error;
ok(error, "DOMError");
is(error.name, "NotFoundError", "error.name");
}, function onreject(aError) {
ok(aError, "DOMError");
is(aError.name, "NotFoundError", "error.name");
});
}
@ -27,10 +26,9 @@ function getMsgInvalidId(aId) {
.then(function onresolve() {
ok(false, "request succeeded when tried to get message with " +
"invalid id (id: " + aId + ").");
}, function onreject(aEvent) {
let error = aEvent.target.error;
ok(error, "DOMError");
is(error.name, "NotFoundError", "error.name");
}, function onreject(aError) {
ok(aError, "DOMError");
is(aError.name, "NotFoundError", "error.name");
});
}

View File

@ -13,16 +13,14 @@ function test(text, segments, charsPerSegment, charsAvailableInLastSegment) {
let domRequest = manager.getSegmentInfoForText(text);
ok(domRequest, "DOMRequest object returned.");
return wrapDomRequestAsPromise(domRequest)
.then(function(aEvent) {
let result = aEvent.target.result;
ok(result, "aEvent.target.result = " + JSON.stringify(result));
return domRequest.then(function(aResult) {
ok(aResult, "result = " + JSON.stringify(aResult));
is(result.segments, segments, "result.segments");
is(result.charsPerSegment, charsPerSegment, "result.charsPerSegment");
is(result.charsAvailableInLastSegment, charsAvailableInLastSegment,
"result.charsAvailableInLastSegment");
});
is(aResult.segments, segments, "result.segments");
is(aResult.charsPerSegment, charsPerSegment, "result.charsPerSegment");
is(aResult.charsAvailableInLastSegment, charsAvailableInLastSegment,
"result.charsAvailableInLastSegment");
});
}
startTestCommon(function() {

View File

@ -1,217 +1,81 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
SpecialPowers.setBoolPref("dom.sms.enabled", true);
SpecialPowers.addPermission("sms", true, document);
MARIONETTE_TIMEOUT = 90000;
MARIONETTE_HEAD_JS = "head.js";
const SENDER = "5555552368"; // the remote number
const RECEIVER = "15555215554"; // the emulator's number
let manager = window.navigator.mozMobileMessage;
let MSG_TEXT = "Mozilla Firefox OS!";
let SMS_NUMBER = 100;
const MSG_TEXT = "Mozilla Firefox OS!";
const SMS_NUMBER = 100;
let SmsList = [];
let checkDone = true;
let emulatorReady = true;
let pendingEmulatorCmdCount = 0;
function sendSmsToEmulator(from, text) {
++pendingEmulatorCmdCount;
let cmd = "sms send " + from + " " + text;
runEmulatorCmd(cmd, function(result) {
--pendingEmulatorCmdCount;
is(result[0], "OK", "Emulator response");
});
}
let tasks = {
// List of test fuctions. Each of them should call |tasks.next()| when
// completed or |tasks.finish()| to jump to the last one.
_tasks: [],
_nextTaskIndex: 0,
push: function(func) {
this._tasks.push(func);
},
next: function() {
let index = this._nextTaskIndex++;
let task = this._tasks[index];
try {
task();
} catch (ex) {
ok(false, "test task[" + index + "] throws: " + ex);
// Run last task as clean up if possible.
if (index != this._tasks.length - 1) {
this.finish();
}
}
},
finish: function() {
this._tasks[this._tasks.length - 1]();
},
run: function() {
this.next();
}
};
function taskNextWrapper() {
tasks.next();
}
function verifySmsExists(incomingSms) {
log("Getting SMS (id: " + incomingSms.id + ").");
let requestRet = manager.getMessage(incomingSms.id);
ok(requestRet, "smsrequest obj returned");
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
ok(event.target.result, "smsrequest event.target.result");
let foundSms = event.target.result;
is(foundSms.id, incomingSms.id, "found SMS id matches");
is(foundSms.threadId, incomingSms.threadId, "found SMS thread id matches");
is(foundSms.body, MSG_TEXT, "found SMS msg text matches");
is(foundSms.delivery, "received", "delivery");
is(foundSms.deliveryStatus, "success", "deliveryStatus");
is(foundSms.read, false, "read");
is(foundSms.receiver, RECEIVER, "receiver");
is(foundSms.sender, SENDER, "sender");
is(foundSms.messageClass, "normal", "messageClass");
log("Got SMS (id: " + foundSms.id + ") as expected.");
SmsList.push(incomingSms);
};
requestRet.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
is(event.target.error.name, "NotFoundError", "error returned");
log("Could not get SMS (id: " + incomingSms.id + ") but should have.");
ok(false,"SMS was not found");
tasks.finish();
};
}
let verifDeletedCount = 0;
function verifySmsDeleted(smsId) {
log("Getting SMS (id: " + smsId + ").");
let requestRet = manager.getMessage(smsId);
ok(requestRet, "smsrequest obj returned");
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
ok(event.target.result, "smsrequest event.target.result");
let foundSms = event.target.result;
is(foundSms.id, smsId, "found SMS id matches");
is(foundSms.body, MSG_TEXT, "found SMS msg text matches");
log("Got SMS (id: " + foundSms.id + ") but should not have.");
ok(false, "SMS was not deleted");
tasks.finish();
};
requestRet.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
is(event.target.error.name, "NotFoundError", "error returned");
log("Could not get SMS (id: " + smsId + ") as expected.");
verifDeletedCount++;
};
}
tasks.push(function init() {
log("Initialize test object.");
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
// Callback for incoming sms
manager.onreceived = function onreceived(event) {
log("Received 'onreceived' event.");
let incomingSms = event.message;
ok(incomingSms, "incoming sms");
ok(incomingSms.id, "sms id");
log("Received SMS (id: " + incomingSms.id + ").");
ok(incomingSms.threadId, "thread id");
is(incomingSms.body, MSG_TEXT, "msg body");
is(incomingSms.delivery, "received", "delivery");
is(incomingSms.deliveryStatus, "success", "deliveryStatus");
is(incomingSms.read, false, "read");
is(incomingSms.receiver, RECEIVER, "receiver");
is(incomingSms.sender, SENDER, "sender");
is(incomingSms.messageClass, "normal", "messageClass");
is(incomingSms.deliveryTimestamp, 0, "deliveryTimestamp is 0");
verifySmsExists(incomingSms);
};
tasks.next();
});
tasks.push(function sendAllSms() {
function sendAllSms() {
log("Send " + SMS_NUMBER + " SMS");
let promises = [];
// Wait for all "received" event are received.
promises.push(waitForManagerEvent("received", function(aEvent) {
let message = aEvent.message;
log("Received 'onreceived' event.");
ok(message, "incoming sms");
ok(message.id, "sms id");
log("Received SMS (id: " + message.id + ").");
ok(message.threadId, "thread id");
is(message.body, MSG_TEXT, "msg body");
is(message.delivery, "received", "delivery");
is(message.deliveryStatus, "success", "deliveryStatus");
is(message.read, false, "read");
is(message.receiver, RECEIVER, "receiver");
is(message.sender, SENDER, "sender");
is(message.messageClass, "normal", "messageClass");
is(message.deliveryTimestamp, 0, "deliveryTimestamp is 0");
SmsList.push(message);
return SmsList.length === SMS_NUMBER;
}));
// Generate massive incoming message.
for (let i = 0; i < SMS_NUMBER; i++) {
sendSmsToEmulator(SENDER, MSG_TEXT);
promises.push(sendTextSmsToEmulator(SENDER, MSG_TEXT));
}
waitFor(taskNextWrapper, function() {
return (pendingEmulatorCmdCount === 0) && (SmsList.length === SMS_NUMBER);
});
});
return Promise.all(promises);
}
function deleteAllSms() {
log("Deleting SMS: " + JSON.stringify(SmsList));
tasks.push(function deleteAllSms() {
log("Deleting SMS using smsmsg obj array parameter.");
let deleteStart = Date.now();
log("deleteStart: " + deleteStart);
log("SmsList: " + JSON.stringify(SmsList));
let requestRet = manager.delete(SmsList);
ok(requestRet,"smsrequest obj returned");
return deleteMessages(SmsList)
.then(() => {
let deleteDone = Date.now();
log("Delete " + SmsList.length + " SMS takes " +
(deleteDone - deleteStart) + " ms.");
})
// Verify SMS Deleted
.then(() => {
let promises = [];
requestRet.onsuccess = function(event) {
let deleteDone = Date.now();
log("Delete " + SMS_NUMBER + " SMS takes " + (deleteDone - deleteStart) + " ms.");
log("Received 'onsuccess' smsrequest event.");
if (event.target.result) {
for (let i = 0; i < SmsList.length; i++) {
verifySmsDeleted(SmsList[i].id);
let smsId = SmsList[i].id;
promises.push(getMessage(smsId)
.then((aMessageInDB) => {
log("Got SMS (id: " + aMessageInDB.id + ") but should not have.");
ok(false, "SMS (id: " + aMessageInDB.id + ") was not deleted");
}, (aError) => {
log("Could not get SMS (id: " + smsId + ") as expected.");
is(aError.name, "NotFoundError", "error returned");
}));
}
} else {
log("smsrequest returned false for manager.delete");
ok(false, "SMS delete failed");
}
};
requestRet.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
ok(false, "manager.delete request returned unexpected error: "
+ event.target.error.name);
tasks.finish();
};
waitFor(taskNextWrapper, function() {
return verifDeletedCount === SMS_NUMBER;
});
});
// WARNING: All tasks should be pushed before this!!!
tasks.push(function cleanUp() {
if (pendingEmulatorCmdCount) {
window.setTimeout(cleanUp, 100);
return;
}
manager.onreceived = null;
SpecialPowers.removePermission("sms", document);
SpecialPowers.clearUserPref("dom.sms.enabled");
log("Finish!!!");
finish();
});
return Promise.all(promises);
});
}
// Start the test
tasks.run();
startTestCommon(function testCaseMain() {
return sendAllSms()
.then(() => deleteAllSms());
});

View File

@ -103,24 +103,22 @@ function doSingleRequest(aRequest, aReceiver, aBody, aNow) {
sentGot = true;
}));
promises.push(wrapDomRequestAsPromise(aRequest)
.then(function(aEvent) {
log(" onsuccess event for '" + aReceiver + "' received.");
promises.push(aRequest.then(function(aResult) {
log(" onsuccess event for '" + aReceiver + "' received.");
let message = aEvent.target.result;
checkMessage(message, "sent", aBody);
// Should be mostly identical to sendingMessage.
is(message.id, sendingMessage.id, "message.id");
is(message.receiver, sendingMessage.receiver, "message.receiver");
is(message.body, sendingMessage.body, "message.body");
is(message.timestamp, sendingMessage.timestamp, "message.timestamp");
checkMessage(aResult, "sent", aBody);
// Should be mostly identical to sendingMessage.
is(aResult.id, sendingMessage.id, "message.id");
is(aResult.receiver, sendingMessage.receiver, "message.receiver");
is(aResult.body, sendingMessage.body, "message.body");
is(aResult.timestamp, sendingMessage.timestamp, "message.timestamp");
ok(sendingGot, "sending event should have been triggered");
ok(!sentGot, "sent event should not have been triggered");
ok(!successGot, "success event should not have been triggered");
ok(sendingGot, "sending event should have been triggered");
ok(!sentGot, "sent event should not have been triggered");
ok(!successGot, "success event should not have been triggered");
successGot = true;
}));
successGot = true;
}));
return Promise.all(promises);
}

View File

@ -23,16 +23,14 @@ function test(text, segments, charsPerSegment, charsAvailableInLastSegment) {
let domRequest = manager.getSegmentInfoForText(text);
ok(domRequest, "DOMRequest object returned.");
return wrapDomRequestAsPromise(domRequest)
.then(function(aEvent) {
let result = aEvent.target.result;
ok(result, "aEvent.target.result = " + JSON.stringify(result));
return domRequest.then(function(aResult) {
ok(aResult, "result = " + JSON.stringify(aResult));
is(result.segments, segments, "result.segments");
is(result.charsPerSegment, charsPerSegment, "result.charsPerSegment");
is(result.charsAvailableInLastSegment, charsAvailableInLastSegment,
"result.charsAvailableInLastSegment");
});
is(aResult.segments, segments, "result.segments");
is(aResult.charsPerSegment, charsPerSegment, "result.charsPerSegment");
is(aResult.charsAvailableInLastSegment, charsAvailableInLastSegment,
"result.charsAvailableInLastSegment");
});
}
startTestCommon(function() {

View File

@ -64,7 +64,6 @@ DIRS += [
'fmradio',
'geolocation',
'html',
'icc',
'json',
'jsurl',
'asmjscache',
@ -123,6 +122,7 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
if CONFIG['MOZ_B2G_RIL']:
DIRS += [
'icc',
'wappush',
]

View File

@ -23,9 +23,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "MCC_ISO3166_TABLE",
XPCOMUtils.defineLazyServiceGetter(this, "mobileConnection",
"@mozilla.org/mobileconnection/mobileconnectionservice;1",
"nsIMobileConnectionService");
XPCOMUtils.defineLazyServiceGetter(this, "gIccService",
"@mozilla.org/icc/iccservice;1",
"nsIIccService");
XPCOMUtils.defineLazyServiceGetter(this, "icc",
"@mozilla.org/ril/content-helper;1",
"nsIIccProvider");
#endif
this.PhoneNumberUtils = {
@ -46,8 +46,8 @@ this.PhoneNumberUtils = {
#ifdef MOZ_B2G_RIL
// TODO: Bug 926740 - PhoneNumberUtils for multisim
// In Multi-sim, there is more than one client in
// iccService/mobileConnectionService. Each client represents a
// In Multi-sim, there is more than one client in
// iccProvider/mobileConnectionProvider. Each client represents a
// icc/mobileConnection service. To maintain the backward compatibility with
// single sim, we always use client 0 for now. Adding support for multiple
// sim will be addressed in bug 926740, if needed.
@ -61,8 +61,7 @@ this.PhoneNumberUtils = {
}
// Get SIM mcc
let icc = gIccService.getIccByServiceId(clientId);
let iccInfo = icc && icc.iccInfo;
let iccInfo = icc.getIccInfo(clientId);
if (!mcc && iccInfo && iccInfo.mcc) {
mcc = iccInfo.mcc;
}

View File

@ -1775,15 +1775,14 @@ this.PushService = {
let nm = Cc["@mozilla.org/network/manager;1"].getService(Ci.nsINetworkManager);
if (nm.active && nm.active.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE) {
let iccService = Cc["@mozilla.org/icc/iccservice;1"].getService(Ci.nsIIccService);
let icc = Cc["@mozilla.org/ril/content-helper;1"].getService(Ci.nsIIccProvider);
// TODO: Bug 927721 - PushService for multi-sim
// In Multi-sim, there is more than one client in iccService. Each
// client represents a icc handle. To maintain backward compatibility
// In Multi-sim, there is more than one client in iccProvider. Each
// client represents a icc service. To maintain backward compatibility
// with single sim, we always use client 0 for now. Adding support
// for multiple sim will be addressed in bug 927721, if needed.
let clientId = 0;
let icc = iccService.getIccByServiceId(clientId);
let iccInfo = icc && icc.iccInfo;
let iccInfo = icc.getIccInfo(clientId);
if (iccInfo) {
debug("Running on mobile data");

View File

@ -38,6 +38,7 @@ const TOPIC_PREF_CHANGED = "nsPref:changed";
const TOPIC_XPCOM_SHUTDOWN = "xpcom-shutdown";
const TOPIC_CONNECTION_STATE_CHANGED = "network-connection-state-changed";
const PREF_MANAGE_OFFLINE_STATUS = "network.gonk.manage-offline-status";
const PREF_NETWORK_DEBUG_ENABLED = "network.debugging.enabled";
const IPV4_ADDRESS_ANY = "0.0.0.0";
const IPV6_ADDRESS_ANY = "::0";
@ -53,13 +54,22 @@ const CONNECTION_TYPE_WIFI = 3;
const CONNECTION_TYPE_OTHER = 4;
const CONNECTION_TYPE_NONE = 5;
let DEBUG = false;
let debug;
function updateDebug() {
let debugPref = false; // set default value here.
try {
debugPref = debugPref || Services.prefs.getBoolPref(PREF_NETWORK_DEBUG_ENABLED);
} catch (e) {}
// Read debug setting from pref.
try {
let debugPref = Services.prefs.getBoolPref("network.debugging.enabled");
DEBUG = DEBUG || debugPref;
} catch (e) {}
if (debugPref) {
debug = function(s) {
dump("-*- NetworkManager: " + s + "\n");
};
} else {
debug = function(s) {};
}
}
updateDebug();
function defineLazyRegExp(obj, name, pattern) {
obj.__defineGetter__(name, function() {
@ -121,6 +131,7 @@ function NetworkManager() {
// Ignore.
}
Services.prefs.addObserver(PREF_MANAGE_OFFLINE_STATUS, this, false);
Services.prefs.addObserver(PREF_NETWORK_DEBUG_ENABLED, this, false);
Services.obs.addObserver(this, TOPIC_XPCOM_SHUTDOWN, false);
this.setAndConfigureActive();
@ -147,13 +158,18 @@ NetworkManager.prototype = {
observe: function(subject, topic, data) {
switch (topic) {
case TOPIC_PREF_CHANGED:
this._manageOfflineStatus =
Services.prefs.getBoolPref(PREF_MANAGE_OFFLINE_STATUS);
debug(PREF_MANAGE_OFFLINE_STATUS + " has changed to " + this._manageOfflineStatus);
if (data === PREF_NETWORK_DEBUG_ENABLED) {
updateDebug();
} else if (data === PREF_MANAGE_OFFLINE_STATUS) {
this._manageOfflineStatus =
Services.prefs.getBoolPref(PREF_MANAGE_OFFLINE_STATUS);
debug(PREF_MANAGE_OFFLINE_STATUS + " has changed to " + this._manageOfflineStatus);
}
break;
case TOPIC_XPCOM_SHUTDOWN:
Services.obs.removeObserver(this, TOPIC_XPCOM_SHUTDOWN);
Services.prefs.removeObserver(PREF_MANAGE_OFFLINE_STATUS, this);
Services.prefs.removeObserver(PREF_NETWORK_DEBUG_ENABLED, this);
break;
}
},
@ -715,8 +731,8 @@ NetworkManager.prototype = {
return;
}
if (DEBUG) debug("hostname is resolved: " + hostname);
if (DEBUG) debug("Addresses: " + JSON.stringify(retval));
debug("hostname is resolved: " + hostname);
debug("Addresses: " + JSON.stringify(retval));
deferred.resolve(retval);
};
@ -853,14 +869,4 @@ XPCOMUtils.defineLazyGetter(NetworkManager.prototype, "mRil", function() {
return null;
});
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([NetworkManager]);
let debug;
if (DEBUG) {
debug = function(s) {
dump("-*- NetworkManager: " + s + "\n");
};
} else {
debug = function(s) {};
}
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([NetworkManager]);

View File

@ -15,6 +15,10 @@ Cu.import("resource://gre/modules/Promise.jsm");
const NETWORKSERVICE_CONTRACTID = "@mozilla.org/network/service;1";
const NETWORKSERVICE_CID = Components.ID("{baec696c-c78d-42db-8b44-603f8fbfafb4}");
const TOPIC_PREF_CHANGED = "nsPref:changed";
const TOPIC_XPCOM_SHUTDOWN = "xpcom-shutdown";
const PREF_NETWORK_DEBUG_ENABLED = "network.debugging.enabled";
XPCOMUtils.defineLazyServiceGetter(this, "gNetworkWorker",
"@mozilla.org/network/worker;1",
"nsINetworkWorker");
@ -35,13 +39,22 @@ const WIFI_CTRL_INTERFACE = "wl0.1";
const MANUAL_PROXY_CONFIGURATION = 1;
let DEBUG = false;
let debug;
function updateDebug() {
let debugPref = false; // set default value here.
try {
debugPref = debugPref || Services.prefs.getBoolPref(PREF_NETWORK_DEBUG_ENABLED);
} catch (e) {}
// Read debug setting from pref.
try {
let debugPref = Services.prefs.getBoolPref("network.debugging.enabled");
DEBUG = DEBUG || debugPref;
} catch (e) {}
if (debugPref) {
debug = function(s) {
dump("-*- NetworkService: " + s + "\n");
};
} else {
debug = function(s) {};
}
}
updateDebug();
function netdResponseType(code) {
return Math.floor(code / 100) * 100;
@ -52,10 +65,6 @@ function isError(code) {
return (type !== NETD_COMMAND_PROCEEDING && type !== NETD_COMMAND_OKAY);
}
function debug(msg) {
dump("-*- NetworkService: " + msg + "\n");
}
function Task(id, params, setupFunction) {
this.id = id;
this.params = params;
@ -73,7 +82,7 @@ NetworkWorkerRequestQueue.prototype = {
}
let task = this.tasks[0];
if (DEBUG) debug("run task id: " + task.id);
debug("run task id: " + task.id);
if (typeof task.setupFunction === 'function') {
// If setupFunction returns false, skip sending to Network Worker but call
@ -89,7 +98,7 @@ NetworkWorkerRequestQueue.prototype = {
},
enqueue: function(id, params, setupFunction) {
if (DEBUG) debug("enqueue id: " + id);
debug("enqueue id: " + id);
this.tasks.push(new Task(id, params, setupFunction));
if (this.tasks.length === 1) {
@ -98,10 +107,10 @@ NetworkWorkerRequestQueue.prototype = {
},
dequeue: function(id) {
if (DEBUG) debug("dequeue id: " + id);
debug("dequeue id: " + id);
if (!this.tasks.length || this.tasks[0].id != id) {
if (DEBUG) debug("Id " + id + " is not on top of the queue");
debug("Id " + id + " is not on top of the queue");
return;
}
@ -121,7 +130,7 @@ NetworkWorkerRequestQueue.prototype = {
* adjusts routes etc. accordingly.
*/
function NetworkService() {
if(DEBUG) debug("Starting net_worker.");
debug("Starting net_worker.");
let self = this;
@ -139,7 +148,9 @@ function NetworkService() {
this.addedRoutes = new Map();
this.netWorkerRequestQueue = new NetworkWorkerRequestQueue(this);
this.shutdown = false;
Services.obs.addObserver(this, "xpcom-shutdown", false);
Services.prefs.addObserver(PREF_NETWORK_DEBUG_ENABLED, this, false);
Services.obs.addObserver(this, TOPIC_XPCOM_SHUTDOWN, false);
}
NetworkService.prototype = {
@ -148,11 +159,38 @@ NetworkService.prototype = {
contractID: NETWORKSERVICE_CONTRACTID,
classDescription: "Network Service",
interfaces: [Ci.nsINetworkService]}),
QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkService]),
QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkService,
Ci.nsIObserver]),
addedRoutes: null,
shutdown: false,
// nsIObserver
observe: function(subject, topic, data) {
switch (topic) {
case TOPIC_PREF_CHANGED:
if (data === PREF_NETWORK_DEBUG_ENABLED) {
updateDebug();
}
break;
case TOPIC_XPCOM_SHUTDOWN:
debug("NetworkService shutdown");
this.shutdown = true;
if (gNetworkWorker) {
gNetworkWorker.shutdown();
gNetworkWorker = null;
}
Services.obs.removeObserver(this, TOPIC_XPCOM_SHUTDOWN);
Services.prefs.removeObserver(PREF_NETWORK_DEBUG_ENABLED, this);
break;
}
},
// Helpers
addedRoutes: null,
idgen: 0,
controlMessage: function(params, callback, setupFunction) {
if (this.shutdown) {
@ -178,7 +216,7 @@ NetworkService.prototype = {
},
handleWorkerMessage: function(response) {
if(DEBUG) debug("NetworkManager received message from worker: " + JSON.stringify(response));
debug("NetworkManager received message from worker: " + JSON.stringify(response));
let id = response.id;
if (response.broadcast === true) {
Services.obs.notifyObservers(null, response.topic, response.reason);
@ -196,7 +234,7 @@ NetworkService.prototype = {
// nsINetworkService
getNetworkInterfaceStats: function(networkName, callback) {
if(DEBUG) debug("getNetworkInterfaceStats for " + networkName);
debug("getNetworkInterfaceStats for " + networkName);
let file = new FileUtils.File("/proc/net/dev");
if (!file) {
@ -257,7 +295,7 @@ NetworkService.prototype = {
},
_setNetworkInterfaceAlarm: function(networkName, threshold, callback) {
if(DEBUG) debug("setNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
debug("setNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
let params = {
cmd: "setNetworkInterfaceAlarm",
@ -278,7 +316,7 @@ NetworkService.prototype = {
},
_enableNetworkInterfaceAlarm: function(networkName, threshold, callback) {
if(DEBUG) debug("enableNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
debug("enableNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
let params = {
cmd: "enableNetworkInterfaceAlarm",
@ -298,7 +336,7 @@ NetworkService.prototype = {
},
_disableNetworkInterfaceAlarm: function(networkName, callback) {
if(DEBUG) debug("disableNetworkInterfaceAlarm for " + networkName);
debug("disableNetworkInterfaceAlarm for " + networkName);
let params = {
cmd: "disableNetworkInterfaceAlarm",
@ -313,7 +351,7 @@ NetworkService.prototype = {
},
setWifiOperationMode: function(interfaceName, mode, callback) {
if(DEBUG) debug("setWifiOperationMode on " + interfaceName + " to " + mode);
debug("setWifiOperationMode on " + interfaceName + " to " + mode);
let params = {
cmd: "setWifiOperationMode",
@ -342,7 +380,7 @@ NetworkService.prototype = {
},
setDNS: function(networkInterface, callback) {
if (DEBUG) debug("Going DNS to " + networkInterface.name);
debug("Going DNS to " + networkInterface.name);
let dnses = networkInterface.getDnses();
let options = {
cmd: "setDNS",
@ -356,7 +394,7 @@ NetworkService.prototype = {
},
setDefaultRoute: function(network, oldInterface, callback) {
if (DEBUG) debug("Going to change default route to " + network.name);
debug("Going to change default route to " + network.name);
let gateways = network.getGateways();
let options = {
cmd: "setDefaultRoute",
@ -370,7 +408,7 @@ NetworkService.prototype = {
},
removeDefaultRoute: function(network) {
if(DEBUG) debug("Remove default route for " + network.name);
debug("Remove default route for " + network.name);
let gateways = network.getGateways();
let options = {
cmd: "removeDefaultRoute",
@ -395,14 +433,14 @@ NetworkService.prototype = {
command = 'removeHostRoute';
break;
default:
if (DEBUG) debug('Unknown action: ' + action);
debug('Unknown action: ' + action);
return Promise.reject();
}
let route = this._routeToString(interfaceName, host, prefixLength, gateway);
let setupFunc = () => {
let count = this.addedRoutes.get(route);
if (DEBUG) debug(command + ": " + route + " -> " + count);
debug(command + ": " + route + " -> " + count);
// Return false if there is no need to send the command to network worker.
if ((action == Ci.nsINetworkService.MODIFY_ROUTE_ADD && count) ||
@ -414,7 +452,7 @@ NetworkService.prototype = {
return true;
};
if (DEBUG) debug(command + " " + host + " on " + interfaceName);
debug(command + " " + host + " on " + interfaceName);
let options = {
cmd: command,
ifname: interfaceName,
@ -451,7 +489,7 @@ NetworkService.prototype = {
},
addSecondaryRoute: function(ifname, route) {
if(DEBUG) debug("Going to add route to secondary table on " + ifname);
debug("Going to add route to secondary table on " + ifname);
let options = {
cmd: "addSecondaryRoute",
ifname: ifname,
@ -463,7 +501,7 @@ NetworkService.prototype = {
},
removeSecondaryRoute: function(ifname, route) {
if(DEBUG) debug("Going to remove route from secondary table on " + ifname);
debug("Going to remove route from secondary table on " + ifname);
let options = {
cmd: "removeSecondaryRoute",
ifname: ifname,
@ -480,11 +518,11 @@ NetworkService.prototype = {
// Sets direct connection to internet.
this.clearNetworkProxy();
if (DEBUG) debug("No proxy support for " + network.name + " network interface.");
debug("No proxy support for " + network.name + " network interface.");
return;
}
if (DEBUG) debug("Going to set proxy settings for " + network.name + " network interface.");
debug("Going to set proxy settings for " + network.name + " network interface.");
// Sets manual proxy configuration.
Services.prefs.setIntPref("network.proxy.type", MANUAL_PROXY_CONFIGURATION);
// Do not use this proxy server for all protocols.
@ -495,13 +533,13 @@ NetworkService.prototype = {
Services.prefs.setIntPref("network.proxy.http_port", port);
Services.prefs.setIntPref("network.proxy.ssl_port", port);
} catch(ex) {
if (DEBUG) debug("Exception " + ex + ". Unable to set proxy setting for " +
debug("Exception " + ex + ". Unable to set proxy setting for " +
network.name + " network interface.");
}
},
clearNetworkProxy: function() {
if (DEBUG) debug("Going to clear all network proxy.");
debug("Going to clear all network proxy.");
Services.prefs.clearUserPref("network.proxy.type");
Services.prefs.clearUserPref("network.proxy.share_proxy_settings");
@ -545,7 +583,7 @@ NetworkService.prototype = {
let enable = data.enable;
let enableString = enable ? "Enable" : "Disable";
if(DEBUG) debug(enableString + " Wifi tethering result: Code " + code + " reason " + reason);
debug(enableString + " Wifi tethering result: Code " + code + " reason " + reason);
if (isError(code)) {
callback.wifiTetheringEnabledChange("netd command error");
@ -565,7 +603,7 @@ NetworkService.prototype = {
let enable = data.enable;
let enableString = enable ? "Enable" : "Disable";
if(DEBUG) debug(enableString + " USB tethering result: Code " + code + " reason " + reason);
debug(enableString + " USB tethering result: Code " + code + " reason " + reason);
if (isError(code)) {
callback.usbTetheringEnabledChange("netd command error");
@ -577,7 +615,7 @@ NetworkService.prototype = {
// Switch usb function by modifying property of persist.sys.usb.config.
enableUsbRndis: function(enable, callback) {
if(DEBUG) debug("enableUsbRndis: " + enable);
debug("enableUsbRndis: " + enable);
let params = {
cmd: "enableUsbRndis",
@ -609,7 +647,7 @@ NetworkService.prototype = {
this.controlMessage(params, function(data) {
let code = data.resultCode;
let reason = data.resultReason;
if(DEBUG) debug("updateUpStream result: Code " + code + " reason " + reason);
debug("updateUpStream result: Code " + code + " reason " + reason);
callback.updateUpStreamResult(!isError(code), data.curExternalIfname);
});
},
@ -695,22 +733,6 @@ NetworkService.prototype = {
callback.nativeCommandResult(!result.error);
});
},
shutdown: false,
observe: function observe(aSubject, aTopic, aData) {
switch (aTopic) {
case "xpcom-shutdown":
debug("NetworkService shutdown");
this.shutdown = true;
Services.obs.removeObserver(this, "xpcom-shutdown");
if (gNetworkWorker) {
gNetworkWorker.shutdown();
gNetworkWorker = null;
}
break;
}
},
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([NetworkService]);

View File

@ -98,8 +98,8 @@ IccInfo.prototype = {
mcc: null,
mnc: null,
spn: null,
isDisplayNetworkNameRequired: false,
isDisplaySpnRequired: false
isDisplayNetworkNameRequired: null,
isDisplaySpnRequired: null
};
function GsmIccInfo() {}
@ -131,19 +131,16 @@ function RILContentHelper() {
this.numClients = gNumRadioInterfaces;
if (DEBUG) debug("Number of clients: " + this.numClients);
this._iccs = [];
this.rilContexts = [];
for (let clientId = 0; clientId < this.numClients; clientId++) {
this._iccs.push(new Icc(this, clientId));
this.rilContexts[clientId] = {
cardState: Ci.nsIIcc.CARD_STATE_UNKNOWN,
cardState: Ci.nsIIccProvider.CARD_STATE_UNKNOWN,
iccInfo: null
};
}
this.initDOMRequestHelper(/* aWindow */ null, RIL_IPC_MSG_NAMES);
this._windowsMap = [];
this._requestMap = [];
this._iccListeners = [];
this._iccChannelCallback = [];
@ -156,14 +153,12 @@ RILContentHelper.prototype = {
__proto__: DOMRequestIpcHelper.prototype,
QueryInterface: XPCOMUtils.generateQI([Ci.nsIIccProvider,
Ci.nsIIccService,
Ci.nsIObserver,
Ci.nsISupportsWeakReference]),
classID: RILCONTENTHELPER_CID,
classInfo: XPCOMUtils.generateCI({classID: RILCONTENTHELPER_CID,
classDescription: "RILContentHelper",
interfaces: [Ci.nsIIccProvider,
Ci.nsIIccService]}),
interfaces: [Ci.nsIIccProvider]}),
updateDebugFlag: function() {
try {
@ -211,8 +206,6 @@ RILContentHelper.prototype = {
_windowsMap: null,
_requestMap: null,
rilContexts: null,
getRilContext: function(clientId) {
@ -241,6 +234,142 @@ RILContentHelper.prototype = {
* nsIIccProvider
*/
getIccInfo: function(clientId) {
let context = this.getRilContext(clientId);
return context && context.iccInfo;
},
getCardState: function(clientId) {
let context = this.getRilContext(clientId);
return context && context.cardState;
},
matchMvno: function(clientId, window, mvnoType, mvnoData) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
let request = Services.DOMRequest.createRequest(window);
let requestId = this.getRequestId(request);
cpmm.sendAsyncMessage("RIL:MatchMvno", {
clientId: clientId,
data: {
requestId: requestId,
mvnoType: mvnoType,
mvnoData: mvnoData
}
});
return request;
},
getCardLockEnabled: function(clientId, window, lockType) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
let request = Services.DOMRequest.createRequest(window);
let requestId = this.getRequestId(request);
this._windowsMap[requestId] = window;
cpmm.sendAsyncMessage("RIL:GetCardLockEnabled", {
clientId: clientId,
data: {
lockType: lockType,
requestId: requestId
}
});
return request;
},
unlockCardLock: function(clientId, window, lockType, password, newPin) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
let request = Services.DOMRequest.createRequest(window);
let requestId = this.getRequestId(request);
this._windowsMap[requestId] = window;
cpmm.sendAsyncMessage("RIL:UnlockCardLock", {
clientId: clientId,
data: {
lockType: lockType,
password: password,
newPin: newPin,
requestId: requestId
}
});
return request;
},
setCardLockEnabled: function(clientId, window, lockType, password, enabled) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
let request = Services.DOMRequest.createRequest(window);
let requestId = this.getRequestId(request);
this._windowsMap[requestId] = window;
cpmm.sendAsyncMessage("RIL:SetCardLockEnabled", {
clientId: clientId,
data: {
lockType: lockType,
password: password,
enabled: enabled,
requestId: requestId
}
});
return request;
},
changeCardLockPassword: function(clientId, window, lockType, password,
newPassword) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
let request = Services.DOMRequest.createRequest(window);
let requestId = this.getRequestId(request);
this._windowsMap[requestId] = window;
cpmm.sendAsyncMessage("RIL:ChangeCardLockPassword", {
clientId: clientId,
data: {
lockType: lockType,
password: password,
newPassword: newPassword,
requestId: requestId
}
});
return request;
},
getCardLockRetryCount: function(clientId, window, lockType) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
let request = Services.DOMRequest.createRequest(window);
let requestId = this.getRequestId(request);
this._windowsMap[requestId] = window;
cpmm.sendAsyncMessage("RIL:GetCardLockRetryCount", {
clientId: clientId,
data: {
lockType: lockType,
requestId: requestId
}
});
return request;
},
sendStkResponse: function(clientId, window, command, response) {
if (window == null) {
throw Components.Exception("Can't get window object",
@ -416,6 +545,27 @@ RILContentHelper.prototype = {
return request;
},
getServiceState: function(clientId, window, service) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
return new window.Promise((resolve, reject) => {
let requestId =
this.getPromiseResolverId({resolve: resolve, reject: reject});
this._windowsMap[requestId] = window;
cpmm.sendAsyncMessage("RIL:GetServiceState", {
clientId: clientId,
data: {
requestId: requestId,
service: service
}
});
});
},
_iccListeners: null,
registerListener: function(listenerType, clientId, listener) {
@ -571,56 +721,62 @@ RILContentHelper.prototype = {
case "RIL:CardStateChanged":
if (this.rilContexts[clientId].cardState != data.cardState) {
this.rilContexts[clientId].cardState = data.cardState;
this._deliverIccEvent(clientId,
"notifyCardStateChanged",
null);
this._deliverEvent(clientId,
"_iccListeners",
"notifyCardStateChanged",
null);
}
break;
case "RIL:IccInfoChanged":
this.updateIccInfo(clientId, data);
this._deliverIccEvent(clientId,
"notifyIccInfoChanged",
null);
this._deliverEvent(clientId,
"_iccListeners",
"notifyIccInfoChanged",
null);
break;
case "RIL:GetCardLockResult": {
let requestId = data.requestId;
let callback = this._requestMap[requestId];
delete this._requestMap[requestId];
let requestWindow = this._windowsMap[requestId];
delete this._windowsMap[requestId];
if (data.errorMsg) {
callback.notifyError(data.errorMsg);
this.fireRequestError(requestId, data.errorMsg);
break;
}
callback.notifySuccessWithBoolean(data.enabled);
this.fireRequestSuccess(requestId,
Cu.cloneInto({ enabled: data.enabled },
requestWindow));
break;
}
case "RIL:SetUnlockCardLockResult": {
let requestId = data.requestId;
let callback = this._requestMap[requestId];
delete this._requestMap[requestId];
let requestWindow = this._windowsMap[requestId];
delete this._windowsMap[requestId];
if (data.errorMsg) {
let retryCount =
(data.retryCount !== undefined) ? data.retryCount : -1;
callback.notifyCardLockError(data.errorMsg, retryCount);
let cardLockError = new requestWindow.IccCardLockError(data.errorMsg,
data.retryCount);
this.fireRequestDetailedError(requestId, cardLockError);
break;
}
callback.notifySuccess();
this.fireRequestSuccess(requestId, null);
break;
}
case "RIL:CardLockRetryCount": {
let requestId = data.requestId;
let callback = this._requestMap[requestId];
delete this._requestMap[requestId];
let requestWindow = this._windowsMap[requestId];
delete this._windowsMap[requestId];
if (data.errorMsg) {
callback.notifyError(data.errorMsg);
this.fireRequestError(data.requestId, data.errorMsg);
break;
}
callback.notifyGetCardLockRetryCount(data.retryCount);
this.fireRequestSuccess(data.requestId,
Cu.cloneInto({ retryCount: data.retryCount },
requestWindow));
break;
}
case "RIL:StkCommand":
@ -645,30 +801,12 @@ RILContentHelper.prototype = {
case "RIL:UpdateIccContact":
this.handleUpdateIccContact(data);
break;
case "RIL:MatchMvno": {
let requestId = data.requestId;
let callback = this._requestMap[requestId];
delete this._requestMap[requestId];
if (data.errorMsg) {
callback.notifyError(data.errorMsg);
break;
}
callback.notifySuccessWithBoolean(data.result);
case "RIL:MatchMvno":
this.handleSimpleRequest(data.requestId, data.errorMsg, data.result);
break;
}
case "RIL:GetServiceState": {
let requestId = data.requestId;
let callback = this._requestMap[requestId];
delete this._requestMap[requestId];
if (data.errorMsg) {
callback.notifyError(data.errorMsg);
break;
}
callback.notifySuccessWithBoolean(data.result);
case "RIL:GetServiceState":
this.handleGetServiceState(data);
break;
}
}
},
@ -771,6 +909,20 @@ RILContentHelper.prototype = {
this.fireRequestSuccess(message.requestId, contact);
},
handleGetServiceState: function(message) {
let requestId = message.requestId;
let requestWindow = this._windowsMap[requestId];
delete this._windowsMap[requestId];
let resolver = this.takePromiseResolver(requestId);
if (message.errorMsg) {
resolver.reject(new requestWindow.DOMError(message.errorMsg));
return;
}
resolver.resolve(message.result);
},
_deliverEvent: function(clientId, listenerType, name, args) {
if (!this[listenerType]) {
return;
@ -795,235 +947,6 @@ RILContentHelper.prototype = {
if (DEBUG) debug("listener for " + name + " threw an exception: " + e);
}
}
},
/**
* nsIIccService interface.
*/
_iccs: null, // An array of Icc instances.
getIccByServiceId: function(serviceId) {
let icc = this._iccs[serviceId];
if (!icc) {
throw Cr.NS_ERROR_UNEXPECTED;
}
return icc;
},
/**
* Bridge APIs from nsIIccService to nsIIccProvider
*/
_deliverIccEvent: function(clientId, name, args) {
let icc = this._iccs[clientId];
if (!icc) {
if (DEBUG) debug("_deliverIccEvent: Invalid clientId: " + clientId);
return;
}
icc.deliverListenerEvent(name, args);
},
getIccInfo: function(clientId) {
let context = this.getRilContext(clientId);
return context && context.iccInfo;
},
getCardState: function(clientId) {
let context = this.getRilContext(clientId);
return context && context.cardState;
},
matchMvno: function(clientId, mvnoType, mvnoData, callback) {
let requestId = UUIDGenerator.generateUUID().toString();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("RIL:MatchMvno", {
clientId: clientId,
data: {
requestId: requestId,
mvnoType: mvnoType,
mvnoData: mvnoData
}
});
},
getCardLockEnabled: function(clientId, lockType, callback) {
let requestId = UUIDGenerator.generateUUID().toString();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("RIL:GetCardLockEnabled", {
clientId: clientId,
data: {
lockType: lockType,
requestId: requestId
}
});
},
unlockCardLock: function(clientId, lockType, password, newPin, callback) {
let requestId = UUIDGenerator.generateUUID().toString();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("RIL:UnlockCardLock", {
clientId: clientId,
data: {
lockType: lockType,
password: password,
newPin: newPin,
requestId: requestId
}
});
},
setCardLockEnabled: function(clientId, lockType, password, enabled, callback) {
let requestId = UUIDGenerator.generateUUID().toString();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("RIL:SetCardLockEnabled", {
clientId: clientId,
data: {
lockType: lockType,
password: password,
enabled: enabled,
requestId: requestId
}
});
},
changeCardLockPassword: function(clientId, lockType, password, newPassword,
callback) {
let requestId = UUIDGenerator.generateUUID().toString();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("RIL:ChangeCardLockPassword", {
clientId: clientId,
data: {
lockType: lockType,
password: password,
newPassword: newPassword,
requestId: requestId
}
});
},
getCardLockRetryCount: function(clientId, lockType, callback) {
let requestId = UUIDGenerator.generateUUID().toString();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("RIL:GetCardLockRetryCount", {
clientId: clientId,
data: {
lockType: lockType,
requestId: requestId
}
});
},
getServiceStateEnabled: function(clientId, service, callback) {
let requestId = UUIDGenerator.generateUUID().toString();
this._requestMap[requestId] = callback;
cpmm.sendAsyncMessage("RIL:GetServiceState", {
clientId: clientId,
data: {
requestId: requestId,
service: service
}
});
}
};
function Icc(aIccProvider, aClientId) {
this._iccProvider = aIccProvider;
this._clientId = aClientId;
this._listeners = [];
}
Icc.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIIcc]),
_iccProvider: null,
_clientId: -1,
_listeners: null,
deliverListenerEvent: function(aName, aArgs) {
let listeners = this._listeners.slice();
for (let listener of listeners) {
if (this._listeners.indexOf(listener) === -1) {
continue;
}
let handler = listener[aName];
if (typeof handler != "function") {
throw new Error("No handler for " + aName);
}
try {
handler.apply(listener, aArgs);
} catch (e) {
if (DEBUG) {
debug("listener for " + aName + " threw an exception: " + e);
}
}
}
},
/**
* nsIIcc interface.
*/
registerListener: function(aListener) {
if (this._listeners.indexOf(aListener) >= 0) {
throw Cr.NS_ERROR_UNEXPECTED;
}
this._listeners.push(aListener);
cpmm.sendAsyncMessage("RIL:RegisterIccMsg");
},
unregisterListener: function(aListener) {
let index = this._listeners.indexOf(aListener);
if (index >= 0) {
this._listeners.splice(index, 1);
}
},
get iccInfo() {
return this._iccProvider.getIccInfo(this._clientId);
},
get cardState() {
return this._iccProvider.getCardState(this._clientId);
},
getCardLockEnabled: function(aLockType, aCallback) {
this._iccProvider.getCardLockEnabled(this._clientId, aLockType, aCallback);
},
unlockCardLock: function(aLockType, aPassword, aNewPin, aCallback) {
this._iccProvider.unlockCardLock(this._clientId, aLockType,
aPassword, aNewPin, aCallback);
},
setCardLockEnabled: function(aLockType, aPassword, aEnabled, aCallback) {
this._iccProvider.setCardLockEnabled(this._clientId, aLockType,
aPassword, aEnabled, aCallback);
},
changeCardLockPassword: function(aLockType, aPassword, aNewPassword, aCallback) {
this._iccProvider.changeCardLockPassword(this._clientId, aLockType,
aPassword, aNewPassword, aCallback);
},
getCardLockRetryCount: function(aLockType, aCallback) {
this._iccProvider.getCardLockRetryCount(this._clientId, aLockType, aCallback);
},
matchMvno: function(aMvnoType, aMvnoData, aCallback) {
this._iccProvider.matchMvno(this._clientId, aMvnoType, aMvnoData, aCallback);
},
getServiceStateEnabled: function(aService, aCallback) {
this._iccProvider.getServiceStateEnabled(this._clientId, aService, aCallback);
}
};

View File

@ -13,8 +13,6 @@
# limitations under the License.
# RILContentHelper.js
# TODO: Bug 815526, deprecate RILContentHelper:
# To be removed from b2g/installer/package-manifest.in as well.
component {472816e1-1fd6-4405-996c-806f9ea68174} RILContentHelper.js
contract @mozilla.org/ril/content-helper;1 {472816e1-1fd6-4405-996c-806f9ea68174}
category profile-after-change RILContentHelper @mozilla.org/ril/content-helper;1

View File

@ -87,7 +87,6 @@ const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL
const NETWORK_TYPE_MOBILE_IMS = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS;
const NETWORK_TYPE_MOBILE_DUN = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN;
// TODO: Bug 815526, deprecate RILContentHelper.
const RIL_IPC_ICCMANAGER_MSG_NAMES = [
"RIL:GetRilContext",
"RIL:SendStkResponse",
@ -128,10 +127,6 @@ function debug(s) {
dump("-*- RadioInterfaceLayer: " + s + "\n");
}
XPCOMUtils.defineLazyServiceGetter(this, "gIccService",
"@mozilla.org/icc/gonkiccservice;1",
"nsIGonkIccService");
XPCOMUtils.defineLazyServiceGetter(this, "gMobileMessageService",
"@mozilla.org/mobilemessage/mobilemessageservice;1",
"nsIMobileMessageService");
@ -182,7 +177,6 @@ XPCOMUtils.defineLazyGetter(this, "gStkCmdFactory", function() {
return stk.StkProactiveCmdFactory;
});
// TODO: Bug 815526, deprecate RILContentHelper.
XPCOMUtils.defineLazyGetter(this, "gMessageManager", function() {
return {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIMessageListener,
@ -892,8 +886,8 @@ IccInfo.prototype = {
mcc: null,
mnc: null,
spn: null,
isDisplayNetworkNameRequired: false,
isDisplaySpnRequired: false
isDisplayNetworkNameRequired: null,
isDisplaySpnRequired: null
};
function GsmIccInfo() {}
@ -1429,7 +1423,7 @@ function RadioInterfaceLayer() {
Services.obs.addObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
Services.prefs.addObserver(kPrefRilDebuggingEnabled, this, false);
gMessageManager.init(this); // TODO: Bug 815526, deprecate RILContentHelper.
gMessageManager.init(this);
gRadioEnabledController.init(this);
gDataConnectionManager.init(this);
}
@ -1441,7 +1435,6 @@ RadioInterfaceLayer.prototype = {
interfaces: [Ci.nsIRadioInterfaceLayer]}),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIRadioInterfaceLayer,
Ci.nsIRadioInterfaceLayer_new, // TODO: Bug 815526, deprecate RILContentHelper.
Ci.nsIObserver]),
/**
@ -1683,14 +1676,13 @@ function RadioInterface(aClientId, aWorkerMessenger) {
this.clientId = aClientId;
this.workerMessenger = {
send: aWorkerMessenger.send.bind(aWorkerMessenger, aClientId),
// TODO: Bug 815526, deprecate RILContentHelper.
sendWithIPCMessage:
aWorkerMessenger.sendWithIPCMessage.bind(aWorkerMessenger, aClientId),
};
aWorkerMessenger.registerClient(aClientId, this);
this.rilContext = {
cardState: Ci.nsIIcc.CARD_STATE_UNKNOWN,
cardState: Ci.nsIIccProvider.CARD_STATE_UNKNOWN,
iccInfo: null,
imsi: null
};
@ -1788,14 +1780,12 @@ RadioInterface.prototype = {
isCardPresent: function() {
let cardState = this.rilContext.cardState;
return cardState !== Ci.nsIIcc.CARD_STATE_UNDETECTED &&
cardState !== Ci.nsIIcc.CARD_STATE_UNKNOWN;
return cardState !== Ci.nsIIccProvider.CARD_STATE_UNDETECTED &&
cardState !== Ci.nsIIccProvider.CARD_STATE_UNKNOWN;
},
/**
* Process a message from the content process.
*
* TODO: Bug 815526, deprecate RILContentHelper
*/
receiveMessage: function(msg) {
switch (msg.name) {
@ -1935,9 +1925,6 @@ RadioInterface.prototype = {
case "cardstatechange":
this.rilContext.cardState = message.cardState;
gRadioEnabledController.receiveCardState(this.clientId);
gIccService.notifyCardStateChanged(this.clientId,
this.rilContext.cardState);
// TODO: Bug 815526, deprecate RILContentHelper.
gMessageManager.sendIccMessage("RIL:CardStateChanged",
this.clientId, message);
break;
@ -1955,7 +1942,6 @@ RadioInterface.prototype = {
break;
case "iccimsi":
this.rilContext.imsi = message.imsi;
gIccService.notifyImsiChanged(this.clientId, this.rilContext.imsi);
break;
case "iccmbdn":
this.handleIccMbdn(message);
@ -1967,7 +1953,6 @@ RadioInterface.prototype = {
this.handleStkProactiveCommand(message);
break;
case "stksessionend":
// TODO: Bug 815526, deprecate RILContentHelper.
gMessageManager.sendIccMessage("RIL:StkSessionEnd", this.clientId, null);
break;
case "cdma-info-rec-received":
@ -1983,7 +1968,6 @@ RadioInterface.prototype = {
// and not compared. E.g., if the mvnoData passed is '310260x10xxxxxx',
// then the function returns true only if imsi has the same first 6 digits,
// 8th and 9th digit.
// TODO: Bug 815526, deprecate RILContentHelper.
isImsiMatches: function(mvnoData) {
let imsi = this.rilContext.imsi;
@ -2001,7 +1985,6 @@ RadioInterface.prototype = {
return true;
},
// TODO: Bug 815526, deprecate RILContentHelper.
matchMvno: function(target, message) {
if (DEBUG) this.debug("matchMvno: " + JSON.stringify(message));
@ -2239,8 +2222,6 @@ RadioInterface.prototype = {
handleIccInfoChange: function(message) {
let oldSpn = this.rilContext.iccInfo ? this.rilContext.iccInfo.spn : null;
// TODO: Bug 815526, deprecate RILContentHelper:
// Move the logic of updating iccInfo to IccService.js.
if (!message || !message.iccid) {
// If iccInfo is already `null`, don't have to clear it and send
// RIL:IccInfoChanged.
@ -2270,11 +2251,17 @@ RadioInterface.prototype = {
// RIL:IccInfoChanged corresponds to a DOM event that gets fired only
// when iccInfo has changed.
// TODO: Bug 815526, deprecate RILContentHelper.
gMessageManager.sendIccMessage("RIL:IccInfoChanged",
this.clientId,
message.iccid ? message : null);
gIccService.notifyIccInfoChanged(this.clientId, this.rilContext.iccInfo);
// Update lastKnownSimMcc.
if (message.mcc) {
try {
Services.prefs.setCharPref("ril.lastKnownSimMcc",
message.mcc.toString());
} catch (e) {}
}
// Update lastKnownHomeNetwork.
if (message.mcc && message.mnc) {
@ -2302,7 +2289,6 @@ RadioInterface.prototype = {
.notifyStkProactiveCommand(iccId,
gStkCmdFactory.createCommand(message));
}
// TODO: Bug 815526, deprecate RILContentHelper.
gMessageManager.sendIccMessage("RIL:StkCommand", this.clientId, message);
},

View File

@ -43,7 +43,9 @@ const TOPIC_INTERFACE_REGISTERED = "network-interface-registered";
const TOPIC_INTERFACE_UNREGISTERED = "network-interface-unregistered";
const TOPIC_MOZSETTINGS_CHANGED = "mozsettings-changed";
const TOPIC_CONNECTION_STATE_CHANGED = "network-connection-state-changed";
const TOPIC_PREF_CHANGED = "nsPref:changed";
const TOPIC_XPCOM_SHUTDOWN = "xpcom-shutdown";
const PREF_NETWORK_DEBUG_ENABLED = "network.debugging.enabled";
const POSSIBLE_USB_INTERFACE_NAME = "rndis0,usb0";
const DEFAULT_USB_INTERFACE_NAME = "rndis0";
@ -103,21 +105,22 @@ const MOBILE_DUN_CONNECT_TIMEOUT = 30000;
const MOBILE_DUN_RETRY_INTERVAL = 5000;
const MOBILE_DUN_MAX_RETRIES = 5;
let DEBUG = false;
// Read debug setting from pref.
try {
let debugPref = Services.prefs.getBoolPref("network.debugging.enabled");
DEBUG = DEBUG || debugPref;
} catch (e) {}
let debug;
if (DEBUG) {
debug = function(s) {
dump("-*- TetheringService: " + s + "\n");
};
} else {
debug = function(s) {};
function updateDebug() {
let debugPref = false; // set default value here.
try {
debugPref = debugPref || Services.prefs.getBoolPref(PREF_NETWORK_DEBUG_ENABLED);
} catch (e) {}
if (debugPref) {
debug = function(s) {
dump("-*- TetheringService: " + s + "\n");
};
} else {
debug = function(s) {};
}
}
updateDebug();
function TetheringService() {
Services.obs.addObserver(this, TOPIC_XPCOM_SHUTDOWN, false);
@ -125,6 +128,7 @@ function TetheringService() {
Services.obs.addObserver(this, TOPIC_CONNECTION_STATE_CHANGED, false);
Services.obs.addObserver(this, TOPIC_INTERFACE_REGISTERED, false);
Services.obs.addObserver(this, TOPIC_INTERFACE_UNREGISTERED, false);
Services.prefs.addObserver(PREF_NETWORK_DEBUG_ENABLED, this, false);
this._dataDefaultServiceId = 0;
@ -236,6 +240,11 @@ TetheringService.prototype = {
let network;
switch(aTopic) {
case TOPIC_PREF_CHANGED:
if (aData === PREF_NETWORK_DEBUG_ENABLED) {
updateDebug();
}
break;
case TOPIC_MOZSETTINGS_CHANGED:
if ("wrappedJSObject" in aSubject) {
aSubject = aSubject.wrappedJSObject;
@ -270,6 +279,7 @@ TetheringService.prototype = {
Services.obs.removeObserver(this, TOPIC_CONNECTION_STATE_CHANGED);
Services.obs.removeObserver(this, TOPIC_INTERFACE_REGISTERED);
Services.obs.removeObserver(this, TOPIC_INTERFACE_UNREGISTERED);
Services.prefs.removeObserver(PREF_NETWORK_DEBUG_ENABLED, this);
this.dunConnectTimer.cancel();
this.dunRetryTimer.cancel();

View File

@ -89,8 +89,8 @@ if CONFIG['MOZ_B2G_RIL']:
'nsIRadioInterfaceLayer.idl',
]
EXTRA_COMPONENTS += [
'RILContentHelper.js', # TODO: Bug 815526, deprecate RILContentHelper.
'RILContentHelper.manifest', # TODO: Bug 815526, deprecate RILContentHelper.
'RILContentHelper.js',
'RILContentHelper.manifest',
'RILSystemMessengerHelper.js',
'RILSystemMessengerHelper.manifest',
]

View File

@ -25,7 +25,7 @@ interface nsIRilNetworkInterface : nsINetworkInterface
interface nsIRilContext : nsISupports
{
/**
* One of the nsIIcc.CARD_STATE_* values.
* One of the nsIIccProvider.CARD_STATE_* values.
*/
readonly attribute unsigned long cardState;
@ -79,13 +79,3 @@ interface nsIRadioInterfaceLayer : nsISupports
void setMicrophoneMuted(in boolean muted);
};
/**
* Helper Interface to define new APIs of nsIRadioInterfaceLayer during
* ril-interfaces frozen phase.
*/
[scriptable, uuid(f8ec63da-c22e-11e4-89f3-b767dae42a13)]
interface nsIRadioInterfaceLayer_new : nsIRadioInterfaceLayer
{
};

View File

@ -2557,7 +2557,7 @@ this.GECKO_RADIOSTATE_DISABLED = 1;
// Only used in ril_worker.js
this.GECKO_CARDSTATE_UNINITIALIZED = 4294967294; // UINT32_MAX - 1
// See nsIIcc::CARD_STATE_*
// See nsIIccProvider::CARD_STATE_*
this.GECKO_CARDSTATE_UNDETECTED = 4294967295; // UINT32_MAX
this.GECKO_CARDSTATE_UNKNOWN = 0;
this.GECKO_CARDSTATE_READY = 1;
@ -2590,7 +2590,7 @@ this.GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED = 27;
this.GECKO_CARDSTATE_RUIM_PUK_REQUIRED = 28;
this.GECKO_CARDSTATE_ILLEGAL = 29;
// See nsIIcc::CARD_LOCK_TYPE_*
// See nsIIccProvider::CARD_LOCK_TYPE_*
this.GECKO_CARDLOCK_PIN = 0;
this.GECKO_CARDLOCK_PIN2 = 1;
this.GECKO_CARDLOCK_PUK = 2;
@ -2633,17 +2633,17 @@ GECKO_CARDLOCK_TO_SEL_CODE[GECKO_CARDLOCK_SPCK] = ICC_SEL_CODE_PH_SP_PIN;
// TODO: Bug 1116072: identify the mapping between RIL_PERSOSUBSTATE_SIM_SIM @
// ril.h and TS 27.007, clause 8.65 for GECKO_CARDLOCK_PCK.
// See nsIIcc::CARD_CONTACT_TYPE_*
// See nsIIccProvider::CARD_CONTACT_TYPE_*
this.GECKO_CARDCONTACT_TYPE_ADN = 0;
this.GECKO_CARDCONTACT_TYPE_FDN = 1;
this.GECKO_CARDCONTACT_TYPE_SDN = 2;
// See nsIIcc::CARD_MVNO_TYPE_*
// See nsIIccProvider::CARD_MVNO_TYPE_*
this.GECKO_CARDMVNO_TYPE_IMSI = 0;
this.GECKO_CARDMVNO_TYPE_SPN = 1;
this.GECKO_CARDMVNO_TYPE_GID = 2;
// See nsIIcc::CARD_SERVICE_*
// See nsIIccProvider::CARD_MVNO_TYPE_*
this.GECKO_CARDSERVICE_FDN = 0;
// See ril.h RIL_PersoSubstate

View File

@ -2,7 +2,7 @@
The test performs the static code analysis check by JSHint.
Target js files:
- RILContentHelper.js TODO: Bug 815526, deprecate RILContentHelper.
- RILContentHelper.js
- RadioInterfaceLayer.js
- ril_worker.js
- ril_consts.js
@ -100,7 +100,7 @@ class ResourceUriFileReader:
URI_PREFIX = 'resource://gre/'
URI_PATH = {
'RILContentHelper.js': 'components/RILContentHelper.js', #TODO: Bug 815526, deprecate RILContentHelper.
'RILContentHelper.js': 'components/RILContentHelper.js',
'RadioInterfaceLayer.js': 'components/RadioInterfaceLayer.js',
'ril_worker.js': 'modules/ril_worker.js',
'ril_consts.js': 'modules/ril_consts.js',
@ -354,7 +354,6 @@ class TestRILCodeQuality(MarionetteTestCase):
def tearDown(self):
MarionetteTestCase.tearDown(self)
# TODO: Bug 815526, deprecate RILContentHelper.
def test_RILContentHelper(self):
self._check('RILContentHelper.js')

View File

@ -33,65 +33,65 @@ add_test(function test_personalization_state() {
// Test GSM personalization state.
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK,
Ci.nsIIcc.CARD_STATE_NETWORK_LOCKED);
Ci.nsIIccProvider.CARD_STATE_NETWORK_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK_SUBSET,
Ci.nsIIcc.CARD_STATE_NETWORK_SUBSET_LOCKED);
Ci.nsIIccProvider.CARD_STATE_NETWORK_SUBSET_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_CORPORATE,
Ci.nsIIcc.CARD_STATE_CORPORATE_LOCKED);
Ci.nsIIccProvider.CARD_STATE_CORPORATE_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SERVICE_PROVIDER,
Ci.nsIIcc.CARD_STATE_SERVICE_PROVIDER_LOCKED);
Ci.nsIIccProvider.CARD_STATE_SERVICE_PROVIDER_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SIM,
Ci.nsIIcc.CARD_STATE_SIM_LOCKED);
Ci.nsIIccProvider.CARD_STATE_SIM_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK_PUK,
Ci.nsIIcc.CARD_STATE_NETWORK_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_NETWORK_PUK_REQUIRED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK,
Ci.nsIIcc.CARD_STATE_NETWORK_SUBSET_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_NETWORK_SUBSET_PUK_REQUIRED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_CORPORATE_PUK,
Ci.nsIIcc.CARD_STATE_CORPORATE_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_CORPORATE_PUK_REQUIRED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK,
Ci.nsIIcc.CARD_STATE_SERVICE_PROVIDER_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_SERVICE_PROVIDER_PUK_REQUIRED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SIM_PUK,
Ci.nsIIcc.CARD_STATE_SIM_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_SIM_PUK_REQUIRED);
testPersonalization(false, CARD_PERSOSUBSTATE_UNKNOWN,
Ci.nsIIcc.CARD_STATE_UNKNOWN);
Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
testPersonalization(false, CARD_PERSOSUBSTATE_IN_PROGRESS,
Ci.nsIIcc.CARD_STATE_PERSONALIZATION_IN_PROGRESS);
Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_IN_PROGRESS);
testPersonalization(false, CARD_PERSOSUBSTATE_READY,
Ci.nsIIcc.CARD_STATE_PERSONALIZATION_READY);
Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_READY);
// Test CDMA personalization state.
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK1,
Ci.nsIIcc.CARD_STATE_NETWORK1_LOCKED);
Ci.nsIIccProvider.CARD_STATE_NETWORK1_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK2,
Ci.nsIIcc.CARD_STATE_NETWORK2_LOCKED);
Ci.nsIIccProvider.CARD_STATE_NETWORK2_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_HRPD,
Ci.nsIIcc.CARD_STATE_HRPD_NETWORK_LOCKED);
Ci.nsIIccProvider.CARD_STATE_HRPD_NETWORK_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_CORPORATE,
Ci.nsIIcc.CARD_STATE_RUIM_CORPORATE_LOCKED);
Ci.nsIIccProvider.CARD_STATE_RUIM_CORPORATE_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER,
Ci.nsIIcc.CARD_STATE_RUIM_SERVICE_PROVIDER_LOCKED);
Ci.nsIIccProvider.CARD_STATE_RUIM_SERVICE_PROVIDER_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_RUIM,
Ci.nsIIcc.CARD_STATE_RUIM_LOCKED);
Ci.nsIIccProvider.CARD_STATE_RUIM_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK1_PUK,
Ci.nsIIcc.CARD_STATE_NETWORK1_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_NETWORK1_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK2_PUK,
Ci.nsIIcc.CARD_STATE_NETWORK2_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_NETWORK2_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_HRPD_PUK,
Ci.nsIIcc.CARD_STATE_HRPD_NETWORK_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_HRPD_NETWORK_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_CORPORATE_PUK,
Ci.nsIIcc.CARD_STATE_RUIM_CORPORATE_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_RUIM_CORPORATE_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK,
Ci.nsIIcc.CARD_STATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_RUIM_PUK,
Ci.nsIIcc.CARD_STATE_RUIM_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_RUIM_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_UNKNOWN,
Ci.nsIIcc.CARD_STATE_UNKNOWN);
Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
testPersonalization(true, CARD_PERSOSUBSTATE_IN_PROGRESS,
Ci.nsIIcc.CARD_STATE_PERSONALIZATION_IN_PROGRESS);
Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_IN_PROGRESS);
testPersonalization(true, CARD_PERSOSUBSTATE_READY,
Ci.nsIIcc.CARD_STATE_PERSONALIZATION_READY);
Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_READY);
run_next_test();
});
@ -121,17 +121,17 @@ add_test(function test_card_app_state() {
}
testCardAppState(CARD_APPSTATE_ILLEGAL,
Ci.nsIIcc.CARD_STATE_ILLEGAL);
Ci.nsIIccProvider.CARD_STATE_ILLEGAL);
testCardAppState(CARD_APPSTATE_PIN,
Ci.nsIIcc.CARD_STATE_PIN_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_PIN_REQUIRED);
testCardAppState(CARD_APPSTATE_PUK,
Ci.nsIIcc.CARD_STATE_PUK_REQUIRED);
Ci.nsIIccProvider.CARD_STATE_PUK_REQUIRED);
testCardAppState(CARD_APPSTATE_READY,
Ci.nsIIcc.CARD_STATE_READY);
Ci.nsIIccProvider.CARD_STATE_READY);
testCardAppState(CARD_APPSTATE_UNKNOWN,
Ci.nsIIcc.CARD_STATE_UNKNOWN);
Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
testCardAppState(CARD_APPSTATE_DETECTED,
Ci.nsIIcc.CARD_STATE_UNKNOWN);
Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
run_next_test();
});
@ -159,7 +159,7 @@ add_test(function test_icc_permanent_blocked() {
};
ril._processICCStatus(iccStatus);
equal(ril.cardState, Ci.nsIIcc.CARD_STATE_PERMANENT_BLOCKED);
equal(ril.cardState, Ci.nsIIccProvider.CARD_STATE_PERMANENT_BLOCKED);
}
testPermanentBlocked(1,

View File

@ -129,16 +129,6 @@ dictionary IccSetCardLockOptions
// Necessary for lock types: "pin", "fdn"
};
dictionary IccCardLockStatus
{
boolean enabled; // True when CardLock is enabled.
};
dictionary IccCardLockRetryCount
{
long retryCount; // The number of remaining retries. -1 if unkown.
};
[Pref="dom.icc.enabled",
CheckPermissions="mobileconnection",
AvailableIn="CertifiedApps"]
@ -257,7 +247,6 @@ interface MozIcc : EventTarget
* The request's result will be an object containing
* information about the specified lock's status.
* e.g. {enabled: true}.
* @see IccCardLockStatus.
*/
[Throws]
DOMRequest getCardLock(IccLockType lockType);
@ -300,8 +289,8 @@ interface MozIcc : EventTarget
*
* @return a DOMRequest.
* The request's result will be an object containing the number of
* remaining retries. e.g. {retryCount: 3}.
* @see IccCardLockRetryCount.
* remaining retries.
* e.g. {retryCount: 3}.
*/
[Throws]
DOMRequest getCardLockRetryCount(IccLockType lockType);

View File

@ -229,7 +229,6 @@ WEBIDL_FILES = [
'HTMLTrackElement.webidl',
'HTMLUListElement.webidl',
'HTMLVideoElement.webidl',
'IccCardLockError.webidl',
'IDBCursor.webidl',
'IDBDatabase.webidl',
'IDBEnvironment.webidl',
@ -288,9 +287,6 @@ WEBIDL_FILES = [
'MozActivity.webidl',
'MozCellBroadcast.webidl',
'MozCellBroadcastMessage.webidl',
'MozIcc.webidl',
'MozIccInfo.webidl',
'MozIccManager.webidl',
'MozMmsMessage.webidl',
'MozMobileCellInfo.webidl',
'MozMobileConnection.webidl',
@ -652,6 +648,14 @@ if CONFIG['MOZ_B2G_BT']:
'BluetoothManager.webidl',
]
if CONFIG['MOZ_B2G_RIL']:
WEBIDL_FILES += [
'IccCardLockError.webidl',
'MozIcc.webidl',
'MozIccInfo.webidl',
'MozIccManager.webidl',
]
if CONFIG['MOZ_NFC']:
WEBIDL_FILES += [
'MozIsoDepTech.webidl',

View File

@ -450,6 +450,57 @@ let gTestSuite = (function() {
.then(event => event.target.result);
}
/**
* Import a certificate with nickname and password.
*
* Resolve when we import certificate successfully; reject when any error
* occurs.
*
* Fulfill params: An object of certificate information.
* Reject params: (none)
*
* @return A deferred promise.
*/
function importCert(certBlob, password, nickname) {
let request = wifiManager.importCert(certBlob, password, nickname);
return wrapDomRequestAsPromise(request)
.then(event => event.target.result);
}
/**
* Delete certificate of nickname.
*
* Resolve when we delete certificate successfully; reject when any error
* occurs.
*
* Fulfill params: (none)
* Reject params: (none)
*
* @return A deferred promise.
*/
function deleteCert(nickname) {
let request = wifiManager.deleteCert(nickname);
return wrapDomRequestAsPromise(request)
.then(event => event.target.result);
}
/**
* Get list of imported certificates.
*
* Resolve when we get certificate list successfully; reject when any error
* occurs.
*
* Fulfill params: Nickname of imported certificate arranged by usage.
* Reject params: (none)
*
* @return A deferred promise.
*/
function getImportedCerts() {
let request = wifiManager.getImportedCerts();
return wrapDomRequestAsPromise(request)
.then(event => event.target.result);
}
/**
* Request wifi scan and verify the scan result as well.
*
@ -1188,6 +1239,9 @@ let gTestSuite = (function() {
suite.waitForTimeout = waitForTimeout;
suite.waitForRilDataConnected = waitForRilDataConnected;
suite.requestTetheringEnabled = requestTetheringEnabled;
suite.importCert = importCert;
suite.getImportedCerts = getImportedCerts;
suite.deleteCert = deleteCert;
/**
* Common test routine.
@ -1288,5 +1342,61 @@ let gTestSuite = (function() {
});
};
/**
* Run test with imported certificate.
*
* Certificate will be imported and confirmed before running test, and be
* deleted after running test.
*
* Fulfill params: (none)
*
* @param certBlob
* Certificate content as Blob.
* @param password
* Password for importing certificate, only used for importing PKCS#12.
* @param nickanem
* Nickname for imported certificate.
* @param usage
* Expected usage of imported certificate.
* @param aTestCaseChain
* The test case entry point, which can be a function or a promise.
*
* @return A deferred promise.
*/
suite.doTestWithCertificate = function(certBlob, password, nickname, usage, aTestCaseChain) {
return suite.doTest(function() {
return ensureWifiEnabled(true)
// Import test certificate.
.then(() => importCert(certBlob, password, nickname))
.then(function(info) {
// Check import result.
is(info.nickname, nickname, "Imported nickname");
for (let i = 0; i < usage.length; i++) {
isnot(info.usage.indexOf(usage[i]), -1, "Usage " + usage[i]);
}
})
// Get imported certificate list.
.then(getImportedCerts)
// Check if certificate exists in imported certificate list.
.then(function(list) {
for (let i = 0; i < usage.length; i++) {
isnot(list[usage[i]].indexOf(nickname), -1,
"Certificate \"" + nickname + "\" of usage " + usage[i] + " is imported");
}
})
// Run test case.
.then(aTestCaseChain)
// Delete imported certificates.
.then(() => deleteCert(nickname))
// Check if certificate doesn't exist in imported certificate list.
.then(getImportedCerts)
.then(function(list) {
for (let i = 0; i < usage.length; i++) {
is(list[usage[i]].indexOf(nickname), -1, "Certificate is deleted");
}
})
});
};
return suite;
})();

View File

@ -11,4 +11,7 @@ qemu = true
[test_wifi_tethering_wifi_disabled.js]
[test_wifi_tethering_wifi_inactive.js]
[test_wifi_tethering_wifi_active.js]
[test_wifi_manage_server_certificate.js]
[test_wifi_manage_user_certificate.js]
[test_wifi_manage_pkcs12_certificate.js]
[test_wifi_enable_api.js]

View File

@ -0,0 +1,338 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
// Binary form of test certificate.
var testCertInfo = {
nickname: 'Test Certificate',
password: '12345678',
usage: ['UserCert', 'ServerCert'],
blob: [0x30, 0x82, 0x09, 0xF1, 0x02, 0x01, 0x03, 0x30,
0x82, 0x09, 0xB7, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82,
0x09, 0xA8, 0x04, 0x82, 0x09, 0xA4, 0x30, 0x82,
0x09, 0xA0, 0x30, 0x82, 0x06, 0x9F, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07,
0x06, 0xA0, 0x82, 0x06, 0x90, 0x30, 0x82, 0x06,
0x8C, 0x02, 0x01, 0x00, 0x30, 0x82, 0x06, 0x85,
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x0A, 0x2A,
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01,
0x06, 0x30, 0x0E, 0x04, 0x08, 0x13, 0xB5, 0x2F,
0x5A, 0xB9, 0x49, 0xE6, 0x0B, 0x02, 0x02, 0x08,
0x00, 0x80, 0x82, 0x06, 0x58, 0x35, 0x77, 0x6B,
0xBF, 0x5C, 0x06, 0x09, 0xD8, 0xF0, 0x36, 0x06,
0x69, 0x8D, 0xA2, 0x86, 0xCF, 0x6B, 0x73, 0x86,
0x14, 0xFA, 0x51, 0x9A, 0x87, 0x73, 0x29, 0x71,
0xC5, 0xB1, 0x4F, 0xFB, 0xEC, 0x64, 0x84, 0x20,
0xFC, 0x06, 0x4A, 0x93, 0x74, 0x01, 0xFB, 0xEB,
0x1F, 0xDC, 0xF8, 0xF7, 0xBB, 0xDC, 0x42, 0xA1,
0x4A, 0x71, 0xDE, 0x08, 0x33, 0x7A, 0xCA, 0xD3,
0xD8, 0x40, 0x24, 0x47, 0xAE, 0x41, 0x42, 0x8E,
0xC8, 0x4E, 0xBE, 0x8B, 0xB3, 0xE5, 0x77, 0xAC,
0xBD, 0x98, 0x0C, 0x0E, 0x53, 0xBE, 0x38, 0xB7,
0xEA, 0xD2, 0x29, 0x35, 0xD2, 0xC4, 0xF4, 0xC7,
0xD8, 0xB1, 0x73, 0x2A, 0x13, 0x11, 0x65, 0xF7,
0x0C, 0x8B, 0xC0, 0x43, 0xFB, 0x31, 0x6C, 0xD2,
0xE4, 0x43, 0x85, 0x51, 0x16, 0xBF, 0x35, 0xB5,
0x05, 0x6B, 0x86, 0x11, 0xEA, 0x78, 0x64, 0x9F,
0x42, 0x29, 0xB9, 0x79, 0xAF, 0xB0, 0x7C, 0xBF,
0xC0, 0x89, 0xAD, 0xC7, 0x37, 0xD2, 0x30, 0x8C,
0xDC, 0xF6, 0x77, 0x5E, 0x1F, 0x26, 0x28, 0x8F,
0xAC, 0x19, 0x6C, 0xA0, 0x15, 0xC7, 0x12, 0xA3,
0x0A, 0xD5, 0xC6, 0x15, 0x60, 0x58, 0x16, 0xB8,
0x30, 0x12, 0x3C, 0x78, 0x3C, 0x93, 0x23, 0xA1,
0x56, 0x75, 0x0B, 0x77, 0xAA, 0x0B, 0x0B, 0x2B,
0x91, 0xB6, 0x41, 0xAB, 0xF5, 0x09, 0x4C, 0x1E,
0x36, 0xC0, 0x88, 0xC3, 0x08, 0xF2, 0x65, 0xCB,
0x58, 0x8F, 0x94, 0xB4, 0xB4, 0x05, 0xCC, 0x44,
0x49, 0x73, 0x1B, 0x25, 0x6F, 0x5D, 0x83, 0xBD,
0xF0, 0x70, 0xD0, 0xE8, 0x0D, 0x18, 0x2E, 0x44,
0xD7, 0x89, 0x64, 0x6A, 0xED, 0x23, 0x30, 0xDF,
0xAD, 0x84, 0x3B, 0x74, 0x2C, 0x0D, 0x2B, 0x51,
0x84, 0xA2, 0xA4, 0x9E, 0x42, 0xC3, 0x81, 0x69,
0xFA, 0x56, 0x76, 0x9F, 0xD9, 0x02, 0x64, 0x04,
0xFE, 0xF0, 0xD9, 0x01, 0xBC, 0xE2, 0xC9, 0xDD,
0x88, 0xAC, 0xFA, 0x24, 0x7E, 0xB1, 0xF8, 0x39,
0x27, 0xA2, 0xEB, 0xE4, 0x53, 0xC1, 0xF3, 0xFE,
0x2D, 0x9A, 0x49, 0x73, 0xFF, 0x7C, 0x8E, 0x39,
0xF7, 0x15, 0x27, 0xB3, 0x47, 0x48, 0x92, 0x8C,
0x57, 0x60, 0x9C, 0x97, 0xBA, 0x80, 0xD2, 0x25,
0x80, 0x94, 0xCE, 0x2C, 0x0C, 0x00, 0x44, 0x8C,
0x8C, 0x37, 0x82, 0x5D, 0x5F, 0x62, 0x8B, 0x05,
0x6F, 0xB0, 0x07, 0x34, 0xF9, 0xC3, 0xA1, 0x34,
0x3D, 0xE4, 0x90, 0xB0, 0x03, 0x59, 0x97, 0x6E,
0xFB, 0xF2, 0x92, 0xE5, 0xB5, 0x30, 0x7C, 0x0D,
0x3B, 0x8F, 0x90, 0x8E, 0x04, 0x47, 0x01, 0x0E,
0x88, 0x50, 0x4A, 0x88, 0xA0, 0xFF, 0xB7, 0x9E,
0x2B, 0x2C, 0x98, 0xD0, 0x3E, 0x16, 0x35, 0x5B,
0xD5, 0xEA, 0x54, 0x86, 0xE0, 0xFB, 0x9F, 0x2F,
0x62, 0x89, 0x36, 0x36, 0x9D, 0x6E, 0x62, 0xCB,
0xC8, 0x6C, 0x62, 0x34, 0x8F, 0x66, 0x07, 0x62,
0xA7, 0x00, 0x90, 0x31, 0xFA, 0x5D, 0xDD, 0x12,
0x33, 0x69, 0xD0, 0x74, 0x0E, 0x0B, 0x42, 0x9A,
0xF3, 0x40, 0x7E, 0x3E, 0x48, 0x1D, 0xF2, 0x5C,
0x71, 0x0B, 0x78, 0x7E, 0xD5, 0x15, 0xA4, 0x16,
0x1E, 0xBD, 0x71, 0x18, 0x87, 0x3A, 0xC9, 0xE3,
0x45, 0xEE, 0x70, 0xA2, 0x4C, 0x50, 0xF5, 0x16,
0x5C, 0xF8, 0x76, 0xE6, 0x9F, 0x8D, 0x86, 0x41,
0x7E, 0xF8, 0x60, 0x3D, 0x75, 0x6D, 0x55, 0x96,
0x9E, 0x43, 0x48, 0x82, 0xF7, 0xB6, 0xAC, 0x98,
0x6F, 0x10, 0xAA, 0x20, 0x64, 0xD0, 0x7C, 0x25,
0x24, 0xF7, 0xD8, 0xA4, 0xCC, 0x2D, 0xBF, 0x85,
0x62, 0x6C, 0x4F, 0xFF, 0x9D, 0x71, 0x04, 0x98,
0x61, 0xB0, 0xBC, 0x31, 0xC1, 0xE9, 0xB8, 0x29,
0xA5, 0xEB, 0xD1, 0x1D, 0x65, 0x8E, 0xAE, 0x38,
0x55, 0x65, 0x22, 0xC7, 0xFD, 0x7E, 0xF2, 0x6A,
0xB6, 0xB1, 0x51, 0x37, 0x4B, 0x05, 0x8F, 0xA7,
0x2D, 0x3F, 0x5C, 0x04, 0x2B, 0xBA, 0x2C, 0x37,
0xCA, 0xDE, 0xD5, 0x3E, 0xA0, 0xA5, 0x86, 0x59,
0xA7, 0xD7, 0x38, 0x07, 0xFB, 0x79, 0xF6, 0x2D,
0xE1, 0xAA, 0x7C, 0xD1, 0x91, 0xBE, 0x39, 0xDF,
0x53, 0x3C, 0xD1, 0x44, 0x2C, 0xF9, 0x12, 0x7D,
0xB1, 0xCD, 0xF3, 0x35, 0x1F, 0x85, 0xA6, 0x64,
0x2F, 0xFD, 0x28, 0xF2, 0x85, 0xA8, 0xA7, 0x1F,
0x7F, 0xD9, 0x79, 0x30, 0x9B, 0xFC, 0x69, 0x3A,
0x9B, 0x1F, 0x55, 0x70, 0xC9, 0x60, 0x82, 0x3D,
0xE9, 0x5A, 0x37, 0x5F, 0x8C, 0xBD, 0x19, 0x5D,
0xCC, 0x1C, 0xBE, 0x26, 0x4A, 0xEA, 0x8B, 0x39,
0xCE, 0x0D, 0xBD, 0x63, 0x05, 0x98, 0x75, 0xAB,
0x08, 0x79, 0x90, 0xC7, 0x20, 0xFF, 0xE4, 0x0D,
0xB1, 0xA0, 0x92, 0x2B, 0x0C, 0x4B, 0x0C, 0xDC,
0xB9, 0x72, 0x2A, 0xA4, 0xCC, 0xA6, 0x32, 0xA3,
0x57, 0x82, 0xB4, 0xB9, 0x0F, 0x81, 0xC5, 0xD9,
0x7C, 0xB8, 0x0F, 0x7D, 0xEA, 0x5D, 0xD3, 0xC4,
0x2F, 0x31, 0x79, 0x11, 0xAD, 0x36, 0x56, 0x1F,
0xFA, 0xE3, 0xCE, 0xD2, 0x29, 0x23, 0xE8, 0x2C,
0xDF, 0x7D, 0x94, 0x28, 0x28, 0x9A, 0x0E, 0x64,
0xFC, 0x07, 0x11, 0x96, 0x06, 0x1A, 0x39, 0xCD,
0x04, 0x37, 0x37, 0xDB, 0xFE, 0x68, 0x37, 0xF5,
0x59, 0x54, 0xBC, 0xEF, 0xDB, 0x0C, 0x80, 0xCD,
0xD3, 0x46, 0xA8, 0xA2, 0xBE, 0xE0, 0x63, 0x80,
0xA1, 0x5F, 0x5D, 0xF1, 0xFB, 0x96, 0x8C, 0x06,
0x38, 0xB6, 0xCB, 0x70, 0xB0, 0xFB, 0xD3, 0x26,
0xB3, 0x8B, 0xC6, 0x85, 0x34, 0xB7, 0xAB, 0x5F,
0x7E, 0xC6, 0xAA, 0x79, 0x5B, 0x48, 0x11, 0x65,
0x9E, 0x2A, 0xCD, 0x6A, 0xF0, 0xB2, 0x93, 0xF5,
0x2B, 0x88, 0x45, 0xB7, 0xC9, 0xBE, 0x1A, 0x72,
0x60, 0x62, 0xA4, 0xA5, 0x3B, 0xC2, 0x1C, 0xC6,
0x21, 0x09, 0xA9, 0x40, 0xF6, 0x58, 0x2B, 0xE5,
0x70, 0xDC, 0xFC, 0x47, 0x3B, 0x08, 0xEE, 0xA9,
0x94, 0x26, 0x43, 0xFE, 0xA7, 0x75, 0xD6, 0x4E,
0x52, 0xF6, 0x46, 0xD1, 0x80, 0xEB, 0x3B, 0x8E,
0xBE, 0x54, 0x4F, 0xBD, 0x42, 0x0E, 0x41, 0xF9,
0x36, 0x7D, 0xB6, 0x7F, 0x99, 0x20, 0xC9, 0x63,
0xE7, 0x93, 0x02, 0x62, 0x59, 0x94, 0xCB, 0xC6,
0x62, 0xA9, 0x26, 0xE1, 0x1E, 0x03, 0x5A, 0x41,
0x2F, 0x43, 0x28, 0x75, 0xB7, 0x0C, 0x02, 0x9C,
0x1E, 0xE0, 0x40, 0xB3, 0xE2, 0x9A, 0xED, 0xC6,
0x20, 0x49, 0xEC, 0xDD, 0xC5, 0x64, 0x95, 0x83,
0x51, 0xAE, 0x46, 0x9D, 0x70, 0x17, 0xC6, 0x47,
0xD3, 0x82, 0xCC, 0x6A, 0x5D, 0x93, 0xB2, 0x85,
0x5B, 0x25, 0x05, 0xE7, 0x26, 0x2E, 0xD3, 0xDA,
0x1C, 0xD9, 0x06, 0xB6, 0x16, 0x69, 0x8C, 0x7F,
0xC8, 0xCF, 0x95, 0x18, 0xB5, 0x98, 0xC0, 0x42,
0x61, 0xDE, 0x77, 0x41, 0x3A, 0xF6, 0xE1, 0xB0,
0xE8, 0x64, 0x4A, 0xC2, 0x58, 0xBE, 0x27, 0xC6,
0x9B, 0x0D, 0x47, 0x1A, 0x09, 0x56, 0x7D, 0x2B,
0x19, 0x01, 0x88, 0xC7, 0xFB, 0x1E, 0xCF, 0x5E,
0xF6, 0xB0, 0x82, 0x87, 0xC0, 0xBE, 0xD6, 0xA5,
0xC3, 0xAC, 0x3A, 0x97, 0x88, 0x25, 0x81, 0xAA,
0x3A, 0xCE, 0x66, 0x88, 0x0F, 0xC3, 0x02, 0x50,
0x1C, 0xC3, 0x2B, 0xBC, 0x53, 0x52, 0xFE, 0xD2,
0x3F, 0x50, 0xC8, 0xB2, 0x19, 0x0A, 0x14, 0xB1,
0x73, 0x18, 0xB4, 0xDF, 0xBD, 0xED, 0x43, 0xC5,
0x91, 0xF4, 0x91, 0xBA, 0x7E, 0xB0, 0x7E, 0xA9,
0x43, 0x67, 0x06, 0xCF, 0x51, 0xC1, 0xBF, 0x63,
0x7E, 0x91, 0x76, 0xFF, 0x4F, 0x48, 0x91, 0xCF,
0xDF, 0x01, 0x4D, 0x7E, 0x81, 0x22, 0xFB, 0x79,
0xFC, 0x1D, 0xE3, 0xA7, 0x45, 0x16, 0xFB, 0xF2,
0x83, 0xC7, 0xAE, 0xC6, 0xC5, 0x81, 0xDB, 0xA2,
0x9F, 0x2F, 0xEA, 0xE6, 0x8E, 0x12, 0x8D, 0x43,
0x14, 0x26, 0x25, 0x0E, 0xB4, 0x18, 0xE8, 0x41,
0x84, 0xA3, 0x04, 0xDF, 0x97, 0xFF, 0xAA, 0x45,
0xEC, 0x18, 0xAA, 0xB1, 0xFC, 0xDC, 0xB9, 0xAB,
0xEE, 0xD1, 0xC4, 0x9E, 0x42, 0x3F, 0x5B, 0x8F,
0x9F, 0x22, 0xAF, 0xCC, 0x6F, 0xA0, 0x41, 0x41,
0xCB, 0xD3, 0xAC, 0x96, 0x20, 0xF1, 0x63, 0x56,
0x65, 0xCE, 0x83, 0xC6, 0x62, 0x04, 0x85, 0x16,
0x7F, 0x4E, 0xFB, 0xA0, 0x68, 0x11, 0x85, 0x5B,
0x51, 0xB6, 0x9F, 0xA2, 0xF5, 0xA1, 0xCF, 0x01,
0x9A, 0x80, 0x68, 0xC3, 0xE9, 0x7F, 0x9E, 0x2E,
0x83, 0x84, 0xDC, 0x3C, 0x35, 0xCF, 0x24, 0xBF,
0xF5, 0x00, 0x91, 0x45, 0x14, 0x65, 0xE0, 0xC5,
0x75, 0xDA, 0xEF, 0x14, 0xBD, 0xDB, 0x28, 0x8D,
0x30, 0x96, 0xC9, 0xFE, 0xA8, 0x49, 0x76, 0xC9,
0xED, 0x90, 0x4C, 0x2E, 0xF1, 0x14, 0x2C, 0xF7,
0x13, 0x7C, 0xF1, 0xCC, 0x67, 0xA5, 0x11, 0x55,
0xBD, 0x66, 0x13, 0x8A, 0x76, 0xF9, 0xAC, 0xC9,
0x51, 0x8A, 0xBB, 0x5D, 0x29, 0xEF, 0xF6, 0x37,
0xA0, 0x3E, 0x99, 0x77, 0x6B, 0xE5, 0xCD, 0x06,
0xAC, 0x57, 0x07, 0x37, 0x44, 0x3D, 0x5D, 0xD7,
0xB6, 0x5C, 0xCB, 0x77, 0xD0, 0x4C, 0x28, 0x9D,
0x12, 0x69, 0x5A, 0x68, 0xD1, 0x15, 0x30, 0xC4,
0x30, 0xD2, 0x20, 0xDF, 0xD5, 0x73, 0x9F, 0x83,
0xE9, 0x4C, 0x55, 0xF5, 0xAF, 0xAA, 0x37, 0xF8,
0x28, 0xB6, 0x3F, 0x99, 0x4B, 0x15, 0x1E, 0x40,
0xAB, 0x4F, 0x58, 0x3D, 0x3B, 0x81, 0x7D, 0x62,
0x28, 0x6E, 0x73, 0x58, 0x50, 0x36, 0x49, 0x01,
0xF7, 0x04, 0x3A, 0x23, 0x28, 0xDA, 0x15, 0xC5,
0xE3, 0xF6, 0x6F, 0xE1, 0x79, 0x07, 0xFB, 0xAA,
0xFF, 0x44, 0x48, 0x53, 0x9E, 0x7F, 0x8D, 0x89,
0x88, 0x1A, 0x9A, 0xF9, 0x47, 0x58, 0x20, 0xBB,
0x79, 0x4A, 0x2A, 0x14, 0x03, 0x9B, 0x65, 0x4C,
0x67, 0x02, 0x02, 0xFE, 0xEB, 0xCD, 0xCB, 0x84,
0xF5, 0xCE, 0x32, 0x59, 0xBC, 0xEA, 0xEC, 0xB1,
0x3C, 0x22, 0xCF, 0x9D, 0xB0, 0x34, 0x6D, 0xE6,
0x5A, 0x37, 0xC0, 0x22, 0xAA, 0xF3, 0xB5, 0x71,
0x90, 0x21, 0xE0, 0xB6, 0x19, 0xE9, 0xB3, 0x10,
0xCE, 0x5B, 0xF9, 0xD4, 0x25, 0x30, 0x7D, 0xF6,
0x7D, 0xB6, 0x16, 0xFC, 0x20, 0x3C, 0x2F, 0x96,
0xD5, 0x79, 0x90, 0x88, 0x24, 0x5D, 0x46, 0x64,
0x99, 0xC1, 0xF8, 0x7F, 0x96, 0xA7, 0xB5, 0xA9,
0x47, 0xA3, 0x14, 0xED, 0x93, 0xED, 0x30, 0x56,
0x58, 0xA5, 0xD4, 0x54, 0x2A, 0xF3, 0x89, 0x27,
0x7C, 0x55, 0x41, 0x11, 0x27, 0x9D, 0xF6, 0x4D,
0xA6, 0xB1, 0x00, 0xE0, 0xB0, 0xF6, 0x1E, 0xAB,
0x20, 0x1F, 0xAE, 0x8A, 0x82, 0xA7, 0x49, 0xFC,
0xBB, 0x66, 0xAC, 0x97, 0x95, 0x49, 0x29, 0xCB,
0x6F, 0xF4, 0xC1, 0xB7, 0x6B, 0xF9, 0x8C, 0x25,
0xC6, 0xF0, 0xB5, 0x81, 0xB0, 0xA2, 0x4D, 0xCC,
0x2E, 0xD0, 0x13, 0x5F, 0x96, 0x3F, 0xCD, 0xD0,
0x52, 0xD1, 0xFE, 0xF9, 0xC2, 0x7E, 0x9D, 0xAB,
0xCB, 0x95, 0x0F, 0x27, 0x01, 0x9E, 0x23, 0x6B,
0x19, 0xFF, 0x52, 0x55, 0x71, 0x0A, 0xD4, 0xBB,
0x43, 0x65, 0x29, 0x66, 0xBE, 0x2D, 0x6C, 0xE3,
0x2A, 0x7C, 0xB4, 0x02, 0x32, 0x59, 0x94, 0x80,
0x14, 0xE7, 0x62, 0xE4, 0xCE, 0xB0, 0xCA, 0xCA,
0x37, 0xD7, 0x0C, 0x68, 0x29, 0xE2, 0x92, 0xE1,
0xEB, 0x91, 0xE5, 0xA1, 0x0C, 0xFC, 0x55, 0xCB,
0x56, 0xB3, 0x96, 0xFB, 0x64, 0xD9, 0x53, 0x8E,
0x82, 0x2B, 0xDF, 0x7F, 0xCB, 0x2A, 0xF6, 0x3C,
0xA7, 0x89, 0x52, 0x13, 0x2C, 0x6A, 0x93, 0xA2,
0x74, 0xF5, 0x91, 0x00, 0x17, 0xAA, 0x74, 0x45,
0x63, 0x5A, 0xE5, 0xC3, 0x16, 0xFC, 0x0E, 0xF7,
0xF3, 0xA4, 0x55, 0x8A, 0xA2, 0x60, 0x24, 0x57,
0x25, 0x2C, 0x94, 0xE0, 0xF5, 0x32, 0x54, 0x4A,
0x2D, 0x63, 0x5F, 0xD8, 0x35, 0x96, 0xBD, 0xFE,
0x90, 0x33, 0x17, 0xF6, 0xB5, 0x81, 0x02, 0xFA,
0x5C, 0x94, 0x3A, 0xBE, 0x22, 0xB9, 0xFC, 0x3E,
0x09, 0xE4, 0x76, 0xD7, 0x03, 0x38, 0x38, 0xC2,
0xC2, 0x0D, 0x66, 0x3C, 0xD0, 0x91, 0x5C, 0xF4,
0x0E, 0xC2, 0xDE, 0x46, 0x90, 0x2E, 0xF5, 0x22,
0xA9, 0x3D, 0x15, 0x20, 0x5F, 0x17, 0x10, 0x5A,
0x54, 0x63, 0x93, 0x7B, 0xC3, 0x00, 0x3D, 0x42,
0x73, 0xF1, 0xAD, 0xC1, 0xDE, 0x76, 0x18, 0x9C,
0x68, 0x17, 0xBF, 0x3B, 0xE0, 0x30, 0x82, 0x02,
0xF9, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x02, 0xEA,
0x04, 0x82, 0x02, 0xE6, 0x30, 0x82, 0x02, 0xE2,
0x30, 0x82, 0x02, 0xDE, 0x06, 0x0B, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01,
0x02, 0xA0, 0x82, 0x02, 0xA6, 0x30, 0x82, 0x02,
0xA2, 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30,
0x0E, 0x04, 0x08, 0x34, 0x37, 0x27, 0x5F, 0xE8,
0xD6, 0x00, 0x0D, 0x02, 0x02, 0x08, 0x00, 0x04,
0x82, 0x02, 0x80, 0xC0, 0xE6, 0xB1, 0x63, 0x73,
0xFC, 0xBF, 0x50, 0xFB, 0x54, 0xCF, 0x67, 0x16,
0xF8, 0x28, 0x48, 0x13, 0x7F, 0xF2, 0xBD, 0x66,
0x70, 0xC7, 0xF6, 0x01, 0xD0, 0x58, 0xF4, 0xA4,
0xD9, 0x45, 0xE2, 0x63, 0x92, 0x7F, 0x78, 0x2B,
0xB6, 0xDB, 0x16, 0x44, 0x1D, 0x11, 0xCB, 0xC3,
0x20, 0xA9, 0x8A, 0x96, 0x13, 0xB8, 0x6E, 0xF3,
0xDA, 0x46, 0x05, 0x2C, 0xF9, 0x67, 0xBB, 0x05,
0x88, 0xC0, 0xC8, 0x60, 0x09, 0xA3, 0x82, 0x27,
0x33, 0xEB, 0xEE, 0x43, 0x98, 0xE9, 0xE2, 0x24,
0xA8, 0x06, 0xD5, 0xFF, 0xF5, 0xC0, 0x79, 0x4B,
0x06, 0x40, 0xE6, 0x28, 0xC6, 0x6E, 0x4E, 0x03,
0xCC, 0x9B, 0xB6, 0xBD, 0xB6, 0x81, 0x88, 0x5C,
0x34, 0x6B, 0x8B, 0x15, 0x23, 0x75, 0x21, 0xAC,
0x79, 0xFD, 0xDB, 0x80, 0x1D, 0x20, 0x84, 0xF1,
0x47, 0xAF, 0x7B, 0x40, 0x6C, 0xD2, 0x64, 0x52,
0x11, 0x1B, 0x01, 0x1E, 0xB5, 0xA9, 0x4B, 0xC4,
0x51, 0x54, 0x40, 0xE2, 0xC8, 0xEB, 0x20, 0x48,
0x2D, 0x40, 0xF8, 0xC6, 0x58, 0x5A, 0xE3, 0x34,
0xD8, 0x79, 0x04, 0xD7, 0xD6, 0x07, 0xF2, 0x12,
0x66, 0xC8, 0x31, 0x37, 0x71, 0x60, 0xF4, 0x75,
0xDC, 0x60, 0x54, 0x19, 0x6A, 0x75, 0x56, 0xC5,
0xA9, 0x67, 0x4A, 0x03, 0x7A, 0xFD, 0x12, 0x59,
0x2B, 0x74, 0xE6, 0xA5, 0xE2, 0xF8, 0xBB, 0x1E,
0x76, 0x96, 0xD4, 0xD4, 0x3F, 0x8B, 0xAD, 0x90,
0xAF, 0x04, 0x41, 0xDB, 0xD8, 0xCC, 0x2D, 0x37,
0x06, 0x20, 0x9B, 0xE7, 0x98, 0x87, 0x12, 0xAC,
0x70, 0xC9, 0xF4, 0x1C, 0x28, 0xFB, 0x2C, 0x9E,
0x18, 0xE1, 0x6D, 0x79, 0x34, 0xBC, 0xAC, 0xCB,
0x75, 0x92, 0x7E, 0x8E, 0x7C, 0xA9, 0x0B, 0x86,
0x4A, 0x88, 0xFB, 0xE8, 0xBE, 0x6A, 0x32, 0xEF,
0x58, 0xCC, 0x4C, 0x89, 0x50, 0xEF, 0xDF, 0xE0,
0xDD, 0x35, 0x07, 0x8C, 0x01, 0x8B, 0x57, 0x38,
0xB5, 0x64, 0xBB, 0x0A, 0xC2, 0xD8, 0xAB, 0xC5,
0x45, 0xA6, 0x83, 0xBF, 0xA6, 0xA2, 0xCC, 0x06,
0x64, 0xBE, 0x84, 0x04, 0x55, 0x8E, 0xF4, 0x4C,
0xB5, 0xBC, 0xE5, 0x97, 0x2B, 0x3C, 0x42, 0x44,
0x91, 0x9B, 0xB2, 0x65, 0x70, 0x02, 0xC5, 0xB7,
0x71, 0xB3, 0xF0, 0xAA, 0x46, 0x4F, 0x42, 0x40,
0x53, 0x65, 0x89, 0xA5, 0x6C, 0xBC, 0xB5, 0x6C,
0x0C, 0x3B, 0x50, 0x46, 0x67, 0xFA, 0x14, 0x68,
0x01, 0xE7, 0xA6, 0xD4, 0xB5, 0xD0, 0x82, 0x44,
0x92, 0x2C, 0xE3, 0x43, 0x5D, 0x34, 0x7C, 0x04,
0xA3, 0x4D, 0x2F, 0x5A, 0x75, 0xE7, 0x0B, 0x64,
0xD0, 0xAE, 0x7F, 0xCB, 0xDD, 0x7D, 0x05, 0x88,
0x4C, 0x34, 0xBB, 0xF4, 0x00, 0xCE, 0x1C, 0x13,
0x4E, 0xA3, 0xE3, 0x60, 0x4B, 0x50, 0x4E, 0xE1,
0x26, 0x22, 0x51, 0xD4, 0x32, 0x60, 0xC6, 0x3E,
0x7D, 0x4A, 0x3E, 0x56, 0x78, 0xBD, 0x5F, 0x23,
0x7F, 0x0A, 0xA0, 0xC1, 0x1A, 0x60, 0xA2, 0x7C,
0x9E, 0x17, 0x6F, 0xD8, 0x73, 0x0F, 0x1A, 0x1F,
0x47, 0x58, 0x44, 0x20, 0x80, 0xC6, 0x5D, 0x6E,
0xEC, 0xFF, 0xCA, 0x65, 0xA1, 0xFB, 0xEE, 0xF2,
0x56, 0x1A, 0x16, 0x9E, 0x4D, 0xCA, 0x67, 0x81,
0x23, 0xDE, 0xBE, 0x5E, 0x31, 0x56, 0xF0, 0x34,
0xBA, 0x12, 0xFC, 0x07, 0x03, 0x96, 0xD2, 0x8E,
0xCE, 0xA6, 0xF6, 0x74, 0x07, 0x4F, 0x63, 0x40,
0x14, 0x0A, 0xD6, 0x45, 0xB4, 0xF1, 0x72, 0x87,
0x34, 0x89, 0x5C, 0x06, 0x1B, 0x8C, 0x0E, 0xA2,
0x84, 0x50, 0x12, 0xAD, 0x26, 0x5B, 0x4F, 0x6B,
0x23, 0x9D, 0x3C, 0xBB, 0x8A, 0xDA, 0x08, 0x4B,
0x93, 0x47, 0x02, 0x96, 0x76, 0xD4, 0x87, 0xE9,
0x4B, 0x69, 0x82, 0xD6, 0xCC, 0x69, 0x02, 0xC0,
0xA4, 0x75, 0x7A, 0x90, 0xFD, 0xF6, 0xD6, 0x9D,
0xE2, 0x4C, 0xB6, 0xFA, 0x61, 0xA5, 0x7C, 0x18,
0xEA, 0x84, 0xA1, 0x74, 0x85, 0x2E, 0xCA, 0xF9,
0x17, 0x29, 0xFF, 0x67, 0x70, 0xC9, 0x6F, 0xF1,
0x41, 0xEF, 0xA1, 0x59, 0x54, 0xA0, 0x99, 0x14,
0x48, 0x74, 0x5D, 0x14, 0x3E, 0x04, 0xCE, 0xF7,
0x16, 0x9F, 0x8A, 0x41, 0xF4, 0xAE, 0xB3, 0x10,
0xCE, 0x19, 0xC2, 0x83, 0x7B, 0xD0, 0x26, 0x1E,
0x75, 0x8A, 0x0A, 0x40, 0x4A, 0xB8, 0xE0, 0x5C,
0x13, 0x8B, 0xCC, 0x6F, 0xF3, 0x00, 0xB3, 0x64,
0x1B, 0x3C, 0x3D, 0x08, 0x3B, 0x9F, 0xD0, 0x9B,
0xE5, 0x72, 0x45, 0x96, 0x95, 0x4D, 0x66, 0xC7,
0x79, 0x5D, 0x3A, 0x1A, 0x94, 0x64, 0x94, 0x07,
0x1A, 0xE8, 0x7C, 0xD1, 0x1C, 0xB1, 0x7E, 0x32,
0x28, 0x1A, 0x90, 0x22, 0xD9, 0x86, 0x9B, 0x9C,
0x9B, 0x0C, 0x04, 0x31, 0x85, 0x10, 0x42, 0x50,
0x40, 0x11, 0x72, 0xAB, 0x94, 0x0C, 0xAF, 0xC3,
0x22, 0x1A, 0xC1, 0x31, 0x25, 0x30, 0x23, 0x06,
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
0x09, 0x15, 0x31, 0x16, 0x04, 0x14, 0xFD, 0x78,
0xA7, 0x70, 0x1F, 0x8A, 0xE9, 0x07, 0xB9, 0xCA,
0x3C, 0xD1, 0xE8, 0xDC, 0x68, 0xFF, 0x02, 0x61,
0x29, 0x97, 0x30, 0x31, 0x30, 0x21, 0x30, 0x09,
0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05,
0x00, 0x04, 0x14, 0x22, 0x7E, 0x99, 0x10, 0xB3,
0x99, 0x79, 0xE7, 0x14, 0x7F, 0x91, 0x59, 0x24,
0x4F, 0x2F, 0xCF, 0xE8, 0x53, 0x1D, 0x0F, 0x04,
0x08, 0x30, 0x1E, 0x5C, 0xE4, 0x3C, 0x66, 0xDF,
0xB0, 0x02, 0x02, 0x08, 0x00]
};
gTestSuite.doTestWithCertificate(
new Blob([new Uint8Array(testCertInfo.blob)]),
testCertInfo.password,
testCertInfo.nickname,
testCertInfo.usage
);

View File

@ -0,0 +1,106 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
// Binary form of test certificate.
var testCertInfo = {
nickname: 'Test Certificate',
password: '',
usage: ['ServerCert'],
blob: [0x30, 0x82, 0x02, 0xae, 0x30, 0x82, 0x02, 0x17,
0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00,
0x92, 0x49, 0xe2, 0x62, 0x71, 0xf6, 0xc7, 0x92,
0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,
0x70, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x0f,
0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c,
0x06, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x31,
0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a,
0x0c, 0x07, 0x4d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c,
0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
0x04, 0x0b, 0x0c, 0x02, 0x51, 0x41, 0x31, 0x0e,
0x30, 0x0c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
0x05, 0x47, 0x65, 0x72, 0x72, 0x79, 0x31, 0x21,
0x30, 0x1f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x12, 0x67,
0x63, 0x68, 0x61, 0x6e, 0x67, 0x40, 0x6d, 0x6f,
0x7a, 0x69, 0x6c, 0x6c, 0x61, 0x2e, 0x63, 0x6f,
0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30,
0x35, 0x32, 0x33, 0x30, 0x39, 0x34, 0x32, 0x33,
0x37, 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x35,
0x32, 0x32, 0x30, 0x39, 0x34, 0x32, 0x33, 0x37,
0x5a, 0x30, 0x70, 0x31, 0x0b, 0x30, 0x09, 0x06,
0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57,
0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04,
0x08, 0x0c, 0x06, 0x54, 0x61, 0x69, 0x70, 0x65,
0x69, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,
0x04, 0x0a, 0x0c, 0x07, 0x4d, 0x6f, 0x7a, 0x69,
0x6c, 0x6c, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06,
0x03, 0x55, 0x04, 0x0b, 0x0c, 0x02, 0x51, 0x41,
0x31, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x04,
0x03, 0x0c, 0x05, 0x47, 0x65, 0x72, 0x72, 0x79,
0x31, 0x21, 0x30, 0x1f, 0x06, 0x09, 0x2a, 0x86,
0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16,
0x12, 0x67, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x40,
0x6d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, 0x61, 0x2e,
0x63, 0x6f, 0x6d, 0x30, 0x81, 0x9f, 0x30, 0x0d,
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d,
0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00,
0xd3, 0xdb, 0x54, 0xcc, 0xca, 0x0b, 0xee, 0xf9,
0x8a, 0x37, 0x0d, 0x06, 0x8b, 0x20, 0x00, 0x4a,
0x55, 0x84, 0x90, 0x1a, 0xb7, 0x9c, 0x91, 0xb2,
0x38, 0x6b, 0x8b, 0x32, 0x7a, 0x89, 0x9e, 0x79,
0x71, 0x88, 0x43, 0x21, 0x94, 0x18, 0xa8, 0xfc,
0xe3, 0x7a, 0x8a, 0xb3, 0xa1, 0xf7, 0x23, 0xe7,
0x1a, 0xe3, 0xe7, 0x0d, 0xf1, 0x66, 0x21, 0x58,
0x21, 0x85, 0x5b, 0x35, 0xec, 0x68, 0xd2, 0xfd,
0x44, 0x76, 0x93, 0x05, 0xbb, 0x89, 0x7d, 0x92,
0xf9, 0xce, 0x75, 0xa3, 0xeb, 0x39, 0xc1, 0x7d,
0x7e, 0x50, 0xf9, 0xb8, 0x60, 0x61, 0xf7, 0x2f,
0x54, 0x39, 0xfe, 0x8a, 0x20, 0xb2, 0x0d, 0x48,
0x7f, 0x18, 0x0d, 0x02, 0xcc, 0x7b, 0x8e, 0x31,
0xe9, 0xbe, 0xfc, 0x96, 0x2e, 0x63, 0x6f, 0xfa,
0x4c, 0xc4, 0xcf, 0x8a, 0xe4, 0x13, 0x67, 0xf1,
0xec, 0x3e, 0xd8, 0x23, 0xa1, 0xbf, 0x67, 0x71,
0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x50, 0x30,
0x4e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,
0x04, 0x16, 0x04, 0x14, 0x13, 0xe1, 0xac, 0xa4,
0x75, 0x3d, 0x2c, 0x5f, 0xe5, 0x41, 0x42, 0x90,
0x5a, 0x48, 0x5c, 0x46, 0xbc, 0x24, 0x8e, 0xa1,
0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04,
0x18, 0x30, 0x16, 0x80, 0x14, 0x13, 0xe1, 0xac,
0xa4, 0x75, 0x3d, 0x2c, 0x5f, 0xe5, 0x41, 0x42,
0x90, 0x5a, 0x48, 0x5c, 0x46, 0xbc, 0x24, 0x8e,
0xa1, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13,
0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81,
0x81, 0x00, 0xaa, 0x6b, 0x62, 0x53, 0x74, 0x2a,
0x20, 0x76, 0xab, 0xd2, 0x60, 0x06, 0xfd, 0x88,
0xf5, 0x1c, 0x85, 0xe6, 0x57, 0xf1, 0xf0, 0x18,
0x97, 0x7c, 0x70, 0xb8, 0xb4, 0x7c, 0xcc, 0x58,
0x8d, 0xf4, 0x7c, 0xb6, 0x34, 0xcc, 0x15, 0x79,
0xaf, 0x75, 0xa9, 0x0b, 0xd1, 0xea, 0xf8, 0x85,
0x7c, 0xe8, 0x19, 0xe9, 0x13, 0x90, 0x84, 0x5f,
0x21, 0x94, 0x0a, 0x4d, 0x15, 0xef, 0xd1, 0x16,
0xd4, 0xba, 0x2c, 0x59, 0x1b, 0x83, 0x23, 0xf5,
0xa5, 0xcd, 0xbd, 0xda, 0x32, 0x73, 0x46, 0x49,
0x98, 0xf3, 0xfb, 0x50, 0x6e, 0x30, 0xd7, 0x3e,
0x31, 0xd6, 0xe8, 0x65, 0x2f, 0x5a, 0xf1, 0x0f,
0x7b, 0x0a, 0x21, 0x61, 0x8e, 0x45, 0x29, 0x4f,
0x7a, 0x04, 0xda, 0x29, 0xfc, 0x6f, 0xc5, 0x5e,
0xee, 0xe1, 0x0f, 0xd5, 0x4b, 0xb7, 0xc9, 0x6a,
0x8e, 0x7c, 0x19, 0xef, 0x6e, 0x64, 0x98, 0xfe,
0xe3, 0x35]
};
gTestSuite.doTestWithCertificate(
new Blob([new Uint8Array(testCertInfo.blob)]),
testCertInfo.password,
testCertInfo.nickname,
testCertInfo.usage
);

View File

@ -0,0 +1,34 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
// Binary form of test certificate.
var testCertInfo = {
nickname: 'Test Certificate',
password: '',
usage: ['UserCert'],
blob: '-----BEGIN CERTIFICATE-----\n' +
'MIICTjCCAbegAwIBAgICNV4wDQYJKoZIhvcNAQEEBQAwgYUxCzAJBgNVBAYTAklU\n' +
'MRYwFAYDVQQKEw1aZXJvc2hlbGwubmV0MRAwDgYDVQQLEwdFeGFtcGxlMR0wGwYD\n' +
'VQQDExRaZXJvU2hlbGwgRXhhbXBsZSBDQTEtMCsGCSqGSIb3DQEJARYeRnVsdmlv\n' +
'LlJpY2NpYXJkaUB6ZXJvc2hlbGwubmV0MB4XDTEzMDMxMTAzMzg1MloXDTE0MDMx\n' +
'MTAzMzg1MlowIzEOMAwGA1UECxMFVXNlcnMxETAPBgNVBAMTCGNodWNrbGVlMIGf\n' +
'MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvVzFhQAVqAIHW5DlAhp4FEGEei7k7\n' +
'uVUeqkH7JAsww6zmDLg9yZlcZAc95N0lkz022gLXehH2M0R1FOR++nkqofzWfc7w\n' +
'n79ith+dU2GQMeKq7vPGDYXpgIkEKbYfzKj3fY3129MlTxJQt1UD/ejz38V8HKgw\n' +
'qKSuwo0NVeY66QIDAQABoy4wLDALBgNVHQ8EBAMCBLAwHQYDVR0lBBYwFAYIKwYB\n' +
'BQUHAwIGCCsGAQUFBwMEMA0GCSqGSIb3DQEBBAUAA4GBAJWgfX5vYSD7MGZk1rTF\n' +
'DSziWYGqpR+Moo3qQ+9qLG8m+XVM9hckWpY31A5sWAeCZCe1SSNLFbbgsaOyPZE2\n' +
'NqMyvs61Vszpc2mmWAYT6j2OU2tw8p5pcUZd6eIp7Gc3fLymiX/WoSmilZKmrGUZ\n' +
'Q15R+TCpclUsaNrUGjybgaw7\n' +
'-----END CERTIFICATE-----'
};
gTestSuite.doTestWithCertificate(
new Blob([testCertInfo.blob]),
testCertInfo.password,
testCertInfo.nickname,
testCertInfo.usage
);

View File

@ -213,7 +213,6 @@ static void Shutdown();
#include "mozilla/dom/nsCSPService.h"
#include "mozilla/dom/nsCSPContext.h"
#include "nsICellBroadcastService.h"
#include "nsIIccService.h"
#include "nsISmsService.h"
#include "nsIMmsService.h"
#include "nsIMobileConnectionService.h"
@ -339,7 +338,6 @@ NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsICellBroadcastService,
NS_CreateCellBroadcastService)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsISmsService, NS_CreateSmsService)
#endif
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIIccService, NS_CreateIccService)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIMmsService, NS_CreateMmsService)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIMobileMessageService,
NS_CreateMobileMessageService)
@ -800,7 +798,6 @@ NS_DEFINE_NAMED_CID(NS_VOICEMAIL_SERVICE_CID);
NS_DEFINE_NAMED_CID(NS_MOBILE_CONNECTION_SERVICE_CID);
NS_DEFINE_NAMED_CID(SMS_SERVICE_CID);
#endif
NS_DEFINE_NAMED_CID(ICC_SERVICE_CID);
NS_DEFINE_NAMED_CID(MMS_SERVICE_CID);
NS_DEFINE_NAMED_CID(MOBILE_MESSAGE_SERVICE_CID);
NS_DEFINE_NAMED_CID(MOBILE_MESSAGE_DATABASE_SERVICE_CID);
@ -1095,7 +1092,6 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
{ &kCELLBROADCAST_SERVICE_CID, false, nullptr, nsICellBroadcastServiceConstructor },
{ &kSMS_SERVICE_CID, false, nullptr, nsISmsServiceConstructor },
#endif
{ &kICC_SERVICE_CID, false, nullptr, nsIIccServiceConstructor },
{ &kMMS_SERVICE_CID, false, nullptr, nsIMmsServiceConstructor },
{ &kMOBILE_MESSAGE_SERVICE_CID, false, nullptr, nsIMobileMessageServiceConstructor },
{ &kMOBILE_MESSAGE_DATABASE_SERVICE_CID, false, nullptr, nsIMobileMessageDatabaseServiceConstructor },
@ -1259,7 +1255,6 @@ static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
{ CELLBROADCAST_SERVICE_CONTRACTID, &kCELLBROADCAST_SERVICE_CID },
{ SMS_SERVICE_CONTRACTID, &kSMS_SERVICE_CID },
#endif
{ ICC_SERVICE_CONTRACTID, &kICC_SERVICE_CID },
{ MMS_SERVICE_CONTRACTID, &kMMS_SERVICE_CID },
{ MOBILE_MESSAGE_SERVICE_CONTRACTID, &kMOBILE_MESSAGE_SERVICE_CID },
{ MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID, &kMOBILE_MESSAGE_DATABASE_SERVICE_CID },

View File

@ -76,6 +76,7 @@ int __real_close(int aFd);
* threads are frozen.
*/
static bool sIsNuwaProcess = false; // This process is a Nuwa process.
static bool sIsNuwaChildProcess = false; // This process is spawned from Nuwa.
static bool sIsFreezing = false; // Waiting for all threads getting frozen.
static bool sNuwaReady = false; // Nuwa process is ready.
static bool sNuwaPendingSpawn = false; // Are there any pending spawn requests?
@ -301,6 +302,7 @@ struct AllThreadsListType : public AutoCleanLinkedList<thread_info_t>
}
};
static AllThreadsListType sAllThreads;
static AllThreadsListType sExitingThreads;
/**
* This mutex protects the access to thread info:
@ -344,6 +346,14 @@ GetThreadInfoInner(pthread_t threadID) {
}
}
for (thread_info_t *tinfo = sExitingThreads.getFirst();
tinfo;
tinfo = tinfo->getNext()) {
if (pthread_equal(tinfo->origThreadID, threadID)) {
return tinfo;
}
}
return nullptr;
}
@ -354,13 +364,11 @@ GetThreadInfoInner(pthread_t threadID) {
*/
static thread_info_t *
GetThreadInfo(pthread_t threadID) {
if (sIsNuwaProcess) {
REAL(pthread_mutex_lock)(&sThreadCountLock);
}
REAL(pthread_mutex_lock)(&sThreadCountLock);
thread_info_t *tinfo = GetThreadInfoInner(threadID);
if (sIsNuwaProcess) {
pthread_mutex_unlock(&sThreadCountLock);
}
pthread_mutex_unlock(&sThreadCountLock);
return tinfo;
}
@ -597,24 +605,69 @@ thread_info_cleanup(void *arg) {
pthread_mutex_unlock(&sThreadCountLock);
}
static void*
cleaner_thread(void *arg) {
thread_info_t *tinfo = (thread_info_t *)arg;
pthread_t *thread = sIsNuwaProcess ? &tinfo->origThreadID
: &tinfo->recreatedThreadID;
// Wait until target thread end.
while (!pthread_kill(*thread, 0)) {
static void
EnsureThreadExited(thread_info_t *tinfo) {
pid_t thread = sIsNuwaProcess ? tinfo->origNativeThreadID
: tinfo->recreatedNativeThreadID;
// Wait until the target thread exits. Note that we use tgkill() instead of
// pthread_kill() because of:
// 1. Use after free inside pthread implementation.
// 2. Race due to pthread_t reuse when a thread is created.
while (!syscall(__NR_tgkill, getpid(), thread, 0)) {
sched_yield();
}
}
static void*
safe_thread_info_cleanup(void *arg)
{
thread_info_t *tinfo = (thread_info_t *)arg;
// We need to ensure the thread is really dead before cleaning up tinfo.
EnsureThreadExited(tinfo);
thread_info_cleanup(tinfo);
return nullptr;
}
static void
thread_cleanup(void *arg) {
MaybeCleanUpDetachedThread(thread_info_t *tinfo)
{
if (pthread_getattr_np(REAL(pthread_self()), &tinfo->threadAttr)) {
return;
}
int detachState = 0;
if (pthread_attr_getdetachstate(&tinfo->threadAttr, &detachState) ||
detachState == PTHREAD_CREATE_JOINABLE) {
// We only clean up tinfo of a detached thread. A joinable thread
// will be cleaned up in __wrap_pthread_join().
return;
}
// Create a detached thread to safely clean up the current thread.
pthread_t thread;
REAL(pthread_create)(&thread, nullptr, &cleaner_thread, arg);
pthread_detach(thread);
if (!REAL(pthread_create)(&thread,
nullptr,
safe_thread_info_cleanup,
tinfo)) {
pthread_detach(thread);
}
}
static void
invalidate_thread_info(void *arg) {
REAL(pthread_mutex_lock)(&sThreadCountLock);
// Unlink tinfo from sAllThreads to make it invisible from CUR_THREAD_INFO so
// it won't be misused by a newly created thread.
thread_info_t *tinfo = (thread_info_t*) arg;
tinfo->remove();
sExitingThreads.insertBack(tinfo);
pthread_mutex_unlock(&sThreadCountLock);
MaybeCleanUpDetachedThread(tinfo);
}
static void *
@ -630,16 +683,8 @@ _thread_create_startup(void *arg) {
tinfo->origThreadID = REAL(pthread_self)();
tinfo->origNativeThreadID = gettid();
pthread_cleanup_push(thread_cleanup, tinfo);
r = tinfo->startupFunc(tinfo->startupArg);
if (!sIsNuwaProcess) {
return r;
}
pthread_cleanup_pop(1);
return r;
}
@ -670,7 +715,12 @@ thread_create_startup(void *arg) {
abort(); // Did not reserve enough stack space.
}
// Get tinfo before invalidating it. Note that we cannot use arg directly here
// because thread_recreate_startup() also runs on the same stack area and
// could corrupt the value.
thread_info_t *tinfo = CUR_THREAD_INFO;
invalidate_thread_info(tinfo);
if (!sIsNuwaProcess) {
longjmp(tinfo->retEnv, 1);
@ -766,7 +816,11 @@ __wrap_pthread_key_create(pthread_key_t *key, void (*destructor)(void*)) {
extern "C" MFBT_API int
__wrap_pthread_key_delete(pthread_key_t key) {
int rv = REAL(pthread_key_delete)(key);
// Don't call pthread_key_delete() for Nuwa-forked processes because bionic's
// pthread_key_delete() implementation can touch the thread stack that was
// freed in thread_info_cleanup().
int rv = sIsNuwaChildProcess ?
0 : REAL(pthread_key_delete)(key);
if (rv != 0) {
return rv;
}
@ -798,8 +852,23 @@ __wrap_pthread_join(pthread_t thread, void **retval) {
if (tinfo == nullptr) {
return REAL(pthread_join)(thread, retval);
}
// pthread_join() need to use the real thread ID in the spawned process.
return REAL(pthread_join)(tinfo->recreatedThreadID, retval);
pthread_t thread_info_t::*threadIDptr =
(sIsNuwaProcess ?
&thread_info_t::origThreadID :
&thread_info_t::recreatedThreadID);
// pthread_join() uses the origThreadID or recreatedThreadID depending on
// whether we are in Nuwa or forked processes.
int rc = REAL(pthread_join)(tinfo->*threadIDptr, retval);
// Before Android L, bionic wakes up the caller of pthread_join() with
// pthread_cond_signal() so the thread can still use the stack for some while.
// Call safe_thread_info_cleanup() to destroy tinfo after the thread really
// exits.
safe_thread_info_cleanup(tinfo);
return rc;
}
/**
@ -1643,6 +1712,7 @@ ForkIPCProcess() {
CloseAllProtoSockets(sProtoFdInfos, sProtoFdInfosSize);
} else {
// in the child
sIsNuwaChildProcess = true;
if (getenv("MOZ_DEBUG_CHILD_PROCESS")) {
printf("\n\nNUWA CHILDCHILDCHILDCHILD\n debug me @ %d\n\n", getpid());
sleep(30);

View File

@ -56,9 +56,9 @@ XPCOMUtils.defineLazyServiceGetter(this, "Ril",
"@mozilla.org/ril;1",
"nsIRadioInterfaceLayer");
XPCOMUtils.defineLazyServiceGetter(this, "IccService",
"@mozilla.org/icc/iccservice;1",
"nsIIccService");
XPCOMUtils.defineLazyServiceGetter(this, "IccProvider",
"@mozilla.org/ril/content-helper;1",
"nsIIccProvider");
XPCOMUtils.defineLazyServiceGetter(this, "MobileConnectionService",
"@mozilla.org/mobileconnection/mobileconnectionservice;1",
@ -116,11 +116,11 @@ this.MobileIdentityManager = {
return Ril;
},
get iccService() {
if (this._iccService) {
return this._iccService;
get iccProvider() {
if (this._iccProvider) {
return this._iccProvider;
}
return IccService;
return IccProvider;
},
get mobileConnectionService() {
@ -153,10 +153,8 @@ this.MobileIdentityManager = {
// We don't need to keep listening for changes until we rebuild the
// cache again.
for (let i = 0; i < self._iccInfo.length; i++) {
let icc = self.iccService.getIccByServiceId(i);
if (icc) {
icc.unregisterListener(iccListener);
}
self.iccProvider.unregisterIccMsg(self._iccInfo[i].clientId,
iccListener);
}
self._iccInfo = null;
@ -216,10 +214,7 @@ this.MobileIdentityManager = {
// We need to subscribe to ICC change notifications so we can refresh
// the cache if any change is observed.
let icc = this.iccService.getIccByServiceId(i);
if (icc) {
icc.registerListener(iccListener);
}
this.iccProvider.registerIccMsg(i, iccListener);
}
return this._iccInfo;

View File

@ -1002,19 +1002,13 @@ add_test(function() {
}
};
MobileIdentityManager._iccService = {
_iccs: [],
MobileIdentityManager._iccProvider = {
_listeners: [],
getIccByServiceId: function(aClientId) {
let self = this;
this_iccs.push({
registerListener: function(aIccListener) {
self._listeners.push(aIccListener);
},
unregisterListener: function() {
self._listeners.pop();
}
});
registerIccMsg: function(aClientId, aIccListener) {
this._listeners.push(aIccListener);
},
unregisterIccMsg: function() {
this._listeners.pop();
}
};
@ -1033,17 +1027,17 @@ add_test(function() {
}
// We should have listeners for each valid icc.
do_check_eq(MobileIdentityManager._iccService._listeners.length, 2);
do_check_eq(MobileIdentityManager._iccProvider._listeners.length, 2);
// We can mock an ICC change event at this point.
MobileIdentityManager._iccService._listeners[0].notifyIccInfoChanged();
MobileIdentityManager._iccProvider._listeners[0].notifyIccInfoChanged();
// After the ICC change event the caches should be null.
do_check_null(MobileIdentityManager._iccInfo);
do_check_null(MobileIdentityManager._iccIds);
// And we should have unregistered all listeners for ICC change events.
do_check_eq(MobileIdentityManager._iccService._listeners.length, 0);
do_check_eq(MobileIdentityManager._iccProvider._listeners.length, 0);
do_test_finished();
run_next_test();
@ -1110,19 +1104,13 @@ add_test(function() {
}
};
MobileIdentityManager._iccService = {
_iccs: [],
MobileIdentityManager._iccProvider = {
_listeners: [],
getIccByServiceId: function(aClientId) {
let self = this;
this_iccs.push({
registerListener: function(aIccListener) {
self._listeners.push(aIccListener);
},
unregisterListener: function() {
self._listeners.pop();
}
});
registerIccMsg: function(aClientId, aIccListener) {
this._listeners.push(aIccListener);
},
unregisterIccMsg: function() {
this._listeners.pop();
}
};
@ -1133,7 +1121,7 @@ add_test(function() {
do_check_eq(MobileIdentityManager._iccIds.length, 0);
// We should have listeners for each valid icc.
do_check_eq(MobileIdentityManager._iccService._listeners.length, 0);
do_check_eq(MobileIdentityManager._iccProvider._listeners.length, 0);
do_test_finished();
run_next_test();

View File

@ -5,6 +5,7 @@ MAINTAINER Jonas Finnemann Jensen <jopsen@gmail.com>
COPY b2g-desktop-config.py /home/worker/b2g-desktop-config.py
COPY dot-config /home/worker/.config
COPY dot-pulse /home/worker/.pulse
COPY hgrc /home/worker/.hgrc
COPY bin /home/worker/bin
COPY mozharness_configs /home/worker/mozharness_configs
COPY buildprops.json /home/worker/buildprops.json

Some files were not shown because too many files have changed in this diff Show More