]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add absolute timeout option to dial that applies when call is up (bug #1107)
authorMark Spencer <markster@digium.com>
Sat, 6 Mar 2004 00:02:40 +0000 (00:02 +0000)
committerMark Spencer <markster@digium.com>
Sat, 6 Mar 2004 00:02:40 +0000 (00:02 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2357 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_dial.c

index 6acbddba71b78ef7eef2e91af03b27cff98fab4a..665e714faf295dc9e3db90b4feb9daca9ce8a1ae 100755 (executable)
@@ -67,6 +67,7 @@ static char *descrip =
 "      'P[(x)]' -- privacy mode, using 'x' as database if provided.\n"
 "      'g' -- goes on in context if the destination channel hangs up\n"
 "      'A(x)' -- play an announcement to the called party, using x as file\n"
+"      'S(x)' -- hangup the call after x seconds AFTER called party picked up\n"       
 "  In addition to transferring the call, a call may be parked and then picked\n"
 "up by another user.\n"
 "  The optional URL will be sent to the called party if the channel supports\n"
@@ -377,9 +378,12 @@ static int dial_exec(struct ast_channel *chan, void *data)
        struct varshead *headp, *newheadp;
        struct ast_var_t *newvar;
        int go_on=0;
+       unsigned int calldurationlimit=0;
+       char *cdl;
+       time_t now;
        
        if (!data) {
-               ast_log(LOG_WARNING, "Dial requires an argument (technology1/number1&technology2/number2...|optional timeout)\n");
+               ast_log(LOG_WARNING, "Dial requires an argument (technology1/number1&technology2/number2...|optional timeout|options)\n");
                return -1;
        }
        
@@ -388,6 +392,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
        strncpy(info, (char *)data, sizeof(info) - 1);
        peers = info;
        if (peers) {
+               
                timeout = strchr(info, '|');
                if (timeout) {
                        *timeout = '\0';
@@ -416,6 +421,13 @@ static int dial_exec(struct ast_channel *chan, void *data)
        
 
        if (transfer) {
+               /* Extract call duration limit */
+               if ((cdl = strstr(transfer, "S("))) {
+                       calldurationlimit=atoi(cdl+2);
+                       if (option_verbose > 2)
+                               ast_verbose(VERBOSE_PREFIX_3 "Setting call duration limit to %i seconds.\n",calldurationlimit);                 
+               } 
+               
                /* XXX ANNOUNCE SUPPORT */
                if ((ann = strstr(transfer, "A("))) {
                        announce = 1;
@@ -700,6 +712,10 @@ static int dial_exec(struct ast_channel *chan, void *data)
                        // Ok, done. stop autoservice
                        res2 = ast_autoservice_stop(chan);
                }
+               if (calldurationlimit > 0) {
+                       time(&now);
+                       chan->whentohangup = now + calldurationlimit;
+               }
                res = ast_bridge_call(chan, peer, allowredir_in, allowredir_out, allowdisconnect);
 
                if (res != AST_PBX_NO_HANGUP_PEER)