[asterisk-commits] wdoekes: trunk r347192 - in /trunk: CHANGES UPGRADE.txt apps/app_voicemail.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Dec 6 14:23:23 CST 2011


Author: wdoekes
Date: Tue Dec  6 14:23:13 2011
New Revision: 347192

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=347192
Log:
Add VM_INFO() dialplan function to gather information about a mailbox.

Deprecates MAILBOX_EXISTS. Provides count, email, exists, fullname,
language, locale, pager, password, tz.

(closes issue ASTERISK-18634)
Patch by: Kris Shaw
Review: https://reviewboard.asterisk.org/r/1568
Reviewed by: Walter Doekes

Modified:
    trunk/CHANGES
    trunk/UPGRADE.txt
    trunk/apps/app_voicemail.c

Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=347192&r1=347191&r2=347192
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Tue Dec  6 14:23:13 2011
@@ -73,6 +73,13 @@
    have their own verbosity level.  While 'core set verbose' still works to
    affect the core console verbosity, 'remote set verbose' will now set a
    separate level for each remote console without affecting any other console.
+
+Dialplan functions
+------------------
+ * Addition of the VM_INFO function that can be used to retrieve voicemail
+   user information, such as the email address and full name.
+   The MAILBOX_EXISTS dialplan function has been deprecated in favour of
+   VM_INFO.
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 1.8 to Asterisk 10 -------------------

Modified: trunk/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/trunk/UPGRADE.txt?view=diff&rev=347192&r1=347191&r2=347192
==============================================================================
--- trunk/UPGRADE.txt (original)
+++ trunk/UPGRADE.txt Tue Dec  6 14:23:13 2011
@@ -21,6 +21,10 @@
 ===========================================================
 
 From 10 to 11:
+
+Dialplan Functions:
+ - MAILBOX_EXISTS has been deprecated. Use VM_INFO with the 'exists' parameter
+   instead.
 
 func_enum:
  - ENUM query functions now return a count of -1 on lookup error to

Modified: trunk/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/trunk/apps/app_voicemail.c?view=diff&rev=347192&r1=347191&r2=347192
==============================================================================
--- trunk/apps/app_voicemail.c (original)
+++ trunk/apps/app_voicemail.c Tue Dec  6 14:23:13 2011
@@ -284,6 +284,7 @@
 			</parameter>
 		</syntax>
 		<description>
+			<note><para>DEPRECATED. Use VM_INFO(mailbox[@context],exists) instead.</para></note>
 			<para>Check to see if the specified <replaceable>mailbox</replaceable> exists. If no voicemail
 			<replaceable>context</replaceable> is specified, the <literal>default</literal> context
 			will be used.</para>
@@ -297,6 +298,9 @@
 				</variable>
 			</variablelist>
 		</description>
+		<see-also>
+			<ref type="function">VM_INFO</ref>
+		</see-also>
 	</application>
 	<application name="VMAuthenticate" language="en_US">
 		<synopsis>
@@ -354,9 +358,66 @@
 			<parameter name="context" />
 		</syntax>
 		<description>
+			<note><para>DEPRECATED. Use VM_INFO(mailbox[@context],exists) instead.</para></note>
 			<para>Returns a boolean of whether the corresponding <replaceable>mailbox</replaceable> exists.
 			If <replaceable>context</replaceable> is not specified, defaults to the <literal>default</literal>
 			context.</para>
