mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	CallCompletionRequest()/CallCompletionCancel() exit non-zero if fail.
The CallCompletionRequest()/CallCompletionCancel() dialplan applications exit nonzero on normal failure conditions. The nonzero exit causes the dialplan to hangup immediately. The dialplan author has no opportunity to report success/failure to the user. * Made always return zero so the dialplan can continue. * Made set CC_REQUEST_RESULT/CC_REQUEST_REASON and CC_CANCEL_RESULT/CC_CANCEL_REASON channel variables respectively. Also documented the values set. * Reduced the warning about no core instance in CallCompletionCancel() to a debug message. It is a normal event and should not be output at the WARNING level. (closes issue #18763) Reported by: p_lindheimer Patches: ccss.patch uploaded by p lindheimer (license 558) Modified Tested by: p_lindheimer, rmudgett JIRA SWP-3042 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@312461 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										57
									
								
								main/ccss.c
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								main/ccss.c
									
									
									
									
									
								
							| @@ -48,6 +48,21 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| 		<description> | ||||
| 			<para>Request call completion service for a previously failed | ||||
| 			call attempt.</para> | ||||
| 			<para>This application sets the following channel variables:</para> | ||||
| 			<variablelist> | ||||
| 				<variable name="CC_REQUEST_RESULT"> | ||||
| 					<para>This is the returned status of the request.</para> | ||||
| 					<value name="SUCCESS" /> | ||||
| 					<value name="FAIL" /> | ||||
| 				</variable> | ||||
| 				<variable name="CC_REQUEST_REASON"> | ||||
| 					<para>This is the reason the request failed.</para> | ||||
| 					<value name="NO_CORE_INSTANCE" /> | ||||
| 					<value name="NOT_GENERIC" /> | ||||
| 					<value name="TOO_MANY_REQUESTS" /> | ||||
| 					<value name="UNSPECIFIED" /> | ||||
| 				</variable> | ||||
| 			</variablelist> | ||||
| 		</description> | ||||
| 	</application> | ||||
| 	<application name="CallCompletionCancel" language="en_US"> | ||||
| @@ -57,6 +72,20 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| 		<syntax /> | ||||
| 		<description> | ||||
| 			<para>Cancel a Call Completion Request.</para> | ||||
| 			<para>This application sets the following channel variables:</para> | ||||
| 			<variablelist> | ||||
| 				<variable name="CC_CANCEL_RESULT"> | ||||
| 					<para>This is the returned status of the cancel.</para> | ||||
| 					<value name="SUCCESS" /> | ||||
| 					<value name="FAIL" /> | ||||
| 				</variable> | ||||
| 				<variable name="CC_CANCEL_REASON"> | ||||
| 					<para>This is the reason the cancel failed.</para> | ||||
| 					<value name="NO_CORE_INSTANCE" /> | ||||
| 					<value name="NOT_GENERIC" /> | ||||
| 					<value name="UNSPECIFIED" /> | ||||
| 				</variable> | ||||
| 			</variablelist> | ||||
| 		</description> | ||||
| 	</application> | ||||
|  ***/ | ||||
| @@ -3924,7 +3953,9 @@ static int ccreq_exec(struct ast_channel *chan, const char *data) | ||||
| 	match_flags = MATCH_NO_REQUEST; | ||||
| 	if (!(core_instance = ao2_t_callback_data(cc_core_instances, 0, match_agent, device_name, &match_flags, "Find core instance for CallCompletionRequest"))) { | ||||
| 		ast_log_dynamic_level(cc_logger_level, "Couldn't find a core instance for caller %s\n", device_name); | ||||
| 		return -1; | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_REQUEST_RESULT", "FAIL"); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_REQUEST_REASON", "NO_CORE_INSTANCE"); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	ast_log_dynamic_level(cc_logger_level, "Core %d: Found core_instance for caller %s\n", | ||||
| @@ -3934,6 +3965,7 @@ static int ccreq_exec(struct ast_channel *chan, const char *data) | ||||
| 		ast_log_dynamic_level(cc_logger_level, "Core %d: CallCompletionRequest is only for generic agent types.\n", | ||||
| 				core_instance->core_id); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_REQUEST_RESULT", "FAIL"); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_REQUEST_REASON", "NOT_GENERIC"); | ||||
| 		cc_unref(core_instance, "Unref core_instance since CallCompletionRequest was called with native agent"); | ||||
| 		return 0; | ||||
| 	} | ||||
| @@ -3943,14 +3975,19 @@ static int ccreq_exec(struct ast_channel *chan, const char *data) | ||||
| 				core_instance->core_id); | ||||
| 		ast_cc_failed(core_instance->core_id, "Too many CC requests\n"); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_REQUEST_RESULT", "FAIL"); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_REQUEST_REASON", "TOO_MANY_REQUESTS"); | ||||
| 		cc_unref(core_instance, "Unref core_instance since too many CC requests"); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	res = ast_cc_agent_accept_request(core_instance->core_id, "CallCompletionRequest called by caller %s for core_id %d", device_name, core_instance->core_id); | ||||
| 	pbx_builtin_setvar_helper(chan, "CC_REQUEST_RESULT", res ? "FAIL" : "SUCCESS"); | ||||
| 	if (res) { | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_REQUEST_REASON", "UNSPECIFIED"); | ||||
| 	} | ||||
|  | ||||
| 	cc_unref(core_instance, "Done with CallCompletionRequest"); | ||||
| 	return res; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static const char *cccancel_app = "CallCompletionCancel"; | ||||
| @@ -3966,19 +4003,27 @@ static int cccancel_exec(struct ast_channel *chan, const char *data) | ||||
|  | ||||
| 	match_flags = MATCH_REQUEST; | ||||
| 	if (!(core_instance = ao2_t_callback_data(cc_core_instances, 0, match_agent, device_name, &match_flags, "Find core instance for CallCompletionCancel"))) { | ||||
| 		ast_log(LOG_WARNING, "Cannot find CC transaction to cancel for caller %s\n", device_name); | ||||
| 		return -1; | ||||
| 		ast_log_dynamic_level(cc_logger_level, "Cannot find CC transaction to cancel for caller %s\n", device_name); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_CANCEL_RESULT", "FAIL"); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_CANCEL_REASON", "NO_CORE_INSTANCE"); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (strcmp(core_instance->agent->callbacks->type, "generic")) { | ||||
| 		ast_log(LOG_WARNING, "CallCompletionCancel may only be used for calles with a generic agent\n"); | ||||
| 		cc_unref(core_instance, "Unref core instance found during CallCompletionCancel"); | ||||
| 		return -1; | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_CANCEL_RESULT", "FAIL"); | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_CANCEL_REASON", "NOT_GENERIC"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	res = ast_cc_failed(core_instance->core_id, "Call completion request Cancelled for core ID %d by caller %s", | ||||
| 			core_instance->core_id, device_name); | ||||
| 	cc_unref(core_instance, "Unref core instance found during CallCompletionCancel"); | ||||
| 	return res; | ||||
| 	pbx_builtin_setvar_helper(chan, "CC_CANCEL_RESULT", res ? "FAIL" : "SUCCESS"); | ||||
| 	if (res) { | ||||
| 		pbx_builtin_setvar_helper(chan, "CC_CANCEL_REASON", "UNSPECIFIED"); | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| struct count_monitors_cb_data { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user