Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
182 lines
5.6 KiB
JavaScript
Executable file
182 lines
5.6 KiB
JavaScript
Executable file
/* globals SIMSlot */
|
|
'use strict';
|
|
|
|
(function(window) {
|
|
var _start = Date.now();
|
|
var DEBUG = false;
|
|
|
|
/**
|
|
* SIMSlot is the API wrapper for each mobileConnection,
|
|
* and since one mobileConnection matches one SIM slot,
|
|
* we call it SIMSlot.
|
|
*
|
|
* @param {Object} conn mobileConnection
|
|
* @param {index} index The slot number of this SIM slot.
|
|
* @param {Object} [card] iccObject
|
|
*
|
|
* @property {Object} simCard Represent the current active iccObj,
|
|
* i.e., SIM card.
|
|
* @property {Number} index The slot number of this SIM slot.
|
|
*/
|
|
window.SIMSlot = function SIMSlot(conn, index, card) {
|
|
this.index = index;
|
|
this.conn = conn;
|
|
if (card) {
|
|
this.update(card);
|
|
}
|
|
|
|
/**
|
|
* TODO: Add event listeners on this.conn
|
|
*/
|
|
/**
|
|
* The event represents the instance is initialized.
|
|
* @event SIMSlot#simslot-created
|
|
*/
|
|
this.publish('created');
|
|
};
|
|
|
|
SIMSlot.EVENTS = ['cardstatechange', 'iccinfochange',
|
|
'stkcommand', 'stksessionend'];
|
|
|
|
SIMSlot.METHODS = ['sendStkResponse', 'sendStkMenuSelection',
|
|
'sendStkTimerExpiration', 'sendStkEventDownload'];
|
|
SIMSlot.DOM_REQUEST_METHODS = ['getCardLock', 'unlockCardLock', 'setCardLock',
|
|
'getCardLockRetryCount', 'readContacts',
|
|
'updateContact', 'iccOpenChannel', 'iccExchangeAPDU',
|
|
'iccCloseChannel'];
|
|
|
|
SIMSlot.ABSENT_TYPES = ['permanentBlocked'];
|
|
SIMSlot.LOCK_TYPES = ['pinRequired', 'pukRequired', 'networkLocked',
|
|
'corporateLocked', 'serviceProviderLocked',
|
|
'network1Locked', 'network2Locked', 'hrpdNetworkLocked',
|
|
'ruimCorporateLocked', 'ruimServiceProviderLocked'];
|
|
|
|
/**
|
|
* Update the iccObj.
|
|
*
|
|
* This method is called by SIMSlotManager when the iccObj
|
|
* needs to be updated.
|
|
* @param {Object} iccObj The iccObj belongs to this slot.
|
|
*/
|
|
SIMSlot.prototype.update = function ss_update(iccObj) {
|
|
this.simCard = iccObj;
|
|
this.constructor.EVENTS.forEach(function iterater(evt) {
|
|
iccObj.addEventListener(evt, this);
|
|
}, this);
|
|
|
|
this.constructor.DOM_REQUEST_METHODS.forEach(function iterator(domRequest) {
|
|
this[domRequest] = function() {
|
|
return iccObj[domRequest].apply(iccObj, arguments);
|
|
};
|
|
}, this);
|
|
|
|
this.constructor.METHODS.forEach(function iterator(method) {
|
|
this[method] = function() {
|
|
return iccObj[method].apply(iccObj, arguments);
|
|
};
|
|
}, this);
|
|
|
|
this.publish('updated');
|
|
};
|
|
|
|
/**
|
|
* The prefix of every event published by the SIMSlot instance.
|
|
* @type {String}
|
|
*/
|
|
SIMSlot.prototype.EVENT_PREFIX = 'simslot-';
|
|
SIMSlot.prototype.CLASS_NAME = 'SIMSLOT';
|
|
|
|
/**
|
|
* Publish an event with this instance in the detail.
|
|
* @param {String} eventName The event name without prefix
|
|
*/
|
|
SIMSlot.prototype.publish = function ss_publish(eventName) {
|
|
this.debug(' publish: ' + eventName);
|
|
window.dispatchEvent(new CustomEvent(this.EVENT_PREFIX + eventName, {
|
|
detail: this
|
|
}));
|
|
};
|
|
|
|
SIMSlot.prototype.handleEvent = function ss_handleEvent(evt) {
|
|
switch (evt.type) {
|
|
default:
|
|
this.publish(evt.type);
|
|
if (this.simCard) {
|
|
this.debug(this.simCard.cardState);
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
|
|
SIMSlot.prototype.debug = function() {
|
|
if (DEBUG) {
|
|
console.log('[' + this.CLASS_NAME + ']' +
|
|
'[' + (this.index) + ']' +
|
|
'[' + (new Date().getTime() / 1000 - _start).toFixed(3) + ']' +
|
|
Array.slice(arguments).concat());
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Indicate the slot has SIM card or not.
|
|
* @return {Boolean} Without SIM card or not.
|
|
*/
|
|
SIMSlot.prototype.isAbsent = function ss_isAbsent() {
|
|
return (!this.simCard ||
|
|
this.constructor.ABSENT_TYPES.indexOf(this.simCard.cardState) >= 0 ||
|
|
this.simCard && this.simCard.iccInfo &&
|
|
this.simCard.iccInfo.iccid === null);
|
|
};
|
|
|
|
/**
|
|
* Function to get simcard's smsc number
|
|
* @param {Function} cb your callback function to get smsc number
|
|
*/
|
|
SIMSlot.prototype.getSmsc = function ss_getSmsc(cb) {
|
|
var mobileMessage = window.navigator.mozMobileMessage;
|
|
if (!mobileMessage) {
|
|
console.error('can\'t access mozMobileMessage');
|
|
cb(null);
|
|
} else {
|
|
// The return type of getSmscAddress can be either a DOMRequest which
|
|
// resolves to a string for legacy implementations, or
|
|
// a Promise which resolves to a SmscAddress object in Bug 1043250.
|
|
mobileMessage.getSmscAddress(this.index).then(
|
|
(result) => {
|
|
var smsc;
|
|
// Keep the legacy behavior for backward compatibility. The legacy
|
|
// interface resolves to a string, and is always assumed to be in text
|
|
// mode.
|
|
if (typeof result === 'string' || result instanceof String) {
|
|
smsc = result.split(',')[0].replace(/"/g, '');
|
|
} else {
|
|
smsc = result.address;
|
|
}
|
|
cb(smsc);
|
|
},
|
|
(error) => {
|
|
console.error(error);
|
|
cb(null);
|
|
}
|
|
);
|
|
}
|
|
};
|
|
|
|
SIMSlot.prototype.isUnknownState = function ss_isUnknownState() {
|
|
var empty = (this.simCard.cardState === '');
|
|
var unknown = (this.simCard.cardState === 'unknown');
|
|
return !this.simCard.cardState || unknown || empty;
|
|
};
|
|
|
|
/**
|
|
* Indicate SIM card in the slot is locked or not.
|
|
* @return {Boolean} SIM card locked or not.
|
|
*/
|
|
SIMSlot.prototype.isLocked = function ss_isLocked() {
|
|
return this.constructor.LOCK_TYPES.indexOf(this.simCard.cardState) >= 0;
|
|
};
|
|
|
|
SIMSlot.prototype.getCardState = function ss_getCardState() {
|
|
return this.simCard.cardState;
|
|
};
|
|
}(window));
|