Add new ast_complete_applications function so that we can use it with the

'channel originate ... application <app>' CLI command.

(And yeah, I cleaned up some whitespace in res_clioriginate.c... big whoop,
wanna fight about it!?)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@196758 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Sean Bright
2009-05-26 14:36:11 +00:00
parent 9a83ed9d93
commit 3abe8a963e
3 changed files with 44 additions and 29 deletions

View File

@@ -1199,6 +1199,14 @@ int ast_hashtab_compare_contexts(const void *ah_a, const void *ah_b);
unsigned int ast_hashtab_hash_contexts(const void *obj); unsigned int ast_hashtab_hash_contexts(const void *obj);
/*! @} */ /*! @} */
/*!
* \brief Command completion for the list of installed applications.
*
* This can be called from a CLI command completion function that wants to
* complete from the list of available applications.
*/
char *ast_complete_applications(const char *line, const char *word, int state);
#if defined(__cplusplus) || defined(c_plusplus) #if defined(__cplusplus) || defined(c_plusplus)
} }
#endif #endif

View File

@@ -5558,9 +5558,6 @@ static char *handle_show_application(struct ast_cli_entry *e, int cmd, struct as
{ {
struct ast_app *aa; struct ast_app *aa;
int app, no_registered_app = 1; int app, no_registered_app = 1;
char *ret = NULL;
int which = 0;
int wordlen;
switch (cmd) { switch (cmd) {
case CLI_INIT: case CLI_INIT:
@@ -5575,18 +5572,7 @@ static char *handle_show_application(struct ast_cli_entry *e, int cmd, struct as
* application at one time. You can type 'show application Dial Echo' and * application at one time. You can type 'show application Dial Echo' and
* you will see informations about these two applications ... * you will see informations about these two applications ...
*/ */
wordlen = strlen(a->word); return ast_complete_applications(a->line, a->word, a->n);
/* return the n-th [partial] matching entry */
AST_RWLIST_RDLOCK(&apps);
AST_RWLIST_TRAVERSE(&apps, aa, list) {
if (!strncasecmp(a->word, aa->name, wordlen) && ++which > a->n) {
ret = ast_strdup(aa->name);
break;
}
}
AST_RWLIST_UNLOCK(&apps);
return ret;
} }
if (a->argc < 4) { if (a->argc < 4) {
@@ -9878,3 +9864,22 @@ int ast_async_parseable_goto(struct ast_channel *chan, const char *goto_string)
{ {
return pbx_parseable_goto(chan, goto_string, 1); return pbx_parseable_goto(chan, goto_string, 1);
} }
char *ast_complete_applications(const char *line, const char *word, int state)
{
struct ast_app *app = NULL;
int which = 0;
char *ret = NULL;
size_t wordlen = strlen(word);
AST_RWLIST_RDLOCK(&apps);
AST_RWLIST_TRAVERSE(&apps, app, list) {
if (!strncasecmp(word, app->name, wordlen) && ++which > state) {
ret = ast_strdup(app->name);
break;
}
}
AST_RWLIST_UNLOCK(&apps);
return ret;
}

View File

@@ -16,12 +16,12 @@
* at the top of the source tree. * at the top of the source tree.
*/ */
/*! /*!
* \file * \file
* \author Russell Bryant <russell@digium.com> * \author Russell Bryant <russell@digium.com>
* *
* \brief Originate calls via the CLI * \brief Originate calls via the CLI
* *
*/ */
#include "asterisk.h" #include "asterisk.h"
@@ -52,12 +52,12 @@ static char *orig_app(int fd, const char *chan, const char *app, const char *app
char *chantech; char *chantech;
char *chandata; char *chandata;
int reason = 0; int reason = 0;
if (ast_strlen_zero(app)) if (ast_strlen_zero(app))
return CLI_SHOWUSAGE; return CLI_SHOWUSAGE;
chandata = ast_strdupa(chan); chandata = ast_strdupa(chan);
chantech = strsep(&chandata, "/"); chantech = strsep(&chandata, "/");
if (!chandata) { if (!chandata) {
ast_cli(fd, "*** No data provided after channel type! ***\n"); ast_cli(fd, "*** No data provided after channel type! ***\n");
@@ -86,7 +86,7 @@ static char *orig_exten(int fd, const char *chan, const char *data)
int reason = 0; int reason = 0;
chandata = ast_strdupa(chan); chandata = ast_strdupa(chan);
chantech = strsep(&chandata, "/"); chantech = strsep(&chandata, "/");
if (!chandata) { if (!chandata) {
ast_cli(fd, "*** No data provided after channel type! ***\n"); ast_cli(fd, "*** No data provided after channel type! ***\n");
@@ -102,7 +102,7 @@ static char *orig_exten(int fd, const char *chan, const char *data)
exten = "s"; exten = "s";
if (ast_strlen_zero(context)) if (ast_strlen_zero(context))
context = "default"; context = "default";
ast_pbx_outgoing_exten(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, context, exten, 1, &reason, 0, NULL, NULL, NULL, NULL, NULL); ast_pbx_outgoing_exten(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, context, exten, 1, &reason, 0, NULL, NULL, NULL, NULL, NULL);
return CLI_SUCCESS; return CLI_SUCCESS;
@@ -118,11 +118,11 @@ static char *orig_exten(int fd, const char *chan, const char *data)
static char *handle_orig(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) static char *handle_orig(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{ {
static const char * const choices[] = { "application", "extension", NULL }; static const char * const choices[] = { "application", "extension", NULL };
char *res; char *res = NULL;
switch (cmd) { switch (cmd) {
case CLI_INIT: case CLI_INIT:
e->command = "channel originate"; e->command = "channel originate";
e->usage = e->usage =
" There are two ways to use this command. A call can be originated between a\n" " There are two ways to use this command. A call can be originated between a\n"
"channel and a specific application, or between a channel and an extension in\n" "channel and a specific application, or between a channel and an extension in\n"
"the dialplan. This is similar to call files or the manager originate action.\n" "the dialplan. This is similar to call files or the manager originate action.\n"
@@ -140,14 +140,16 @@ static char *handle_orig(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
"used. If no extension is given, the 's' extension will be used.\n"; "used. If no extension is given, the 's' extension will be used.\n";
return NULL; return NULL;
case CLI_GENERATE: case CLI_GENERATE:
if (a->pos != 3)
return NULL;
/* ugly, can be removed when CLI entries have ast_module pointers */ /* ugly, can be removed when CLI entries have ast_module pointers */
ast_module_ref(ast_module_info->self); ast_module_ref(ast_module_info->self);
res = ast_cli_complete(a->word, choices, a->n); if (a->pos == 3) {
res = ast_cli_complete(a->word, choices, a->n);
} else if (a->pos == 4) {
if (!strcasecmp("application", a->argv[3])) {
res = ast_complete_applications(a->line, a->word, a->n);
}
}
ast_module_unref(ast_module_info->self); ast_module_unref(ast_module_info->self);
return res; return res;
} }
@@ -158,7 +160,7 @@ static char *handle_orig(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
ast_module_ref(ast_module_info->self); ast_module_ref(ast_module_info->self);
if (!strcasecmp("application", a->argv[3])) { if (!strcasecmp("application", a->argv[3])) {
res = orig_app(a->fd, a->argv[2], a->argv[4], a->argv[5]); res = orig_app(a->fd, a->argv[2], a->argv[4], a->argv[5]);
} else if (!strcasecmp("extension", a->argv[3])) { } else if (!strcasecmp("extension", a->argv[3])) {
res = orig_exten(a->fd, a->argv[2], a->argv[4]); res = orig_exten(a->fd, a->argv[2], a->argv[4]);
} else { } else {