From 0e805a51ec92ee94c1dda87c901c7908d3b32d41 Mon Sep 17 00:00:00 2001
From: Sean Bright <sean@malleable.com>
Date: Wed, 30 Sep 2009 15:11:21 +0000
Subject: [PATCH] Modify VoiceMailMain()'s a() argument to allow mailboxes to
 be specified by name.

(closes issue #14740)
Reported by: pj
Patches:
      issue14740_09022009.diff uploaded by seanbright (license 71)
Tested by: seanbright, lmadsen


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@221090 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_voicemail.c | 71 ++++++++++++++++++++++++++++----------------
 1 file changed, 46 insertions(+), 25 deletions(-)

diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 972a485d69..bd2a82ca90 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -222,7 +222,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 					<option name="a">
 						<argument name="folder" required="true" />
 						<para>Skip folder prompt and go directly to <replaceable>folder</replaceable> specified.
-						Defaults to <literal>0</literal> (INBOX).</para>
+						Defaults to <literal>INBOX</literal> (or <literal>0</literal>).</para>
 						<enumlist>
 							<enum name="0"><para>INBOX</para></enum>
 							<enum name="1"><para>Old</para></enum>
@@ -1456,27 +1456,41 @@ static int create_dirpath(char *dest, int len, const char *context, const char *
 	return 0;
 }
 
-static const char *mbox(int id)
-{
-	static const char * const msgs[] = {
+static const char * const mailbox_folders[] = {
 #ifdef IMAP_STORAGE
-		imapfolder,
+	imapfolder,
 #else
-		"INBOX",
+	"INBOX",
 #endif
-		"Old",
-		"Work",
-		"Family",
-		"Friends",
-		"Cust1",
-		"Cust2",
-		"Cust3",
-		"Cust4",
-		"Cust5",
-		"Deleted",
-		"Urgent"
-	};
-	return (id >= 0 && id < ARRAY_LEN(msgs)) ? msgs[id] : "Unknown";
+	"Old",
+	"Work",
+	"Family",
+	"Friends",
+	"Cust1",
+	"Cust2",
+	"Cust3",
+	"Cust4",
+	"Cust5",
+	"Deleted",
+	"Urgent",
+};
+
+static const char *mbox(int id)
+{
+	return (id >= 0 && id < ARRAY_LEN(mailbox_folders)) ? mailbox_folders[id] : "Unknown";
+}
+
+static int get_folder_by_name(const char *name)
+{
+	size_t i;
+
+	for (i = 0; i < ARRAY_LEN(mailbox_folders); i++) {
+		if (strcasecmp(name, mailbox_folders[i]) == 0) {
+			return i;
+		}
+	}
+
+	return -1;
 }
 
 static void free_user(struct ast_vm_user *vmu)
@@ -9090,15 +9104,22 @@ static int vm_execmain(struct ast_channel *chan, const char *data)
 			}
 			if (ast_test_flag(&flags, OPT_AUTOPLAY) ) {
 				play_auto = 1;
-				if (opts[OPT_ARG_PLAYFOLDER]) {
-					if (sscanf(opts[OPT_ARG_PLAYFOLDER], "%30d", &play_folder) != 1) {
-						ast_log(AST_LOG_WARNING, "Invalid value '%s' provided for folder autoplay option\n", opts[OPT_ARG_PLAYFOLDER]);
+				if (!ast_strlen_zero(opts[OPT_ARG_PLAYFOLDER])) {
+					/* See if it is a folder name first */
+					if (isdigit(opts[OPT_ARG_PLAYFOLDER][0])) {
+						if (sscanf(opts[OPT_ARG_PLAYFOLDER], "%30d", &play_folder) != 1) {
+							play_folder = -1;
+						}
+					} else {
+						play_folder = get_folder_by_name(opts[OPT_ARG_PLAYFOLDER]);
 					}
 				} else {
 					ast_log(AST_LOG_WARNING, "Invalid folder set with option a\n");
-				}	
-				if ( play_folder > 9 || play_folder < 0) {
-					ast_log(AST_LOG_WARNING, "Invalid value '%d' provided for folder autoplay option\n", play_folder);
+				}
+				if (play_folder > 9 || play_folder < 0) {
+					ast_log(AST_LOG_WARNING,
+						"Invalid value '%s' provided for folder autoplay option. Defaulting to 'INBOX'\n",
+						opts[OPT_ARG_PLAYFOLDER]);
 					play_folder = 0;
 				}
 			}
-- 
GitLab