[isi-voicecall-fix PATCHv3 4/6] isi/voicecall: fix answering early incoming calls

2010-11-17 Thread Pekka . Pessi
From: Pekka Pessi 

The voicecall driver must wait until the incoming call is mt-alerting or
waiting before answering.
---
 drivers/isimodem/voicecall.c |   49 +-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/drivers/isimodem/voicecall.c b/drivers/isimodem/voicecall.c
index 60052d4..76aa8f5 100644
--- a/drivers/isimodem/voicecall.c
+++ b/drivers/isimodem/voicecall.c
@@ -671,18 +671,65 @@ static void isi_call_status_ind_cb(GIsiClient *client,
isi_call_notify(ovc, call);
 }
 
+static void isi_wait_incoming(struct isi_call_req_context *irc, int event);
+
 static struct isi_call_req_context *
 isi_call_answer_req(struct ofono_voicecall *ovc,
uint8_t call_id, ofono_voicecall_cb_t cb, void *data)
 {
+   struct isi_voicecall *ivc = ofono_voicecall_get_data(ovc);
+   int id;
+
uint8_t const req[] = {
CALL_ANSWER_REQ, call_id, 0
};
size_t rlen = sizeof req;
 
+   for (id = 1; id <= 7; id++) {
+   struct isi_call_req_context *irc;
+
+   if (!(ivc->calls[id].mode_info & CALL_MODE_ORIGINATOR))
+   continue;
+
+   if (ivc->calls[id].status != CALL_STATUS_PROCEEDING &&
+   ivc->calls[id].status != CALL_STATUS_COMING)
+   continue;
+
+   irc = isi_call_req_new(ovc, cb, data);
+   if (irc)
+   isi_ctx_queue(irc, isi_wait_incoming, id);
+
+   return irc;
+   }
+
return isi_call_req(ovc, req, rlen, isi_call_answer_resp, cb, data);
 }
 
