Issue 6082 - New DTMF event for manager
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 10 Apr 2007 23:55:26 +0000 (23:55 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 10 Apr 2007 23:55:26 +0000 (23:55 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@61324 65c4cc65-6c06-0410-ace0-fbb531ad65f3

configs/manager.conf.sample
include/asterisk/manager.h
main/channel.c
main/manager.c

index 660ab84..6f2eec8 100644 (file)
@@ -58,5 +58,5 @@ bindaddr = 0.0.0.0
 ; writetimeout = 100
 ;
 ; Authorization for various classes 
-;read = system,call,log,verbose,command,agent,user,config
-;write = system,call,log,verbose,command,agent,user,config
+;read = system,call,log,verbose,command,agent,user,config,dtmf
+;write = system,call,log,verbose,command,agent,user,config,dtmf
index 8efcfba..fd1ed4a 100644 (file)
@@ -55,6 +55,7 @@
 #define EVENT_FLAG_AGENT               (1 << 5) /* Ability to read/set agent info */
 #define EVENT_FLAG_USER                 (1 << 6) /* Ability to read/set user info */
 #define EVENT_FLAG_CONFIG              (1 << 7) /* Ability to modify configurations */
+#define EVENT_FLAG_DTMF                (1 << 8) /* Ability to read DTMF events */
 
 /* Export manager structures */
 #define AST_MAX_MANHEADERS 128
index 87be422..dd79c6f 100644 (file)
@@ -2030,6 +2030,19 @@ int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
        return 0; /* Time is up */
 }
 
+static void send_dtmf_event(const struct ast_channel *chan, const char *direction, const char digit, const char *begin, const char *end)
+{
+       manager_event(EVENT_FLAG_DTMF,
+                       "DTMF",
+                       "Channel: %s\r\n"
+                       "Uniqueid: %s\r\n"
+                       "Digit: %c\r\n"
+                       "Direction: %s\r\n"
+                       "Begin: %s\r\n"
+                       "End: %s\r\n",
+                       chan->name, chan->uniqueid, digit, direction, begin, end);
+}
+
 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
 {
        struct ast_frame *f = NULL;     /* the return value */
@@ -2196,6 +2209,7 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
                        }
                        break;
                case AST_FRAME_DTMF_END:
+                       send_dtmf_event(chan, "Received", f->subclass, "No", "Yes");
                        ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass, chan->name, f->len);
                        /* Queue it up if DTMF is deffered, or if DTMF emulation is forced.
                         * However, only let emulation be forced if the other end cares about BEGIN frames */
@@ -2223,6 +2237,7 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
                        }
                        break;
                case AST_FRAME_DTMF_BEGIN:
+                       send_dtmf_event(chan, "Received", f->subclass, "Yes", "No");
                        ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass, chan->name);
                        if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_END_DTMF_ONLY)) {
                                ast_frfree(f);
@@ -2617,6 +2632,7 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
                        chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
                break;
        case AST_FRAME_DTMF_BEGIN:
+               send_dtmf_event(chan, "Sent", fr->subclass, "Yes", "No");
                ast_clear_flag(chan, AST_FLAG_BLOCKING);
                ast_channel_unlock(chan);
                res = ast_senddigit_begin(chan, fr->subclass);
@@ -2624,6 +2640,7 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
                CHECK_BLOCKING(chan);
                break;
        case AST_FRAME_DTMF_END:
+               send_dtmf_event(chan, "Sent", fr->subclass, "No", "Yes");
                ast_clear_flag(chan, AST_FLAG_BLOCKING);
                ast_channel_unlock(chan);
                res = ast_senddigit_end(chan, fr->subclass, fr->len);
index 2298cf2..8cff7ce 100644 (file)
@@ -308,6 +308,7 @@ static struct permalias {
        { EVENT_FLAG_AGENT, "agent" },
        { EVENT_FLAG_USER, "user" },
        { EVENT_FLAG_CONFIG, "config" },
+       { EVENT_FLAG_DTMF, "dtmf" },
        { -1, "all" },
        { 0, "none" },
 };