mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Add "ImportVar" application
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4272 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										58
									
								
								pbx.c
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								pbx.c
									
									
									
									
									
								
							| @@ -182,6 +182,7 @@ static int pbx_builtin_saydigits(struct ast_channel *, void *); | ||||
| static int pbx_builtin_saycharacters(struct ast_channel *, void *); | ||||
| static int pbx_builtin_sayphonetic(struct ast_channel *, void *); | ||||
| int pbx_builtin_setvar(struct ast_channel *, void *); | ||||
| static int pbx_builtin_importvar(struct ast_channel *, void *); | ||||
| void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value); | ||||
| char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name); | ||||
|  | ||||
| @@ -388,6 +389,12 @@ static struct pbx_builtin { | ||||
| 	"  SetVar(#n=value): Sets variable n to value.  If prefixed with _, single\n" | ||||
| 	"inheritance assumed.  If prefixed with __, infinite inheritance is assumed.\n" }, | ||||
|  | ||||
| 	{ "ImportVar", pbx_builtin_importvar, | ||||
| 	"Set variable to value", | ||||
| 	"  ImportVar(#n=channel|variable): Sets variable n to variable as evaluated on\n" | ||||
| 	"the specified channel (instead of current).  If prefixed with _, single\n" | ||||
| 	"inheritance assumed.  If prefixed with __, infinite inheritance is assumed.\n" }, | ||||
|  | ||||
| 	{ "StripMSD", pbx_builtin_stripmsd, | ||||
| 	"Strip leading digits", | ||||
| 	"  StripMSD(count): Strips the leading 'count' digits from the channel's\n" | ||||
| @@ -910,16 +917,6 @@ static void pbx_substitute_variables_temp(struct ast_channel *c, const char *var | ||||
| 	} else if (c && !strcmp(var, "EXTEN")) { | ||||
| 		strncpy(workspace, c->exten, workspacelen - 1); | ||||
| 		*ret = workspace; | ||||
| 	} else if (c && !strncmp(var, "EXTEN-", strlen("EXTEN-")) &&  | ||||
| 		/* XXX Remove me eventually */ | ||||
| 		(sscanf(var + strlen("EXTEN-"), "%d", &offset) == 1)) { | ||||
| 		if (offset < 0) | ||||
| 			offset=0; | ||||
| 		if (offset > strlen(c->exten)) | ||||
| 			offset = strlen(c->exten); | ||||
| 		strncpy(workspace, c->exten + offset, workspacelen - 1); | ||||
| 		*ret = workspace; | ||||
| 		ast_log(LOG_WARNING, "The use of 'EXTEN-foo' has been deprecated in favor of 'EXTEN:foo'\n"); | ||||
| 	} else if (c && !strcmp(var, "RDNIS")) { | ||||
| 		if (c->cid.cid_rdnis) { | ||||
| 			strncpy(workspace, c->cid.cid_rdnis, workspacelen - 1); | ||||
| @@ -5075,7 +5072,7 @@ int pbx_builtin_setvar(struct ast_channel *chan, void *data) | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	stringp = data; | ||||
| 	stringp = ast_strdupa(data); | ||||
| 	name = strsep(&stringp,"="); | ||||
| 	value = strsep(&stringp,"\0");  | ||||
|  | ||||
| @@ -5084,6 +5081,45 @@ int pbx_builtin_setvar(struct ast_channel *chan, void *data) | ||||
| 	return(0); | ||||
| } | ||||
|  | ||||
| int pbx_builtin_importvar(struct ast_channel *chan, void *data) | ||||
| { | ||||
| 	char *name; | ||||
| 	char *value; | ||||
| 	char *stringp=NULL; | ||||
| 	char *channel; | ||||
| 	struct ast_channel *chan2=NULL; | ||||
| 	char tmp[4096]=""; | ||||
| 	char *s; | ||||
|  | ||||
| 	if (!data || ast_strlen_zero(data)) { | ||||
| 		ast_log(LOG_WARNING, "Ignoring, since there is no variable to set\n"); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	stringp = ast_strdupa(data); | ||||
| 	name = strsep(&stringp,"="); | ||||
| 	channel = strsep(&stringp,"|");  | ||||
| 	value = strsep(&stringp,"\0"); | ||||
| 	if (channel && value && name) { | ||||
| 		while((chan2 = ast_channel_walk_locked(chan2))) { | ||||
| 			if (!strcmp(chan2->name, channel)) | ||||
| 				break; | ||||
| 			ast_mutex_unlock(&chan2->lock); | ||||
| 		} | ||||
| 		if (chan2) { | ||||
| 			s = alloca(strlen(value) + 4); | ||||
| 			if (s) { | ||||
| 				sprintf(s, "${%s}", value); | ||||
| 				pbx_substitute_variables_helper(chan2, s, tmp, sizeof(tmp) - 1); | ||||
| 			} | ||||
| 			ast_mutex_unlock(&chan2->lock); | ||||
| 		} | ||||
| 		pbx_builtin_setvar_helper(chan, name, tmp); | ||||
| 	} | ||||
|  | ||||
| 	return(0); | ||||
| } | ||||
|  | ||||
| static int pbx_builtin_setglobalvar(struct ast_channel *chan, void *data) | ||||
| { | ||||
| 	char *name; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user