From f8d13b41766f638f32c5531f3068d08b05b714a0 Mon Sep 17 00:00:00 2001 From: Edgar Chen Date: Wed, 6 Mar 2013 10:12:23 +0800 Subject: [PATCH] Bug 847820 - Part 3: RIL implementation. r=allstars.chh --- dom/system/gonk/RILContentHelper.js | 42 +++++++++++++++++++++- dom/system/gonk/RadioInterfaceLayer.js | 35 ++++++++---------- dom/system/gonk/nsIRadioInterfaceLayer.idl | 39 +------------------- 3 files changed, 56 insertions(+), 60 deletions(-) diff --git a/dom/system/gonk/RILContentHelper.js b/dom/system/gonk/RILContentHelper.js index 231946ae59b9..a46187c5e476 100644 --- a/dom/system/gonk/RILContentHelper.js +++ b/dom/system/gonk/RILContentHelper.js @@ -81,7 +81,8 @@ const RIL_IPC_MSG_NAMES = [ "RIL:CfStateChanged", "RIL:IccOpenChannel", "RIL:IccCloseChannel", - "RIL:IccExchangeAPDU" + "RIL:IccExchangeAPDU", + "RIL:IccUpdateContact" ]; XPCOMUtils.defineLazyServiceGetter(this, "cpmm", @@ -655,6 +656,34 @@ RILContentHelper.prototype = { return request; }, + updateContact: function updateContact(window, contactType, contact, pin2) { + if (window == null) { + throw Components.Exception("Can't get window object", + Cr.NS_ERROR_UNEXPECTED); + } + + let request = Services.DOMRequest.createRequest(window); + let requestId = this.getRequestId(request); + + // Parsing nsDOMContact to Icc Contact format + let iccContact = {}; + + if (contact.name) { + iccContact.alphaId = contact.name[0]; + } + + if (contact.tel) { + iccContact.number = contact.tel[0].value; + } + + cpmm.sendAsyncMessage("RIL:IccUpdateContact", {requestId: requestId, + contactType: contactType, + contact: iccContact, + pin2: pin2}); + + return request; + }, + getCallForwardingOption: function getCallForwardingOption(window, reason) { if (window == null) { throw Components.Exception("Can't get window object", @@ -1057,6 +1086,9 @@ RILContentHelper.prototype = { case "RIL:IccExchangeAPDU": this.handleIccExchangeAPDU(msg.json); break; + case "RIL:IccUpdateContact": + this.handleIccUpdateContact(msg.json); + break; case "RIL:DataError": this.updateConnectionInfo(msg.json, this.rilContext.dataConnectionInfo); this._deliverEvent("_mobileConnectionListeners", "notifyDataError", @@ -1168,6 +1200,14 @@ RILContentHelper.prototype = { } }, + handleIccUpdateContact: function handleIccUpdateContact(message) { + if (message.errorMsg) { + this.fireRequestError(message.requestId, message.errorMsg); + } else { + this.fireRequestSuccess(message.requestId, null); + } + }, + handleVoicemailNotification: function handleVoicemailNotification(message) { let changed = false; if (!this.voicemailStatus) { diff --git a/dom/system/gonk/RadioInterfaceLayer.js b/dom/system/gonk/RadioInterfaceLayer.js index 978524b880a8..5b32c62c421a 100644 --- a/dom/system/gonk/RadioInterfaceLayer.js +++ b/dom/system/gonk/RadioInterfaceLayer.js @@ -99,6 +99,7 @@ const RIL_IPC_MOBILECONNECTION_MSG_NAMES = [ "RIL:IccOpenChannel", "RIL:IccExchangeAPDU", "RIL:IccCloseChannel", + "RIL:IccUpdateContact", "RIL:RegisterMobileConnectionMsg", "RIL:RegisterIccMsg", "RIL:SetCallForwardingOption", @@ -510,6 +511,10 @@ RadioInterfaceLayer.prototype = { this.saveRequestTarget(msg); this.iccExchangeAPDU(msg.json); break; + case "RIL:IccUpdateContact": + this.saveRequestTarget(msg); + this.updateICCContact(msg.json); + break; case "RIL:RegisterMobileConnectionMsg": this.registerMessageTarget("mobileconnection", msg.target); break; @@ -675,15 +680,7 @@ RadioInterfaceLayer.prototype = { } break; case "icccontactupdate": - if (!this._contactUpdateCallbacks) { - return; - } - let updateCallback = this._contactUpdateCallbacks[message.requestId]; - if (updateCallback) { - delete this._contactUpdateCallbacks[message.requestId]; - updateCallback.onUpdated(message.errorMsg, - message.contactType); - } + this.handleIccUpdateContact(message); break; case "iccmbdn": this.handleICCMbdn(message); @@ -1397,6 +1394,11 @@ RadioInterfaceLayer.prototype = { this._sendRequestResults("RIL:EnumerateCalls", options); }, + handleIccUpdateContact: function handleIccUpdateContact(message) { + debug("handleIccUpdateContact: " + JSON.stringify(message)); + this._sendRequestResults("RIL:IccUpdateContact", message); + }, + /** * Open Logical UICC channel (aid) for Secure Element access */ @@ -2883,18 +2885,9 @@ RadioInterfaceLayer.prototype = { requestId: requestId}); }, - _contactUpdateCallbacks: null, - updateICCContact: function updateICCContact(contactType, contact, pin2, callback) { - if (!this._contactUpdateCallbacks) { - this._contactUpdateCallbacks = {}; - } - let requestId = Math.floor(Math.random() * 1000); - this._contactUpdateCallbacks[requestId] = callback; - this.worker.postMessage({rilMessageType: "updateICCContact", - contactType: contactType, - contact: contact, - pin2: pin2, - requestId: requestId}); + updateICCContact: function updateICCContact(message) { + message.rilMessageType = "updateICCContact"; + this.worker.postMessage(message); }, }; diff --git a/dom/system/gonk/nsIRadioInterfaceLayer.idl b/dom/system/gonk/nsIRadioInterfaceLayer.idl index 59eceddb3d98..37b8bd9be500 100644 --- a/dom/system/gonk/nsIRadioInterfaceLayer.idl +++ b/dom/system/gonk/nsIRadioInterfaceLayer.idl @@ -69,21 +69,6 @@ interface nsIRILContactCallback : nsISupports in jsval contacts); }; -[scriptable, function, uuid(ab954d56-12a1-4c6b-8753-14ad5664111d)] -interface nsIRILContactUpdateCallback : nsISupports -{ - /** - * Called when an ICC contact is updated. - * - * @param errorMsg - * Error message from RIL. - * @param contactType - * Type of the contact, i.e. ADN, FDN. - */ - void onUpdated(in DOMString errorMsg, - in DOMString contactType); -}; - [scriptable, uuid(c0c5cb9f-6372-4b5a-b74c-baacc2da5e4f)] interface nsIVoicemailInfo : nsISupports { @@ -108,7 +93,7 @@ interface nsIRilContext : nsISupports readonly attribute nsIDOMMozMobileConnectionInfo data; }; -[scriptable, uuid(8b3a1bc8-86d2-11e2-ace0-33f0ed290b90)] +[scriptable, uuid(9a914550-8f7a-11e2-9e96-0800200c9a66)] interface nsIRadioInterfaceLayer : nsISupports { /** @@ -164,26 +149,4 @@ interface nsIRadioInterfaceLayer : nsISupports */ void getICCContacts(in DOMString contactType, in nsIRILContactCallback callback); - - /** - * Update ICC Contact. - * - * This function allows two operations: update the existing contact or - * insert a new contact. - * If the contact has 'recordId' property, the corresponding record will be - * updated. If not, the contact will be inserted. - * - * @param contactType One of the values below. - * "ADN" (Abbreviated Dialling Numbers) - * "FDN" (Fixed Dialling Numbers) - * @param contact The contact will be updated. - * If has 'recordId' property, updates corresponding record. - * If not, finds a free record and updates it. - * @param pin2 PIN2 is required for updating FDN, otherwise should be "". - * @param callback A nsIRILContactUpdateCallback object. - */ - void updateICCContact(in DOMString contactType, - in jsval contact, - in DOMString pin2, - in nsIRILContactUpdateCallback callback); };