summaryrefslogtreecommitdiff
path: root/apps/app_followme.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2012-05-09 17:58:11 +0000
committerRichard Mudgett <rmudgett@digium.com>2012-05-09 17:58:11 +0000
commit108f5fafd700470536a7d53a1c2d617e5a36aeaa (patch)
treebfad227a434a1ec682f12667177d1bf9f484246b /apps/app_followme.c
parent6125190ca125b10f7b829710be230816e9534f64 (diff)
Improve FollowMe accept/decline DTMF string matching.
If you hit the wrong DTMF digit trying to accept/decline a FollowMe call, you had to wait for the prompt to repeat to try again. * Make FollowMe compare the last DTMF digits received to the accept/decline matching strings. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@365951 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps/app_followme.c')
-rw-r--r--apps/app_followme.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/apps/app_followme.c b/apps/app_followme.c
index 04439e4bf..8b894d6d2 100644
--- a/apps/app_followme.c
+++ b/apps/app_followme.c
@@ -887,20 +887,31 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
}
}
if (tmpuser && tmpuser->state == 3 && f->frametype == AST_FRAME_DTMF) {
+ int cmp_len;
+
if (ast_channel_stream(winner))
ast_stopstream(winner);
tmpuser->digts = 0;
ast_debug(1, "DTMF received: %c\n", (char) f->subclass.integer);
if (tmpuser->ynidx < ARRAY_LEN(tmpuser->yn) - 1) {
- tmpuser->yn[tmpuser->ynidx++] = (char) f->subclass.integer;
+ tmpuser->yn[tmpuser->ynidx++] = f->subclass.integer;
+ } else {
+ /* Discard oldest digit. */
+ memmove(tmpuser->yn, tmpuser->yn + 1,
+ sizeof(tmpuser->yn) - 2 * sizeof(tmpuser->yn[0]));
+ tmpuser->yn[ARRAY_LEN(tmpuser->yn) - 2] = f->subclass.integer;
}
ast_debug(1, "DTMF string: %s\n", tmpuser->yn);
- if (!strcmp(tmpuser->yn, tpargs->takecall)) {
+ cmp_len = strlen(tpargs->takecall);
+ if (cmp_len <= tmpuser->ynidx
+ && !strcmp(tmpuser->yn + (tmpuser->ynidx - cmp_len), tpargs->takecall)) {
ast_debug(1, "Match to take the call!\n");
ast_frfree(f);
return tmpuser->ochan;
}
- if (!strcmp(tmpuser->yn, tpargs->nextindp)) {
+ cmp_len = strlen(tpargs->nextindp);
+ if (cmp_len <= tmpuser->ynidx
+ && !strcmp(tmpuser->yn + (tmpuser->ynidx - cmp_len), tpargs->nextindp)) {
ast_debug(1, "Declined to take the call.\n");
clear_caller(tmpuser);
}