Skip to content

Commit

Permalink
Bug 824705 - Data connection is lost on reboot if SIM PIN code is ena…
Browse files Browse the repository at this point in the history
…bled
  • Loading branch information
fabi1cazenave committed Dec 28, 2012
1 parent 655b8a8 commit a913c26
Showing 1 changed file with 126 additions and 133 deletions.
259 changes: 126 additions & 133 deletions apps/system/js/operator_variant/operator_variant.js
Original file line number Original file line Diff line number Diff line change
@@ -1,132 +1,83 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- / /* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */


'use strict'; 'use strict';


(function OperatorVariant() { (function OperatorVariant() {
var gNetwork = null; /**
var cset = null; * Get the mcc/mnc info that has been stored in the settings.
*/


// Ensure Home Network Identity data. var settings = window.navigator.mozSettings;
function ensureHNI() { if (!settings)
var iccInfo = mobileConnection.iccInfo; return;
if (!iccInfo) {
return;
}


if (gNetwork && var iccSettings = { mcc: -1, mnc: -1 };
gNetwork.mcc == iccInfo.mcc &&
gNetwork.mnc == iccInfo.mnc) { // Read the mcc/mnc settings, then trigger callback.
return; function getICCSettings(callback) {
} var transaction = settings.createLock();
var mccKey = 'operatorvariant.mcc';
var mncKey = 'operatorvariant.mnc';

var mccRequest = transaction.get(mccKey);
mccRequest.onsuccess = function() {
iccSettings.mcc = parseInt(mccRequest.result[mccKey], 10) || 0;
var mncRequest = transaction.get(mncKey);
mncRequest.onsuccess = function() {
iccSettings.mnc = parseInt(mncRequest.result[mncKey], 10) || 0;
callback();
};
};
}


gNetwork = {};
gNetwork.mcc = iccInfo.mcc;
gNetwork.mnc = iccInfo.mnc;
applyOperatorVariantSettings();
};


function handleSettingsReady(key, value) { /**
cset[key] = value; * Compare the cached mcc/mnc info with the one in the SIM card,
ensureHNI(); * and retrieve/apply APN settings if they differ.
applyOperatorVariantSettings(); */
};


function applyOperatorVariantSettings() { var mobileConnection = window.navigator.mozMobileConnection;
if (!cset['operatorvariant.mcc'] || if (!mobileConnection)
!cset['operatorvariant.mnc']) { return;

// Check the mcc/mnc information on the SIM card.
function checkICCInfo() {
if (!mobileConnection.iccInfo || mobileConnection.cardState !== 'ready')
return; return;
}


var cardState = mobileConnection.cardState; // ensure that the iccSettings have been retrieved
if (gNetwork.mcc == 0 && gNetwork.mnc == 0 && cardState == 'ready') { if ((iccSettings.mcc < 0) || (iccSettings.mnc < 0))
return; return;
}
if ((gNetwork.mcc == cset['operatorvariant.mcc']) && // XXX sometimes we get 0/0 for mcc/mnc, even when cardState === 'ready'...
(gNetwork.mnc == cset['operatorvariant.mnc'])) { var mcc = parseInt(mobileConnection.iccInfo.mcc, 10) || 0;
var mnc = parseInt(mobileConnection.iccInfo.mnc, 10) || 0;
if (!mcc || !mnc)
return; return;
}


// new SIM card // same SIM card => do nothing
cset['operatorvariant.mcc'] = gNetwork.mcc; if ((mcc == iccSettings.mcc) && (mnc == iccSettings.mnc))
cset['operatorvariant.mnc'] = gNetwork.mnc; return;
retrieveOperatorVariantSettings(function onsuccess(result) {
var apnPrefNames = {
'default': {
'ril.data.carrier': 'carrier',
'ril.data.apn': 'apn',
'ril.data.user': 'user',
'ril.data.passwd': 'password',
'ril.data.httpProxyHost': 'proxy',
'ril.data.httpProxyPort': 'port'
},
'supl': {
'ril.supl.carrier': 'carrier',
'ril.supl.apn': 'apn',
'ril.supl.user': 'user',
'ril.supl.passwd': 'password',
'ril.supl.httpProxyHost': 'proxy',
'ril.supl.httpProxyPort': 'port'
},
'mms': {
'ril.mms.carrier': 'carrier',
'ril.mms.apn': 'apn',
'ril.mms.user': 'user',
'ril.mms.passwd': 'password',
'ril.mms.httpProxyHost': 'proxy',
'ril.mms.httpProxyPort': 'port',
'ril.mms.mmsc': 'mmsc',
'ril.mms.mmsproxy': 'mmsproxy',
'ril.mms.mmsport': 'mmsport'
},
'operatorvariant': {
'ril.iccInfo.mbdn': 'voicemail',
'ril.sms.strict7BitEncoding.enabled': 'enableStrict7BitEncodingForSms',
'ril.cellbroadcast.searchlist': 'cellBroadcastSearchList'
}
};


var booleanPrefNames = [ // new SIM card => cache iccInfo, load and apply new APN settings
'ril.sms.strict7BitEncoding.enabled' iccSettings.mcc = mcc;
]; iccSettings.mnc = mnc;

retrieveOperatorVariantSettings(applyOperatorVariantSettings);
var transaction = settings.createLock();
transaction.set(cset);
for (var type in apnPrefNames) {
var apn = {};
for (var i = 0; i < result.length; i++) {
if (result[i] && result[i].type.indexOf(type) != -1) {
apn = result[i];
break;
}
}
var prefNames = apnPrefNames[type];
for (var key in prefNames) {
var name = apnPrefNames[type][key];
var item = {};
if (booleanPrefNames.indexOf(key) != -1) {
item[key] = apn[name] || false;
} else {
item[key] = apn[name] || '';
}
transaction.set(item);
}
}
});
}; };


// Load and query APN database, then trigger callback on results.
function retrieveOperatorVariantSettings(callback) { function retrieveOperatorVariantSettings(callback) {
var OPERATOR_VARIANT_FILE = 'shared/resources/apn.json'; var OPERATOR_VARIANT_FILE = 'shared/resources/apn.json';


// load and query APN database, then trigger callback on results
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
xhr.open('GET', OPERATOR_VARIANT_FILE, true); xhr.open('GET', OPERATOR_VARIANT_FILE, true);
xhr.responseType = 'json'; xhr.responseType = 'json';
xhr.onreadystatechange = function() { xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status === 0)) { if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status === 0)) {
var apn = xhr.response; var apn = xhr.response;
var mcc = parseInt(cset['operatorvariant.mcc'], 10); var mcc = iccSettings.mcc;
var mnc = parseInt(cset['operatorvariant.mnc'], 10); var mnc = iccSettings.mnc;
// get a list of matching APNs // get a list of matching APNs
var compatibleAPN = apn[mcc] ? (apn[mcc][mnc] || []) : []; var compatibleAPN = apn[mcc] ? (apn[mcc][mnc] || []) : [];
callback(compatibleAPN); callback(compatibleAPN);
Expand All @@ -135,41 +86,83 @@
xhr.send(); xhr.send();
} }


var settings = window.navigator.mozSettings; // Store APN settings for the first carrier matching the mcc/mnc info.
if (!settings) { function applyOperatorVariantSettings(result) {
return; var apnPrefNames = {
} 'default': {
var mobileConnection = window.navigator.mozMobileConnection; 'ril.data.carrier': 'carrier',
if (!mobileConnection) { 'ril.data.apn': 'apn',
return; 'ril.data.user': 'user',
} 'ril.data.passwd': 'password',
'ril.data.httpProxyHost': 'proxy',
'ril.data.httpProxyPort': 'port'
},
'supl': {
'ril.supl.carrier': 'carrier',
'ril.supl.apn': 'apn',
'ril.supl.user': 'user',
'ril.supl.passwd': 'password',
'ril.supl.httpProxyHost': 'proxy',
'ril.supl.httpProxyPort': 'port'
},
'mms': {
'ril.mms.carrier': 'carrier',
'ril.mms.apn': 'apn',
'ril.mms.user': 'user',
'ril.mms.passwd': 'password',
'ril.mms.httpProxyHost': 'proxy',
'ril.mms.httpProxyPort': 'port',
'ril.mms.mmsc': 'mmsc',
'ril.mms.mmsproxy': 'mmsproxy',
'ril.mms.mmsport': 'mmsport'
},
'operatorvariant': {
'ril.iccInfo.mbdn': 'voicemail',
'ril.sms.strict7BitEncoding.enabled': 'enableStrict7BitEncodingForSms',
'ril.cellbroadcast.searchlist': 'cellBroadcastSearchList'
}
};


function onerrorRequest() { var booleanPrefNames = [
}; 'ril.sms.strict7BitEncoding.enabled'
];

// store relevant APN settings
var transaction = settings.createLock();
for (var type in apnPrefNames) {
var apn = {};
for (var i = 0; i < result.length; i++) {
if (result[i] && result[i].type.indexOf(type) != -1) {
apn = result[i];
break;
}
}
var prefNames = apnPrefNames[type];
for (var key in prefNames) {
var name = apnPrefNames[type][key];
var item = {};
if (booleanPrefNames.indexOf(key) != -1) {
item[key] = apn[name] || false;
} else {
item[key] = apn[name] || '';
}
transaction.set(item);
}
}


cset = {}; // store the current mcc/mnc info in the settings
var transaction = settings.createLock(); transaction.set({
'operatorvariant.mcc': iccSettings.mcc,
'operatorvariant.mnc': iccSettings.mnc
});
}


var mcc_request = transaction.get('operatorvariant.mcc');
mcc_request.onsuccess = function() {
var value = -1;
if (mcc_request.result['operatorvariant.mcc']) {
value = mcc_request.result['operatorvariant.mcc'];
}
handleSettingsReady('operatorvariant.mcc', value);
};
mcc_request.onerror = onerrorRequest;


var mnc_request = transaction.get('operatorvariant.mnc'); /**
mnc_request.onsuccess = function() { * Check the APN settings on startup and when the SIM card is changed.
var value = -1; */
if (mnc_request.result['operatorvariant.mnc']) {
value = mnc_request.result['operatorvariant.mnc'];
}
handleSettingsReady('operatorvariant.mnc', value);
};
mnc_request.onerror = onerrorRequest;


mobileConnection.addEventListener('iccinfochange', ensureHNI); getICCSettings(checkICCInfo);
mobileConnection.addEventListener('iccinfochange', checkICCInfo);
})(); })();


0 comments on commit a913c26

Please sign in to comment.