summaryrefslogtreecommitdiffstats
path: root/call.c
diff options
context:
space:
mode:
authorJoerie de Gram <j.de.gram@gmail.com>2011-10-26 18:03:00 +0200
committerJoerie de Gram <j.de.gram@gmail.com>2011-10-29 16:26:26 +0200
commit791fd3e4a946c05d6598f5054075515df6327b7d (patch)
treee45cfbe6eb9a9ce1515c6c1cc81e50761971ad15 /call.c
downloadhardware_ril_samsung-ril-791fd3e4a946c05d6598f5054075515df6327b7d.zip
hardware_ril_samsung-ril-791fd3e4a946c05d6598f5054075515df6327b7d.tar.gz
hardware_ril_samsung-ril-791fd3e4a946c05d6598f5054075515df6327b7d.tar.bz2
Temporary initial commit
Diffstat (limited to 'call.c')
-rw-r--r--call.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/call.c b/call.c
new file mode 100644
index 0000000..4e89e82
--- /dev/null
+++ b/call.c
@@ -0,0 +1,184 @@
+#define LOG_TAG "RIL-CALL"
+#include <utils/Log.h>
+
+#include "samsung-ril.h"
+
+extern const struct RIL_Env *rilenv;
+extern struct radio_state radio;
+extern struct ipc_client *ipc_client;
+
+/**
+ * In: RIL_REQUEST_GET_CURRENT_CALLS
+ * Requests current call list
+ *
+ * Out: IPC_CALL_LIST GET
+ * Requests a list of active calls
+ */
+void requestGetCurrentCalls(RIL_Token t)
+{
+ ipc_client_send_get(IPC_CALL_LIST, getRequestId(t));
+}
+
+/**
+ * In: IPC_CALL_LIST GET
+ * Provides a list of active calls
+ *
+ * Out: RIL_REQUEST_GET_CURRENT_CALLS
+ * Requests current call list
+ */
+void respondCallList(RIL_Token t, void *data, int length)
+{
+ struct ipc_call_list_entry *entry;
+ unsigned char num_entries;
+ char *number, *number_ril;
+ int i;
+
+ num_entries = *((unsigned char*)data);
+ entry = (struct ipc_call_list_entry*)((char*)data+1);
+
+ RIL_Call **calls = (RIL_Call**)malloc(num_entries * sizeof(RIL_Call*));
+
+ for(i = 0; i < num_entries; i++) {
+ RIL_Call *call = (RIL_Call*)malloc(sizeof(RIL_Call));
+
+ /* Number is located after call list entry */
+ number = ((char*)entry) + sizeof(*entry);
+
+ number_ril = (char*)malloc(entry->number_len + 1);
+ memset(number_ril, 0, (entry->number_len + 1));
+ memcpy(number_ril, number, entry->number_len);
+
+ call->state = (entry->state-1); /* FIXME: mapping func */
+ call->index = (entry->idx+1);
+ call->toa = (entry->number_len > 0 && number[0] == '+') ? 145 : 129;
+ call->isMpty = entry->mpty;
+ call->isMT = (entry->term == IPC_CALL_TERM_MT);
+ call->als = 0;
+ call->isVoice = (entry->type == IPC_CALL_TYPE_VOICE);
+ call->isVoicePrivacy = 0;
+ call->number = number_ril;
+ call->numberPresentation = (entry->number_len > 0) ? 0 : 2;
+ call->name = NULL;
+ call->namePresentation = 2;
+ call->uusInfo = NULL;
+
+ calls[i] = call;
+
+ /* Next entry after current number */
+ entry = (struct ipc_call_list_entry*)(number + entry->number_len);
+ }
+
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, calls, (num_entries * sizeof(RIL_Call*)));
+
+ for(i = 0; i < num_entries; i++) {
+ free(calls[i]);
+ }
+
+ free(calls);
+}
+
+/**
+ * In: RIL_REQUEST_HANGUP
+ * Hang up a specific line (like AT+CHLD=1x)
+ *
+ * Out: IPC_CALL_RELEASE EXEC
+ */
+void requestHangup(RIL_Token t)
+{
+ ipc_client_send_exec(IPC_CALL_RELEASE, getRequestId(t));
+
+ /* FIXME: This should actually be sent based on the response from baseband */
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
+
+ /* FIXME: Do we really need to send this? */
+ RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
+}
+
+/**
+ * In: RIL_REQUEST_ANSWER
+ * Answer incoming call
+ *
+ * Out: IPC_CALL_ANSWER
+ */
+void requestAnswer(RIL_Token t)
+{
+ ipc_client_send_exec(IPC_CALL_ANSWER, getRequestId(t));
+
+ /* FIXME: This should actually be sent based on the response from baseband */
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
+
+ /* FIXME: Do we really need to send this? */
+ RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
+}
+
+/**
+ * In: RIL_REQUEST_DIAL
+ * Initiate voice call
+ *
+ * Out: IPC_CALL_OUTGOING
+ */
+void requestDial(RIL_Token t, void *data, size_t datalen)
+{
+ const RIL_Dial *dial = (const RIL_Dial*)data;
+ struct ipc_call_outgoing call;
+ int clir;
+
+ if(strlen(dial->address) > sizeof(call.number)) {
+ printf("Outgoing call number too long\n");
+ return;
+ }
+
+ /* FIXME: separate method? */
+ switch(dial->clir) {
+ case 0:
+ clir = IPC_CALL_IDENTITY_DEFAULT;
+ break;
+ case 1:
+ clir = IPC_CALL_IDENTITY_SHOW;
+ break;
+ case 2:
+ clir = IPC_CALL_IDENTITY_HIDE;
+ break;
+ default:
+ clir = IPC_CALL_IDENTITY_DEFAULT;
+ break;
+ }
+
+ memset(&call, 0x00, sizeof(call));
+
+ call.type = IPC_CALL_TYPE_VOICE;
+ call.identity = clir;
+ call.prefix = IPC_CALL_PREFIX_NONE;
+
+ call.length = strlen(dial->address);
+ memcpy(call.number, dial->address, strlen(dial->address));
+
+ ipc_client_send(ipc_client, IPC_CALL_OUTGOING, IPC_TYPE_EXEC, (unsigned char*)&call, sizeof(call), getRequestId(t));
+
+ /* FIXME: This should actually be sent based on the response from baseband */
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
+}
+
+/**
+ * In: RIL_UNSOL_CALL_RING
+ * Ring indication for an incoming call (eg, RING or CRING event).
+ */
+void respondCallIncoming(RIL_Token t, void *data, int length)
+{
+ RIL_onUnsolicitedResponse(RIL_UNSOL_CALL_RING, NULL, 0);
+
+ /* FIXME: Do we really need to send this? */
+ RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
+}
+
+/**
+ * In: IPC_CALL_STATUS
+ * Indicates that a call's status has changed
+ *
+ * RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
+ * Indicate when call state has changed
+ */
+void respondCallStatus(RIL_Token t, void *data, int length)
+{
+ RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
+}