summaryrefslogtreecommitdiffstats
path: root/drivers/isimodem/voicecall.c
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2010-12-03 10:30:49 +0200
committerAki Niemi <aki.niemi@nokia.com>2010-12-03 14:52:33 +0200
commitbe2778cb9913bad89c827a335c2ef664afc3df51 (patch)
tree21ac45ec797c45e58827369e2746c3f3f602fdc5 /drivers/isimodem/voicecall.c
parenteb3af7970084cf65570a83d04116bfb28c999851 (diff)
downloadofono-be2778cb9913bad89c827a335c2ef664afc3df51.tar.bz2
isi/voicecall: avoid side-effects of release
If a call was held automatically when an another call was dialed or answered, it gets retrieved when the other call is released unless auto change features is explicitly disabled. Drop cause_type parameter because it is never used. Use cause code for busy when releasing incoming or waiting calls.
Diffstat (limited to 'drivers/isimodem/voicecall.c')
-rw-r--r--drivers/isimodem/voicecall.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/isimodem/voicecall.c b/drivers/isimodem/voicecall.c
index e7126a88..9c1bec72 100644
--- a/drivers/isimodem/voicecall.c
+++ b/drivers/isimodem/voicecall.c
@@ -699,12 +699,13 @@ static gboolean isi_call_answer_resp(GIsiClient *client,
static struct isi_call_req_context *
isi_call_release_req(struct ofono_voicecall *ovc,
- uint8_t call_id, enum call_cause_type cause_type,
- uint8_t cause, ofono_voicecall_cb_t cb, void *data)
+ uint8_t call_id, uint8_t cause,
+ ofono_voicecall_cb_t cb, void *data)
{
uint8_t const req[] = {
- CALL_RELEASE_REQ, call_id, 1,
- CALL_CAUSE, 4, cause_type, cause,
+ CALL_RELEASE_REQ, call_id, 2,
+ CALL_CAUSE, 4, CALL_CAUSE_TYPE_CLIENT, cause,
+ CALL_STATE_AUTO_CHANGE, 4, 0, 0
};
size_t rlen = sizeof req;
@@ -1008,7 +1009,8 @@ 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;
+ uint8_t cause = CALL_CAUSE_RELEASE_BY_USER;
for (id = 1; id <= 7; id++) {
if (ivc->calls[id].call_id & CALL_ID_WAITING)
@@ -1018,11 +1020,14 @@ static void isi_hangup_current(struct ofono_voicecall *ovc,
switch (ivc->calls[id].status) {
case CALL_STATUS_CREATE:
+ case CALL_STATUS_MT_ALERTING:
+ case CALL_STATUS_ANSWERED:
+ goto release_by_id;
+
case CALL_STATUS_COMING:
case CALL_STATUS_PROCEEDING:
case CALL_STATUS_MO_ALERTING:
- case CALL_STATUS_MT_ALERTING:
- case CALL_STATUS_ANSWERED:
+ cause = CALL_CAUSE_BUSY_USER_REQUEST;
goto release_by_id;
}
}
@@ -1030,15 +1035,14 @@ static void isi_hangup_current(struct ofono_voicecall *ovc,
id = CALL_ID_ACTIVE;
release_by_id:
- isi_call_release_req(ovc, id, CALL_CAUSE_TYPE_CLIENT,
- CALL_CAUSE_RELEASE_BY_USER, cb, data);
+ isi_call_release_req(ovc, id, cause, cb, data);
}
static void isi_release_all_held(struct ofono_voicecall *ovc,
ofono_voicecall_cb_t cb, void *data)
{
/* AT+CHLD=0 (w/out incoming calls) */
- isi_call_release_req(ovc, CALL_ID_HOLD, CALL_CAUSE_TYPE_CLIENT,
+ isi_call_release_req(ovc, CALL_ID_HOLD,
CALL_CAUSE_RELEASE_BY_USER, cb, data);
}
@@ -1047,8 +1051,7 @@ static void isi_set_udub(struct ofono_voicecall *ovc,
{
/* Release waiting calls */
isi_call_release_req(ovc, CALL_ID_WAITING,
- CALL_CAUSE_TYPE_CLIENT, CALL_CAUSE_BUSY_USER_REQUEST,
- cb, data);
+ CALL_CAUSE_BUSY_USER_REQUEST, cb, data);
}
static void isi_retrieve(struct ofono_voicecall *ovc,
@@ -1079,7 +1082,6 @@ static void isi_release_all_active(struct ofono_voicecall *ovc,
struct isi_call_req_context *irc;
irc = isi_call_release_req(ovc, CALL_ID_ACTIVE,
- CALL_CAUSE_TYPE_CLIENT,
CALL_CAUSE_RELEASE_BY_USER,
cb, data);
@@ -1176,9 +1178,7 @@ static void isi_release_specific(struct ofono_voicecall *ovc, int id,
break;
}
- isi_call_release_req(ovc, id,
- CALL_CAUSE_TYPE_CLIENT, cause,
- cb, data);
+ isi_call_release_req(ovc, id, cause, cb, data);
} else
CALLBACK_WITH_FAILURE(cb, data);
}