Merged revisions 122137 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 12 Jun 2008 15:26:07 +0000 (15:26 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 12 Jun 2008 15:26:07 +0000 (15:26 +0000)
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: https://origsvn.digium.com/svn/asterisk/trunk@122174 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_meetme.c

index c1acfc2..8b017ff 100644 (file)
@@ -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);