+static void isi_wait_incoming(struct isi_call_req_context *irc,
+   int event)
+{
+   struct isi_voicecall *ivc;
+
+   DBG("irc=%p event=%u", (void *)irc, event);
+
+   switch (event) {
+   case CALL_STATUS_MT_ALERTING:
+   case CALL_STATUS_WAITING:
+   isi_call_answer_req(irc->ovc, irc->id, irc->cb, irc->data);
+   isi_ctx_free(irc);
+   return;
+   }
+
+   ivc = ofono_voicecall_get_data(irc->ovc);
+   switch (ivc->calls[irc->id].status) {
+   case CALL_STATUS_MO_RELEASE:
+   case CALL_STATUS_MT_RELEASE:
+   case CALL_STATUS_TERMINATED:
+   case CALL_STATUS_IDLE:
+   isi_ctx_return_failure(irc);
+   }
+}
+
 static gboolean isi_call_answer_resp(GIsiClient *client,
void const *restrict data,
size_t len,
@@ -1018,7 +1065,7 @@ static void isi_hangup_current(struct ofono_voicecall 
*ovc,
 * active calls or calls in progress.
 */
struct isi_voicecall *ivc = ofono_voicecall_get_data(ovc);
-   int id = 0;
+   int id;
 
for (id = 1; id <= 7; id++) {
if (ivc->calls[id].call_id & CALL_ID_WAITING)
-- 
1.7.1

___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono


Re: [isi-voicecall-fix PATCHv3 4/6] isi/voicecall: fix answering early incoming calls

2010-11-22 Thread Denis Kenzior
Hi Pekka,

On 11/16/2010 11:05 AM, pekka.pe...@nokia.com wrote:
> From: Pekka Pessi 
> 
> The voicecall driver must wait until the incoming call is mt-alerting or
> waiting before answering.
> ---
>  drivers/isimodem/voicecall.c |   49 
> +-
>  1 files changed, 48 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/isimodem/voicecall.c b/drivers/isimodem/voicecall.c
> index 60052d4..76aa8f5 100644
> --- a/drivers/isimodem/voicecall.c
> +++ b/drivers/isimodem/voicecall.c
> @@ -671,18 +671,65 @@ static void isi_call_status_ind_cb(GIsiClient *client,
>   isi_call_notify(ovc, call);
>  }
>  
> +static void isi_wait_incoming(struct isi_call_req_context *irc, int event);
> +

Why is there a forward declaration for a static function?

>  static struct isi_call_req_context *
>  isi_call_answer_req(struct ofono_voicecall *ovc,
>   uint8_t call_id, ofono_voicecall_cb_t cb, void *data)
>  {
> + struct isi_voicecall *ivc = ofono_voicecall_get_data(ovc);
> + int id;
> +
>   uint8_t const req[] = {
>   CALL_ANSWER_REQ, call_id, 0
>   };
>   size_t rlen = sizeof req;
>  
> + for (id = 1; id <= 7; id++) {
> + struct isi_call_req_context *irc;
> +
> + if (!(ivc->calls[id].mode_info & CALL_MODE_ORIGINATOR))
> + continue;
> +
> + if (ivc->calls[id].status != CALL_STATUS_PROCEEDING &&
> + ivc->calls[id].status != CALL_STATUS_COMING)
> + continue;
> +
> + irc = isi_call_req_new(ovc, cb, data);
> + if (irc)

Why not simply

if (irc == NULL)
return NULL

> + isi_ctx_queue(irc, isi_wait_incoming, id);
> +
> + return irc;
> + }
> +
>   return isi_call_req(ovc, req, rlen, isi_call_answer_resp, cb, data);
>  }
>  
> +static void isi_wait_incoming(struct isi_call_req_context *irc,
> + int event)
> +{
> + struct isi_voicecall *ivc;
> +
> + DBG("irc=%p event=%u", (void *)irc, event);
> +
> + switch (event) {
> + case CALL_STATUS_MT_ALERTING:
> + case CALL_STATUS_WAITING:
> + isi_call_answer_req(irc->ovc, irc->id, irc->cb, irc->data);
> + isi_ctx_free(irc);
> + return;
> + }
> +
> + ivc = ofono_voicecall_get_data(irc->ovc);

Rule M1 again

> + switch (ivc->calls[irc->id].status) {
> + case CALL_STATUS_MO_RELEASE:
> + case CALL_STATUS_MT_RELEASE:
> + case CALL_STATUS_TERMINATED:
> + case CALL_STATUS_IDLE:
> + isi_ctx_return_failure(irc);
> + }
> +}
> +
>  static gboolean isi_call_answer_resp(GIsiClient *client,
>   void const *restrict data,
>   size_t len,
> @@ -1018,7 +1065,7 @@ static void isi_hangup_current(struct ofono_voicecall 
> *ovc,
>* active calls or calls in progress.
>*/
>   struct isi_voicecall *ivc = ofono_voicecall_get_data(ovc);
> - int id = 0;
> + int id;
>  
>   for (id = 1; id <= 7; id++) {
>   if (ivc->calls[id].call_id & CALL_ID_WAITING)

___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono


Re: [isi-voicecall-fix PATCHv3 4/6] isi/voicecall: fix answering early incoming calls

2010-11-22 Thread Pekka Pessi
Hi Denis,

2010/11/22 Denis Kenzior :
>> +static void isi_wait_incoming(struct isi_call_req_context *irc, int event);
>> +
>
> Why is there a forward declaration for a static function?

Because there is a dependency loop: isi_call_answer_req uses
isi_wait_incoming and isi_wait_incoming calls isi_call_answer_req.

-- 
Pekka.Pessi mail at nokia.com
___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono


Re: [isi-voicecall-fix PATCHv3 4/6] isi/voicecall: fix answering early incoming calls

2010-11-22 Thread Denis Kenzior
Hi Pekka,

On 11/22/2010 10:22 AM, Pekka Pessi wrote:
> Hi Denis,
> 
> 2010/11/22 Denis Kenzior :
>>> +static void isi_wait_incoming(struct isi_call_req_context *irc, int event);
>>> +
>>
>> Why is there a forward declaration for a static function?
> 
> Because there is a dependency loop: isi_call_answer_req uses
> isi_wait_incoming and isi_wait_incoming calls isi_call_answer_req.
> 

Ok, fair enough.

Regards,
-Denis
___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono