mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Cancel destroy request on new invite, merge bkw's control playback changes
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3084 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -31,46 +31,61 @@ static char *app = "ControlPlayback"; | |||||||
| static char *synopsis = "Play a file with fast forward and rewind"; | static char *synopsis = "Play a file with fast forward and rewind"; | ||||||
|  |  | ||||||
| static char *descrip =  | static char *descrip =  | ||||||
| "  ControlPlayback(filename[|skipms][|endplay]):  Plays  back  a  given  filename\n" | "ControlPlayback(filename[|skipms][|<rewindchar><ffchar><endchar>]):\n" | ||||||
| "(do not put extension). Options may also be included following a pipe symbol.\n" | "  Plays  back  a  given  filename (do not put extension). Options may also\n" | ||||||
| "you can use * and # to rewind and fast forward the playback specified. If 'endplay' is.\n" | "  be included following a pipe symbol.  You can use * and # to rewind and\n" | ||||||
| "added the file will terminate playback when 1 is pressed. Returns -1 if the channel\n" | "  fast forward the playback specified. If 'endchar' is added the file will\n" | ||||||
| "was hung up, or if the file does not exist. Returns 0 otherwise.\n"; | "  terminate playback when 'endchar' is pressed. Returns -1 if the channel\n" | ||||||
|  | "  was hung up, or if the file does not exist. Returns 0 otherwise.\n\n" | ||||||
|  | "  Example:  exten => 1234,1,ControlPlayback(file|4000|*#1)\n\n"; | ||||||
|  |  | ||||||
|  |  | ||||||
| STANDARD_LOCAL_USER; | STANDARD_LOCAL_USER; | ||||||
|  |  | ||||||
| LOCAL_USER_DECL; | LOCAL_USER_DECL; | ||||||
|  |  | ||||||
|  | static int is_on_phonepad(char key) | ||||||
|  | { | ||||||
|  | 	return (key == 35 || key == 42 || (key >= 48 && key <= 57)) ? 1 : 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int controlplayback_exec(struct ast_channel *chan, void *data) | static int controlplayback_exec(struct ast_channel *chan, void *data) | ||||||
| { | { | ||||||
| 	int res = 0; | 	int res = 0; | ||||||
| 	int skipms = 0; | 	int skipms = 0; | ||||||
| 	struct localuser *u; | 	struct localuser *u; | ||||||
| 	char tmp[256]; | 	char tmp[256]; | ||||||
| 	char *skip, *endplay; | 	char opts[3]; | ||||||
| 	int option_endplay = 0; | 	char *skip = NULL, *stop = NULL; | ||||||
| 	if (!data || ast_strlen_zero((char *)data)) { | 	if (!data || ast_strlen_zero((char *)data)) { | ||||||
| 		ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n"); | 		ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n"); | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
|  | 	memset(opts,0,3); | ||||||
| 	strncpy(tmp, (char *)data, sizeof(tmp)-1); | 	strncpy(tmp, (char *)data, sizeof(tmp)-1); | ||||||
| 	if((skip=strchr(tmp,'|'))) { | 	if((skip=strchr(tmp,'|'))) { | ||||||
| 		*skip = '\0'; | 		*skip = '\0'; | ||||||
| 		*skip++; | 		*skip++; | ||||||
| 		if((endplay=strchr(skip,'|'))) { |  | ||||||
| 			*endplay = '\0'; |  | ||||||
| 			*endplay++; |  | ||||||
| 			if(!strcmp(endplay,"endplay")) { |  | ||||||
| 				option_endplay = 1; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	if (atoi(skip) > 0) { |  | ||||||
| 		skipms =  atoi(skip); | 	if(skip && (stop=strchr(skip,'|'))) { | ||||||
| 	} else { | 		*stop = '\0'; | ||||||
|  | 		*stop++; | ||||||
|  | 		strncpy(opts,stop,3); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	skipms = skip ? atoi(skip) : 3000; | ||||||
|  | 	if(!skipms) | ||||||
| 		skipms = 3000; | 		skipms = 3000; | ||||||
| 	} |  | ||||||
| 		 | 	if(opts[0] == '\0' || ! is_on_phonepad(opts[0])) | ||||||
|  | 		opts[0] = '*'; | ||||||
|  | 	if(opts[1] == '\0' || ! is_on_phonepad(opts[1])) | ||||||
|  | 		opts[1] = '#'; | ||||||
|  | 	if(opts[2] == '\0' || ! is_on_phonepad(opts[2])) | ||||||
|  | 		opts[2] = '1'; | ||||||
|  |  | ||||||
| 	LOCAL_USER_ADD(u); | 	LOCAL_USER_ADD(u); | ||||||
|  |  | ||||||
| 	if (chan->_state != AST_STATE_UP) | 	if (chan->_state != AST_STATE_UP) | ||||||
| @@ -78,10 +93,10 @@ static int controlplayback_exec(struct ast_channel *chan, void *data) | |||||||
|  |  | ||||||
| 	ast_stopstream(chan); | 	ast_stopstream(chan); | ||||||
| 	for(;;) { | 	for(;;) { | ||||||
| 		res = ast_control_streamfile(chan, tmp, "#", "*", skipms); | 		res = ast_control_streamfile(chan, tmp, &opts[1], &opts[0], skipms); | ||||||
| 		if (res < 1) | 		if (res < 1) | ||||||
| 			break; | 			break; | ||||||
| 		if(option_endplay && res == 49) { | 		if(res == opts[2]) { | ||||||
| 			res = 0; | 			res = 0; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -6334,6 +6334,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc | |||||||
| 			/* Use this as the basis */ | 			/* Use this as the basis */ | ||||||
| 			if (sip_debug_test_pvt(p)) | 			if (sip_debug_test_pvt(p)) | ||||||
| 				ast_verbose("Using latest request as basis request\n"); | 				ast_verbose("Using latest request as basis request\n"); | ||||||
|  | 			sip_cancel_destroy(p); | ||||||
| 			/* This call is no longer outgoing if it ever was */ | 			/* This call is no longer outgoing if it ever was */ | ||||||
| 			p->outgoing = 0; | 			p->outgoing = 0; | ||||||
| 			copy_request(&p->initreq, req); | 			copy_request(&p->initreq, req); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user