Adding the Atxfer manager command. With this, you may initiate

an attended transfer over AMI

(closes issue #10585)
Reported by: ornati
Patches:
      atxfer-trunk-r90428.diff uploaded by ornati (license 210)
	  (with modifications from me)
Tested by: putnopvut



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@106236 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Michelson
2008-03-05 22:33:05 +00:00
parent eafa9b0de0
commit 2ed30d47e8
3 changed files with 82 additions and 0 deletions

View File

@@ -57,6 +57,8 @@ AMI - The manager (TCP/TLS/HTTP)
* Originate now requires the Originate privilege and, if you want to call out * Originate now requires the Originate privilege and, if you want to call out
to a subshell, it requires the System privilege, as well. This was done to to a subshell, it requires the System privilege, as well. This was done to
enhance manager security. enhance manager security.
* New command: Atxfer. See doc/manager_1_1.txt for more details or
manager show command Atxfer from the CLI
Dialplan functions Dialplan functions
------------------ ------------------

View File

@@ -177,6 +177,16 @@ Changes to manager version 1.1:
Rule: <name> The name of the rule whose contents you wish to list. If this variable Rule: <name> The name of the rule whose contents you wish to list. If this variable
is not present, all rules in queuerules.conf will be listed. is not present, all rules in queuerules.conf will be listed.
- Action: Atxfer
Modules: none
Purpose:
Initiate an attended transfer
Variables:
Channel: The transferer channel's name
Exten: The extension to transfer to
Priority: The priority to transfer to
Context: The context to transfer to
* NEW EVENTS * NEW EVENTS
------------ ------------

View File

@@ -73,6 +73,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/version.h" #include "asterisk/version.h"
#include "asterisk/term.h" #include "asterisk/term.h"
#include "asterisk/astobj2.h" #include "asterisk/astobj2.h"
#include "asterisk/features.h"
enum error_type { enum error_type {
UNKNOWN_ACTION = 1, UNKNOWN_ACTION = 1,
@@ -1941,6 +1942,74 @@ static int action_redirect(struct mansession *s, const struct message *m)
return 0; return 0;
} }
static char mandescr_atxfer[] =
"Description: Attended transfer.\n"
"Variables: (Names marked with * are required)\n"
" *Channel: Transferer's channel\n"
" *Exten: Extension to transfer to\n"
" *Context: Context to transfer to\n"
" *Priority: Priority to transfer to\n"
" ActionID: Optional Action id for message matching.\n";
static int action_atxfer(struct mansession *s, const struct message *m)
{
const char *name = astman_get_header(m, "Channel");
const char *exten = astman_get_header(m, "Exten");
const char *context = astman_get_header(m, "Context");
const char *priority = astman_get_header(m, "Priority");
struct ast_channel *chan = NULL;
struct ast_call_feature *atxfer_feature = NULL;
char *feature_code = NULL;
int priority_int = 0;
if (ast_strlen_zero(name)) {
astman_send_error(s, m, "No channel specified\n");
return 0;
}
if (ast_strlen_zero(exten)) {
astman_send_error(s, m, "No extension specified\n");
return 0;
}
if (ast_strlen_zero(context)) {
astman_send_error(s, m, "No context specified\n");
return 0;
}
if (ast_strlen_zero(priority)) {
astman_send_error(s, m, "No priority specified\n");
return 0;
}
if (sscanf(priority, "%d", &priority_int) != 1 && (priority_int = ast_findlabel_extension(NULL, context, exten, priority, NULL)) < 1) {
astman_send_error(s, m, "Invalid Priority\n");
return 0;
}
if (!(atxfer_feature = ast_find_call_feature("atxfer"))) {
astman_send_error(s, m, "No attended transfer feature found\n");
return 0;
}
if (!(chan = ast_get_channel_by_name_locked(name))) {
astman_send_error(s, m, "Channel specified does not exist\n");
return 0;
}
for (feature_code = atxfer_feature->exten; feature_code && *feature_code; ++feature_code) {
struct ast_frame f = {AST_FRAME_DTMF, *feature_code};
ast_queue_frame(chan, &f);
}
for (feature_code = (char *)exten; feature_code && *feature_code; ++feature_code) {
struct ast_frame f = {AST_FRAME_DTMF, *feature_code};
ast_queue_frame(chan, &f);
}
astman_send_ack(s, m, "Atxfer successfully queued\n");
ast_channel_unlock(chan);
return 0;
}
static char mandescr_command[] = static char mandescr_command[] =
"Description: Run a CLI command.\n" "Description: Run a CLI command.\n"
"Variables: (Names marked with * are required)\n" "Variables: (Names marked with * are required)\n"
@@ -3662,6 +3731,7 @@ static int __init_manager(int reload)
ast_manager_register2("CreateConfig", EVENT_FLAG_CONFIG, action_createconfig, "Creates an empty file in the configuration directory", mandescr_createconfig); ast_manager_register2("CreateConfig", EVENT_FLAG_CONFIG, action_createconfig, "Creates an empty file in the configuration directory", mandescr_createconfig);
ast_manager_register2("ListCategories", EVENT_FLAG_CONFIG, action_listcategories, "List categories in configuration file", mandescr_listcategories); ast_manager_register2("ListCategories", EVENT_FLAG_CONFIG, action_listcategories, "List categories in configuration file", mandescr_listcategories);
ast_manager_register2("Redirect", EVENT_FLAG_CALL, action_redirect, "Redirect (transfer) a call", mandescr_redirect ); ast_manager_register2("Redirect", EVENT_FLAG_CALL, action_redirect, "Redirect (transfer) a call", mandescr_redirect );
ast_manager_register2("Atxfer", EVENT_FLAG_CALL, action_atxfer, "Attended transfer", mandescr_atxfer);
ast_manager_register2("Originate", EVENT_FLAG_ORIGINATE, action_originate, "Originate Call", mandescr_originate); ast_manager_register2("Originate", EVENT_FLAG_ORIGINATE, action_originate, "Originate Call", mandescr_originate);
ast_manager_register2("Command", EVENT_FLAG_COMMAND, action_command, "Execute Asterisk CLI Command", mandescr_command ); ast_manager_register2("Command", EVENT_FLAG_COMMAND, action_command, "Execute Asterisk CLI Command", mandescr_command );
ast_manager_register2("ExtensionState", EVENT_FLAG_CALL | EVENT_FLAG_REPORTING, action_extensionstate, "Check Extension Status", mandescr_extensionstate ); ast_manager_register2("ExtensionState", EVENT_FLAG_CALL | EVENT_FLAG_REPORTING, action_extensionstate, "Check Extension Status", mandescr_extensionstate );