diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-06-12 15:26:07 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-06-12 15:26:07 +0000 |
commit | 1a1d9a6c133efb8c22d3a5005e51e1851f3b9cfa (patch) | |
tree | f99261923866fe4a8340f8256b321a34eb5e7c37 /apps/app_meetme.c | |
parent | cc826d9442fbb2a9673df71b3ea77de9744a5bf3 (diff) |
Merged revisions 122137 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r122137 | tilghman | 2008-06-12 10:18:39 -0500 (Thu, 12 Jun 2008) | 8 lines
Flipflop the sections for two options, since the section for 'X' (exit context)
may otherwise absorb keypresses meant for 's' (admin/user menu).
(closes issue #12836)
Reported by: blitzrage
Patches:
20080611__bug12836.diff.txt uploaded by Corydon76 (license 14)
Tested by: blitzrage
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@122174 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_meetme.c')
-rw-r--r-- | apps/app_meetme.c | 57 |
1 files changed, 28 insertions, 29 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c index c1acfc258..8b017ffda 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -2281,6 +2281,8 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c break; if (c) { + char dtmfstr[2] = ""; + if (c->fds[0] != origfd || (user->zapchannel && (c->audiohooks || c->monitor))) { if (using_pseudo) { /* Kill old pseudo */ @@ -2298,6 +2300,11 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c f = ast_read(c); if (!f) break; + if (f->frametype == AST_FRAME_DTMF) { + dtmfstr[0] = f->subclass; + dtmfstr[1] = '\0'; + } + if ((f->frametype == AST_FRAME_VOICE) && (f->subclass == AST_FORMAT_SLINEAR)) { if (user->talk.actual) ast_frame_adjust_volume(f, user->talk.actual); @@ -2348,35 +2355,6 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c if (user->talking) careful_write(fd, f->data.ptr, f->datalen, 0); } - } else if ((f->frametype == AST_FRAME_DTMF) && (confflags & CONFFLAG_EXIT_CONTEXT)) { - char tmp[2]; - - if (confflags & CONFFLAG_PASS_DTMF) - conf_queue_dtmf(conf, user, f); - - tmp[0] = f->subclass; - tmp[1] = '\0'; - if (!ast_goto_if_exists(chan, exitcontext, tmp, 1)) { - ast_debug(1, "Got DTMF %c, goto context %s\n", tmp[0], exitcontext); - ret = 0; - ast_frfree(f); - break; - } else { - ast_debug(2, "Exit by single digit did not work in meetme. Extension %s does not exist in context %s\n", tmp, exitcontext); - } - } else if ((f->frametype == AST_FRAME_DTMF) && (confflags & CONFFLAG_KEYEXIT) && (strchr(exitkeys, f->subclass))) { - char exitkey[2]; - - exitkey[0] = f->subclass; - exitkey[1] = '\0'; - - pbx_builtin_setvar_helper(chan, "MEETME_EXIT_KEY", exitkey); - - if (confflags & CONFFLAG_PASS_DTMF) - conf_queue_dtmf(conf, user, f); - ret = 0; - ast_frfree(f); - break; } else if (((f->frametype == AST_FRAME_DTMF) && (f->subclass == '*') && (confflags & CONFFLAG_STARMENU)) || ((f->frametype == AST_FRAME_DTMF) && menu_active)) { if (confflags & CONFFLAG_PASS_DTMF) conf_queue_dtmf(conf, user, f); @@ -2543,6 +2521,27 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c } conf_flush(fd, chan); + /* Since this option could absorb dtmf meant for the previous (menu), we have to check this one last */ + } else if ((f->frametype == AST_FRAME_DTMF) && (confflags & CONFFLAG_EXIT_CONTEXT) && ast_exists_extension(chan, exitcontext, dtmfstr, 1, "")) { + if (confflags & CONFFLAG_PASS_DTMF) + conf_queue_dtmf(conf, user, f); + + if (!ast_goto_if_exists(chan, exitcontext, dtmfstr, 1)) { + ast_debug(1, "Got DTMF %c, goto context %s\n", dtmfstr[0], exitcontext); + ret = 0; + ast_frfree(f); + break; + } else { + ast_debug(2, "Exit by single digit did not work in meetme. Extension %s does not exist in context %s\n", dtmfstr, exitcontext); + } + } else if ((f->frametype == AST_FRAME_DTMF) && (confflags & CONFFLAG_KEYEXIT) && (strchr(exitkeys, f->subclass))) { + pbx_builtin_setvar_helper(chan, "MEETME_EXIT_KEY", dtmfstr); + + if (confflags & CONFFLAG_PASS_DTMF) + conf_queue_dtmf(conf, user, f); + ret = 0; + ast_frfree(f); + break; } else if ((f->frametype == AST_FRAME_DTMF_BEGIN || f->frametype == AST_FRAME_DTMF_END) && confflags & CONFFLAG_PASS_DTMF) { conf_queue_dtmf(conf, user, f); |