From c44807d445c031aa00a1096fa7cc72ef2d15adcb Mon Sep 17 00:00:00 2001 From: Gene Lian Date: Sat, 2 Nov 2013 18:17:25 +0800 Subject: [PATCH] Bug 854326 - B2G Multi-SIM: support multiple SIM cards for SMS/MMS (part 3, add ICC ID). r=vicamo --- .../nsIRilMobileMessageDatabaseService.idl | 2 + dom/mobilemessage/src/gonk/MmsService.js | 88 ++++++++++++------- .../src/gonk/MobileMessageDatabaseService.js | 29 +++++- dom/system/gonk/RadioInterfaceLayer.js | 34 +++++-- 4 files changed, 114 insertions(+), 39 deletions(-) diff --git a/dom/mobilemessage/interfaces/nsIRilMobileMessageDatabaseService.idl b/dom/mobilemessage/interfaces/nsIRilMobileMessageDatabaseService.idl index dbbfdf59e108..2a9cc4429cb6 100644 --- a/dom/mobilemessage/interfaces/nsIRilMobileMessageDatabaseService.idl +++ b/dom/mobilemessage/interfaces/nsIRilMobileMessageDatabaseService.idl @@ -33,6 +33,7 @@ interface nsIRilMobileMessageDatabaseService : nsIMobileMessageDatabaseService * - |type| DOMString: "sms" or "mms" * - |sender| DOMString: the phone number of sender * - |timestamp| Number: the timestamp of received message + * - |iccId| DOMString: the ICC ID of the SIM for receiving message * * - If |type| == "sms", we also need: * - |messageClass| DOMString: the message class of received message @@ -57,6 +58,7 @@ interface nsIRilMobileMessageDatabaseService : nsIMobileMessageDatabaseService * - |sender| DOMString: the phone number of sender * - |timestamp| Number: the timestamp of sending message * - |deliveryStatusRequested| Bool: true when the delivery report is requested. + * - |iccId| DOMString: the ICC ID of the SIM for sending message * * - If |type| == "sms", we also need: * - |receiver| DOMString: the phone number of receiver diff --git a/dom/mobilemessage/src/gonk/MmsService.js b/dom/mobilemessage/src/gonk/MmsService.js index f79346e12f7b..4cb79aa09892 100644 --- a/dom/mobilemessage/src/gonk/MmsService.js +++ b/dom/mobilemessage/src/gonk/MmsService.js @@ -246,6 +246,55 @@ XPCOMUtils.defineLazyGetter(this, "gMmsConnection", function () { return isRoaming; }, + /** + * Get phone number from iccInfo. + * + * If the icc card is gsm card, the phone number is in msisdn. + * @see nsIDOMMozGsmIccInfo + * + * Otherwise, the phone number is in mdn. + * @see nsIDOMMozCdmaIccInfo + */ + getPhoneNumber: function getPhoneNumber() { + let iccInfo = gRadioInterface.rilContext.iccInfo; + + if (!iccInfo) { + return null; + } + + let number = (iccInfo instanceof Ci.nsIDOMMozGsmIccInfo) + ? iccInfo.msisdn : iccInfo.mdn; + + // Workaround an xpconnect issue with undefined string objects. + // See bug 808220 + if (number === undefined || number === "undefined") { + return null; + } + + return number; + }, + + /** + * A utility function to get the ICC ID of the SIM card (if installed). + */ + getIccId: function getIccId() { + let iccInfo = gRadioInterface.rilContext.iccInfo; + + if (!iccInfo || !(iccInfo instanceof Ci.nsIDOMMozGsmIccInfo)) { + return null; + } + + let iccId = iccInfo.iccid; + + // Workaround an xpconnect issue with undefined string objects. + // See bug 808220 + if (iccId === undefined || iccId === "undefined") { + return null; + } + + return iccId; + }, + /** * Acquire the MMS network connection. * @@ -1282,33 +1331,6 @@ MmsService.prototype = { return config >= CONFIG_SEND_REPORT_DEFAULT_YES; }, - /** - * Get phone number from iccInfo. - * - * If the icc card is gsm card, the phone number is in msisdn. - * @see nsIDOMMozGsmIccInfo - * - * Otherwise, the phone number is in mdn. - * @see nsIDOMMozCdmaIccInfo - */ - getPhoneNumber: function getPhoneNumber() { - let iccInfo = gRadioInterface.rilContext.iccInfo; - - if (!iccInfo) { - return null; - } - - let number = (iccInfo instanceof Ci.nsIDOMMozGsmIccInfo) - ? iccInfo.msisdn : iccInfo.mdn; - - // Workaround an xpconnect issue with undefined string objects. - // See bug 808220 - if (number === undefined || number === "undefined") { - return null; - } - return number; - }, - /** * Convert intermediate message to indexedDB savable object. * @@ -1354,7 +1376,8 @@ MmsService.prototype = { intermediate.sender = "anonymous"; } intermediate.receivers = []; - intermediate.phoneNumber = this.getPhoneNumber(); + intermediate.phoneNumber = gMmsConnection.getPhoneNumber(); + intermediate.iccId = gMmsConnection.getIccId(); return intermediate; }, @@ -1368,7 +1391,8 @@ MmsService.prototype = { * The indexedDB savable MMS message, which is going to be * merged with the extra retrieval confirmation. */ - mergeRetrievalConfirmation: function mergeRetrievalConfirmation(intermediate, savable) { + mergeRetrievalConfirmation: function mergeRetrievalConfirmation(intermediate, + savable) { savable.timestamp = Date.now(); if (intermediate.headers.from) { savable.sender = intermediate.headers.from.address; @@ -1644,7 +1668,8 @@ MmsService.prototype = { retrievalMode = Services.prefs.getCharPref(kPrefRetrievalMode); } catch (e) {} - let savableMessage = this.convertIntermediateToSavable(notification, retrievalMode); + let savableMessage = this.convertIntermediateToSavable(notification, + retrievalMode); gMobileMessageDatabaseService .saveReceivedMessage(savableMessage, @@ -1845,7 +1870,8 @@ MmsService.prototype = { aMessage["type"] = "mms"; aMessage["timestamp"] = Date.now(); aMessage["receivers"] = receivers; - aMessage["sender"] = this.getPhoneNumber(); + aMessage["sender"] = gMmsConnection.getPhoneNumber(); + aMessage["iccId"] = gMmsConnection.getIccId(); try { aMessage["deliveryStatusRequested"] = Services.prefs.getBoolPref("dom.mms.requestStatusReport"); diff --git a/dom/mobilemessage/src/gonk/MobileMessageDatabaseService.js b/dom/mobilemessage/src/gonk/MobileMessageDatabaseService.js index de94ba2819a3..76b1827bd41b 100644 --- a/dom/mobilemessage/src/gonk/MobileMessageDatabaseService.js +++ b/dom/mobilemessage/src/gonk/MobileMessageDatabaseService.js @@ -24,7 +24,7 @@ const DISABLE_MMS_GROUPING_FOR_RECEIVING = true; const DB_NAME = "sms"; -const DB_VERSION = 15; +const DB_VERSION = 16; const MESSAGE_STORE_NAME = "sms"; const THREAD_STORE_NAME = "thread"; const PARTICIPANT_STORE_NAME = "participant"; @@ -230,6 +230,10 @@ MobileMessageDatabaseService.prototype = { self.upgradeSchema14(event.target.transaction, next); break; case 15: + if (DEBUG) debug("Upgrade to version 15. Add ICC ID for each message."); + self.upgradeSchema15(event.target.transaction, next); + break; + case 16: // This will need to be moved for each new version if (DEBUG) debug("Upgrade finished."); break; @@ -1049,6 +1053,25 @@ MobileMessageDatabaseService.prototype = { }; }, + /** + * Add ICC ID. + */ + upgradeSchema15: function upgradeSchema15(transaction, next) { + let messageStore = transaction.objectStore(MESSAGE_STORE_NAME); + messageStore.openCursor().onsuccess = function(event) { + let cursor = event.target.result; + if (!cursor) { + next(); + return; + } + + let messageRecord = cursor.value; + messageRecord.iccId = null; + cursor.update(messageRecord); + cursor.continue(); + }; + }, + matchParsedPhoneNumbers: function matchParsedPhoneNumbers(addr1, parsedAddr1, addr2, parsedAddr2) { if ((parsedAddr1.internationalNumber && @@ -1104,7 +1127,7 @@ MobileMessageDatabaseService.prototype = { if (aMessageRecord.type == "sms") { return gMobileMessageService.createSmsMessage(aMessageRecord.id, aMessageRecord.threadId, - null, // TODO + aMessageRecord.iccId, aMessageRecord.delivery, aMessageRecord.deliveryStatus, aMessageRecord.sender, @@ -1160,7 +1183,7 @@ MobileMessageDatabaseService.prototype = { } return gMobileMessageService.createMmsMessage(aMessageRecord.id, aMessageRecord.threadId, - null, // TODO + aMessageRecord.iccId, aMessageRecord.delivery, aMessageRecord.deliveryInfo, aMessageRecord.sender, diff --git a/dom/system/gonk/RadioInterfaceLayer.js b/dom/system/gonk/RadioInterfaceLayer.js index f09b08ece884..0b5fff974111 100644 --- a/dom/system/gonk/RadioInterfaceLayer.js +++ b/dom/system/gonk/RadioInterfaceLayer.js @@ -1144,9 +1144,31 @@ RadioInterface.prototype = { if (number === undefined || number === "undefined") { return null; } + return number; }, + /** + * A utility function to get the ICC ID of the SIM card (if installed). + */ + getIccId: function getIccId() { + let iccInfo = this.rilContext.iccInfo; + + if (!iccInfo || !(iccInfo instanceof GsmIccInfo)) { + return null; + } + + let iccId = iccInfo.iccid; + + // Workaround an xpconnect issue with undefined string objects. + // See bug 808220 + if (iccId === undefined || iccId === "undefined") { + return null; + } + + return iccId; + }, + updateNetworkInfo: function updateNetworkInfo(message) { let voiceMessage = message[RIL.NETWORK_INFO_VOICE_REGISTRATION_STATE]; let dataMessage = message[RIL.NETWORK_INFO_DATA_REGISTRATION_STATE]; @@ -1835,6 +1857,7 @@ RadioInterface.prototype = { message.receiver = this.getPhoneNumber(); message.body = message.fullBody = message.fullBody || null; message.timestamp = Date.now(); + message.iccId = this.getIccId(); if (gSmsService.isSilentNumber(message.sender)) { message.id = -1; @@ -1846,7 +1869,7 @@ RadioInterface.prototype = { let domMessage = gMobileMessageService.createSmsMessage(message.id, message.threadId, - null, // TODO + message.iccId, message.delivery, message.deliveryStatus, message.sender, @@ -1912,7 +1935,7 @@ RadioInterface.prototype = { let domMessage = gMobileMessageService.createSmsMessage(message.id, message.threadId, - null, // TODO + message.iccId, message.delivery, message.deliveryStatus, message.sender, @@ -3022,7 +3045,7 @@ RadioInterface.prototype = { context.request.notifyMessageSent( gMobileMessageService.createSmsMessage(sms.id, sms.threadId, - null, // TODO + sms.iccId, DOM_MOBILE_MESSAGE_DELIVERY_SENT, sms.deliveryStatus, sms.sender, @@ -3065,7 +3088,8 @@ RadioInterface.prototype = { receiver: number, body: message, deliveryStatusRequested: options.requestStatusReport, - timestamp: Date.now() + timestamp: Date.now(), + iccId: this.getIccId() }; if (silent) { @@ -3074,7 +3098,7 @@ RadioInterface.prototype = { let domMessage = gMobileMessageService.createSmsMessage(-1, // id 0, // threadId - null, // TODO + sendingMessage.iccId, delivery, deliveryStatus, sendingMessage.sender,