+		</description>
+		<see-also>
+			<ref type="function">VM_INFO</ref>
+		</see-also>
+	</function>
+	<function name="VM_INFO" language="en_US">
+		<synopsis>
+			Returns the selected attribute from a mailbox.
+		</synopsis>
+		<syntax argsep=",">
+			<parameter name="mailbox" argsep="@" required="true">
+				<argument name="mailbox" required="true" />
+				<argument name="context" />
+			</parameter>
+			<parameter name="attribute" required="true">
+				<optionlist>
+					<option name="count">
+						<para>Count of messages in specified <replaceable>folder</replaceable>.
+						If <replaceable>folder</replaceable> is not specified, defaults to <literal>INBOX</literal>.</para>
+					</option>
+					<option name="email">
+						<para>E-mail address associated with the mailbox.</para>
+					</option>
+					<option name="exists">
+						<para>Returns a boolean of whether the corresponding <replaceable>mailbox</replaceable> exists.</para>
+					</option>
+					<option name="fullname">
+						<para>Full name associated with the mailbox.</para>
+					</option>
+					<option name="language">
+						<para>Mailbox language if overridden, otherwise the language of the channel.</para>
+					</option>
+					<option name="locale">
+						<para>Mailbox locale if overridden, otherwise global locale.</para>
+					</option>
+					<option name="pager">
+						<para>Pager e-mail address associated with the mailbox.</para>
+					</option>
+					<option name="password">
+						<para>Mailbox access password.</para>
+					</option>
+					<option name="tz">
+						<para>Mailbox timezone if overridden, otherwise global timezone</para>
+					</option>
+				</optionlist>
+			</parameter>
+			<parameter name="folder" required="false">
+				<para>If not specified, <literal>INBOX</literal> is assumed.</para>
+			</parameter>
+		</syntax>
+		<description>
+			<para>Returns the selected attribute from the specified <replaceable>mailbox</replaceable>.
+			If <replaceable>context</replaceable> is not specified, defaults to the <literal>default</literal>
+			context. Where the <replaceable>folder</replaceable> can be specified, common folders
+			include <literal>INBOX</literal>, <literal>Old</literal>, <literal>Work</literal>,
+			<literal>Family</literal> and <literal>Friends</literal>.</para>
 		</description>
 	</function>
 	<manager name="VoicemailUsersList" language="en_US">
@@ -5223,11 +5284,15 @@
 	char sql[PATH_MAX];
 	char rowdata[20];
 	struct generic_prepare_struct gps = { .sql = sql, .argc = 0 };
-	if (!folder)
+
+	/* If no mailbox, return immediately */
+	if (ast_strlen_zero(mailbox)) {
+		return 0;
+	}
+
+	if (ast_strlen_zero(folder)) {
 		folder = "INBOX";
-	/* If no mailbox, return immediately */
-	if (ast_strlen_zero(mailbox))
-		return 0;
+	}
 
 	obj = ast_odbc_request_obj(odbc_database, 0);
 	if (obj) {
@@ -10975,7 +11040,7 @@
 
 	if (!dep_warning) {
 		dep_warning = 1;
-		ast_log(AST_LOG_WARNING, "MailboxExists is deprecated.  Please use ${MAILBOX_EXISTS(%s)} instead.\n", (char *) data);
+		ast_log(AST_LOG_WARNING, "MailboxExists is deprecated.  Please use ${VM_INFO(%s,exists)} instead.\n", data);
 	}
 
 	box = ast_strdupa(data);
@@ -11005,6 +11070,7 @@
 		AST_APP_ARG(mbox);
 		AST_APP_ARG(context);
 	);
+	static int dep_warning = 0;
 
 	AST_NONSTANDARD_APP_ARGS(arg, args, '@');
 
@@ -11013,13 +11079,97 @@
 		return -1;
 	}
 
+	if (!dep_warning) {
+		dep_warning = 1;
+		ast_log(AST_LOG_WARNING, "MAILBOX_EXISTS is deprecated.  Please use ${VM_INFO(%s,exists)} instead.\n", args);
+	}
+
 	ast_copy_string(buf, find_user(&svm, ast_strlen_zero(arg.context) ? "default" : arg.context, arg.mbox) ? "1" : "0", len);
