From: Pekka Pessi <pekka.pe...@nokia.com> --- drivers/isimodem/voicecall.c | 89 +++++++++++++++++++++++++++--------------- 1 files changed, 57 insertions(+), 32 deletions(-)
diff --git a/drivers/isimodem/voicecall.c b/drivers/isimodem/voicecall.c index 84751b0..cc2a829 100644 --- a/drivers/isimodem/voicecall.c +++ b/drivers/isimodem/voicecall.c @@ -80,41 +80,62 @@ enum { /* ------------------------------------------------------------------------- */ /* Request context for voicecall cb */ -struct isi_call_req_context; - -typedef void isi_call_req_step(struct isi_call_req_context *, int reason); +typedef void isi_call_req_step(struct isi_call_req_context *, + int id, int status); struct isi_call_req_context { - struct isi_call_req_context *next, **prev; + struct isi_call_req_context *next; + struct isi_call_req_context **prev; isi_call_req_step *step; + int id; struct ofono_voicecall *ovc; ofono_voicecall_cb_t cb; void *data; }; -static struct isi_call_req_context * -isi_call_req(struct ofono_voicecall *ovc, - void const *restrict req, - size_t len, - GIsiResponse *handler, - ofono_voicecall_cb_t cb, void *data) +static struct isi_call_req_context *isi_call_req_new( + struct ofono_voicecall *ovc, + ofono_voicecall_cb_t cb, + void *data) { - struct isi_voicecall *ivc; struct isi_call_req_context *irc; - ivc = ofono_voicecall_get_data(ovc); - irc = g_try_new0(struct isi_call_req_context, 1); + if (irc == NULL) + goto failed; - if (irc) { - irc->ovc = ovc; - irc->cb = cb; - irc->data = data; + irc->ovc = ovc; + irc->cb = cb; + irc->data = data; - if (g_isi_request_make(ivc->client, req, len, - ISI_CALL_TIMEOUT, handler, irc)) - return irc; - } + return irc; + +failed: + if (cb) + CALLBACK_WITH_FAILURE(cb, data); + + return NULL; +} + +static struct isi_call_req_context *isi_call_req(struct ofono_voicecall *ovc, + void const *restrict req, + size_t len, + GIsiResponse *handler, + ofono_voicecall_cb_t cb, + void *data) +{ + struct isi_voicecall *ivc; + struct isi_call_req_context *irc; + + irc = isi_call_req_new(ovc, cb, data); + if (irc == NULL) + return NULL; + + ivc = ofono_voicecall_get_data(ovc); + + if (g_isi_send(ivc->client, req, len, + ISI_CALL_TIMEOUT, handler, irc, NULL)) + return irc; g_free(irc); @@ -125,7 +146,8 @@ isi_call_req(struct ofono_voicecall *ovc, } static void isi_ctx_queue(struct isi_call_req_context *irc, - isi_call_req_step *next) + isi_call_req_step *next, + int id) { if (irc->prev == NULL) { struct isi_voicecall *ivc = ofono_voicecall_get_data(irc->ovc); @@ -139,6 +161,7 @@ static void isi_ctx_queue(struct isi_call_req_context *irc, } irc->step = next; + irc->id = id; } static void isi_ctx_remove(struct isi_call_req_context *irc) @@ -187,7 +210,7 @@ static gboolean isi_ctx_return_failure(struct isi_call_req_context *irc) static gboolean isi_ctx_return_success(struct isi_call_req_context *irc) { if (irc && irc->step) { - irc->step(irc, 0); + irc->step(irc, 0, 0); return TRUE; } @@ -310,7 +333,7 @@ static void isi_call_notify(struct ofono_voicecall *ovc, call_status_name(call->status), call->status); for (queue = &ivc->queue; (irc = *queue);) { - irc->step(irc, call->status); + irc->step(irc, call->id, call->status); if (*queue == irc) queue = &irc->next; @@ -1063,18 +1086,19 @@ static void isi_release_all_active(struct ofono_voicecall *ovc, if (irc == NULL) ; else if (waiting) - isi_ctx_queue(irc, isi_wait_and_answer); + isi_ctx_queue(irc, isi_wait_and_answer, 0); else if (hold) - isi_ctx_queue(irc, isi_wait_and_retrieve); + isi_ctx_queue(irc, isi_wait_and_retrieve, 0); } else CALLBACK_WITH_FAILURE(cb, data); } static void isi_wait_and_answer(struct isi_call_req_context *irc, - int event) + int id, int status) { - DBG("irc=%p event=%u", (void *)irc, event); - switch (event) { + DBG("irc=%p id=%d status=%d", (void *)irc, id, status); + + switch (status) { case CALL_STATUS_TERMINATED: isi_answer(irc->ovc, irc->cb, irc->data); isi_ctx_free(irc); @@ -1083,10 +1107,11 @@ static void isi_wait_and_answer(struct isi_call_req_context *irc, } static void isi_wait_and_retrieve(struct isi_call_req_context *irc, - int event) + int id, int status) { - DBG("irc=%p event=%u", (void *)irc, event); - switch (event) { + DBG("irc=%p id=%u status=%u", (void *)irc, id, status); + + switch (status) { case CALL_STATUS_TERMINATED: isi_retrieve(irc->ovc, irc->cb, irc->data); isi_ctx_free(irc); -- 1.7.1 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono