summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2015-12-03 11:38:04 -0600
committerDenis Kenzior <denkenz@gmail.com>2015-12-03 11:38:04 -0600
commit5ea2800800920043aa03825ffca5b6500b03318a (patch)
tree6dc1760830b2c86cf60d33ec084e916a47e42dfc
parent014a2427f25caea8f5dcd14192ca6f6491ebd9fe (diff)
downloadofono-5ea2800800920043aa03825ffca5b6500b03318a.tar.bz2
rilmodem: Implement clcc_poll_cb inline
-rw-r--r--drivers/rilmodem/voicecall.c78
1 files changed, 76 insertions, 2 deletions
diff --git a/drivers/rilmodem/voicecall.c b/drivers/rilmodem/voicecall.c
index 94e11d96..663d48f5 100644
--- a/drivers/rilmodem/voicecall.c
+++ b/drivers/rilmodem/voicecall.c
@@ -119,14 +119,31 @@ done:
ofono_voicecall_disconnected(vc, reqdata->id, reason, NULL);
}
+static int call_compare(gconstpointer a, gconstpointer b)
+{
+ const struct ofono_call *ca = a;
+ const struct ofono_call *cb = b;
+
+ if (ca->id < cb->id)
+ return -1;
+
+ if (ca->id > cb->id)
+ return 1;
+
+ return 0;
+}
+
static void clcc_poll_cb(struct ril_msg *message, gpointer user_data)
{
struct ofono_voicecall *vc = user_data;
struct ril_voicecall_data *vd = ofono_voicecall_get_data(vc);
int reqid = RIL_REQUEST_LAST_CALL_FAIL_CAUSE;
- GSList *calls;
+ struct parcel rilp;
+ GSList *calls = NULL;
GSList *n, *o;
struct ofono_call *nc, *oc;
+ int num, i;
+ char *number, *name;
/*
* We consider all calls have been dropped if there is no radio, which
@@ -139,8 +156,65 @@ static void clcc_poll_cb(struct ril_msg *message, gpointer user_data)
return;
}
- calls = g_ril_reply_parse_get_calls(vd->ril, message);
+ g_ril_init_parcel(message, &rilp);
+
+ /* maguro signals no calls with empty event data */
+ if (rilp.size < sizeof(int32_t))
+ goto no_calls;
+
+ DBG("[%d,%04d]< %s", g_ril_get_slot(vd->ril),
+ message->serial_no,
+ "RIL_REQUEST_GET_CURRENT_CALLS");
+
+ /* Number of RIL_Call structs */
+ num = parcel_r_int32(&rilp);
+
+ for (i = 0; i < num; i++) {
+ struct ofono_call *call;
+
+ call = g_new0(struct ofono_call, 1);
+
+ ofono_call_init(call);
+ call->status = parcel_r_int32(&rilp);
+ call->id = parcel_r_int32(&rilp);
+ call->phone_number.type = parcel_r_int32(&rilp);
+ parcel_r_int32(&rilp); /* isMpty */
+ parcel_r_int32(&rilp); /* isMT */
+ parcel_r_int32(&rilp); /* als */
+ call->type = parcel_r_int32(&rilp); /* isVoice */
+ parcel_r_int32(&rilp); /* isVoicePrivacy */
+ number = parcel_r_string(&rilp);
+ if (number) {
+ strncpy(call->phone_number.number, number,
+ OFONO_MAX_PHONE_NUMBER_LENGTH);
+ g_free(number);
+ }
+
+ parcel_r_int32(&rilp); /* numberPresentation */
+ name = parcel_r_string(&rilp);
+ if (name) {
+ strncpy(call->name, name,
+ OFONO_MAX_CALLER_NAME_LENGTH);
+ g_free(name);
+ }
+
+ parcel_r_int32(&rilp); /* namePresentation */
+ parcel_r_int32(&rilp); /* uusInfo */
+
+ if (strlen(call->phone_number.number) > 0)
+ call->clip_validity = 0;
+ else
+ call->clip_validity = 2;
+
+ DBG("[id=%d,status=%d,type=%d,number=%s,name=%s]",
+ call->id, call->status, call->type,
+ call->phone_number.number, call->name);
+
+ calls = g_slist_insert_sorted(calls, call, call_compare);
+ }
+
+no_calls:
n = calls;
o = vd->calls;