summaryrefslogtreecommitdiffstats
path: root/reference-ril
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2013-11-22 16:48:36 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2013-11-22 16:48:36 -0800
commit2c464b0d9dbc759e4021b90029c4224adc1c8851 (patch)
treeb54c45e92dc4a7aea836df336ccadddb5aec51f2 /reference-ril
parent6a775fe2ff760239ddce5d20813518ef8944d3cc (diff)
parenta18b9d1e1a014290691d63a7f335085dadc83e46 (diff)
downloadandroid_hardware_ril-2c464b0d9dbc759e4021b90029c4224adc1c8851.tar.gz
android_hardware_ril-2c464b0d9dbc759e4021b90029c4224adc1c8851.tar.bz2
android_hardware_ril-2c464b0d9dbc759e4021b90029c4224adc1c8851.zip
Merge commit 'a18b9d1e1a014290691d63a7f335085dadc83e46' into HEAD
Diffstat (limited to 'reference-ril')
-rw-r--r--reference-ril/reference-ril.c113
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