diff options
author | Richard Mudgett <rmudgett@digium.com> | 2012-05-09 17:58:11 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2012-05-09 17:58:11 +0000 |
commit | 108f5fafd700470536a7d53a1c2d617e5a36aeaa (patch) | |
tree | bfad227a434a1ec682f12667177d1bf9f484246b /apps/app_followme.c | |
parent | 6125190ca125b10f7b829710be230816e9534f64 (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.c | 17 |
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); } |