Bug 1161438 - Part 1 - Exporting contact to SIM should also return updated contact. r=echen

This commit is contained in:
John Dai 2015-05-31 22:38:00 +02:00
parent 7f67be6b74
commit 760591146f

View File

@ -797,10 +797,11 @@ RilObject.prototype = {
* @param requestId Request id from RadioInterfaceLayer.
*/
updateICCContact: function(options) {
let onsuccess = function onsuccess() {
let onsuccess = function onsuccess(updatedContact) {
let recordIndex =
contact.pbrIndex * ICC_MAX_LINEAR_FIXED_RECORDS + contact.recordId;
contact.contactId = this.iccInfo.iccid + recordIndex;
updatedContact.pbrIndex * ICC_MAX_LINEAR_FIXED_RECORDS + updatedContact.recordId;
updatedContact.contactId = this.iccInfo.iccid + recordIndex;
options.contact = updatedContact;
// Reuse 'options' to get 'requestId' and 'contactType'.
this.sendChromeMessage(options);
}.bind(this);
@ -9358,6 +9359,8 @@ ICCPDUHelperObject.prototype = {
* @param numOctets Number of total octets to be writen, including trailing
* 0xff.
* @param str String to be written. Could be null.
*
* @return The string has been written into Buf.
*/
writeStringTo8BitUnpacked: function(numOctets, str) {
const langTable = PDU_NL_LOCKING_SHIFT_TABLES[PDU_NL_IDENTIFIER_DEFAULT];
@ -9396,6 +9399,8 @@ ICCPDUHelperObject.prototype = {
while (j++ < numOctets) {
GsmPDUHelper.writeHexOctet(0xff);
}
return (str) ? str.substring(0, i) : null;
},
/**
@ -9409,6 +9414,7 @@ ICCPDUHelperObject.prototype = {
* @param str
* String to be written.
*
* @return The string has been written into Buf.
*/
writeICCUCS2String: function(numOctets, str) {
let GsmPDUHelper = this.context.GsmPDUHelper;
@ -9468,7 +9474,7 @@ ICCPDUHelperObject.prototype = {
for (let i = str.length * 2; i < numOctets; i++) {
GsmPDUHelper.writeHexOctet(0xff);
}
return;
return str;
}
/**
* +------+-----+--------------+-----+-----+-----+--------+------+
@ -9541,6 +9547,7 @@ ICCPDUHelperObject.prototype = {
GsmPDUHelper.writeHexOctet(0xff);
}
}
return str;
},
/**
@ -9675,6 +9682,9 @@ ICCPDUHelperObject.prototype = {
* @param recordSize The size of linear fixed record.
* @param alphaId Alpha Identifier to be written.
* @param number Dialling Number to be written.
*
* @return An object contains the alphaId and number
* that have been written into Buf.
*/
writeAlphaIdDiallingNumber: function(recordSize, alphaId, number) {
let Buf = this.context.Buf;
@ -9685,13 +9695,16 @@ ICCPDUHelperObject.prototype = {
Buf.writeInt32(strLen);
let alphaLen = recordSize - ADN_FOOTER_SIZE_BYTES;
this.writeAlphaIdentifier(alphaLen, alphaId);
this.writeNumberWithLength(number);
let writtenAlphaId = this.writeAlphaIdentifier(alphaLen, alphaId);
let writtenNumber = this.writeNumberWithLength(number);
// Write unused octets 0xff, CCP and EXT1.
GsmPDUHelper.writeHexOctet(0xff);
GsmPDUHelper.writeHexOctet(0xff);
Buf.writeStringDelimiter(strLen);
return {alphaId: writtenAlphaId,
number: writtenNumber};
},
/**
@ -9736,18 +9749,20 @@ ICCPDUHelperObject.prototype = {
* @param alphaId
* Alpha Identifier to be written.
*
* @return The Alpha Identifier has been written into Buf.
*
* Unused octets will be written as 0xff.
*/
writeAlphaIdentifier: function(numOctets, alphaId) {
if (numOctets === 0) {
return;
return null;
}
// If alphaId is empty or it's of GSM 8 bit.
if (!alphaId || this.context.ICCUtilsHelper.isGsm8BitAlphabet(alphaId)) {
this.writeStringTo8BitUnpacked(numOctets, alphaId);
return this.writeStringTo8BitUnpacked(numOctets, alphaId);
} else {
this.writeICCUCS2String(numOctets, alphaId);
return this.writeICCUCS2String(numOctets, alphaId);
}
},
@ -9834,37 +9849,45 @@ ICCPDUHelperObject.prototype = {
return number;
},
/**
* Write Number with Length
*
* @param number The value to be written.
*
* @return The number has been written into Buf.
*/
writeNumberWithLength: function(number) {
let GsmPDUHelper = this.context.GsmPDUHelper;
if (number) {
let numStart = number[0] == "+" ? 1 : 0;
number = number.substring(0, numStart) +
number.substring(numStart)
.replace(/[^0-9*#,]/g, "")
.replace(/\*/g, "a")
.replace(/\#/g, "b")
.replace(/\,/g, "c");
let writtenNumber = number.substring(0, numStart) +
number.substring(numStart)
.replace(/[^0-9*#,]/g, "");
let numDigits = number.length - numStart;
let numDigits = writtenNumber.length - numStart;
if (numDigits > ADN_MAX_NUMBER_DIGITS) {
number = number.substring(0, ADN_MAX_NUMBER_DIGITS + numStart);
numDigits = number.length - numStart;
writtenNumber = writtenNumber.substring(0, ADN_MAX_NUMBER_DIGITS + numStart);
numDigits = writtenNumber.length - numStart;
}
// +1 for TON/NPI
let numLen = Math.ceil(numDigits / 2) + 1;
GsmPDUHelper.writeHexOctet(numLen);
this.writeDiallingNumber(number);
this.writeDiallingNumber(writtenNumber.replace(/\*/g, "a")
.replace(/\#/g, "b")
.replace(/\,/g, "c"));
// Write trailing 0xff of Dialling Number.
for (let i = 0; i < ADN_MAX_BCD_NUMBER_BYTES - numLen; i++) {
GsmPDUHelper.writeHexOctet(0xff);
}
return writtenNumber;
} else {
// +1 for numLen
for (let i = 0; i < ADN_MAX_BCD_NUMBER_BYTES + 1; i++) {
GsmPDUHelper.writeHexOctet(0xff);
}
return null;
}
}
};
@ -12268,15 +12291,16 @@ ICCRecordHelperObject.prototype = {
* @param onerror Callback to be called when error.
*/
updateADNLike: function(fileId, contact, pin2, onsuccess, onerror) {
let updatedContact;
function dataWriter(recordSize) {
this.context.ICCPDUHelper.writeAlphaIdDiallingNumber(recordSize,
contact.alphaId,
contact.number);
updatedContact = this.context.ICCPDUHelper.writeAlphaIdDiallingNumber(recordSize,
contact.alphaId,
contact.number);
}
function callback(options) {
if (onsuccess) {
onsuccess();
onsuccess(updatedContact);
}
}
@ -12511,6 +12535,7 @@ ICCRecordHelperObject.prototype = {
updateEmail: function(pbr, recordNumber, email, adnRecordId, onsuccess, onerror) {
let fileId = pbr[USIM_PBR_EMAIL].fileId;
let fileType = pbr[USIM_PBR_EMAIL].fileType;
let writtenEmail;
let dataWriter = function dataWriter(recordSize) {
let Buf = this.context.Buf;
let GsmPDUHelper = this.context.GsmPDUHelper;
@ -12521,9 +12546,9 @@ ICCRecordHelperObject.prototype = {
Buf.writeInt32(strLen);
if (fileType == ICC_USIM_TYPE1_TAG) {
ICCPDUHelper.writeStringTo8BitUnpacked(recordSize, email);
writtenEmail = ICCPDUHelper.writeStringTo8BitUnpacked(recordSize, email);
} else {
ICCPDUHelper.writeStringTo8BitUnpacked(recordSize - 2, email);
writtenEmail = ICCPDUHelper.writeStringTo8BitUnpacked(recordSize - 2, email);
GsmPDUHelper.writeHexOctet(pbr.adn.sfi || 0xff);
GsmPDUHelper.writeHexOctet(adnRecordId);
}
@ -12531,11 +12556,17 @@ ICCRecordHelperObject.prototype = {
Buf.writeStringDelimiter(strLen);
}.bind(this);
let callback = (options) => {
if (onsuccess) {
onsuccess(writtenEmail);
}
}
this.context.ICCIOHelper.updateLinearFixedEF({
fileId: fileId,
recordNumber: recordNumber,
dataWriter: dataWriter,
callback: onsuccess,
callback: callback,
onerror: onerror
});
},
@ -12608,6 +12639,7 @@ ICCRecordHelperObject.prototype = {
updateANR: function(pbr, recordNumber, number, adnRecordId, onsuccess, onerror) {
let fileId = pbr[USIM_PBR_ANR0].fileId;
let fileType = pbr[USIM_PBR_ANR0].fileType;
let writtenNumber;
let dataWriter = function dataWriter(recordSize) {
let Buf = this.context.Buf;
let GsmPDUHelper = this.context.GsmPDUHelper;
@ -12619,7 +12651,7 @@ ICCRecordHelperObject.prototype = {
// EF_AAS record Id. Unused for now.
GsmPDUHelper.writeHexOctet(0xff);
this.context.ICCPDUHelper.writeNumberWithLength(number);
writtenNumber = this.context.ICCPDUHelper.writeNumberWithLength(number);
// Write unused octets 0xff, CCP and EXT1.
GsmPDUHelper.writeHexOctet(0xff);
@ -12634,11 +12666,17 @@ ICCRecordHelperObject.prototype = {
Buf.writeStringDelimiter(strLen);
}.bind(this);
let callback = (options) => {
if (onsuccess) {
onsuccess(writtenNumber);
}
}
this.context.ICCIOHelper.updateLinearFixedEF({
fileId: fileId,
recordNumber: recordNumber,
dataWriter: dataWriter,
callback: onsuccess,
callback: callback,
onerror: onerror
});
},
@ -14760,12 +14798,18 @@ ICCContactHelperObject.prototype = {
let ICCRecordHelper = this.context.ICCRecordHelper;
let ICCUtilsHelper = this.context.ICCUtilsHelper;
let updateContactCb = (updatedContact) => {
updatedContact.pbrIndex = contact.pbrIndex;
updatedContact.recordId = contact.recordId;
onsuccess(updatedContact);
}
switch (contactType) {
case GECKO_CARDCONTACT_TYPE_ADN:
if (!this.hasDfPhoneBook(appType)) {
ICCRecordHelper.updateADNLike(ICC_EF_ADN, contact, null, onsuccess, onerror);
ICCRecordHelper.updateADNLike(ICC_EF_ADN, contact, null, updateContactCb, onerror);
} else {
this.updateUSimContact(contact, onsuccess, onerror);
this.updateUSimContact(contact, updateContactCb, onerror);
}
break;
case GECKO_CARDCONTACT_TYPE_FDN:
@ -14777,7 +14821,7 @@ ICCContactHelperObject.prototype = {
onerror(CONTACT_ERR_CONTACT_TYPE_NOT_SUPPORTED);
break;
}
ICCRecordHelper.updateADNLike(ICC_EF_FDN, contact, pin2, onsuccess, onerror);
ICCRecordHelper.updateADNLike(ICC_EF_FDN, contact, pin2, updateContactCb, onerror);
break;
default:
if (DEBUG) {
@ -15037,8 +15081,10 @@ ICCContactHelperObject.prototype = {
* @param onerror Callback to be called when error.
*/
updatePhonebookSet: function(pbr, contact, onsuccess, onerror) {
let updateAdnCb = function() {
this.updateSupportedPBRFields(pbr, contact, onsuccess, onerror);
let updateAdnCb = function(updatedContact) {
this.updateSupportedPBRFields(pbr, contact, (updatedContactField) => {
onsuccess(Object.assign(updatedContact, updatedContactField));
}, onerror);
}.bind(this);
this.context.ICCRecordHelper.updateADNLike(pbr.adn.fileId, contact, null,
@ -15055,12 +15101,15 @@ ICCContactHelperObject.prototype = {
*/
updateSupportedPBRFields: function(pbr, contact, onsuccess, onerror) {
let fieldIndex = 0;
let contactField = {};
(function updateField() {
let field = USIM_PBR_FIELDS[fieldIndex];
fieldIndex += 1;
if (!field) {
if (onsuccess) {
onsuccess();
onsuccess(contactField);
}
return;
}
@ -15071,7 +15120,10 @@ ICCContactHelperObject.prototype = {
return;
}
this.updateContactField(pbr, contact, field, updateField.bind(this), onerror);
this.updateContactField(pbr, contact, field, (fieldEntry) => {
contactField = Object.assign(contactField, fieldEntry);
updateField.call(this);
}, onerror);
}).call(this);
},
@ -15110,10 +15162,18 @@ ICCContactHelperObject.prototype = {
let ICCRecordHelper = this.context.ICCRecordHelper;
if (field === USIM_PBR_EMAIL) {
ICCRecordHelper.updateEmail(pbr, contact.recordId, contact.email, null, onsuccess, onerror);
ICCRecordHelper.updateEmail(pbr, contact.recordId, contact.email, null,
(updatedEmail) => {
onsuccess({email: updatedEmail});
}, onerror);
} else if (field === USIM_PBR_ANR0) {
let anr = Array.isArray(contact.anr) ? contact.anr[0] : null;
ICCRecordHelper.updateANR(pbr, contact.recordId, anr, null, onsuccess, onerror);
ICCRecordHelper.updateANR(pbr, contact.recordId, anr, null,
(updatedANR) => {
// ANR could have multiple files. If we support more than one anr,
// we will save it as anr0, anr1,...etc.
onsuccess((updatedANR) ? {anr: [updatedANR]} : null);
}, onerror);
} else {
if (DEBUG) {
this.context.debug("Unsupported field :" + field);
@ -15164,10 +15224,18 @@ ICCContactHelperObject.prototype = {
// Case 2.
if (field === USIM_PBR_EMAIL) {
ICCRecordHelper.updateEmail(pbr, recordId, contact.email, contact.recordId, onsuccess, onerror);
ICCRecordHelper.updateEmail(pbr, recordId, contact.email, contact.recordId,
(updatedEmail) => {
onsuccess({email: updatedEmail});
}, onerror);
} else if (field === USIM_PBR_ANR0) {
let anr = Array.isArray(contact.anr) ? contact.anr[0] : null;
ICCRecordHelper.updateANR(pbr, recordId, anr, contact.recordId, onsuccess, onerror);
ICCRecordHelper.updateANR(pbr, recordId, anr, contact.recordId,
(updatedANR) => {
// ANR could have multiple files. If we support more than one anr,
// we will save it as anr0, anr1,...etc.
onsuccess((updatedANR) ? {anr: [updatedANR]} : null);
}, onerror);
} else {
if (DEBUG) {
this.context.debug("Unsupported field :" + field);
@ -15191,16 +15259,26 @@ ICCContactHelperObject.prototype = {
*/
addContactFieldType2: function(pbr, contact, field, onsuccess, onerror) {
let ICCRecordHelper = this.context.ICCRecordHelper;
let successCb = function successCb(recordId) {
let updateCb = function updateCb() {
this.updateContactFieldIndexInIAP(pbr, contact.recordId, field, recordId, onsuccess, onerror);
let updateCb = function updateCb(contactField) {
this.updateContactFieldIndexInIAP(pbr, contact.recordId, field, recordId, () => {
onsuccess(contactField);
}, onerror);
}.bind(this);
if (field === USIM_PBR_EMAIL) {
ICCRecordHelper.updateEmail(pbr, recordId, contact.email, contact.recordId, updateCb, onerror);
ICCRecordHelper.updateEmail(pbr, recordId, contact.email, contact.recordId,
(updatedEmail) => {
updateCb({email: updatedEmail});
}, onerror);
} else if (field === USIM_PBR_ANR0) {
ICCRecordHelper.updateANR(pbr, recordId, contact.anr[0], contact.recordId, updateCb, onerror);
ICCRecordHelper.updateANR(pbr, recordId, contact.anr[0], contact.recordId,
(updatedANR) => {
// ANR could have multiple files. If we support more than one anr,
// we will save it as anr0, anr1,...etc.
updateCb((updatedANR) ? {anr: [updatedANR]} : null);
}, onerror);
}
}.bind(this);