Index: apps/app_minivm.c =================================================================== --- apps/app_minivm.c (revision 83173) +++ apps/app_minivm.c (working copy) @@ -463,7 +463,7 @@ static char *message_template_parse_emailbody(const char *body); static int create_vmaccount(char *name, struct ast_variable *var, int realtime); static struct minivm_account *find_user_realtime(const char *domain, const char *username); -static int handle_minivm_reload(int fd, int argc, char *argv[]); +static char *handle_minivm_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); /*! \brief Create message template */ static struct minivm_template *message_template_create(const char *name) @@ -2484,50 +2484,37 @@ return 0; } -static const char minivm_show_users_help[] = -"Usage: minivm list accounts\n" -" Lists all mailboxes currently set up\n"; - -static const char minivm_show_zones_help[] = -"Usage: minivm list zones\n" -" Lists zone message formats\n"; - -static const char minivm_list_templates_help[] = -"Usage: minivm list templates\n" -" Lists message templates for e-mail, paging and IM\n"; - -static const char minivm_show_stats_help[] = -"Usage: minivm show stats\n" -" Display Mini-Voicemail counters\n"; - -static const char minivm_show_settings_help[] = -"Usage: minivm show settings\n" -" Display Mini-Voicemail general settings\n"; - -static const char minivm_reload_help[] = -"Usage: minivm reload\n" -" Reload mini-voicemail configuration and reset statistics\n"; - /*! \brief CLI routine for listing templates */ -static int handle_minivm_list_templates(int fd, int argc, char *argv[]) +static char *handle_minivm_list_templates(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct minivm_template *this; char *output_format = "%-15s %-10s %-10s %-15.15s %-50s\n"; int count = 0; - if (argc > 3) - return RESULT_SHOWUSAGE; + switch (cmd) { + case CLI_INIT: + e->command = "minivm list templates"; + e->usage = + "Usage: minivm list templates\n" + " Lists message templates for e-mail, paging and IM\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + if (a->argc > 3) + return CLI_SHOWUSAGE; + AST_LIST_LOCK(&message_templates); if (AST_LIST_EMPTY(&message_templates)) { - ast_cli(fd, "There are no message templates defined\n"); + ast_cli(a->fd, "There are no message templates defined\n"); AST_LIST_UNLOCK(&message_templates); - return RESULT_FAILURE; + return CLI_FAILURE; } - ast_cli(fd, output_format, "Template name", "Charset", "Locale", "Attach media", "Subject"); - ast_cli(fd, output_format, "-------------", "-------", "------", "------------", "-------"); + ast_cli(a->fd, output_format, "Template name", "Charset", "Locale", "Attach media", "Subject"); + ast_cli(a->fd, output_format, "-------------", "-------", "------", "------------", "-------"); AST_LIST_TRAVERSE(&message_templates, this, list) { - ast_cli(fd, output_format, this->name, + ast_cli(a->fd, output_format, this->name, this->charset ? this->charset : "-", this->locale ? this->locale : "-", this->attachment ? "Yes" : "No", @@ -2535,38 +2522,71 @@ count++; } AST_LIST_UNLOCK(&message_templates); - ast_cli(fd, "\n * Total: %d minivoicemail message templates\n", count); - return RESULT_SUCCESS; + ast_cli(a->fd, "\n * Total: %d minivoicemail message templates\n", count); + return CLI_SUCCESS; } +static char *complete_minivm_show_users(const char *line, const char *word, int pos, int state) +{ + int which = 0; + int wordlen; + struct minivm_account *vmu; + const char *domain = ""; + + /* 0 - voicemail; 1 - list; 2 - accounts; 3 - for; 4 - */ + if (pos > 4) + return NULL; + if (pos == 3) + return (state == 0) ? ast_strdup("for") : NULL; + wordlen = strlen(word); + AST_LIST_TRAVERSE(&minivm_accounts, vmu, list) { + if (!strncasecmp(word, vmu->domain, wordlen)) { + if (domain && strcmp(domain, vmu->domain) && ++which > state) + return ast_strdup(vmu->domain); + /* ignore repeated domains ? */ + domain = vmu->domain; + } + } + return NULL; +} + /*! \brief CLI command to list voicemail accounts */ -static int handle_minivm_show_users(int fd, int argc, char *argv[]) +static char *handle_minivm_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct minivm_account *vmu; char *output_format = "%-23s %-15s %-15s %-10s %-10s %-50s\n"; int count = 0; - if ((argc < 3) || (argc > 5) || (argc == 4)) - return RESULT_SHOWUSAGE; - if ((argc == 5) && strcmp(argv[3],"for")) - return RESULT_SHOWUSAGE; + switch (cmd) { + case CLI_INIT: + e->command = "minivm list accounts"; + e->usage = + "Usage: minivm list accounts\n" + " Lists all mailboxes currently set up\n"; + return NULL; + case CLI_GENERATE: + return complete_minivm_show_users(a->line, a->word, a->pos, a->n); + } + if ((a->argc < 3) || (a->argc > 5) || (a->argc == 4)) + return CLI_SHOWUSAGE; + if ((a->argc == 5) && strcmp(a->argv[3],"for")) + return CLI_SHOWUSAGE; + AST_LIST_LOCK(&minivm_accounts); if (AST_LIST_EMPTY(&minivm_accounts)) { - ast_cli(fd, "There are no voicemail users currently defined\n"); + ast_cli(a->fd, "There are no voicemail users currently defined\n"); AST_LIST_UNLOCK(&minivm_accounts); - return RESULT_FAILURE; + return CLI_FAILURE; } - ast_cli(fd, output_format, "User", "E-Template", "P-template", "Zone", "Format", "Full name"); - ast_cli(fd, output_format, "----", "----------", "----------", "----", "------", "---------"); + ast_cli(a->fd, output_format, "User", "E-Template", "P-template", "Zone", "Format", "Full name"); + ast_cli(a->fd, output_format, "----", "----------", "----------", "----", "------", "---------"); AST_LIST_TRAVERSE(&minivm_accounts, vmu, list) { char tmp[256] = ""; - - - if ((argc == 3) || ((argc == 5) && !strcmp(argv[4], vmu->domain))) { + if ((a->argc == 3) || ((a->argc == 5) && !strcmp(a->argv[4], vmu->domain))) { count++; snprintf(tmp, sizeof(tmp), "%s@%s", vmu->username, vmu->domain); - ast_cli(fd, output_format, tmp, vmu->etemplate ? vmu->etemplate : "-", + ast_cli(a->fd, output_format, tmp, vmu->etemplate ? vmu->etemplate : "-", vmu->ptemplate ? vmu->ptemplate : "-", vmu->zonetag ? vmu->zonetag : "-", vmu->attachfmt ? vmu->attachfmt : "-", @@ -2574,108 +2594,117 @@ } } AST_LIST_UNLOCK(&minivm_accounts); - ast_cli(fd, "\n * Total: %d minivoicemail accounts\n", count); - return RESULT_SUCCESS; + ast_cli(a->fd, "\n * Total: %d minivoicemail accounts\n", count); + return CLI_SUCCESS; } /*! \brief Show a list of voicemail zones in the CLI */ -static int handle_minivm_show_zones(int fd, int argc, char *argv[]) +static char *handle_minivm_show_zones(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct minivm_zone *zone; char *output_format = "%-15s %-20s %-45s\n"; - int res = RESULT_SUCCESS; + char *res = CLI_SUCCESS; - if (argc != 3) - return RESULT_SHOWUSAGE; + switch (cmd) { + case CLI_INIT: + e->command = "minivm list zones"; + e->usage = + "Usage: minivm list zones\n" + " Lists zone message formats\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + if (a->argc != 3) + return CLI_SHOWUSAGE; + AST_LIST_LOCK(&minivm_zones); if (!AST_LIST_EMPTY(&minivm_zones)) { - ast_cli(fd, output_format, "Zone", "Timezone", "Message Format"); - ast_cli(fd, output_format, "----", "--------", "--------------"); + ast_cli(a->fd, output_format, "Zone", "Timezone", "Message Format"); + ast_cli(a->fd, output_format, "----", "--------", "--------------"); AST_LIST_TRAVERSE(&minivm_zones, zone, list) { - ast_cli(fd, output_format, zone->name, zone->timezone, zone->msg_format); + ast_cli(a->fd, output_format, zone->name, zone->timezone, zone->msg_format); } } else { - ast_cli(fd, "There are no voicemail zones currently defined\n"); - res = RESULT_FAILURE; + ast_cli(a->fd, "There are no voicemail zones currently defined\n"); + res = CLI_FAILURE; } AST_LIST_UNLOCK(&minivm_zones); return res; } - -static char *complete_minivm_show_users(const char *line, const char *word, int pos, int state) +/*! \brief CLI Show settings */ +static char *handle_minivm_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - int which = 0; - int wordlen; - struct minivm_account *vmu; - const char *domain = ""; - - /* 0 - show; 1 - voicemail; 2 - users; 3 - for; 4 - */ - if (pos > 4) + switch (cmd) { + case CLI_INIT: + e->command = "minivm show settings"; + e->usage = + "Usage: minivm show settings\n" + " Display Mini-Voicemail general settings\n"; return NULL; - if (pos == 3) - return (state == 0) ? ast_strdup("for") : NULL; - wordlen = strlen(word); - AST_LIST_TRAVERSE(&minivm_accounts, vmu, list) { - if (!strncasecmp(word, vmu->domain, wordlen)) { - if (domain && strcmp(domain, vmu->domain) && ++which > state) - return ast_strdup(vmu->domain); - /* ignore repeated domains ? */ - domain = vmu->domain; - } + case CLI_GENERATE: + return NULL; } - return NULL; -} -/*! \brief CLI Show settings */ -static int handle_minivm_show_settings(int fd, int argc, char *argv[]) -{ - ast_cli(fd, "* Mini-Voicemail general settings\n"); - ast_cli(fd, " -------------------------------\n"); - ast_cli(fd, "\n"); - ast_cli(fd, " Mail command (shell): %s\n", global_mailcmd); - ast_cli(fd, " Max silence: %d\n", global_maxsilence); - ast_cli(fd, " Silence treshold: %d\n", global_silencethreshold); - ast_cli(fd, " Max message length (secs): %d\n", global_vmmaxmessage); - ast_cli(fd, " Min message length (secs): %d\n", global_vmminmessage); - ast_cli(fd, " Default format: %s\n", default_vmformat); - ast_cli(fd, " Extern notify (shell): %s\n", global_externnotify); - ast_cli(fd, " Logfile: %s\n", global_logfile[0] ? global_logfile : ""); - ast_cli(fd, " Operator exit: %s\n", ast_test_flag(&globalflags, MVM_OPERATOR) ? "Yes" : "No"); - ast_cli(fd, " Message review: %s\n", ast_test_flag(&globalflags, MVM_REVIEW) ? "Yes" : "No"); + ast_cli(a->fd, "* Mini-Voicemail general settings\n"); + ast_cli(a->fd, " -------------------------------\n"); + ast_cli(a->fd, "\n"); + ast_cli(a->fd, " Mail command (shell): %s\n", global_mailcmd); + ast_cli(a->fd, " Max silence: %d\n", global_maxsilence); + ast_cli(a->fd, " Silence treshold: %d\n", global_silencethreshold); + ast_cli(a->fd, " Max message length (secs): %d\n", global_vmmaxmessage); + ast_cli(a->fd, " Min message length (secs): %d\n", global_vmminmessage); + ast_cli(a->fd, " Default format: %s\n", default_vmformat); + ast_cli(a->fd, " Extern notify (shell): %s\n", global_externnotify); + ast_cli(a->fd, " Logfile: %s\n", global_logfile[0] ? global_logfile : ""); + ast_cli(a->fd, " Operator exit: %s\n", ast_test_flag(&globalflags, MVM_OPERATOR) ? "Yes" : "No"); + ast_cli(a->fd, " Message review: %s\n", ast_test_flag(&globalflags, MVM_REVIEW) ? "Yes" : "No"); - ast_cli(fd, "\n"); - return RESULT_SUCCESS; + ast_cli(a->fd, "\n"); + return CLI_SUCCESS; } /*! \brief Show stats */ -static int handle_minivm_show_stats(int fd, int argc, char *argv[]) +static char *handle_minivm_show_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct ast_tm time; char buf[BUFSIZ]; - ast_cli(fd, "* Mini-Voicemail statistics\n"); - ast_cli(fd, " -------------------------\n"); - ast_cli(fd, "\n"); - ast_cli(fd, " Voicemail accounts: %5d\n", global_stats.voicemailaccounts); - ast_cli(fd, " Templates: %5d\n", global_stats.templates); - ast_cli(fd, " Timezones: %5d\n", global_stats.timezones); + switch (cmd) { + + case CLI_INIT: + e->command = "minivm show stats"; + e->usage = + "Usage: minivm show stats\n" + " Display Mini-Voicemail counters\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + ast_cli(a->fd, "* Mini-Voicemail statistics\n"); + ast_cli(a->fd, " -------------------------\n"); + ast_cli(a->fd, "\n"); + ast_cli(a->fd, " Voicemail accounts: %5d\n", global_stats.voicemailaccounts); + ast_cli(a->fd, " Templates: %5d\n", global_stats.templates); + ast_cli(a->fd, " Timezones: %5d\n", global_stats.timezones); if (global_stats.receivedmessages == 0) { - ast_cli(fd, " Received messages since last reset: \n"); + ast_cli(a->fd, " Received messages since last reset: \n"); } else { - ast_cli(fd, " Received messages since last reset: %d\n", global_stats.receivedmessages); + ast_cli(a->fd, " Received messages since last reset: %d\n", global_stats.receivedmessages); ast_localtime(&global_stats.lastreceived, &time, NULL); ast_strftime(buf, sizeof(buf), "%a %b %e %r %Z %Y", &time); - ast_cli(fd, " Last received voicemail: %s\n", buf); + ast_cli(a->fd, " Last received voicemail: %s\n", buf); } ast_localtime(&global_stats.reset, &time, NULL); ast_strftime(buf, sizeof(buf), "%a %b %e %r %Z %Y", &time); - ast_cli(fd, " Last reset: %s\n", buf); + ast_cli(a->fd, " Last reset: %s\n", buf); - ast_cli(fd, "\n"); - return RESULT_SUCCESS; + ast_cli(a->fd, "\n"); + return CLI_SUCCESS; } /*! \brief ${MINIVMACCOUNT()} Dialplan function - reads account data */ @@ -2963,29 +2992,12 @@ /*! \brief CLI commands for Mini-voicemail */ static struct ast_cli_entry cli_minivm[] = { - { { "minivm", "list", "accounts", NULL }, - handle_minivm_show_users, "List defined mini-voicemail boxes", - minivm_show_users_help, complete_minivm_show_users, NULL }, - - { { "minivm", "list", "zones", NULL }, - handle_minivm_show_zones, "List zone message formats", - minivm_show_zones_help, NULL, NULL }, - - { { "minivm", "list", "templates", NULL }, - handle_minivm_list_templates, "List message templates", - minivm_list_templates_help, NULL, NULL }, - - { { "minivm", "reload", NULL, NULL }, - handle_minivm_reload, "Reload Mini-voicemail configuration", - minivm_reload_help, NULL, NULL }, - - { { "minivm", "show", "stats", NULL }, - handle_minivm_show_stats, "Show some mini-voicemail statistics", - minivm_show_stats_help, NULL, NULL }, - - { { "minivm", "show", "settings", NULL }, - handle_minivm_show_settings, "Show mini-voicemail general settings", - minivm_show_settings_help, NULL, NULL }, + NEW_CLI(handle_minivm_show_users, "List defined mini-voicemail boxes"), + NEW_CLI(handle_minivm_show_zones, "List zone message formats"), + NEW_CLI(handle_minivm_list_templates, "List message templates"), + NEW_CLI(handle_minivm_reload, "Reload Mini-voicemail configuration"), + NEW_CLI(handle_minivm_show_stats, "Show some mini-voicemail statistics"), + NEW_CLI(handle_minivm_show_settings, "Show mini-voicemail general settings"), }; static struct ast_custom_function minivm_counter_function = { @@ -3061,11 +3073,23 @@ } /*! \brief Reload cofiguration */ -static int handle_minivm_reload(int fd, int argc, char *argv[]) +static char *handle_minivm_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { + + switch (cmd) { + case CLI_INIT: + e->command = "minivm reload"; + e->usage = + "Usage: minivm reload\n" + " Reload mini-voicemail configuration and reset statistics\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + reload(); - ast_cli(fd, "\n-- Mini voicemail re-configured \n"); - return RESULT_SUCCESS; + ast_cli(a->fd, "\n-- Mini voicemail re-configured \n"); + return CLI_SUCCESS; } /*! \brief Unload mini voicemail module */