summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Kocialkowski <contact@paulk.fr>2012-07-06 15:29:24 +0200
committerPaul Kocialkowski <contact@paulk.fr>2012-07-06 15:29:24 +0200
commit72a86665de9e8283539d6003dc1c64d16237d869 (patch)
treeb94c2c4a2f2efd179268045c5a0162f52882363f
parentf470c71cafdd62f5d36ce6007be0dde44e65531b (diff)
downloadhardware_replicant_libsamsung-ril-72a86665de9e8283539d6003dc1c64d16237d869.tar.gz
hardware_replicant_libsamsung-ril-72a86665de9e8283539d6003dc1c64d16237d869.tar.bz2
hardware_replicant_libsamsung-ril-72a86665de9e8283539d6003dc1c64d16237d869.zip
Call: Added last call fail cause support
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
-rw-r--r--call.c39
-rw-r--r--samsung-ril.c3
-rw-r--r--samsung-ril.h3
3 files changed, 44 insertions, 1 deletions
diff --git a/call.c b/call.c
index 20eedc0..39e4b02 100644
--- a/call.c
+++ b/call.c
@@ -49,6 +49,18 @@ unsigned char ipc2ril_call_list_entry_state(unsigned char call_state)
}
}
+RIL_LastCallFailCause ipc2ril_call_fail_cause(unsigned char end_cause)
+{
+ switch(end_cause) {
+ case IPC_CALL_END_CAUSE_NORMAL:
+ case IPC_CALL_END_CAUSE_REJECTED:
+ return CALL_FAIL_NORMAL;
+ case IPC_CALL_END_CAUSE_UNSPECIFIED:
+ default:
+ return CALL_FAIL_ERROR_UNSPECIFIED;
+ }
+}
+
/**
* In: RIL_UNSOL_CALL_RING
* Ring indication for an incoming call (eg, RING or CRING event).
@@ -70,6 +82,13 @@ void ipc_call_incoming(struct ipc_message_info *info)
*/
void ipc_call_status(struct ipc_message_info *info)
{
+ struct ipc_call_status *call_status =
+ (struct ipc_call_status *) info->data;
+
+ memcpy(&(ril_state.call_status), call_status, sizeof(struct ipc_call_status));
+
+ LOGD("Updating Call Status data");
+
RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
}
@@ -226,9 +245,27 @@ void ril_request_answer(RIL_Token t)
}
/**
+ * In: RIL_REQUEST_LAST_CALL_FAIL_CAUSE
+ * Reason why last call was terminated
+ */
+void ril_request_last_call_fail_cause(RIL_Token t)
+{
+ RIL_LastCallFailCause fail_cause;
+ struct ipc_call_status *call_status =
+ &(ril_state.call_status);
+
+ fail_cause = ipc2ril_call_fail_cause(call_status->end_cause);
+
+ // Empty global call_status
+ memset(call_status, 0, sizeof(struct ipc_call_status));
+
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, &fail_cause, sizeof(RIL_LastCallFailCause));
+}
+
+/**
* In: IPC_CALL_BURST_DTMF
* Send DTMF burst. RILJ only sends 1 DTMF tone to send at a time.
- *
+ *
* Out: IPC_CALL_BURST_DTMF
* It should be possible to send multiple DTMF tones at once in this message.
* First byte should be DTMF tones count.
diff --git a/samsung-ril.c b/samsung-ril.c
index edb5487..7f669b5 100644
--- a/samsung-ril.c
+++ b/samsung-ril.c
@@ -443,6 +443,9 @@ void onRequest(int request, void *data, size_t datalen, RIL_Token t)
case RIL_REQUEST_ANSWER:
ril_request_answer(t);
break;
+ case RIL_REQUEST_LAST_CALL_FAIL_CAUSE:
+ ril_request_last_call_fail_cause(t);
+ break;
case RIL_REQUEST_DTMF:
ril_request_dtmf(t, data, datalen);
break;
diff --git a/samsung-ril.h b/samsung-ril.h
index f6db9d8..a5b7cfa 100644
--- a/samsung-ril.h
+++ b/samsung-ril.h
@@ -181,6 +181,8 @@ struct ril_state {
struct ipc_net_regist gprs_netinfo;
struct ipc_net_current_plmn plmndata;
+ struct ipc_call_status call_status;
+
struct ipc_gprs_pdp_context gprs_context;
struct ipc_gprs_define_pdp_context gprs_define_context;
@@ -332,6 +334,7 @@ void ril_request_get_current_calls(RIL_Token t);
void ipc_call_list(struct ipc_message_info *info);
void ril_request_hangup(RIL_Token t);
void ril_request_answer(RIL_Token t);
+void ril_request_last_call_fail_cause(RIL_Token t);
void ril_request_dtmf(RIL_Token t, void *data, int length);
void ipc_call_burst_dtmf(struct ipc_message_info *info);
void ril_request_dtmf_start(RIL_Token t, void *data, int length);