[Asterisk-cvs] asterisk/apps app_voicemail.c,1.50,1.51

malcolmd at lists.digium.com malcolmd at lists.digium.com
Thu Jan 8 23:54:13 CST 2004


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv12784/apps

Modified Files:
	app_voicemail.c 
Log Message:
Bug #690: Add "show voicemail users" and "show voicemail zones" CLI command to app_voicemail


Index: app_voicemail.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_voicemail.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- app_voicemail.c	8 Jan 2004 20:24:13 -0000	1.50
+++ app_voicemail.c	9 Jan 2004 05:45:56 -0000	1.51
@@ -26,6 +26,7 @@
 #include <asterisk/manager.h>
 #include <asterisk/dsp.h>
 #include <asterisk/localtime.h>
+#include <asterisk/cli.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <unistd.h>
@@ -34,7 +35,9 @@
 #include <stdio.h>
 #include <sys/time.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <time.h>
+#include <dirent.h>
 
 /* we define USESQLVM when we have MySQL or POSTGRES */
 #ifdef USEMYSQLVM
@@ -3003,6 +3006,126 @@
 	return 0;
 }
 
+/* XXX TL Bug 690 */
+static char show_voicemail_users_help[] =
+"Usage: show voicemail users [for <context>]\n"
+"       Lists all mailboxes currently set up\n";
+
+static char show_voicemail_zones_help[] =
+"Usage: show voicemail zones\n"
+"       Lists zone message formats\n";
+
+static int handle_show_voicemail_users(int fd, int argc, char *argv[])
+{
+	struct ast_vm_user *vmu = users;
+	char *output_format = "%-10s %-5s %-25s %-10s %6s\n";
+
+	if ((argc < 3) || (argc > 5) || (argc == 4)) return RESULT_SHOWUSAGE;
+	else if ((argc == 5) && strcmp(argv[3],"for")) return RESULT_SHOWUSAGE;
+
+	if (vmu) {
+		if (argc == 3)
+			ast_cli(fd, output_format, "Context", "Mbox", "User", "Zone", "NewMsg");
+		else {
+			int count = 0;
+			while (vmu) {
+				if (!strcmp(argv[4],vmu->context))
+					count++;
+				vmu = vmu->next;
+			}
+			if (count) {
+				vmu = users;
+				ast_cli(fd, output_format, "Context", "Mbox", "User", "Zone", "NewMsg");
+			} else {
+				ast_cli(fd, "No such voicemail context \"%s\"\n", argv[4]);
+				return RESULT_FAILURE;
+			}
+		}
+		while (vmu) {
+			char dirname[256];
+			DIR *vmdir;
+			struct dirent *vment;
+			int vmcount = 0;
+			char count[12];
+			make_dir(dirname, 255, vmu->context, vmu->mailbox, "INBOX");
+			if ((vmdir = opendir(dirname))) {
+				/* No matter what the format of VM, there will always be a .txt file for each message. */
+				while ((vment = readdir(vmdir)))
+					if (!strncmp(vment->d_name + 7,".txt",4))
+						vmcount++;
+				closedir(vmdir);
+			}
+			snprintf(count,11,"%d",vmcount);
+			ast_cli(fd, output_format, vmu->context, vmu->mailbox, vmu->fullname, vmu->zonetag, count);
+			vmu = vmu->next;
+		}
+	} else {
+		ast_cli(fd, "There are no voicemail users currently defined\n");
+		return RESULT_FAILURE;
+	}
+	return RESULT_SUCCESS;
+}
+
+static int handle_show_voicemail_zones(int fd, int argc, char *argv[])
+{
+	struct vm_zone *zone = zones;
+	char *output_format = "%-15s %-20s %-45s\n";
+
+	if (argc != 3) return RESULT_SHOWUSAGE;
+
+	if (zone) {
+		ast_cli(fd, output_format, "Zone", "Timezone", "Message Format");
+		while (zone) {
+			ast_cli(fd, output_format, zone->name, zone->timezone, zone->msg_format);
+			zone = zone->next;
+		}
+	} else {
+		ast_cli(fd, "There are no voicemail zones currently defined\n");
+		return RESULT_FAILURE;
+	}
+	return RESULT_SUCCESS;
+}
+
+static char *complete_show_voicemail_users(char *line, char *word, int pos, int state)
+{
+	int which = 0;
+	struct ast_vm_user *vmu = users;
+	char *context = "";
+
+	/* 0 - show; 1 - voicemail; 2 - users; 3 - for; 4 - <context> */
+	if (pos > 4)
+		return NULL;
+	if (pos == 3) {
+		if (state == 0)
+			return strdup("for");
+		else
+			return NULL;
+	}
+	while (vmu) {
+		if (!strncasecmp(word, vmu->context, strlen(word))) {
+			if (context && strcmp(context, vmu->context)) {
+				if (++which > state) {
+					return strdup(vmu->context);
+				}
+				context = vmu->context;
+			}
+		}
+		vmu = vmu->next;
+	}
+	return NULL;
+}
+
+static struct ast_cli_entry show_voicemail_users_cli =
+	{ { "show", "voicemail", "users", NULL },
+	handle_show_voicemail_users, "List defined voicemail boxes",
+	show_voicemail_users_help, complete_show_voicemail_users };
+
+static struct ast_cli_entry show_voicemail_zones_cli =
+	{ { "show", "voicemail", "zones", NULL },
+	handle_show_voicemail_zones, "List zone message formats",
+	show_voicemail_zones_help, NULL };
+
+
 static int load_config(void)
 {
 	struct ast_vm_user *cur, *l;
@@ -3233,6 +3356,8 @@
 	res |= ast_unregister_application(app2);
 	res |= ast_unregister_application(capp2);
 	sql_close();
+	ast_cli_unregister(&show_voicemail_users_cli);
+	ast_cli_unregister(&show_voicemail_zones_cli);
 	return res;
 }
 
@@ -3254,6 +3379,8 @@
 		ast_log(LOG_WARNING, "SQL init\n");
 		return res;
 	}
+	ast_cli_register(&show_voicemail_users_cli);
+	ast_cli_register(&show_voicemail_zones_cli);
 	return res;
 }
 




More information about the svn-commits mailing list