aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-02 18:22:05 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-02 18:22:05 +0000
commit522dd61cfc2d9a1c4f1ddc738df10b0ad342c2d1 (patch)
tree14fa07d24b6f39f85ea139cff524deca1224d2c5 /apps
parent11787e241829c449721451ea3678e9012c300b3d (diff)
Add new application VMSayName for use with voicemail.
VMSayName that will play the recorded name of the voicemail user if it exists, otherwise will play the mailbox number. A unit test has been written to verify correct functionality called test_voicemail_vmsayname. (closes issue #14973) Reported by: ghjm Review: https://reviewboard.asterisk.org/r/530/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@249889 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_voicemail.c151
1 files changed, 148 insertions, 3 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 61594fb9e..085451ac5 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -302,6 +302,21 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
mailbox.</para>
</description>
</application>
+ <application name="VMSayName" language="en_US">
+ <synopsis>
+ Play the name of a voicemail user
+ </synopsis>
+ <syntax>
+ <parameter name="mailbox" required="true" argsep="@">
+ <argument name="mailbox" />
+ <argument name="context" />
+ </parameter>
+ </syntax>
+ <description>
+ <para>This application will say the recorded name of the voicemail user specified as the
+ argument to this application. If no context is provided, <literal>default</literal> is assumed.</para>
+ </description>
+ </application>
<function name="MAILBOX_EXISTS" language="en_US">
<synopsis>
Tell if a mailbox is configured.
@@ -730,6 +745,8 @@ static char *app2 = "VoiceMailMain";
static char *app3 = "MailboxExists";
static char *app4 = "VMAuthenticate";
+static char *sayname_app = "VMSayName";
+
static AST_LIST_HEAD_STATIC(users, ast_vm_user);
static AST_LIST_HEAD_STATIC(zones, vm_zone);
static char zonetag[80];
@@ -11593,6 +11610,126 @@ static int write_password_to_file(const char *secretfn, const char *password) {
return 0;
}
+static int vmsayname_exec(struct ast_channel *chan, const char *data)
+{
+ char *context;
+ char *args_copy;
+ int res;
+
+ if (ast_strlen_zero(data)) {
+ ast_log(LOG_WARNING, "VMSayName requires argument mailbox@context");
+ return -1;
+ }
+
+ args_copy = ast_strdupa(data);
+ if ((context = strchr(args_copy, '@'))) {
+ *context++ = '\0';
+ } else {
+ context = "default";
+ }
+
+ if ((res = sayname(chan, args_copy, context) < 0)) {
+ ast_debug(3, "Greeting not found for '%s@%s', falling back to mailbox number.\n", args_copy, context);
+ res = ast_stream_and_wait(chan, "vm-extension", AST_DIGIT_ANY);
+ if (!res) {
+ res = ast_say_character_str(chan, args_copy, AST_DIGIT_ANY, chan->language);
+ }
+ }
+
+ return res;
+}
+
+#ifdef TEST_FRAMEWORK
+static int fake_write(struct ast_channel *ast, struct ast_frame *frame)
+{
+ return 0;
+}
+
+static struct ast_frame *fake_read(struct ast_channel *ast)
+{
+ return &ast_null_frame;
+}
+
+AST_TEST_DEFINE(test_voicemail_vmsayname)
+{
+ char dir[PATH_MAX];
+ char dir2[PATH_MAX];
+ static const char TEST_CONTEXT[] = "very_long_unique_context_so_that_nobody_will_ever_have_the_same_one_configured_3141592653";
+ static const char TEST_EXTENSION[] = "1234";
+
+ struct ast_channel *test_channel1 = NULL;
+ int res = -1;
+
+ static const struct ast_channel_tech fake_tech = {
+ .write = fake_write,
+ .read = fake_read,
+ };
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = "vmsayname_exec";
+ info->category = "apps/app_voicemail/";
+ info->summary = "Vmsayname unit test";
+ info->description =
+ "This tests passing various parameters to vmsayname";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ if (!(test_channel1 = ast_channel_alloc(0, AST_STATE_DOWN, NULL, NULL, NULL,
+ NULL, NULL, 0, 0, "TestChannel1"))) {
+ goto exit_vmsayname_test;
+ }
+
+ /* normally this is done in the channel driver */
+ test_channel1->nativeformats = AST_FORMAT_GSM;
+ test_channel1->writeformat = AST_FORMAT_GSM;
+ test_channel1->rawwriteformat = AST_FORMAT_GSM;
+ test_channel1->readformat = AST_FORMAT_GSM;
+ test_channel1->rawreadformat = AST_FORMAT_GSM;
+ test_channel1->tech = &fake_tech;
+
+ ast_test_status_update(test, "Test playing of extension when greeting is not available...\n");
+ snprintf(dir, sizeof(dir), "%s@%s", TEST_EXTENSION, TEST_CONTEXT); /* not a dir, don't get confused */
+ if (!(res = vmsayname_exec(test_channel1, dir))) {
+ snprintf(dir, sizeof(dir), "%s%s/%s/greet", VM_SPOOL_DIR, TEST_CONTEXT, TEST_EXTENSION);
+ if (ast_fileexists(dir, NULL, NULL)) {
+ ast_test_status_update(test, "This should not happen, most likely means clean up from previous test failed\n");
+ res = -1;
+ goto exit_vmsayname_test;
+ } else {
+ /* no greeting already exists as expected, let's create one to fully test sayname */
+ if ((res = create_dirpath(dir, sizeof(dir), TEST_CONTEXT, TEST_EXTENSION, ""))) {
+ ast_log(AST_LOG_WARNING, "Failed to make test directory\n");
+ goto exit_vmsayname_test;
+ }
+ snprintf(dir, sizeof(dir), "%s/sounds/beep.gsm", ast_config_AST_VAR_DIR);
+ snprintf(dir2, sizeof(dir2), "%s%s/%s/greet.gsm", VM_SPOOL_DIR, TEST_CONTEXT, TEST_EXTENSION);
+ /* we're not going to hear the sound anyway, just use a valid gsm audio file */
+ symlink(dir, dir2);
+ ast_test_status_update(test, "Test playing created mailbox greeting...\n");
+ snprintf(dir, sizeof(dir), "%s@%s", TEST_EXTENSION, TEST_CONTEXT); /* not a dir, don't get confused */
+ res = vmsayname_exec(test_channel1, dir);
+
+ /* TODO: there may be a better way to do this */
+ unlink(dir2);
+ snprintf(dir2, sizeof(dir2), "%s%s/%s", VM_SPOOL_DIR, TEST_CONTEXT, TEST_EXTENSION);
+ rmdir(dir2);
+ snprintf(dir2, sizeof(dir2), "%s%s", VM_SPOOL_DIR, TEST_CONTEXT);
+ rmdir(dir2);
+ }
+ }
+
+exit_vmsayname_test:
+
+ if (test_channel1) {
+ ast_hangup(test_channel1);
+ }
+
+ return res ? AST_TEST_FAIL : AST_TEST_PASS;
+}
+
AST_TEST_DEFINE(test_voicemail_msgcount)
{
int i, j, res = AST_TEST_PASS, syserr;
@@ -11755,6 +11892,7 @@ AST_TEST_DEFINE(test_voicemail_msgcount)
return res;
}
+#endif
static int reload(void)
{
@@ -11771,6 +11909,10 @@ static int unload_module(void)
res |= ast_unregister_application(app4);
res |= ast_custom_function_unregister(&mailbox_exists_acf);
res |= ast_manager_unregister("VoicemailUsersList");
+#ifdef TEST_FRAMEWORK
+ res |= AST_TEST_UNREGISTER(test_voicemail_vmsayname);
+ res |= AST_TEST_UNREGISTER(test_voicemail_msgcount);
+#endif
ast_cli_unregister_multiple(cli_voicemail, ARRAY_LEN(cli_voicemail));
ast_uninstall_vm_functions();
ao2_ref(inprocess_container, -1);
@@ -11784,7 +11926,6 @@ static int unload_module(void)
free_vm_users();
free_vm_zones();
- AST_TEST_UNREGISTER(test_voicemail_msgcount);
return res;
}
@@ -11812,8 +11953,14 @@ static int load_module(void)
res |= ast_register_application_xml(app2, vm_execmain);
res |= ast_register_application_xml(app3, vm_box_exists);
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_manager_register_xml("VoicemailUsersList", EVENT_FLAG_CALL | EVENT_FLAG_REPORTING, manager_list_voicemail_users);
+#ifdef TEST_FRAMEWORK
+ res |= AST_TEST_REGISTER(test_voicemail_vmsayname);
+ res |= AST_TEST_REGISTER(test_voicemail_msgcount);
+#endif
+
if (res)
return res;
@@ -11823,8 +11970,6 @@ static int load_module(void)
ast_realtime_require_field("voicemail", "uniqueid", RQ_UINTEGER3, 11, "password", RQ_CHAR, 10, SENTINEL);
ast_realtime_require_field("voicemail_data", "filename", RQ_CHAR, 30, "duration", RQ_UINTEGER3, 5, SENTINEL);
- AST_TEST_REGISTER(test_voicemail_msgcount);
-
return res;
}