+	return 0;
+}
+
+static int acf_vm_info(struct ast_channel *chan, const char *cmd, char *args, char *buf, size_t len)
+{
+	struct ast_vm_user *vmu = NULL;
+	char *tmp, *mailbox, *context, *parse;
+	int res = 0;
+
+	AST_DECLARE_APP_ARGS(arg,
+		AST_APP_ARG(mailbox_context);
+		AST_APP_ARG(attribute);
+		AST_APP_ARG(folder);
+	);
+
+	buf[0] = '\0';
+
+	if (ast_strlen_zero(args)) {
+		ast_log(LOG_ERROR, "VM_INFO requires an argument (<mailbox>[@<context>],attribute[,folder])\n");
+		return -1;
+	}
+
+	parse = ast_strdupa(args);
+	AST_STANDARD_APP_ARGS(arg, parse);
+
+	if (ast_strlen_zero(arg.mailbox_context) || ast_strlen_zero(arg.attribute)) {
+		ast_log(LOG_ERROR, "VM_INFO requires an argument (<mailbox>[@<context>],attribute[,folder])\n");
+		return -1;
+	}
+
+	tmp = ast_strdupa(arg.mailbox_context);
+	mailbox = strsep(&tmp, "@");
+	context = strsep(&tmp, "");
+
+	if (ast_strlen_zero(context)) {
+		 context = "default";
+	}
+
+	vmu = find_user(NULL, context, mailbox);
+
+	if (!strncasecmp(arg.attribute, "exists", 5)) {
+		ast_copy_string(buf, vmu ? "1" : "0", len);
+		return 0;
+	}
+
+	if (vmu) {
+		if (!strncasecmp(arg.attribute, "password", 8)) {
+			ast_copy_string(buf, vmu->password, len);
+		} else if (!strncasecmp(arg.attribute, "fullname", 8)) {
+			ast_copy_string(buf, vmu->fullname, len);
+		} else if (!strncasecmp(arg.attribute, "email", 5)) {
+			ast_copy_string(buf, vmu->email, len);
+		} else if (!strncasecmp(arg.attribute, "pager", 5)) {
+			ast_copy_string(buf, vmu->pager, len);
+		} else if (!strncasecmp(arg.attribute, "language", 8)) {
+			ast_copy_string(buf, S_OR(vmu->language, chan->language), len);
+		} else if (!strncasecmp(arg.attribute, "locale", 6)) {
+			ast_copy_string(buf, vmu->locale, len);
+		} else if (!strncasecmp(arg.attribute, "tz", 2)) {
+			ast_copy_string(buf, vmu->zonetag, len);
+		} else if (!strncasecmp(arg.attribute, "count", 5)) {
+			/* If mbxfolder is empty messagecount will default to INBOX */
+			res = messagecount(context, mailbox, arg.folder);
+			if (res < 0) {
+				ast_log(LOG_ERROR, "Unable to retrieve message count for mailbox %s\n", arg.mailbox_context);
+				return -1;
+			}
+			snprintf(buf, len, "%d", res);
+		} else {
+			ast_log(LOG_ERROR, "Unknown attribute '%s' for VM_INFO\n", arg.attribute);
+			return -1;
+		}
+	}
+
 	return 0;
 }
 
 static struct ast_custom_function mailbox_exists_acf = {
 	.name = "MAILBOX_EXISTS",
 	.read = acf_mailbox_exists,
+};
+
+static struct ast_custom_function vm_info_acf = {
+	.name = "VM_INFO",
+	.read = acf_vm_info,
 };
 
 static int vmauthenticate(struct ast_channel *chan, const char *data)
@@ -13018,6 +13168,88 @@
 	return res;
 }
 
