diff --git a/dom/system/gonk/GonkGPSGeolocationProvider.cpp b/dom/system/gonk/GonkGPSGeolocationProvider.cpp index 3e91bae55458..06ca36888733 100644 --- a/dom/system/gonk/GonkGPSGeolocationProvider.cpp +++ b/dom/system/gonk/GonkGPSGeolocationProvider.cpp @@ -24,6 +24,7 @@ #include "nsIInterfaceRequestorUtils.h" #include "nsINetworkManager.h" #include "nsIRadioInterfaceLayer.h" +#include "nsIDOMMobileConnection.h" #include "nsThreadUtils.h" #ifdef AGPS_TYPE_INVALID @@ -371,11 +372,15 @@ GonkGPSGeolocationProvider::SetReferenceLocation() icc->GetMcc(&location.u.cellID.mcc); icc->GetMnc(&location.u.cellID.mnc); } - nsCOMPtr cell; - rilCtx->GetCell(getter_AddRefs(cell)); - if (cell) { - cell->GetLac(&location.u.cellID.lac); - cell->GetCid(&location.u.cellID.cid); + nsCOMPtr voice; + rilCtx->GetVoice(getter_AddRefs(voice)); + if (voice) { + nsCOMPtr cell; + voice->GetCell(getter_AddRefs(cell)); + if (cell) { + cell->GetGsmLocationAreaCode(&location.u.cellID.lac); + cell->GetGsmCellId(&location.u.cellID.cid); + } } if (mAGpsRilInterface) { mAGpsRilInterface->set_ref_location(&location, sizeof(location)); diff --git a/dom/system/gonk/RILContentHelper.js b/dom/system/gonk/RILContentHelper.js index 32e2a3a1cfe3..48b5a090baee 100644 --- a/dom/system/gonk/RILContentHelper.js +++ b/dom/system/gonk/RILContentHelper.js @@ -33,6 +33,8 @@ const MOBILECONNECTIONINFO_CID = Components.ID("{a35cfd39-2d93-4489-ac7d-396475dacb27}"); const MOBILENETWORKINFO_CID = Components.ID("{a6c8416c-09b4-46d1-bf29-6520d677d085}"); +const MOBILECELLINFO_CID = + Components.ID("{5e809018-68c0-4c54-af0b-2a9b8f748c45}"); const VOICEMAILSTATUS_CID= Components.ID("{5467f2eb-e214-43ea-9b89-67711241ec8e}"); @@ -89,6 +91,7 @@ MobileConnectionInfo.prototype = { emergencyCallsOnly: false, roaming: false, network: null, + cell: null, type: null, signalStrength: null, relSignalStrength: null @@ -114,6 +117,23 @@ MobileNetworkInfo.prototype = { state: null }; +function MobileCellInfo() {} +MobileCellInfo.prototype = { + QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMMozMobileCellInfo]), + classID: MOBILECELLINFO_CID, + classInfo: XPCOMUtils.generateCI({ + classID: MOBILECELLINFO_CID, + classDescription: "MobileCellInfo", + flags: Ci.nsIClassInfo.DOM_OBJECT, + interfaces: [Ci.nsIDOMMozMobileCellInfo] + }), + + // nsIDOMMozMobileCellInfo + + gsmLocationAreaCode: null, + gsmCellId: null +}; + function VoicemailStatus() {} VoicemailStatus.prototype = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMMozVoicemailStatus]), @@ -168,11 +188,24 @@ RILContentHelper.prototype = { updateConnectionInfo: function updateConnectionInfo(srcInfo, destInfo) { for (let key in srcInfo) { - if (key != "network") { + if ((key != "network") && (key != "cell")) { destInfo[key] = srcInfo[key]; } } + let srcCell = srcInfo.cell; + if (!srcCell) { + destInfo.cell = null; + } else { + let cell = destInfo.cell; + if (!cell) { + cell = destInfo.cell = new MobileCellInfo(); + } + + cell.gsmLocationAreaCode = srcCell.gsmLocationAreaCode; + cell.gsmCellId = srcCell.gsmCellId; + } + let srcNetwork = srcInfo.network; if (!srcNetwork) { destInfo.network= null; diff --git a/dom/system/gonk/RadioInterfaceLayer.js b/dom/system/gonk/RadioInterfaceLayer.js index 4f3f0db0c981..6e6e3436a1f4 100644 --- a/dom/system/gonk/RadioInterfaceLayer.js +++ b/dom/system/gonk/RadioInterfaceLayer.js @@ -151,14 +151,16 @@ function RadioInterfaceLayer() { radioState: RIL.GECKO_RADIOSTATE_UNAVAILABLE, cardState: RIL.GECKO_CARDSTATE_UNAVAILABLE, icc: null, - cell: null, // These objects implement the nsIDOMMozMobileConnectionInfo interface, - // although the actual implementation lives in the content process. + // although the actual implementation lives in the content process. So are + // the child attributes `network` and `cell`, which implement + // nsIDOMMozMobileNetworkInfo and nsIDOMMozMobileCellInfo respectively. voice: {connected: false, emergencyCallsOnly: false, roaming: false, network: null, + cell: null, type: null, signalStrength: null, relSignalStrength: null}, @@ -166,6 +168,7 @@ function RadioInterfaceLayer() { emergencyCallsOnly: false, roaming: false, network: null, + cell: null, type: null, signalStrength: null, relSignalStrength: null}, @@ -420,9 +423,6 @@ RadioInterfaceLayer.prototype = { case "iccmbdn": ppmm.sendAsyncMessage("RIL:VoicemailNumberChanged", message); break; - case "celllocationchanged": - this.rilContext.cell = message; - break; case "ussdreceived": debug("ussdreceived " + JSON.stringify(message)); this.handleUSSDReceived(message); @@ -506,6 +506,13 @@ RadioInterfaceLayer.prototype = { voiceInfo.relSignalStrength = null; } + let newCell = newInfo.cell; + if ((newCell.gsmLocationAreaCode < 0) || (newCell.gsmCellId < 0)) { + voiceInfo.cell = null; + } else { + voiceInfo.cell = newCell; + } + if (!newInfo.batch) { ppmm.sendAsyncMessage("RIL:VoiceInfoChanged", voiceInfo); } @@ -529,6 +536,13 @@ RadioInterfaceLayer.prototype = { dataInfo.relSignalStrength = null; } + let newCell = newInfo.cell; + if ((newCell.gsmLocationAreaCode < 0) || (newCell.gsmCellId < 0)) { + dataInfo.cell = null; + } else { + dataInfo.cell = newCell; + } + if (!newInfo.batch) { ppmm.sendAsyncMessage("RIL:DataInfoChanged", dataInfo); } diff --git a/dom/system/gonk/nsIRadioInterfaceLayer.idl b/dom/system/gonk/nsIRadioInterfaceLayer.idl index a4088e50476f..eff43159a368 100644 --- a/dom/system/gonk/nsIRadioInterfaceLayer.idl +++ b/dom/system/gonk/nsIRadioInterfaceLayer.idl @@ -217,21 +217,7 @@ interface nsIICCRecords : nsISupports readonly attribute jsval fdn; }; -[scriptable, uuid(1b47459d-d0bc-4e91-8509-cc106054b9ee)] -interface nsICellLocation : nsISupports -{ - /** - * Location Area Code - */ - readonly attribute unsigned short lac; - - /** - * Cell Identity - */ - readonly attribute unsigned long cid; -}; - -[scriptable, uuid(a6f6977e-f4ee-42b4-ae79-798c8c47c360)] +[scriptable, uuid(e6dc89f2-0d4e-46fc-902c-cfeeaee15e40)] interface nsIRilContext : nsISupports { readonly attribute DOMString radioState; @@ -240,8 +226,6 @@ interface nsIRilContext : nsISupports readonly attribute nsIICCRecords icc; - readonly attribute nsICellLocation cell; - readonly attribute nsIDOMMozMobileConnectionInfo voice; readonly attribute nsIDOMMozMobileConnectionInfo data; diff --git a/dom/system/gonk/ril_worker.js b/dom/system/gonk/ril_worker.js index 2117a6b87bbf..77e4acd69f81 100644 --- a/dom/system/gonk/ril_worker.js +++ b/dom/system/gonk/ril_worker.js @@ -623,11 +623,6 @@ let RIL = { voiceRegistrationState: {}, dataRegistrationState: {}, - /** - * The cell location on a phone, such as LAC, CID. - */ - cellLocation: {}, - /** * List of strings identifying the network operator. */ @@ -698,11 +693,13 @@ let RIL = { * * @param string * String to be parsed. - * @param defaultValue + * @param defaultValue [optional] * Default value to be used. + * @param radix [optional] + * A number that represents the numeral system to be used. Default 10. */ - parseInt: function RIL_parseInt(string, defaultValue) { - let number = parseInt(string, 10); + parseInt: function RIL_parseInt(string, defaultValue, radix) { + let number = parseInt(string, radix || 10); if (!isNaN(number)) { return number; } @@ -2186,6 +2183,24 @@ let RIL = { } } + if (!curState.cell) { + curState.cell = {}; + } + + // From TS 23.003, 0000 and 0xfffe are indicated that no valid LAI exists + // in MS. So we still need to report the '0000' as well. + let lac = RIL.parseInt(newState[1], -1, 16); + if (curState.cell.gsmLocationAreaCode !== lac) { + curState.cell.gsmLocationAreaCode = lac; + changed = true; + } + + let cid = RIL.parseInt(newState[2], -1, 16); + if (curState.cell.gsmCellId !== cid) { + curState.cell.gsmCellId = cid; + changed = true; + } + let radioTech = RIL.parseInt(newState[3], NETWORK_CREG_TECH_UNKNOWN); if (curState.radioTech != radioTech) { changed = true; @@ -2202,28 +2217,6 @@ let RIL = { RIL.getSMSCAddress(); } - let cell = this.cellLocation; - let cellChanged = false; - - // From TS 23.003, 0000 and 0xfffe are indicated that no valid LAI exists - // in MS. So we still need to report the '0000' as well. - let lac = parseInt(state[1], 16); - if (cell.lac !== lac) { - cell.lac = lac; - cellChanged = true; - } - - let cid = parseInt(state[2], 16); - if (cell.cid !== cid) { - cell.cid = cid; - cellChanged = true; - } - - if (cellChanged) { - cell.rilMessageType = "celllocationchanged"; - this.sendDOMMessage(cell); - } - // TODO: This zombie code branch that will be raised from the dead once // we add explicit CDMA support everywhere (bug 726098). let cdma = false;