mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Version 0.3.0 from FTP
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@585 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										122
									
								
								apps/app_dial.c
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								apps/app_dial.c
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| /* | ||||
|  * Asterisk -- A telephony toolkit for Linux. | ||||
|  * | ||||
|  * Trivial application to dial a channel | ||||
|  * Trivial application to dial a channel and send an URL on answer | ||||
|  *  | ||||
|  * Copyright (C) 1999, Mark Spencer | ||||
|  * | ||||
| @@ -22,6 +22,7 @@ | ||||
| #include <asterisk/say.h> | ||||
| #include <asterisk/parking.h> | ||||
| #include <asterisk/musiconhold.h> | ||||
| #include <asterisk/callerid.h> | ||||
| #include <stdlib.h> | ||||
| #include <errno.h> | ||||
| #include <unistd.h> | ||||
| @@ -41,7 +42,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][|options]):\n" | ||||
| "  Dial(Technology/resource[&Technology2/resource2...][|timeout][|options][|URL]):\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" | ||||
| @@ -63,8 +64,11 @@ static char *descrip = | ||||
| "      'm' -- provide hold music to the calling party until answered.\n" | ||||
| "      'd' -- data-quality (modem) call (minimum delay).\n" | ||||
| "      'H' -- allow caller to hang up by hitting *.\n" | ||||
| "      'P[(x)]' -- privacy mode, using 'x' as database if provided.\n" | ||||
| "  In addition to transferring the call, a call may be parked and then picked\n" | ||||
| "up by another user.\n"; | ||||
| "up by another user.\n" | ||||
| "  The optionnal URL will be sent to the called party if the channel supports\n" | ||||
| "it.\n"; | ||||
|  | ||||
| /* We define a customer "local user" structure because we | ||||
|    use it not only for keeping track of what is in use but | ||||
| @@ -160,6 +164,12 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu | ||||
| 					ast_verbose( VERBOSE_PREFIX_2 "No one is available to answer at this time\n"); | ||||
| 			} | ||||
| 			*to = 0; | ||||
| 			/* if no one available we'd better stop MOH/ringing to */ | ||||
| 			if (moh) { | ||||
| 				ast_moh_stop(in); | ||||
| 			} else if (ringind) { | ||||
| 				ast_indicate(in, -1); | ||||
| 			} | ||||
| 			return NULL; | ||||
| 		} | ||||
| 		winner = ast_waitfor_n(watchers, pos, to); | ||||
| @@ -210,6 +220,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu | ||||
| 							if (!sentringing) { | ||||
| 								ast_indicate(in, AST_CONTROL_RINGING); | ||||
| 								sentringing++; | ||||
| 								ringind++; | ||||
| 							} | ||||
| 							break; | ||||
| 						case AST_CONTROL_OFFHOOK: | ||||
| @@ -277,15 +288,22 @@ static int dial_exec(struct ast_channel *chan, void *data) | ||||
| 	int res=-1; | ||||
| 	struct localuser *u; | ||||
| 	char info[256], *peers, *timeout, *tech, *number, *rest, *cur; | ||||
| 	char  privdb[256] = "", *s; | ||||
| 	struct localuser *outgoing=NULL, *tmp; | ||||
| 	struct ast_channel *peer; | ||||
| 	int to; | ||||
| 	int allowredir=0; | ||||
| 	int allowdisconnect=0; | ||||
| 	int privacy=0; | ||||
| 	char numsubst[AST_MAX_EXTENSION]; | ||||
| 	char restofit[AST_MAX_EXTENSION]; | ||||
| 	char *transfer = NULL; | ||||
| 	char *newnum; | ||||
| 	char callerid[256], *l, *n; | ||||
| 	char *url=NULL; /* JDG */ | ||||
| 	struct ast_var_t *current; | ||||
| 	struct varshead *headp, *newheadp; | ||||
| 	struct ast_var_t *newvar; | ||||
| 	 | ||||
| 	if (!data) { | ||||
| 		ast_log(LOG_WARNING, "Dial requires an argument (technology1/number1&technology2/number2...|optional timeout)\n"); | ||||
| @@ -306,6 +324,15 @@ static int dial_exec(struct ast_channel *chan, void *data) | ||||
| 			if (transfer) { | ||||
| 				*transfer = '\0'; | ||||
| 				transfer++; | ||||
| 				/* JDG */ | ||||
| 				url = strchr(transfer, '|'); | ||||
| 				if (url) { | ||||
| 					*url = '\0'; | ||||
| 					url++; | ||||
| 					ast_log(LOG_DEBUG, "DIAL WITH URL=%s_\n", url); | ||||
| 				} else  | ||||
| 					ast_log(LOG_DEBUG, "SIMPLE DIAL (NO URL)\n"); | ||||
| 				/* /JDG */ | ||||
| 			} | ||||
| 		} | ||||
| 	} else | ||||
| @@ -315,6 +342,46 @@ static int dial_exec(struct ast_channel *chan, void *data) | ||||
| 		goto out; | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	if (transfer) { | ||||
| 		/* Extract privacy info from transfer */ | ||||
| 		if ((s = strstr(transfer, "P("))) { | ||||
| 			privacy = 1; | ||||
| 			strncpy(privdb, s + 2, sizeof(privdb) - 1); | ||||
| 			/* Overwrite with X's what was the privacy info */ | ||||
| 			while(*s && (*s != ')'))  | ||||
| 				*(s++) = 'X'; | ||||
| 			if (*s) | ||||
| 				*s = 'X'; | ||||
| 			/* Now find the end of the privdb */ | ||||
| 			s = strchr(privdb, ')'); | ||||
| 			if (s) | ||||
| 				*s = '\0'; | ||||
| 			else { | ||||
| 				ast_log(LOG_WARNING, "Transfer with privacy lacking trailing '('\n"); | ||||
| 				privacy = 0; | ||||
| 			} | ||||
| 		} else if (strchr(transfer, 'P')) { | ||||
| 			/* No specified privdb */ | ||||
| 			privacy = 1; | ||||
| 		} | ||||
| 	} | ||||
| 	if (!strlen(privdb) && privacy) { | ||||
| 		/* If privdb is not specified and we are using privacy, copy from extension */ | ||||
| 		strncpy(privdb, chan->exten, sizeof(privdb) - 1); | ||||
| 	} | ||||
| 	if (privacy) { | ||||
| 		if (chan->callerid) | ||||
| 			strncpy(callerid, chan->callerid, sizeof(callerid)); | ||||
| 		else | ||||
| 			strcpy(callerid, ""); | ||||
| 		ast_callerid_parse(callerid, &n, &l); | ||||
| 		if (l) { | ||||
| 			ast_shrink_phone_number(l); | ||||
| 		} else | ||||
| 			l = ""; | ||||
| 		ast_log(LOG_NOTICE, "Privacy DB is '%s', privacy is %d, clid is '%s'\n", privdb, privacy, l); | ||||
| 	} | ||||
| 	cur = peers; | ||||
| 	do { | ||||
| 		/* Remember where to start next time */ | ||||
| @@ -341,14 +408,19 @@ static int dial_exec(struct ast_channel *chan, void *data) | ||||
| 		if (transfer) { | ||||
| 			if (strchr(transfer, 't')) | ||||
| 				tmp->allowredirect = 1; | ||||
|                         else    tmp->allowredirect = 0; | ||||
| 			if (strchr(transfer, 'r')) | ||||
| 				tmp->ringbackonly = 1; | ||||
|                         else    tmp->ringbackonly = 0; | ||||
| 			if (strchr(transfer, 'm')) | ||||
| 				tmp->musiconhold = 1; | ||||
|                         else    tmp->musiconhold = 0; | ||||
| 			if (strchr(transfer, 'd')) | ||||
| 				tmp->dataquality = 1; | ||||
|                         else    tmp->dataquality = 0; | ||||
| 			if (strchr(transfer, 'H')) | ||||
| 				tmp->allowdisconnect = 1; | ||||
|                         else    tmp->allowdisconnect = 0; | ||||
| 		} | ||||
| 		strncpy(numsubst, number, sizeof(numsubst)-1); | ||||
| 		/* If we're dialing by extension, look at the extension to know what to dial */ | ||||
| @@ -382,6 +454,23 @@ static int dial_exec(struct ast_channel *chan, void *data) | ||||
| 			cur = rest; | ||||
| 			break; | ||||
| 		} | ||||
| 		/* If creating a SIP channel, look for a variable called */ | ||||
| 		/* VXML_URL in the calling channel and copy it to the    */ | ||||
| 		/* new channel.                                          */ | ||||
| 		if (strcasecmp(tech,"SIP")==0) | ||||
| 		{ | ||||
| 			headp=&chan->varshead; | ||||
| 			AST_LIST_TRAVERSE(headp,current,entries) { | ||||
| 				if (strcasecmp(ast_var_name(current),"VXML_URL")==0) | ||||
| 				{ | ||||
| 					newvar=ast_var_assign(ast_var_name(current),ast_var_value(current)); | ||||
| 					newheadp=&tmp->chan->varshead; | ||||
| 					AST_LIST_INSERT_HEAD(newheadp,newvar,entries); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		tmp->chan->appl = "AppDial"; | ||||
| 		tmp->chan->data = "(Outgoing Line)"; | ||||
| 		tmp->chan->whentohangup = 0; | ||||
| @@ -445,6 +534,18 @@ static int dial_exec(struct ast_channel *chan, void *data) | ||||
| 		/* Ah ha!  Someone answered within the desired timeframe.  Of course after this | ||||
| 		   we will always return with -1 so that it is hung up properly after the  | ||||
| 		   conversation.  */ | ||||
| 		if (!strcmp(chan->type,"Zap")) | ||||
| 		{ | ||||
| 			int x = 2; | ||||
| 			if (tmp->dataquality) x = 0; | ||||
| 			ast_channel_setoption(chan,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0); | ||||
| 		}			 | ||||
| 		if (!strcmp(peer->type,"Zap")) | ||||
| 		{ | ||||
| 			int x = 2; | ||||
| 			if (tmp->dataquality) x = 0; | ||||
| 			ast_channel_setoption(peer,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0); | ||||
| 		}			 | ||||
| 		hanguptree(outgoing, peer); | ||||
| 		outgoing = NULL; | ||||
| 		/* If appropriate, log that we have a destination channel */ | ||||
| @@ -457,16 +558,11 @@ static int dial_exec(struct ast_channel *chan, void *data) | ||||
| 			ast_hangup(peer); | ||||
| 			return -1; | ||||
| 		} | ||||
| 		if (!strcmp(chan->type,"Zap")) { | ||||
| 			int x = 2; | ||||
| 			if (tmp->dataquality) x = 0; | ||||
| 			ast_channel_setoption(chan,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0); | ||||
| 		}			 | ||||
| 		if (!strcmp(peer->type,"Zap")) { | ||||
| 			int x = 2; | ||||
| 			if (tmp->dataquality) x = 0; | ||||
| 			ast_channel_setoption(peer,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0); | ||||
| 		}			 | ||||
|  		/* JDG: sendurl */ | ||||
|  		if( url && strlen(url) && ast_channel_supports_html(peer) ) { | ||||
|  			ast_log(LOG_DEBUG, "app_dial: sendurl=%s.\n", url); | ||||
|  			ast_channel_sendurl( peer, url ); | ||||
|  		} /* /JDG */ | ||||
| 		res = ast_bridge_call(chan, peer, allowredir, allowdisconnect); | ||||
| 		ast_hangup(peer); | ||||
| 	}	 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user