mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Merged revisions 227827 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r227827 | mnicholson | 2009-11-04 14:52:27 -0600 (Wed, 04 Nov 2009) | 10 lines This patch modifies the Dial application to monitor the calling channel for hangups while playing back announcements. (closes issue #16005) Reported by: falves11 Patches: dial-announce-hangup-fix1.diff uploaded by mnicholson (license 96) Tested by: mnicholson, falves11 Review: https://reviewboard.asterisk.org/r/407/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@227829 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -2021,21 +2021,70 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast | ||||
| 			res = 0; | ||||
| 		} else { | ||||
| 			int digit = 0; | ||||
| 			/* Start autoservice on the other chan */ | ||||
| 			res = ast_autoservice_start(chan); | ||||
| 			/* Now Stream the File */ | ||||
| 			if (!res) | ||||
| 				res = ast_streamfile(peer, opt_args[OPT_ARG_ANNOUNCE], peer->language); | ||||
| 			if (!res) { | ||||
| 				digit = ast_waitstream(peer, AST_DIGIT_ANY); | ||||
| 			} | ||||
| 			/* Ok, done. stop autoservice */ | ||||
| 			res = ast_autoservice_stop(chan); | ||||
| 			if (digit > 0 && !res) | ||||
| 				res = ast_senddigit(chan, digit, 0); | ||||
| 			else | ||||
| 				res = digit; | ||||
| 			struct ast_channel *chans[2]; | ||||
| 			struct ast_channel *active_chan; | ||||
|  | ||||
| 			chans[0] = chan; | ||||
| 			chans[1] = peer; | ||||
|  | ||||
| 			/* we need to stream the announcment while monitoring the caller for a hangup */ | ||||
|  | ||||
| 			/* stream the file */ | ||||
| 			res = ast_streamfile(peer, opt_args[OPT_ARG_ANNOUNCE], peer->language); | ||||
| 			if (res) { | ||||
| 				res = 0; | ||||
| 				ast_log(LOG_ERROR, "error streaming file '%s' to callee\n", opt_args[OPT_ARG_ANNOUNCE]); | ||||
| 			} | ||||
|  | ||||
| 			ast_set_flag(peer, AST_FLAG_END_DTMF_ONLY); | ||||
| 			while (peer->stream) { | ||||
| 				int ms; | ||||
|  | ||||
| 				ms = ast_sched_wait(peer->sched); | ||||
|  | ||||
| 				if (ms < 0 && !peer->timingfunc) { | ||||
| 					ast_stopstream(peer); | ||||
| 					break; | ||||
| 				} | ||||
| 				if (ms < 0) | ||||
| 					ms = 1000; | ||||
|  | ||||
| 				active_chan = ast_waitfor_n(chans, 2, &ms); | ||||
| 				if (active_chan) { | ||||
| 					struct ast_frame *fr = ast_read(active_chan); | ||||
| 					if (!fr) { | ||||
| 						ast_hangup(peer); | ||||
| 						res = -1; | ||||
| 						goto done; | ||||
| 					} | ||||
| 					switch(fr->frametype) { | ||||
| 						case AST_FRAME_DTMF_END: | ||||
| 							digit = fr->subclass.integer; | ||||
| 							if (active_chan == peer && strchr(AST_DIGIT_ANY, res)) { | ||||
| 								ast_stopstream(peer); | ||||
| 								res = ast_senddigit(chan, digit, 0); | ||||
| 							} | ||||
| 							break; | ||||
| 						case AST_FRAME_CONTROL: | ||||
| 							switch (fr->subclass.integer) { | ||||
| 								case AST_CONTROL_HANGUP: | ||||
| 									ast_frfree(fr); | ||||
| 									ast_hangup(peer); | ||||
| 									res = -1; | ||||
| 									goto done; | ||||
| 								default: | ||||
| 									break; | ||||
| 							} | ||||
| 							break; | ||||
| 						default: | ||||
| 							/* Ignore all others */ | ||||
| 							break; | ||||
| 					} | ||||
| 					ast_frfree(fr); | ||||
| 				} | ||||
| 				ast_sched_runq(peer->sched); | ||||
| 			} | ||||
| 			ast_clear_flag(peer, AST_FLAG_END_DTMF_ONLY); | ||||
| 		} | ||||
|  | ||||
| 		if (chan && peer && ast_test_flag64(&opts, OPT_GOTO) && !ast_strlen_zero(opt_args[OPT_ARG_GOTO])) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user