diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-04-01 21:36:53 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-04-01 21:36:53 +0000 |
commit | 75594e6e4aee1e0b8abaa4e668ba15ac5c34eb86 (patch) | |
tree | 8c5b40967a6ba32b743c9a181a86b409f2509cb0 /main/ccss.c | |
parent | 759bf6b84085fbd331a0f632f0c65477b0ff4496 (diff) |
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
Diffstat (limited to 'main/ccss.c')
-rw-r--r-- | main/ccss.c | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/main/ccss.c b/main/ccss.c index 2cb14d5b1..cdd0be7a9 100644 --- a/main/ccss.c +++ b/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 { |