+AST_TEST_DEFINE(test_voicemail_vm_info)
+{
+	struct ast_vm_user *vmu;
+	struct ast_channel *chan = NULL;
+	const char testcontext[] = "test";
+	const char testmailbox[] = "00000000";
+	const char vminfo_cmd[] = "VM_INFO";
+	char vminfo_buf[256], vminfo_args[256];
+	int res = AST_TEST_PASS;
+	int test_ret = 0;
+	int test_counter = 0;
+
+	struct {
+		char *vminfo_test_args;
+		char *vminfo_expected;
+		int vminfo_ret;
+	} test_items[] = {
+		{ "", "", -1 },				/* Missing argument */
+		{ "00000000 at test,badparam", "", -1 },	/* Wrong argument */
+		{ "00000000 at test", "", -1 },		/* Missing argument */
+		{ "00000000 at test,exists", "1", 0 },
+		{ "11111111 at test,exists", "0", 0 },	/* Invalid mailbox */
+		{ "00000000 at test,email", "vm-info-test at example.net", 0 },
+		{ "11111111 at test,email", "", 0 },	/* Invalid mailbox */
+		{ "00000000 at test,fullname", "Test Framework Mailbox", 0 },
+		{ "00000000 at test,pager", "vm-info-pager-test at example.net", 0 },
+		{ "00000000 at test,locale", "en_US", 0 },
+		{ "00000000 at test,tz", "central", 0 },
+		{ "00000000 at test,language", "en", 0 },
+		{ "00000000 at test,password", "9876", 0 },
+	};
+
+	switch (cmd) {
+		case TEST_INIT:
+			info->name = "test_voicemail_vm_info";
+			info->category = "/apps/app_voicemail/";
+			info->summary = "VM_INFO unit test";
+			info->description =
+				"This tests passing various parameters to VM_INFO";
+			return AST_TEST_NOT_RUN;
+		case TEST_EXECUTE:
+			break;
+	}
+
+	if (!(chan = ast_dummy_channel_alloc())) {
+		ast_test_status_update(test, "Unable to create dummy channel\n");
+		return AST_TEST_FAIL;
+	}
+
+	if (!(vmu = find_user(NULL, testcontext, testmailbox)) &&
+			!(vmu = find_or_create(testcontext, testmailbox))) {
+		ast_test_status_update(test, "Cannot create vmu structure\n");
+		chan = ast_channel_unref(chan);
+		return AST_TEST_FAIL;
+	}
+
+	populate_defaults(vmu);
+
+	ast_copy_string(vmu->email, "vm-info-test at example.net", sizeof(vmu->email));
+	ast_copy_string(vmu->fullname, "Test Framework Mailbox", sizeof(vmu->fullname));
+	ast_copy_string(vmu->pager, "vm-info-pager-test at example.net", sizeof(vmu->pager));
+	ast_copy_string(vmu->language, "en", sizeof(vmu->language));
+	ast_copy_string(vmu->zonetag, "central", sizeof(vmu->zonetag));
+	ast_copy_string(vmu->locale, "en_US", sizeof(vmu->zonetag));
+	ast_copy_string(vmu->password, "9876", sizeof(vmu->password));
+
+	for (test_counter = 0; test_counter < ARRAY_LEN(test_items); test_counter++) {
+		ast_copy_string(vminfo_args, test_items[test_counter].vminfo_test_args, sizeof(vminfo_args));
+		test_ret = acf_vm_info(chan, vminfo_cmd, vminfo_args, vminfo_buf, sizeof(vminfo_buf));
+		if (strcmp(vminfo_buf, test_items[test_counter].vminfo_expected)) {
+			ast_test_status_update(test, "VM_INFO respose was: '%s', but expected: '%s'\n", vminfo_buf, test_items[test_counter].vminfo_expected);
+			res = AST_TEST_FAIL;
+		}
+		if (!(test_ret == test_items[test_counter].vminfo_ret)) {
+			ast_test_status_update(test, "VM_INFO return code was: '%i', but expected '%i'\n", test_ret, test_items[test_counter].vminfo_ret);
+			res = AST_TEST_FAIL;
+		}
+	}
+
+	chan = ast_channel_unref(chan);
+	return res;
+}
 #endif /* defined(TEST_FRAMEWORK) */
 
 static int reload(void)
@@ -13035,6 +13267,7 @@
 	res |= ast_unregister_application(app4);
 	res |= ast_unregister_application(sayname_app);
 	res |= ast_custom_function_unregister(&mailbox_exists_acf);
+	res |= ast_custom_function_unregister(&vm_info_acf);
 	res |= ast_manager_unregister("VoicemailUsersList");
 	res |= ast_data_unregister(NULL);
 #ifdef TEST_FRAMEWORK
@@ -13043,6 +13276,7 @@
 	res |= AST_TEST_UNREGISTER(test_voicemail_vmuser);
 	res |= AST_TEST_UNREGISTER(test_voicemail_notify_endl);
 	res |= AST_TEST_UNREGISTER(test_voicemail_load_config);
+	res |= AST_TEST_UNREGISTER(test_voicemail_vm_info);
 #endif
 	ast_cli_unregister_multiple(cli_voicemail, ARRAY_LEN(cli_voicemail));
 	ast_uninstall_vm_functions();
@@ -13086,6 +13320,7 @@
 	res |= ast_register_application_xml(app4, vmauthenticate);
 	res |= ast_register_application_xml(sayname_app, vmsayname_exec);
 	res |= ast_custom_function_register(&mailbox_exists_acf);
+	res |= ast_custom_function_register(&vm_info_acf);
 	res |= ast_manager_register_xml("VoicemailUsersList", EVENT_FLAG_CALL | EVENT_FLAG_REPORTING, manager_list_voicemail_users);
 #ifdef TEST_FRAMEWORK
 	res |= AST_TEST_REGISTER(test_voicemail_vmsayname);
@@ -13093,6 +13328,7 @@
 	res |= AST_TEST_REGISTER(test_voicemail_vmuser);
 	res |= AST_TEST_REGISTER(test_voicemail_notify_endl);
 	res |= AST_TEST_REGISTER(test_voicemail_load_config);
+	res |= AST_TEST_REGISTER(test_voicemail_vm_info);
 #endif
 
 	if (res)




More information about the asterisk-commits mailing list