From: Kevin P. Fleming Date: Tue, 15 Nov 2005 19:52:25 +0000 (+0000) Subject: issue #5751 X-Git-Tag: 1.2.0~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e88e390bb821b460a04eee4f240836f9297629cf;p=thirdparty%2Fasterisk.git issue #5751 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7104 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/ChangeLog b/ChangeLog index aa1501b231..e20a430905 100755 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2005-11-15 Kevin P. Fleming + * channels/chan_sip.c (handle_request_info): properly forward 'flash' events received via SIP INFO (issue #5751, different patch) + * apps/app_disa.c (disa_exec): don't duplicate constant strings when not needed * apps/app_playback.c (playback_exec): use correct logic tests for options (issue #5752) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 3c7aef5afe..2de41da8ea 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -8575,8 +8575,6 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req) { char buf[1024]; unsigned int event; - char resp = 0; - struct ast_frame f; char *c; /* Need to check the media/type */ @@ -8592,42 +8590,46 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req) ast_copy_string(buf, c, sizeof(buf)); } - if (p->owner) { /* PBX call */ - if (!ast_strlen_zero(buf)) { - if (sipdebug) - ast_verbose("* DTMF received: '%c'\n", buf[0]); - if (buf[0] == '*') - event = 10; - else if (buf[0] == '#') - event = 11; - else if ((buf[0] >= 'A') && (buf[0] <= 'D')) - event = 12 + buf[0] - 'A'; - else - event = atoi(buf); - if (event < 10) { - resp = '0' + event; - } else if (event < 11) { - resp = '*'; - } else if (event < 12) { - resp = '#'; - } else if (event < 16) { - resp = 'A' + (event - 12); - } - /* Build DTMF frame and deliver to PBX for transmission to other call leg*/ - memset(&f, 0, sizeof(f)); - f.frametype = AST_FRAME_DTMF; - f.subclass = resp; - f.offset = 0; - f.data = NULL; - f.datalen = 0; - ast_queue_frame(p->owner, &f); - } + if (!p->owner) { /* not a PBX call */ + transmit_response(p, "481 Call leg/transaction does not exist", req); + ast_set_flag(p, SIP_NEEDDESTROY); + return; + } + + if (ast_strlen_zero(buf)) { transmit_response(p, "200 OK", req); return; + } + + if (sipdebug) + ast_verbose("* DTMF-relay event received: '%c'\n", buf[0]); + if (buf[0] == '*') + event = 10; + else if (buf[0] == '#') + event = 11; + else if ((buf[0] >= 'A') && (buf[0] <= 'D')) + event = 12 + buf[0] - 'A'; + else + event = atoi(buf); + if (event == 16) { + /* send a FLASH event */ + struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_FLASH, }; + ast_queue_frame(p->owner, &f); } else { - transmit_response(p, "481 Call leg/transaction does not exist", req); - ast_set_flag(p, SIP_NEEDDESTROY); + /* send a DTMF event */ + struct ast_frame f = { AST_FRAME_DTMF, }; + if (event < 10) { + f.subclass = '0' + event; + } else if (event < 11) { + f.subclass = '*'; + } else if (event < 12) { + f.subclass = '#'; + } else if (event < 16) { + f.subclass = 'A' + (event - 12); + } + ast_queue_frame(p->owner, &f); } + transmit_response(p, "200 OK", req); return; } else if (!strcasecmp(get_header(req, "Content-Type"), "application/media_control+xml")) { /* Eh, we'll just assume it's a fast picture update for now */