VulpesOS/gaia/apps/wappush/js/store.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

171 lines
5.1 KiB
JavaScript
Executable file

/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
/* exported StoreProvisioning */
/* global uuid */
'use strict';
/**
* The StoreProvisioning singleton is a database helper in charge of storing the
* APNs into the settings database.
*
*/
var StoreProvisioning = (function() {
var CP_APN_KEY = 'ril.data.cp.apns';
var MCC_KEY = 'operatorvariant.mcc';
var MNC_KEY = 'operatorvariant.mnc';
var mccMncCodes = { mcc: '000', mnc: '00' };
/**
* Loads the operator numeric value (MCC and MNC codes) stored into the
* settings database. The APNs are stored relaying on these codes.
*
* @param {Number} iccCardIndex Index of the card on which the message was
* received. We are going to add the apns to
* the right card.
* @param {function} callback It will be called once the work is done (only
* useful for unit testing). This function doesn't
* any parameter.
*/
function sp_getMccMncCodes(iccCardIndex, callback) {
var settings = navigator.mozSettings;
if (!settings) {
if (callback) {
callback();
}
return;
}
iccCardIndex = iccCardIndex || 0;
var transaction = navigator.mozSettings.createLock();
var mccRequest = transaction.get(MCC_KEY);
mccRequest.onsuccess = function() {
var mccs = mccRequest.result[MCC_KEY];
if (!mccs || !Array.isArray(mccs) || !mccs[iccCardIndex]) {
mccMncCodes.mcc = '000';
} else {
mccMncCodes.mcc = mccs[iccCardIndex];
}
var mncRequest = transaction.get(MNC_KEY);
mncRequest.onsuccess = function() {
var mncs = mncRequest.result[MNC_KEY];
if (!mncs || !Array.isArray(mncs) || !mncs[iccCardIndex]) {
mccMncCodes.mnc = '00';
} else {
mccMncCodes.mnc = mncs[iccCardIndex];
}
if (callback) {
callback(mccMncCodes.mcc, mccMncCodes.mnc);
}
};
};
}
/**
* Stores the APNs into the settings database.
*
* @param {Array} parameters The array containing the APNs.
* @param {Number} iccCardIndex Index of the card on which the message was
* received.
* @param {function} callback It will be called once the work is done (only
* useful for unit testing). This function doesn't
* accetp any parameter.
*/
function sp_provision(parameters, iccCardIndex, callback) {
var existingApns = null;
var newApns = {};
// Add an unique id to identify APNs with the same carrier name
for (var i = 0; i < parameters.length; i++) {
parameters[i]._id = uuid();
}
var settings = navigator.mozSettings;
if (!settings) {
if (callback) {
callback();
}
return;
}
sp_getMccMncCodes(iccCardIndex, function sp_getMccMncCodesCb() {
var transaction = navigator.mozSettings.createLock();
var load = transaction.get(CP_APN_KEY);
load.onsuccess = function onsuccessCb() {
existingApns = load.result[CP_APN_KEY];
var data = {}, mcc = mccMncCodes.mcc, mnc = mccMncCodes.mnc;
if (!existingApns) {
newApns[mcc] = {};
newApns[mcc][mnc] = parameters;
data[CP_APN_KEY] = newApns;
} else {
if (!existingApns[mcc]) {
existingApns[mcc] = {};
}
if (!existingApns[mcc][mnc]) {
existingApns[mcc][mnc] = [];
}
// TODO: Should we handle possible duplicated APNs?
existingApns[mcc][mnc] = existingApns[mcc][mnc].concat(parameters);
data[CP_APN_KEY] = existingApns;
}
transaction.set(data);
iccCardIndex = iccCardIndex || 0;
var request = transaction.get('ril.data.apnSettings');
request.onsuccess = function() {
var apnSettings = request.result['ril.data.apnSettings'];
if (!apnSettings || !Array.isArray(apnSettings)) {
apnSettings = [[], []];
}
var apnList = apnSettings[iccCardIndex];
parameters.forEach(function(apn) {
var apnEnabled = false;
for (var i = 0; i < apnList.length; i++) {
if (apnList[i].types[0] === apn.types[0]) {
apnList[i] = apn;
apnEnabled = true;
break;
}
}
if (!apnEnabled) {
apnList.push(apn);
}
});
transaction.set({
'ril.data.apnSettings': apnSettings,
'apn.selections': null
});
if (callback) {
callback();
}
};
request.onerror = function onError() {
if (callback) {
callback();
}
};
};
load.onerror = function onerrorCb() {
if (callback) {
callback();
}
};
});
}
return {
getMccMncCodes: sp_getMccMncCodes,
provision: sp_provision
};
})();