mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1161438 - Part 1 - Exporting contact to SIM should also return updated contact. r=echen
This commit is contained in:
parent
7f67be6b74
commit
760591146f
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user