From c75c3e8bc24ec8d6415dcedeb201d8098ce1b471 Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Fri, 17 May 2002 14:33:10 +0000 Subject: [PATCH] Version 0.1.12 from FTP git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@450 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_dial.c | 50 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/apps/app_dial.c b/apps/app_dial.c index 0fbfad004e..20db11b0f1 100755 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -11,6 +11,7 @@ * the GNU General Public License */ +#include #include #include #include @@ -20,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -39,7 +41,7 @@ static char *app = "Dial"; static char *synopsis = "Place an call and connect to the current channel"; static char *descrip = -" Dial(Technology/resource[&Technology2/resource2...][|timeout][|transfer]):\n" +" Dial(Technology/resource[&Technology2/resource2...][|timeout][|options]):\n" "Requests one or more channels and places specified outgoing calls on them.\n" "As soon as a channel answers, the Dial app will answer the originating\n" "channel (if it needs to be answered) and will bridge a call with the channel\n" @@ -54,8 +56,11 @@ static char *descrip = "no-answer).\n" " This application returns -1 if the originating channel hangs up, or if the\n" "call is bridged and either of the parties in the bridge terminate the call.\n" -"The transfer string may contain a 't' to allow the called user transfer a\n" -"call or 'T' to allow the calling user to transfer the call.\n" +"The option string may contain zero or more of the following characters:\n" +" 't' -- allow the called user transfer the calling user\n" +" 'T' -- to allow the calling user to transfer the call.\n" +" 'r' -- indicate ringing to the calling party, pass no audio until answered.\n" +" 'm' -- provide hold music to the calling party until answered.\n" " In addition to transferring the call, a call may be parked and then picked\n" "up by another user.\n"; @@ -67,6 +72,8 @@ struct localuser { struct ast_channel *chan; int stillgoing; int allowredirect; + int ringbackonly; + int musiconhold; struct localuser *next; }; @@ -101,6 +108,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu struct ast_channel *watchers[MAX]; int pos; int single; + int moh=0; + int ringind=0; struct ast_channel *winner; single = (outgoing && !outgoing->next); @@ -110,6 +119,16 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu ast_channel_make_compatible(outgoing->chan, in); } + if (outgoing) { + moh = outgoing->musiconhold; + ringind = outgoing->ringbackonly; + if (outgoing->musiconhold) { + ast_moh_start(in, NULL); + } else if (outgoing->ringbackonly) { + ast_indicate(in, AST_CONTROL_RINGING); + } + } + while(*to && !peer) { o = outgoing; found = -1; @@ -186,10 +205,12 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu default: ast_log(LOG_DEBUG, "Dunno what to do with control type %d\n", f->subclass); } - } else if (single && (f->frametype == AST_FRAME_VOICE)) { + } else if (single && (f->frametype == AST_FRAME_VOICE) && + !(outgoing->ringbackonly || outgoing->musiconhold)) { if (ast_write(in, f)) ast_log(LOG_WARNING, "Unable to forward frame\n"); - } else if (single && (f->frametype == AST_FRAME_IMAGE)) { + } else if (single && (f->frametype == AST_FRAME_IMAGE) && + !(outgoing->ringbackonly || outgoing->musiconhold)) { if (ast_write(in, f)) ast_log(LOG_WARNING, "Unable to forward image\n"); } @@ -217,6 +238,12 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu if (!*to && (option_verbose > 2)) ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", orig); } + if (moh) { + ast_moh_stop(in); + } else if (ringind) { + ast_indicate(in, -1); + } + return peer; } @@ -290,10 +317,15 @@ static int dial_exec(struct ast_channel *chan, void *data) ast_log(LOG_WARNING, "Out of memory\n"); goto out; } - if (transfer && (strchr(transfer, 't'))) - tmp->allowredirect = 1; - else - tmp->allowredirect = 0; + memset(tmp, 0, sizeof(struct localuser)); + if (transfer) { + if (strchr(transfer, 't')) + tmp->allowredirect = 1; + if (strchr(transfer, 'r')) + tmp->ringbackonly = 1; + if (strchr(transfer, 'm')) + tmp->musiconhold = 1; + } strncpy(numsubst, number, sizeof(numsubst)-1); /* If we're dialing by extension, look at the extension to know what to dial */ if ((newnum = strstr(numsubst, "BYEXTENSION"))) {