mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	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:
		
							
								
								
									
										118
									
								
								apps/app_url.c
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								apps/app_url.c
									
									
									
									
									
								
							| @@ -26,6 +26,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| #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 *app = "SendURL"; | ||||
| 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 @@ static int sendurl_exec(struct ast_channel *chan, void *data) | ||||
| 	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 @@ static int sendurl_exec(struct ast_channel *chan, void *data) | ||||
| 	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)  | ||||
| 					break; | ||||
| 				f = ast_read(chan); | ||||
| 				if (!f) { | ||||
| 					res = -1; | ||||
| 					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); | ||||
| 			} | ||||
| 		} | ||||
| 	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; | ||||
| 				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; | ||||
| 				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; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user