[Asterisk-cvs] asterisk/apps app_url.c,1.9,1.10

kpfleming kpfleming
Tue Sep 13 21:47:35 CDT 2005


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv31109/apps

Modified Files:
	app_url.c 
Log Message:
add status variable output and jumping control to SendURL() (issue #4812)


Index: app_url.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_url.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- app_url.c	6 Jun 2005 22:39:32 -0000	1.9
+++ app_url.c	14 Sep 2005 01:46:09 -0000	1.10
@@ -26,6 +26,7 @@
 #include "asterisk/module.h"
 #include "asterisk/translate.h"
 #include "asterisk/image.h"
+#include "asterisk/options.h"
 
 static char *tdesc = "Send URL Applications";
 
@@ -34,15 +35,25 @@
 static char *synopsis = "Send a URL";
 
 static char *descrip = 
-"  SendURL(URL[|option]): Requests client go to URL.  If the client\n"
-"does not support html transport, and  there  exists  a  step  with\n"
-"priority  n + 101,  then  execution  will  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"
-"If the option 'wait' is  specified,  execution  will  wait  for an\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";
+"  SendURL(URL[|option]): Requests client go to URL (IAX2) or sends the \n"
+"URL to the client (other channels).\n"
+"Result is returned in the SENDURLSTATUS channel variable:\n"
+"    SUCCESS       URL successfully sent to client\n"
+"    FAILURE       Failed to send URL\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"
+"acknowledgement that the URL has been loaded before continuing\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;
 
@@ -54,11 +65,15 @@
 	struct localuser *u;
 	char tmp[256];
 	char *options;
-	int option_wait=0;
+	int local_option_wait=0;
+	int local_option_jump = 0;
 	struct ast_frame *f;
 	char *stringp=NULL;
+	char *status = "FAILURE";
+
 	if (!data || !strlen((char *)data)) {
 		ast_log(LOG_WARNING, "SendURL requires an argument (URL)\n");
+		pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", status);
 		return -1;
 	}
 	strncpy(tmp, (char *)data, sizeof(tmp)-1);
@@ -66,51 +81,62 @@
 	strsep(&stringp, "|");
 	options = strsep(&stringp, "|");
 	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);
 	if (!ast_channel_supports_html(chan)) {
 		/* Does not support transport */
-		if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num))
-			chan->priority += 100;
+		if (local_option_jump || option_priority_jumping)
+			 ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
+		pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", "UNSUPPORTED");
 		LOCAL_USER_REMOVE(u);
 		return 0;
 	}
 	res = ast_channel_sendurl(chan, tmp);
-	if (res > -1) {
-		if (option_wait) {
-			for(;;) {
-				/* Wait for an event */
-				res = ast_waitfor(chan, -1);
-				if (res < 0) 
+	if (res == -1) {
+		pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", "FAILURE");
+		LOCAL_USER_REMOVE(u);
+		return res;
+	}
+	status = "SUCCESS";
+	if (local_option_wait) {
+		for(;;) {
+			/* Wait for an event */
+			res = ast_waitfor(chan, -1);
+			if (res < 0) 
+				break;
+			f = ast_read(chan);
+			if (!f) {
+				res = -1;
+				status = "FAILURE";
+				break;
+			}
+			if (f->frametype == AST_FRAME_HTML) {
+				switch(f->subclass) {
+				case AST_HTML_LDCOMPLETE:
+					res = 0;
+					ast_frfree(f);
+					status = "NOLOAD";
+					goto out;
 					break;
-				f = ast_read(chan);
-				if (!f) {
-					res = -1;
+				case AST_HTML_NOSUPPORT:
+					/* Does not support transport */
+					status ="UNSUPPORTED";
+					if (local_option_jump || option_priority_jumping)
+			 			ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
+					res = 0;
+					goto out;
 					break;
-				}
-				if (f->frametype == AST_FRAME_HTML) {
-					switch(f->subclass) {
-					case AST_HTML_LDCOMPLETE:
-						res = 0;
-						ast_frfree(f);
-						goto out;
-						break;
-					case AST_HTML_NOSUPPORT:
-						/* Does not support transport */
-						if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num))
-							chan->priority += 100;
-						res = 0;
-						goto out;
-						break;
-					default:
-						ast_log(LOG_WARNING, "Don't know what to do with HTML subclass %d\n", f->subclass);
-					};
-				}
-				ast_frfree(f);
+				default:
+					ast_log(LOG_WARNING, "Don't know what to do with HTML subclass %d\n", f->subclass);
+				};
 			}
+			ast_frfree(f);
 		}
-	}
+	} 
 out:	
+	pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", status);
 	LOCAL_USER_REMOVE(u);
 	return res;
 }




More information about the svn-commits mailing list