mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-30 10:33:13 +00:00
Adding a new option 'n' to app_chanspy. This option allows for the name of the spied-on
party to be spoken instead of the channel name or number. This was accomplished by adding a new function pointer to point to a function in app_voicemail which retrieves the name file and plays it. This makes for an easy way that applications may play a user's name should it be necessary. app_directory, in particular, can be simplified greatly by this change. This change comes as a suggestion from Switchvox, which already has this feature. AST-23 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114813 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
4
CHANGES
4
CHANGES
@@ -36,6 +36,10 @@ Application Changes
|
||||
* Chanspy has a new option, 'B', which can be used to "barge" on a call. This is
|
||||
like the pre-existing whisper mode, except that the spy can also talk to the
|
||||
participant on the bridged channel as well.
|
||||
* Chanspy has a new option, 'n', which will allow for the spied-on party's name
|
||||
to be spoken instead of the channel name or number. For more information on the
|
||||
use of this option, issue the command "core show application ChanSpy" from the
|
||||
Asterisk CLI.
|
||||
|
||||
SIP Changes
|
||||
-----------
|
||||
|
@@ -72,6 +72,13 @@ static const char *desc_chan =
|
||||
" b - Only spy on channels involved in a bridged call.\n"
|
||||
" g(grp) - Match only channels where their SPYGROUP variable is set to\n"
|
||||
" contain 'grp' in an optional : delimited list.\n"
|
||||
" n([mailbox][@context]) - Say the name of the person being spied on if that person has recorded\n"
|
||||
" his/her name. If a context is specified, then that voicemail context will\n"
|
||||
" be searched when retrieving the name, otherwise the \"default\" context\n"
|
||||
" will be searched. If no mailbox is specified, then the channel name will\n"
|
||||
" be used when searching for the name (i.e. if SIP/1000 is the channel being\n"
|
||||
" spied on and no mailbox is specified, then \"1000\" will be used when searching\n"
|
||||
" for the name).\n"
|
||||
" q - Don't play a beep when beginning to spy on a channel, or speak the\n"
|
||||
" selected channel name.\n"
|
||||
" r[(basename)] - Record the session to the monitor spool directory. An\n"
|
||||
@@ -114,6 +121,13 @@ static const char *desc_ext =
|
||||
" b - Only spy on channels involved in a bridged call.\n"
|
||||
" g(grp) - Match only channels where their ${SPYGROUP} variable is set to\n"
|
||||
" contain 'grp' in an optional : delimited list.\n"
|
||||
" n([mailbox][@context]) - Say the name of the person being spied on if that person has recorded\n"
|
||||
" his/her name. If a context is specified, then that voicemail context will\n"
|
||||
" be searched when retrieving the name, otherwise the \"default\" context\n"
|
||||
" will be searched. If no mailbox is specified, then the channel name will\n"
|
||||
" be used when searching for the name (i.e. if SIP/1000 is the channel being\n"
|
||||
" spied on and no mailbox is specified, then \"1000\" will be used when searching\n"
|
||||
" for the name).\n"
|
||||
" q - Don't play a beep when beginning to spy on a channel, or speak the\n"
|
||||
" selected channel name.\n"
|
||||
" r[(basename)] - Record the session to the monitor spool directory. An\n"
|
||||
@@ -149,6 +163,7 @@ enum {
|
||||
OPTION_ENFORCED = (1 << 9), /* Enforced mode */
|
||||
OPTION_NOTECH = (1 << 10), /* Skip technology name playback */
|
||||
OPTION_BARGE = (1 << 11), /* Barge mode (whisper to both channels) */
|
||||
OPTION_NAME = (1 << 12), /* Say the name of the person on whom we will spy */
|
||||
} chanspy_opt_flags;
|
||||
|
||||
enum {
|
||||
@@ -156,6 +171,7 @@ enum {
|
||||
OPT_ARG_GROUP,
|
||||
OPT_ARG_RECORD,
|
||||
OPT_ARG_ENFORCED,
|
||||
OPT_ARG_NAME,
|
||||
OPT_ARG_ARRAY_SIZE,
|
||||
} chanspy_opt_args;
|
||||
|
||||
@@ -172,6 +188,7 @@ AST_APP_OPTIONS(spy_opts, {
|
||||
AST_APP_OPTION('o', OPTION_READONLY),
|
||||
AST_APP_OPTION('X', OPTION_EXIT),
|
||||
AST_APP_OPTION('s', OPTION_NOTECH),
|
||||
AST_APP_OPTION_ARG('n', OPTION_NAME, OPT_ARG_NAME),
|
||||
});
|
||||
|
||||
|
||||
@@ -554,7 +571,8 @@ redo:
|
||||
|
||||
static int common_exec(struct ast_channel *chan, const struct ast_flags *flags,
|
||||
int volfactor, const int fd, const char *mygroup, const char *myenforced,
|
||||
const char *spec, const char *exten, const char *context)
|
||||
const char *spec, const char *exten, const char *context, const char *mailbox,
|
||||
const char *name_context)
|
||||
{
|
||||
char nameprefix[AST_NAME_STRLEN];
|
||||
char peer_name[AST_NAME_STRLEN + 5];
|
||||
@@ -727,6 +745,7 @@ static int common_exec(struct ast_channel *chan, const struct ast_flags *flags,
|
||||
strncat(peer_name, peer->name, AST_NAME_STRLEN - 4 - 1);
|
||||
ptr = strchr(peer_name, '/');
|
||||
*ptr++ = '\0';
|
||||
ptr = strsep(&ptr, "-");
|
||||
|
||||
for (s = peer_name; s < ptr; s++)
|
||||
*s = tolower(*s);
|
||||
@@ -737,6 +756,12 @@ static int common_exec(struct ast_channel *chan, const struct ast_flags *flags,
|
||||
ast_channel_unlock(peer);
|
||||
|
||||
if (!ast_test_flag(flags, OPTION_QUIET)) {
|
||||
if (ast_test_flag(flags, OPTION_NAME)) {
|
||||
const char *local_context = S_OR(name_context, "default");
|
||||
const char *local_mailbox = S_OR(mailbox, ptr);
|
||||
res = ast_app_sayname(chan, local_mailbox, local_context);
|
||||
}
|
||||
if (!ast_test_flag(flags, OPTION_NAME) || res < 0) {
|
||||
if (!ast_test_flag(flags, OPTION_NOTECH)) {
|
||||
if (ast_fileexists(peer_name, NULL, NULL) != -1) {
|
||||
res = ast_streamfile(chan, peer_name, chan->language);
|
||||
@@ -754,6 +779,7 @@ static int common_exec(struct ast_channel *chan, const struct ast_flags *flags,
|
||||
if ((num = atoi(ptr)))
|
||||
ast_say_digits(chan, atoi(ptr), "", chan->language);
|
||||
}
|
||||
}
|
||||
|
||||
res = channel_spy(chan, peer_chanspy_ds, &volfactor, fd, flags, exitcontext);
|
||||
num_spyed_upon++;
|
||||
@@ -815,6 +841,8 @@ static int chanspy_exec(struct ast_channel *chan, void *data)
|
||||
int oldwf = 0;
|
||||
int volfactor = 0;
|
||||
int res;
|
||||
char *mailbox = NULL;
|
||||
char *name_context = NULL;
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(spec);
|
||||
AST_APP_ARG(options);
|
||||
@@ -851,6 +879,20 @@ static int chanspy_exec(struct ast_channel *chan, void *data)
|
||||
if (ast_test_flag(&flags, OPTION_ENFORCED))
|
||||
myenforced = opts[OPT_ARG_ENFORCED];
|
||||
|
||||
if (ast_test_flag(&flags, OPTION_NAME)) {
|
||||
if (!ast_strlen_zero(opts[OPT_ARG_NAME])) {
|
||||
char *delimiter;
|
||||
if ((delimiter = strchr(opts[OPT_ARG_NAME], '@'))) {
|
||||
mailbox = opts[OPT_ARG_NAME];
|
||||
*delimiter++ = '\0';
|
||||
name_context = delimiter;
|
||||
} else {
|
||||
mailbox = opts[OPT_ARG_NAME];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} else
|
||||
ast_clear_flag(&flags, AST_FLAGS_ALL);
|
||||
|
||||
@@ -870,7 +912,7 @@ static int chanspy_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
res = common_exec(chan, &flags, volfactor, fd, mygroup, myenforced, args.spec, NULL, NULL);
|
||||
res = common_exec(chan, &flags, volfactor, fd, mygroup, myenforced, args.spec, NULL, NULL, mailbox, name_context);
|
||||
|
||||
if (fd)
|
||||
close(fd);
|
||||
@@ -891,6 +933,8 @@ static int extenspy_exec(struct ast_channel *chan, void *data)
|
||||
int oldwf = 0;
|
||||
int volfactor = 0;
|
||||
int res;
|
||||
char *mailbox = NULL;
|
||||
char *name_context = NULL;
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(context);
|
||||
AST_APP_ARG(options);
|
||||
@@ -930,6 +974,21 @@ static int extenspy_exec(struct ast_channel *chan, void *data)
|
||||
|
||||
if (ast_test_flag(&flags, OPTION_PRIVATE))
|
||||
ast_set_flag(&flags, OPTION_WHISPER);
|
||||
|
||||
|
||||
if (ast_test_flag(&flags, OPTION_NAME)) {
|
||||
if (!ast_strlen_zero(opts[OPT_ARG_NAME])) {
|
||||
char *delimiter;
|
||||
if ((delimiter = strchr(opts[OPT_ARG_NAME], '@'))) {
|
||||
mailbox = opts[OPT_ARG_NAME];
|
||||
*delimiter++ = '\0';
|
||||
name_context = delimiter;
|
||||
} else {
|
||||
mailbox = opts[OPT_ARG_NAME];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else
|
||||
ast_clear_flag(&flags, AST_FLAGS_ALL);
|
||||
|
||||
@@ -950,7 +1009,7 @@ static int extenspy_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
|
||||
|
||||
res = common_exec(chan, &flags, volfactor, fd, mygroup, NULL, NULL, exten, args.context);
|
||||
res = common_exec(chan, &flags, volfactor, fd, mygroup, NULL, NULL, exten, args.context, mailbox, name_context);
|
||||
|
||||
if (fd)
|
||||
close(fd);
|
||||
|
@@ -9528,6 +9528,23 @@ static int load_config(int reload)
|
||||
}
|
||||
}
|
||||
|
||||
static int sayname(struct ast_channel *chan, const char *mailbox, const char *context)
|
||||
{
|
||||
int res = -1;
|
||||
char dir[PATH_MAX];
|
||||
snprintf(dir, sizeof(dir), "%s%s/%s/greet", VM_SPOOL_DIR, context, mailbox);
|
||||
ast_debug(2, "About to try retrieving name file %s\n", dir);
|
||||
RETRIEVE(dir, -1, mailbox, context);
|
||||
if (ast_fileexists(dir, NULL, NULL)) {
|
||||
res = ast_streamfile(chan, dir, chan->language);
|
||||
if (!res) {
|
||||
res = ast_waitstream(chan, "");
|
||||
}
|
||||
}
|
||||
DISPOSE(dir, -1);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int reload(void)
|
||||
{
|
||||
return load_config(1);
|
||||
@@ -9575,7 +9592,7 @@ static int load_module(void)
|
||||
|
||||
ast_cli_register_multiple(cli_voicemail, sizeof(cli_voicemail) / sizeof(struct ast_cli_entry));
|
||||
|
||||
ast_install_vm_functions(has_voicemail, inboxcount, messagecount);
|
||||
ast_install_vm_functions(has_voicemail, inboxcount, messagecount, sayname);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@@ -105,7 +105,8 @@ int ast_app_getdata_full(struct ast_channel *c, char *prompt, char *s, int maxle
|
||||
|
||||
void ast_install_vm_functions(int (*has_voicemail_func)(const char *mailbox, const char *folder),
|
||||
int (*inboxcount_func)(const char *mailbox, int *newmsgs, int *oldmsgs),
|
||||
int (*messagecount_func)(const char *context, const char *mailbox, const char *folder));
|
||||
int (*messagecount_func)(const char *context, const char *mailbox, const char *folder),
|
||||
int (*sayname_func)(struct ast_channel *chan, const char *mailbox, const char *context));
|
||||
|
||||
void ast_uninstall_vm_functions(void);
|
||||
|
||||
@@ -115,6 +116,9 @@ int ast_app_has_voicemail(const char *mailbox, const char *folder);
|
||||
/*! \brief Determine number of new/old messages in a mailbox */
|
||||
int ast_app_inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs);
|
||||
|
||||
/*! Given a mailbox and context, play that mailbox owner's name to the channel specified */
|
||||
int ast_app_sayname(struct ast_channel *chan, const char *mailbox, const char *context);
|
||||
|
||||
/*! \brief Determine number of messages in a given mailbox and folder */
|
||||
int ast_app_messagecount(const char *context, const char *mailbox, const char *folder);
|
||||
|
||||
|
13
main/app.c
13
main/app.c
@@ -177,15 +177,18 @@ int ast_app_getdata_full(struct ast_channel *c, char *prompt, char *s, int maxle
|
||||
|
||||
static int (*ast_has_voicemail_func)(const char *mailbox, const char *folder) = NULL;
|
||||
static int (*ast_inboxcount_func)(const char *mailbox, int *newmsgs, int *oldmsgs) = NULL;
|
||||
static int (*ast_sayname_func)(struct ast_channel *chan, const char *mailbox, const char *context) = NULL;
|
||||
static int (*ast_messagecount_func)(const char *context, const char *mailbox, const char *folder) = NULL;
|
||||
|
||||
void ast_install_vm_functions(int (*has_voicemail_func)(const char *mailbox, const char *folder),
|
||||
int (*inboxcount_func)(const char *mailbox, int *newmsgs, int *oldmsgs),
|
||||
int (*messagecount_func)(const char *context, const char *mailbox, const char *folder))
|
||||
int (*messagecount_func)(const char *context, const char *mailbox, const char *folder),
|
||||
int (*sayname_func)(struct ast_channel *chan, const char *mailbox, const char *context))
|
||||
{
|
||||
ast_has_voicemail_func = has_voicemail_func;
|
||||
ast_inboxcount_func = inboxcount_func;
|
||||
ast_messagecount_func = messagecount_func;
|
||||
ast_sayname_func = sayname_func;
|
||||
}
|
||||
|
||||
void ast_uninstall_vm_functions(void)
|
||||
@@ -193,6 +196,7 @@ void ast_uninstall_vm_functions(void)
|
||||
ast_has_voicemail_func = NULL;
|
||||
ast_inboxcount_func = NULL;
|
||||
ast_messagecount_func = NULL;
|
||||
ast_sayname_func = NULL;
|
||||
}
|
||||
|
||||
int ast_app_has_voicemail(const char *mailbox, const char *folder)
|
||||
@@ -227,6 +231,13 @@ int ast_app_inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ast_app_sayname(struct ast_channel *chan, const char *mailbox, const char *context)
|
||||
{
|
||||
if (ast_sayname_func)
|
||||
return ast_sayname_func(chan, mailbox, context);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ast_app_messagecount(const char *context, const char *mailbox, const char *folder)
|
||||
{
|
||||
static int warned = 0;
|
||||
|
Reference in New Issue
Block a user