mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
Merged revisions 312461 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r312461 | rmudgett | 2011-04-01 16:31:39 -0500 (Fri, 01 Apr 2011) | 25 lines 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/trunk@312462 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>
|
||||
***/
|
||||
@@ -3934,7 +3963,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",
|
||||
@@ -3944,6 +3975,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;
|
||||
}
|
||||
@@ -3953,14 +3985,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";
|
||||
@@ -3976,19 +4013,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