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 /reference-ril | |
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 'reference-ril')
-rw-r--r-- | reference-ril/reference-ril.c | 113 |
1 files changed, 108 insertions, 5 deletions
diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c index 77c6f31..1b7a7bc 100644 --- a/reference-ril/reference-ril.c +++ b/reference-ril/reference-ril.c @@ -211,6 +211,14 @@ static const struct timeval TIMEVAL_SIMPOLL = {1,0}; static const struct timeval TIMEVAL_CALLSTATEPOLL = {0,500000}; static const struct timeval TIMEVAL_0 = {0,0}; +static int s_ims_registered = 0; // 0==unregistered +static int s_ims_services = 1; // & 0x1 == sms over ims supported +static int s_ims_format = 1; // FORMAT_3GPP(1) vs FORMAT_3GPP2(2); +static int s_ims_cause_retry = 0; // 1==causes sms over ims to temp fail +static int s_ims_cause_perm_failure = 0; // 1==causes sms over ims to permanent fail +static int s_ims_gsm_retry = 0; // 1==causes sms over gsm to temp fail +static int s_ims_gsm_fail = 0; // 1==causes sms over gsm to permanent fail + #ifdef WORKAROUND_ERRONEOUS_ANSWER // Max number of times we'll try to repoll when we think // we have a AT+CLCC race condition @@ -1499,12 +1507,14 @@ static void requestCdmaSendSMS(void *data, size_t datalen, RIL_Token t) // But it is not implemented yet. memset(&response, 0, sizeof(response)); + response.messageRef = 1; RIL_onRequestComplete(t, RIL_E_SUCCESS, &response, sizeof(response)); return; error: // Cdma Send SMS will always cause send retry error. - RIL_onRequestComplete(t, RIL_E_SMS_SEND_FAIL_RETRY, NULL, 0); + response.messageRef = -1; + RIL_onRequestComplete(t, RIL_E_SMS_SEND_FAIL_RETRY, &response, sizeof(response)); } static void requestSendSMS(void *data, size_t datalen, RIL_Token t) @@ -1517,6 +1527,12 @@ static void requestSendSMS(void *data, size_t datalen, RIL_Token t) RIL_SMS_Response response; ATResponse *p_response = NULL; + memset(&response, 0, sizeof(response)); + RLOGD("requestSendSMS datalen =%d", datalen); + + if (s_ims_gsm_fail != 0) goto error; + if (s_ims_gsm_retry != 0) goto error2; + smsc = ((const char **)data)[0]; pdu = ((const char **)data)[1]; @@ -1534,17 +1550,68 @@ static void requestSendSMS(void *data, size_t datalen, RIL_Token t) if (err != 0 || p_response->success == 0) goto error; - memset(&response, 0, sizeof(response)); - /* FIXME fill in messageRef and ackPDU */ - + response.messageRef = 1; RIL_onRequestComplete(t, RIL_E_SUCCESS, &response, sizeof(response)); at_response_free(p_response); return; error: - RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0); + response.messageRef = -2; + RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, &response, sizeof(response)); + at_response_free(p_response); + return; +error2: + // send retry error. + response.messageRef = -1; + RIL_onRequestComplete(t, RIL_E_SMS_SEND_FAIL_RETRY, &response, sizeof(response)); at_response_free(p_response); + return; + } + +static void requestImsSendSMS(void *data, size_t datalen, RIL_Token t) +{ + RIL_IMS_SMS_Message *p_args; + RIL_SMS_Response response; + + memset(&response, 0, sizeof(response)); + + RLOGD("requestImsSendSMS: datalen=%d, " + "registered=%d, service=%d, format=%d, ims_perm_fail=%d, " + "ims_retry=%d, gsm_fail=%d, gsm_retry=%d", + datalen, s_ims_registered, s_ims_services, s_ims_format, + s_ims_cause_perm_failure, s_ims_cause_retry, s_ims_gsm_fail, + s_ims_gsm_retry); + + // figure out if this is gsm/cdma format + // then route it to requestSendSMS vs requestCdmaSendSMS respectively + p_args = (RIL_IMS_SMS_Message *)data; + + if (0 != s_ims_cause_perm_failure ) goto error; + + // want to fail over ims and this is first request over ims + if (0 != s_ims_cause_retry && 0 == p_args->retry) goto error2; + + if (RADIO_TECH_3GPP == p_args->tech) { + return requestSendSMS(p_args->message.gsmMessage, + datalen - sizeof(RIL_RadioTechnologyFamily), + t); + } else if (RADIO_TECH_3GPP2 == p_args->tech) { + return requestCdmaSendSMS(p_args->message.cdmaMessage, + datalen - sizeof(RIL_RadioTechnologyFamily), + t); + } else { + RLOGE("requestImsSendSMS invalid format value =%d", p_args->tech); + } + +error: + response.messageRef = -2; + RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, &response, sizeof(response)); + return; + +error2: + response.messageRef = -1; + RIL_onRequestComplete(t, RIL_E_SMS_SEND_FAIL_RETRY, &response, sizeof(response)); } static void requestSetupDataCall(void *data, size_t datalen, RIL_Token t) @@ -2051,6 +2118,9 @@ onRequest (int request, void *data, size_t datalen, RIL_Token t) case RIL_REQUEST_CDMA_SEND_SMS: requestCdmaSendSMS(data, datalen, t); break; + case RIL_REQUEST_IMS_SEND_SMS: + requestImsSendSMS(data, datalen, t); + break; case RIL_REQUEST_SETUP_DATA_CALL: requestSetupDataCall(data, datalen, t); break; @@ -2168,6 +2238,27 @@ onRequest (int request, void *data, size_t datalen, RIL_Token t) requestEnterSimPin(data, datalen, t); break; + case RIL_REQUEST_IMS_REGISTRATION_STATE: { + int reply[2]; + //0==unregistered, 1==registered + reply[0] = s_ims_registered; + + //to be used when changed to include service supporated info + //reply[1] = s_ims_services; + + // FORMAT_3GPP(1) vs FORMAT_3GPP2(2); + reply[1] = s_ims_format; + + RLOGD("IMS_REGISTRATION=%d, format=%d ", + reply[0], reply[1]); + if (reply[1] != -1) { + RIL_onRequestComplete(t, RIL_E_SUCCESS, reply, sizeof(reply)); + } else { + RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0); + } + break; + } + case RIL_REQUEST_VOICE_RADIO_TECH: { int tech = techFromModemType(TECH(sMdmInfo)); @@ -2927,6 +3018,18 @@ static void waitForClose() pthread_mutex_unlock(&s_state_mutex); } +static void sendUnsolImsNetworkStateChanged() +{ +#if 0 // to be used when unsol is changed to return data. + int reply[2]; + reply[0] = s_ims_registered; + reply[1] = s_ims_services; + reply[1] = s_ims_format; +#endif + RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED, + NULL, 0); +} + /** * Called by atchannel when an unsolicited line appears * This is called on atchannel's reader thread. AT commands may |