add status variable output and jumping control to SendURL() (issue #4812)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6581 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin P. Fleming
2005-09-14 01:46:09 +00:00
parent 7b0c1cb275
commit 8f537c4378

View File

@@ -26,6 +26,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h" #include "asterisk/module.h"
#include "asterisk/translate.h" #include "asterisk/translate.h"
#include "asterisk/image.h" #include "asterisk/image.h"
#include "asterisk/options.h"
static char *tdesc = "Send URL Applications"; static char *tdesc = "Send URL Applications";
@@ -34,15 +35,25 @@ static char *app = "SendURL";
static char *synopsis = "Send a URL"; static char *synopsis = "Send a URL";
static char *descrip = static char *descrip =
" SendURL(URL[|option]): Requests client go to URL. If the client\n" " SendURL(URL[|option]): Requests client go to URL (IAX2) or sends the \n"
"does not support html transport, and there exists a step with\n" "URL to the client (other channels).\n"
"priority n + 101, then execution will continue at that step.\n" "Result is returned in the SENDURLSTATUS channel variable:\n"
"Otherwise, execution will continue at the next priority level.\n" " SUCCESS URL successfully sent to client\n"
"SendURL only returns 0 if the URL was sent correctly or if\n" " FAILURE Failed to send URL\n"
"the channel does not support HTML transport, and -1 otherwise.\n" " NOLOAD Clien failed to load URL (wait enabled)\n"
" UNSUPPORTED Channel does not support URL transport\n"
"\n"
"If the option 'wait' is specified, execution will wait for an\n" "If the option 'wait' is specified, execution will wait for an\n"
"acknowledgement that the URL has been loaded before continuing\n" "acknowledgement that the URL has been loaded before continuing\n"
"and will return -1 if the peer is unable to load the URL\n"; "and will return -1 if the peer is unable to load the URL\n"
"\n"
"Old behaviour (deprecated): \n"
" If the client does not support Asterisk \"html\" transport, \n"
" and there exists a step with priority n + 101, then execution will\n"
" continue at that step.\n"
" Otherwise, execution will continue at the next priority level.\n"
" SendURL only returns 0 if the URL was sent correctly or if\n"
" the channel does not support HTML transport, and -1 otherwise.\n";
STANDARD_LOCAL_USER; STANDARD_LOCAL_USER;
@@ -54,11 +65,15 @@ static int sendurl_exec(struct ast_channel *chan, void *data)
struct localuser *u; struct localuser *u;
char tmp[256]; char tmp[256];
char *options; char *options;
int option_wait=0; int local_option_wait=0;
int local_option_jump = 0;
struct ast_frame *f; struct ast_frame *f;
char *stringp=NULL; char *stringp=NULL;
char *status = "FAILURE";
if (!data || !strlen((char *)data)) { if (!data || !strlen((char *)data)) {
ast_log(LOG_WARNING, "SendURL requires an argument (URL)\n"); ast_log(LOG_WARNING, "SendURL requires an argument (URL)\n");
pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", status);
return -1; return -1;
} }
strncpy(tmp, (char *)data, sizeof(tmp)-1); strncpy(tmp, (char *)data, sizeof(tmp)-1);
@@ -66,18 +81,26 @@ static int sendurl_exec(struct ast_channel *chan, void *data)
strsep(&stringp, "|"); strsep(&stringp, "|");
options = strsep(&stringp, "|"); options = strsep(&stringp, "|");
if (options && !strcasecmp(options, "wait")) if (options && !strcasecmp(options, "wait"))
option_wait = 1; local_option_wait = 1;
if (options && !strcasecmp(options, "j"))
local_option_jump = 1;
LOCAL_USER_ADD(u); LOCAL_USER_ADD(u);
if (!ast_channel_supports_html(chan)) { if (!ast_channel_supports_html(chan)) {
/* Does not support transport */ /* Does not support transport */
if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) if (local_option_jump || option_priority_jumping)
chan->priority += 100; ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", "UNSUPPORTED");
LOCAL_USER_REMOVE(u); LOCAL_USER_REMOVE(u);
return 0; return 0;
} }
res = ast_channel_sendurl(chan, tmp); res = ast_channel_sendurl(chan, tmp);
if (res > -1) { if (res == -1) {
if (option_wait) { pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", "FAILURE");
LOCAL_USER_REMOVE(u);
return res;
}
status = "SUCCESS";
if (local_option_wait) {
for(;;) { for(;;) {
/* Wait for an event */ /* Wait for an event */
res = ast_waitfor(chan, -1); res = ast_waitfor(chan, -1);
@@ -86,6 +109,7 @@ static int sendurl_exec(struct ast_channel *chan, void *data)
f = ast_read(chan); f = ast_read(chan);
if (!f) { if (!f) {
res = -1; res = -1;
status = "FAILURE";
break; break;
} }
if (f->frametype == AST_FRAME_HTML) { if (f->frametype == AST_FRAME_HTML) {
@@ -93,12 +117,14 @@ static int sendurl_exec(struct ast_channel *chan, void *data)
case AST_HTML_LDCOMPLETE: case AST_HTML_LDCOMPLETE:
res = 0; res = 0;
ast_frfree(f); ast_frfree(f);
status = "NOLOAD";
goto out; goto out;
break; break;
case AST_HTML_NOSUPPORT: case AST_HTML_NOSUPPORT:
/* Does not support transport */ /* Does not support transport */
if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) status ="UNSUPPORTED";
chan->priority += 100; if (local_option_jump || option_priority_jumping)
ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
res = 0; res = 0;
goto out; goto out;
break; break;
@@ -109,8 +135,8 @@ static int sendurl_exec(struct ast_channel *chan, void *data)
ast_frfree(f); ast_frfree(f);
} }
} }
}
out: out:
pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", status);
LOCAL_USER_REMOVE(u); LOCAL_USER_REMOVE(u);
return res; return res;
} }