]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Qualify that SIP INFO stuff is real (bug #1558)
authorMark Spencer <markster@digium.com>
Wed, 5 May 2004 01:56:03 +0000 (01:56 +0000)
committerMark Spencer <markster@digium.com>
Wed, 5 May 2004 01:56:03 +0000 (01:56 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2894 65c4cc65-6c06-0410-ace0-fbb531ad65f3

aesopt.h
channels/chan_sip.c

index 936ccd4ca70a470c1ebd3a14eb31bc9f2e32e5cc..9919f6c50edd3de8c521214b8e396e6a49947006 100755 (executable)
--- a/aesopt.h
+++ b/aesopt.h
 #  include <machine/endian.h>
 #elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
 #  include <endian.h>
+#if !defined(__APPLE__)
 #  include <byteswap.h>
+#endif
 #elif defined( linux )
 #  include <endian.h>
 #endif
index 0204c1cf1b50345400cbee215c769854047c02dc..3319508f98a49d3fd2735bb822998ae999f8ee9e 100755 (executable)
@@ -4840,6 +4840,7 @@ static int sip_show_channel(int fd, int argc, char *argv[])
        return RESULT_SUCCESS;
 }
 
+
 static void receive_info(struct sip_pvt *p, struct sip_request *req)
 {
        char buf[1024] = "";
@@ -4847,19 +4848,23 @@ static void receive_info(struct sip_pvt *p, struct sip_request *req)
        char resp = 0;
        struct ast_frame f;
        char *c;
-       /* Try getting the "signal=" part */
-       if (!ast_strlen_zero(c = get_sdp(req, "Signal")) || !ast_strlen_zero(c = get_sdp(req, "d"))) {
-               strncpy(buf, c, sizeof(buf) - 1);
-       } else if (get_msg_text(buf, sizeof(buf), req)) {
-               /* Normal INFO method */
-               ast_log(LOG_WARNING, "Unable to retrieve text from %s\n", p->callid);
-               return;
-       }
        
-       if (p->owner) {
-               if (!ast_strlen_zero(buf)) {
-                       if (sip_debug_test_pvt(p))
-                               ast_verbose("DTMF received: '%c'\n", buf[0]);
+       /* Need to check the media/type */
+       if (!strcasecmp(get_header(req, "Content-Type"), "application/dtmf-relay")) {
+
+               /* Try getting the "signal=" part */
+               if (strlen(c = get_sdp(req, "Signal")) || strlen(c = get_sdp(req, "d"))) {
+                  strncpy(buf, c, sizeof(buf) - 1);
+               } else {
+                  ast_log(LOG_WARNING, "Unable to retrieve DTMF signal from INFO message from %s\n", p->callid);
+                  transmit_response(p, "200 OK", req); /* Should return error */
+                  return;
+               }
+       
+               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] == '#')
@@ -4875,6 +4880,7 @@ static void receive_info(struct sip_pvt *p, struct sip_request *req)
                         } 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;
@@ -4882,8 +4888,19 @@ static void receive_info(struct sip_pvt *p, struct sip_request *req)
                         f.data = NULL;
                         f.datalen = 0;
                         ast_queue_frame(p->owner, &f);
+                  }
+                  transmit_response(p, "200 OK", req);
+                  return;
                }
+               transmit_response(p, "481 Call leg/transaction does not exist", req);
+               return;
        }
+       /* Other type of INFO message, not really understood by Asterisk */
+       /* if (get_msg_text(buf, sizeof(buf), req)) { */
+
+       ast_log(LOG_WARNING, "Unable to parse INFO message from %s. Content %s\n", p->callid, buf);
+       transmit_response(p, "415 Unsupported media type", req);
+       return;
 }
 
 static int sip_do_debug_ip(int fd, int argc, char *argv[])