mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	app_dial.c: Make 'A' option pass COLP updates.
While the 'A' option is playing the announcement file allow the caller and peer to exchange COLP update frames. ASTERISK-25423 Reported by: John Hardin Change-Id: Iac6cf89b56d26452c6bb88e9363622bbf23895f9
This commit is contained in:
		| @@ -2748,34 +2748,50 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast | ||||
|  | ||||
| 				active_chan = ast_waitfor_n(chans, 2, &ms); | ||||
| 				if (active_chan) { | ||||
| 					struct ast_channel *other_chan; | ||||
| 					struct ast_frame *fr = ast_read(active_chan); | ||||
|  | ||||
| 					if (!fr) { | ||||
| 						ast_autoservice_chan_hangup_peer(chan, 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); | ||||
| 					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_autoservice_chan_hangup_peer(chan, peer); | ||||
| 							res = -1; | ||||
| 							goto done; | ||||
| 						case AST_CONTROL_CONNECTED_LINE: | ||||
| 							/* Pass COLP update to the other channel. */ | ||||
| 							if (active_chan == chan) { | ||||
| 								other_chan = peer; | ||||
| 							} else { | ||||
| 								other_chan = chan; | ||||
| 							} | ||||
| 							break; | ||||
| 						case AST_FRAME_CONTROL: | ||||
| 							switch (fr->subclass.integer) { | ||||
| 								case AST_CONTROL_HANGUP: | ||||
| 									ast_frfree(fr); | ||||
| 									ast_autoservice_chan_hangup_peer(chan, peer); | ||||
| 									res = -1; | ||||
| 									goto done; | ||||
| 								default: | ||||
| 									break; | ||||
| 							if (ast_channel_connected_line_sub(active_chan, other_chan, fr, 1) | ||||
| 								&& ast_channel_connected_line_macro(active_chan, | ||||
| 									other_chan, fr, other_chan == chan, 1)) { | ||||
| 								ast_indicate_data(other_chan, fr->subclass.integer, | ||||
| 									fr->data.ptr, fr->datalen); | ||||
| 							} | ||||
| 							break; | ||||
| 						default: | ||||
| 							/* Ignore all others */ | ||||
| 							break; | ||||
| 						} | ||||
| 						break; | ||||
| 					default: | ||||
| 						/* Ignore all others */ | ||||
| 						break; | ||||
| 					} | ||||
| 					ast_frfree(fr); | ||||
| 				} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user