mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	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: https://origsvn.digium.com/svn/asterisk/trunk@249889 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -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; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user