From: Tilghman Lesher Date: Thu, 12 Jun 2008 15:18:39 +0000 (+0000) Subject: Flipflop the sections for two options, since the section for 'X' (exit context) X-Git-Tag: 1.4.22-rc1~219 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3ca503066ac307526f93f3b3d555468bb4646570;p=thirdparty%2Fasterisk.git 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: https://origsvn.digium.com/svn/asterisk/branches/1.4@122137 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 1a2b8da5c2..990913b1e1 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -1909,6 +1909,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 */ @@ -1926,6 +1928,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); @@ -1976,21 +1983,6 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c if (user->talking || !(confflags & CONFFLAG_OPTIMIZETALKER)) careful_write(fd, f->data, 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_log(LOG_DEBUG, "Got DTMF %c, goto context %s\n", tmp[0], exitcontext); - ret = 0; - ast_frfree(f); - break; - } else if (option_debug > 1) - ast_log(LOG_DEBUG, "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) && (f->subclass == '#') && (confflags & CONFFLAG_POUNDEXIT)) { if (confflags & CONFFLAG_PASS_DTMF) conf_queue_dtmf(conf, user, f); @@ -2154,6 +2146,18 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c } conf_flush(fd, chan); + /* Since this option could absorb dtmf for the previous, 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_log(LOG_DEBUG, "Got DTMF %c, goto context %s\n", dtmfstr[0], exitcontext); + ret = 0; + ast_frfree(f); + break; + } else if (option_debug > 1) + ast_log(LOG_DEBUG, "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_BEGIN || f->frametype == AST_FRAME_DTMF_END) && confflags & CONFFLAG_PASS_DTMF) { conf_queue_dtmf(conf, user, f);