diff options
author | Sukanya Rajkhowa <srajkh@codeaurora.org> | 2013-09-10 12:30:13 -0700 |
---|---|---|
committer | Ed Tam <etam@google.com> | 2013-10-10 16:18:58 -0700 |
commit | a18b9d1e1a014290691d63a7f335085dadc83e46 (patch) | |
tree | 17be8f206b5f98913c00e107fbb22a8ff8bb6bb2 /libril/ril.cpp | |
parent | 3492c6e5917828645feb3dba4618629929a43ab1 (diff) | |
download | android_hardware_ril-a18b9d1e1a014290691d63a7f335085dadc83e46.tar.gz android_hardware_ril-a18b9d1e1a014290691d63a7f335085dadc83e46.tar.bz2 android_hardware_ril-a18b9d1e1a014290691d63a7f335085dadc83e46.zip |
RIL: Support SMS over IMS
RIL_REQUEST_IMS_REGISTRATION_STATE is used to aquire IMS registration state.
RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED is called when IMS registration
state has changed.
RIL_REQUEST_IMS_SEND_SMS is used to send MO SMS over IMS. However, if retry
field is set in case of failure, RIL_REQUEST_IMS_SEND_SMS sets messageRef from
RIL_SMS_RESPONSE of corresponding failed MO SMS, and sets retry field to
non-zero. If voice is available, sends RIL_REQUEST_IMS_SEND_SMS retries with
data encoded based on voice tech available.
Bug: 9626411
Change-Id: If0ecc9fa47661f6560171e472f3c464713e97968
Diffstat (limited to 'libril/ril.cpp')
-rw-r--r-- | libril/ril.cpp | 168 |
1 files changed, 164 insertions, 4 deletions
diff --git a/libril/ril.cpp b/libril/ril.cpp index 46a150f..1957939 100644 --- a/libril/ril.cpp +++ b/libril/ril.cpp @@ -208,6 +208,9 @@ static void dispatchSetInitialAttachApn (Parcel& p, RequestInfo *pRI); static void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI); static void dispatchCdmaSms(Parcel &p, RequestInfo *pRI); +static void dispatchImsSms(Parcel &p, RequestInfo *pRI); +static void dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef); +static void dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef); static void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI); static void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI); static void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI); @@ -879,9 +882,8 @@ invalid: return; } -static void -dispatchCdmaSms(Parcel &p, RequestInfo *pRI) { - RIL_CDMA_SMS_Message rcsm; +static status_t +constructCdmaSms(Parcel &p, RequestInfo *pRI, RIL_CDMA_SMS_Message& rcsm) { int32_t t; uint8_t ut; status_t status; @@ -945,7 +947,7 @@ dispatchCdmaSms(Parcel &p, RequestInfo *pRI) { } if (status != NO_ERROR) { - goto invalid; + return status; } startRequest; @@ -957,6 +959,18 @@ dispatchCdmaSms(Parcel &p, RequestInfo *pRI) { printRequest(pRI->token, pRI->pCI->requestNumber); + return status; +} + +static void +dispatchCdmaSms(Parcel &p, RequestInfo *pRI) { + RIL_CDMA_SMS_Message rcsm; + + ALOGD("dispatchCdmaSms"); + if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) { + goto invalid; + } + s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI); #ifdef MEMSET_FREED @@ -971,6 +985,149 @@ invalid: } static void +dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) { + RIL_IMS_SMS_Message rism; + RIL_CDMA_SMS_Message rcsm; + + ALOGD("dispatchImsCdmaSms: retry=%d, messageRef=%d", retry, messageRef); + + if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) { + goto invalid; + } + memset(&rism, 0, sizeof(rism)); + rism.tech = RADIO_TECH_3GPP2; + rism.retry = retry; + rism.messageRef = messageRef; + rism.message.cdmaMessage = &rcsm; + + s_callbacks.onRequest(pRI->pCI->requestNumber, &rism, + sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t) + +sizeof(rcsm),pRI); + +#ifdef MEMSET_FREED + memset(&rcsm, 0, sizeof(rcsm)); + memset(&rism, 0, sizeof(rism)); +#endif + + return; + +invalid: + invalidCommandBlock(pRI); + return; +} + +static void +dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) { + RIL_IMS_SMS_Message rism; + int32_t countStrings; + status_t status; + size_t datalen; + char **pStrings; + ALOGD("dispatchImsGsmSms: retry=%d, messageRef=%d", retry, messageRef); + + status = p.readInt32 (&countStrings); + + if (status != NO_ERROR) { + goto invalid; + } + + memset(&rism, 0, sizeof(rism)); + rism.tech = RADIO_TECH_3GPP; + rism.retry = retry; + rism.messageRef = messageRef; + + startRequest; + appendPrintBuf("%sformat=%d,", printBuf, rism.format); + if (countStrings == 0) { + // just some non-null pointer + pStrings = (char **)alloca(sizeof(char *)); + datalen = 0; + } else if (((int)countStrings) == -1) { + pStrings = NULL; + datalen = 0; + } else { + datalen = sizeof(char *) * countStrings; + + pStrings = (char **)alloca(datalen); + + for (int i = 0 ; i < countStrings ; i++) { + pStrings[i] = strdupReadString(p); + appendPrintBuf("%s%s,", printBuf, pStrings[i]); + } + } + removeLastChar; + closeRequest; + printRequest(pRI->token, pRI->pCI->requestNumber); + + rism.message.gsmMessage = pStrings; + s_callbacks.onRequest(pRI->pCI->requestNumber, &rism, + sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t) + +datalen, pRI); + + if (pStrings != NULL) { + for (int i = 0 ; i < countStrings ; i++) { +#ifdef MEMSET_FREED + memsetString (pStrings[i]); +#endif + free(pStrings[i]); + } + +#ifdef MEMSET_FREED + memset(pStrings, 0, datalen); +#endif + } + +#ifdef MEMSET_FREED + memset(&rism, 0, sizeof(rism)); +#endif + return; +invalid: + ALOGE("dispatchImsGsmSms invalid block"); + invalidCommandBlock(pRI); + return; +} + +static void +dispatchImsSms(Parcel &p, RequestInfo *pRI) { + int32_t t; + status_t status = p.readInt32(&t); + RIL_RadioTechnologyFamily format; + uint8_t retry; + int32_t messageRef; + + ALOGD("dispatchImsSms"); + if (status != NO_ERROR) { + goto invalid; + } + format = (RIL_RadioTechnologyFamily) t; + + // read retry field + status = p.read(&retry,sizeof(retry)); + if (status != NO_ERROR) { + goto invalid; + } + // read messageRef field + status = p.read(&messageRef,sizeof(messageRef)); + if (status != NO_ERROR) { + goto invalid; + } + + if (RADIO_TECH_3GPP == format) { + dispatchImsGsmSms(p, pRI, retry, messageRef); + } else if (RADIO_TECH_3GPP2 == format) { + dispatchImsCdmaSms(p, pRI, retry, messageRef); + } else { + ALOGE("requestImsSendSMS invalid format value =%d", format); + } + + return; + +invalid: + invalidCommandBlock(pRI); + return; +} + +static void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) { RIL_CDMA_SMS_Ack rcsa; int32_t t; @@ -3653,6 +3810,8 @@ requestToString(int request) { case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST"; case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE"; case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN"; + case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE"; + case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS"; case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED"; @@ -3689,6 +3848,7 @@ requestToString(int request) { case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED"; case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED"; case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST"; + case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED"; default: return "<unknown request>"; } } |