Bug 854326 - B2G Multi-SIM: support multiple SIM cards for SMS/MMS (part 3, add ICC ID). r=vicamo

This commit is contained in:
Gene Lian 2013-11-02 18:17:25 +08:00
Родитель 339d80b66e
Коммит c44807d445
4 изменённых файлов: 114 добавлений и 39 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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");

Просмотреть файл

@ -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,

Просмотреть файл

@ -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,