aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-15 19:52:25 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-15 19:52:25 +0000
commit08c3aa37921a36fbe430a1afbde1003b2ff27d1f (patch)
tree891d9938f1362d5609b61dc57f1a2bbaa223a5a6 /channels
parentc44967b62f311bcb49a3d8dd9160052d2b9703ad (diff)
issue #5751
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@7104 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-xchannels/chan_sip.c70
1 files changed, 36 insertions, 34 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 3c7aef5af..2de41da8e 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 */