diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 8ee8367e244946254b08861fed35eb9d2178ec6f..55072cf82ca8dd8696cd30136782bb5aa4621df2 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -113,7 +113,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/module.h" #include "asterisk/adsi.h" #include "asterisk/app.h" -#include "asterisk/app_voicemail.h" #include "asterisk/manager.h" #include "asterisk/dsp.h" #include "asterisk/localtime.h" @@ -1041,7 +1040,6 @@ static int add_email_attachment(FILE *p, struct ast_vm_user *vmu, char *format, static int is_valid_dtmf(const char *key); static void read_password_from_file(const char *secretfn, char *password, int passwordlen); static int write_password_to_file(const char *secretfn, const char *password); -struct ast_str *vm_mailbox_snapshot_str(const char *mailbox, const char *context); static const char *substitute_escapes(const char *value); static int message_range_and_existence_check(struct vm_state *vms, const char *msg_ids [], size_t num_msgs, int *msg_nums, struct ast_vm_user *vmu); /*! @@ -1060,6 +1058,19 @@ static int message_range_and_existence_check(struct vm_state *vms, const char *m */ static int save_to_folder(struct ast_vm_user *vmu, struct vm_state *vms, int msg, int box, int *newmsg, int move); +static struct ast_vm_mailbox_snapshot *vm_mailbox_snapshot_create(const char *mailbox, const char *context, const char *folder, int descending, enum ast_vm_snapshot_sort_val sort_val, int combine_INBOX_and_OLD); +static struct ast_vm_mailbox_snapshot *vm_mailbox_snapshot_destroy(struct ast_vm_mailbox_snapshot *mailbox_snapshot); + +static int vm_msg_forward(const char *from_mailbox, const char *from_context, const char *from_folder, const char *to_mailbox, const char *to_context, const char *to_folder, size_t num_msgs, const char *msg_ids[], int delete_old); +static int vm_msg_move(const char *mailbox, const char *context, size_t num_msgs, const char *oldfolder, const char *old_msg_ids[], const char *newfolder); +static int vm_msg_remove(const char *mailbox, const char *context, size_t num_msgs, const char *folder, const char *msgs[]); +static int vm_msg_play(struct ast_channel *chan, const char *mailbox, const char *context, const char *folder, const char *msg_num, ast_vm_msg_play_cb cb); + +#ifdef TEST_FRAMEWORK +static int vm_test_destroy_user(const char *context, const char *mailbox); +static int vm_test_create_user(const char *context, const char *mailbox); +#endif + struct ao2_container *inprocess_container; struct inprocess { @@ -1868,6 +1879,12 @@ static const char *mbox(struct ast_vm_user *vmu, int id) return (id >= 0 && id < ARRAY_LEN(mailbox_folders)) ? mailbox_folders[id] : "Unknown"; } +static const char *vm_index_to_foldername(int id) +{ + return mbox(NULL, id); +} + + static int get_folder_by_name(const char *name) { size_t i; @@ -10580,7 +10597,7 @@ static int play_message_by_id(struct ast_channel *chan, const char *mailbox, con } /* Iterate through every folder, find the msg, and play it */ - for (i = 0; i < AST_VM_FOLDER_NUMBER && !played; i++) { + for (i = 0; i < ARRAY_LEN(mailbox_folders) && !played; i++) { ast_copy_string(vms.username, mailbox, sizeof(vms.username)); vms.lastmsg = -1; @@ -14096,6 +14113,9 @@ static int unload_module(void) #endif ast_cli_unregister_multiple(cli_voicemail, ARRAY_LEN(cli_voicemail)); ast_uninstall_vm_functions(); +#ifdef TEST_FRAMEWORK + ast_uninstall_vm_test_functions(); +#endif ao2_ref(inprocess_container, -1); if (poll_thread != AST_PTHREADT_NULL) @@ -14154,7 +14174,15 @@ static int load_module(void) ast_cli_register_multiple(cli_voicemail, ARRAY_LEN(cli_voicemail)); ast_data_register_multiple(vm_data_providers, ARRAY_LEN(vm_data_providers)); - ast_install_vm_functions(has_voicemail, inboxcount, inboxcount2, messagecount, sayname, msg_create_from_file); + ast_install_vm_functions(has_voicemail, inboxcount, inboxcount2, messagecount, sayname, msg_create_from_file, + vm_index_to_foldername, + vm_mailbox_snapshot_create, vm_mailbox_snapshot_destroy, + vm_msg_move, vm_msg_remove, vm_msg_forward, vm_msg_play); + +#ifdef TEST_FRAMEWORK + ast_install_vm_test_functions(vm_test_destroy_user, vm_test_create_user); +#endif + 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); @@ -14689,7 +14717,7 @@ static struct ast_vm_msg_snapshot *vm_msg_snapshot_destroy(struct ast_vm_msg_sna #ifdef TEST_FRAMEWORK -int ast_vm_test_destroy_user(const char *context, const char *mailbox) +static int vm_test_destroy_user(const char *context, const char *mailbox) { struct ast_vm_user *vmu; @@ -14707,7 +14735,7 @@ int ast_vm_test_destroy_user(const char *context, const char *mailbox) return 0; } -int ast_vm_test_create_user(const char *context, const char *mailbox) +static int vm_test_create_user(const char *context, const char *mailbox) { struct ast_vm_user *vmu; @@ -14846,7 +14874,7 @@ static int vm_msg_snapshot_create(struct ast_vm_user *vmu, return 0; } -struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_create(const char *mailbox, +static struct ast_vm_mailbox_snapshot *vm_mailbox_snapshot_create(const char *mailbox, const char *context, const char *folder, int descending, @@ -14872,7 +14900,7 @@ struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_create(const char *mailb if (!(ast_strlen_zero(folder))) { /* find the folder index */ - for (i = 0; i < AST_VM_FOLDER_NUMBER; i++) { + for (i = 0; i < ARRAY_LEN(mailbox_folders); i++) { if (!strcasecmp(mailbox_folders[i], folder)) { this_index_only = i; break; @@ -14894,7 +14922,14 @@ struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_create(const char *mailb return NULL; } - for (i = 0; i < AST_VM_FOLDER_NUMBER; i++) { + if (!(mailbox_snapshot->snapshots = ast_calloc(ARRAY_LEN(mailbox_folders), sizeof(*mailbox_snapshot->snapshots)))) { + ast_free(mailbox_snapshot); + return NULL; + } + + mailbox_snapshot->folders = ARRAY_LEN(mailbox_folders); + + for (i = 0; i < mailbox_snapshot->folders; i++) { int combining_old = 0; if ((i == old_index) && (combine_INBOX_and_OLD)) { combining_old = 1; @@ -14949,62 +14984,26 @@ snapshot_cleanup: return mailbox_snapshot; } -struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_destroy(struct ast_vm_mailbox_snapshot *mailbox_snapshot) +static struct ast_vm_mailbox_snapshot *vm_mailbox_snapshot_destroy(struct ast_vm_mailbox_snapshot *mailbox_snapshot) { int i; struct ast_vm_msg_snapshot *msg_snapshot; - for (i = 0; i < AST_VM_FOLDER_NUMBER; i++) { + for (i = 0; i < mailbox_snapshot->folders; i++) { while ((msg_snapshot = AST_LIST_REMOVE_HEAD(&mailbox_snapshot->snapshots[i], msg))) { msg_snapshot = vm_msg_snapshot_destroy(msg_snapshot); } } + ast_free(mailbox_snapshot->snapshots); ast_free(mailbox_snapshot); return NULL; } -struct ast_str *vm_mailbox_snapshot_str(const char *mailbox, const char *context) -{ - struct ast_vm_mailbox_snapshot *mailbox_snapshot = ast_vm_mailbox_snapshot_create(mailbox, context, NULL, 0, AST_VM_SNAPSHOT_SORT_BY_ID, 0); - struct ast_vm_msg_snapshot *msg_snapshot; - int i; - struct ast_str *str; - - if (!mailbox_snapshot) { - return NULL; - } - - if (!(str = ast_str_create(512))) { - return NULL; - mailbox_snapshot = ast_vm_mailbox_snapshot_destroy(mailbox_snapshot); - } - - for (i = 0; i < AST_VM_FOLDER_NUMBER; i++) { - ast_str_append(&str, 0, "FOLDER: %s\n", mailbox_folders[i]); - AST_LIST_TRAVERSE(&mailbox_snapshot->snapshots[i], msg_snapshot, msg) { - ast_str_append(&str, 0, "MSG Number: %d\n", msg_snapshot->msg_number); - ast_str_append(&str, 0, "MSG ID: %s\n", msg_snapshot->msg_id); - ast_str_append(&str, 0, "CALLER ID: %s\n", msg_snapshot->callerid); - ast_str_append(&str, 0, "CALLER CHAN: %s\n", msg_snapshot->callerchan); - ast_str_append(&str, 0, "CALLER EXTEN: %s\n", msg_snapshot->exten); - ast_str_append(&str, 0, "DATE: %s\n", msg_snapshot->origdate); - ast_str_append(&str, 0, "TIME: %s\n", msg_snapshot->origtime); - ast_str_append(&str, 0, "DURATION: %s\n", msg_snapshot->duration); - ast_str_append(&str, 0, "FOLDER NAME: %s\n", msg_snapshot->folder_name); - ast_str_append(&str, 0, "FLAG: %s\n", msg_snapshot->flag); - ast_str_append(&str, 0, "\n"); - } - } - - mailbox_snapshot = ast_vm_mailbox_snapshot_destroy(mailbox_snapshot); - return str; -} - /*! * \brief common bounds checking and existence check for Voicemail API functions. * * \details - * This is called by ast_vm_msg_move, ast_vm_msg_remove, and ast_vm_msg_forward to + * This is called by vm_msg_move, vm_msg_remove, and vm_msg_forward to * ensure that data passed in are valid. This ensures that given the * desired message IDs, they can be found. * @@ -15077,7 +15076,7 @@ static void notify_new_state(struct ast_vm_user *vmu) queue_mwi_event(ext_context, urgent, new, old); } -int ast_vm_msg_forward(const char *from_mailbox, +static int vm_msg_forward(const char *from_mailbox, const char *from_context, const char *from_folder, const char *to_mailbox, @@ -15222,7 +15221,7 @@ vm_forward_cleanup: return res; } -int ast_vm_msg_move(const char *mailbox, +static int vm_msg_move(const char *mailbox, const char *context, size_t num_msgs, const char *oldfolder, @@ -15329,7 +15328,7 @@ vm_move_cleanup: return res; } -int ast_vm_msg_remove(const char *mailbox, +static int vm_msg_remove(const char *mailbox, const char *context, size_t num_msgs, const char *folder, @@ -15430,15 +15429,7 @@ vm_remove_cleanup: return res; } -const char *ast_vm_index_to_foldername(unsigned int index) -{ - if (index >= AST_VM_FOLDER_NUMBER) { - return ""; - } - return mailbox_folders[index]; -} - -int ast_vm_msg_play(struct ast_channel *chan, +static int vm_msg_play(struct ast_channel *chan, const char *mailbox, const char *context, const char *folder, @@ -15555,7 +15546,7 @@ play2_msg_cleanup: * AST_MODULE_INFO(, , "Comedian Mail (Voicemail System)" */ -AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, tdesc, +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, tdesc, .load = load_module, .unload = unload_module, .reload = reload, diff --git a/include/asterisk/app.h b/include/asterisk/app.h index d438790e3b15b94532841c107fcfabb7d9c6c238..9053fc6ff2b28a3f6171c201c88cdf26c662010c 100644 --- a/include/asterisk/app.h +++ b/include/asterisk/app.h @@ -27,6 +27,7 @@ #include "asterisk/strings.h" #include "asterisk/threadstorage.h" #include "asterisk/file.h" +#include "asterisk/linkedlists.h" struct ast_flags64; @@ -183,6 +184,35 @@ int ast_app_exec_macro(struct ast_channel *autoservice_chan, struct ast_channel int ast_app_run_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const char *macro_name, const char *macro_args); +enum ast_vm_snapshot_sort_val { + AST_VM_SNAPSHOT_SORT_BY_ID = 0, + AST_VM_SNAPSHOT_SORT_BY_TIME, +}; + +struct ast_vm_msg_snapshot { + AST_DECLARE_STRING_FIELDS( + AST_STRING_FIELD(msg_id); + AST_STRING_FIELD(callerid); + AST_STRING_FIELD(callerchan); + AST_STRING_FIELD(exten); + AST_STRING_FIELD(origdate); + AST_STRING_FIELD(origtime); + AST_STRING_FIELD(duration); + AST_STRING_FIELD(folder_name); + AST_STRING_FIELD(flag); + ); + unsigned int msg_number; + + AST_LIST_ENTRY(ast_vm_msg_snapshot) msg; +}; + +struct ast_vm_mailbox_snapshot { + int total_msg_num; + int folders; + /* Things are not quite as they seem here. This points to an allocated array of lists. */ + AST_LIST_HEAD_NOLOCK(, ast_vm_msg_snapshot) *snapshots; +}; + /*! * \since 11 * \brief Run a subroutine on a channel, placing an optional second channel into autoservice. @@ -229,13 +259,23 @@ int ast_app_exec_sub(struct ast_channel *autoservice_chan, struct ast_channel *s int ast_app_run_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_location, const char *sub_args); +/*! + * \brief Voicemail playback callback function definition + * + * \param channel to play the file back on. + * \param location of file on disk + * \param duration of file in seconds. This will be zero if msg is very short or + * has an unknown duration. + */ +typedef void (ast_vm_msg_play_cb)(struct ast_channel *chan, const char *playfile, int duration); + /*! * \brief Set voicemail function callbacks * \param[in] has_voicemail_func set function pointer - * \param[in] inboxcount2_func set function pointer - * \param[in] sayname_func set function pointer * \param[in] inboxcount_func set function pointer + * \param[in] inboxcount2_func set function pointer * \param[in] messagecount_func set function pointer + * \param[in] sayname_func set function pointer * \version 1.6.1 Added inboxcount2_func, sayname_func */ void ast_install_vm_functions(int (*has_voicemail_func)(const char *mailbox, const char *folder), @@ -243,11 +283,52 @@ void ast_install_vm_functions(int (*has_voicemail_func)(const char *mailbox, con int (*inboxcount2_func)(const char *mailbox, int *urgentmsgs, int *newmsgs, int *oldmsgs), int (*messagecount_func)(const char *context, const char *mailbox, const char *folder), int (*sayname_func)(struct ast_channel *chan, const char *mailbox, const char *context), - int (*copy_recording_to_vm_func)(struct ast_vm_recording_data *vm_rec_data)); + int (*copy_recording_to_vm_func)(struct ast_vm_recording_data *vm_rec_data), + const char *vm_index_to_foldername(int id), + struct ast_vm_mailbox_snapshot *(*vm_mailbox_snapshot_create)(const char *mailbox, + const char *context, + const char *folder, + int descending, + enum ast_vm_snapshot_sort_val sort_val, + int combine_INBOX_and_OLD), + struct ast_vm_mailbox_snapshot *(*vm_mailbox_snapshot_destroy)(struct ast_vm_mailbox_snapshot *mailbox_snapshot), + int (*vm_msg_move)(const char *mailbox, + const char *context, + size_t num_msgs, + const char *oldfolder, + const char *old_msg_ids[], + const char *newfolder), + int (*vm_msg_remove)(const char *mailbox, + const char *context, + size_t num_msgs, + const char *folder, + const char *msgs[]), + int (*vm_msg_forward)(const char *from_mailbox, + const char *from_context, + const char *from_folder, + const char *to_mailbox, + const char *to_context, + const char *to_folder, + size_t num_msgs, + const char *msg_ids[], + int delete_old), + int (*vm_msg_play)(struct ast_channel *chan, + const char *mailbox, + const char *context, + const char *folder, + const char *msg_num, + ast_vm_msg_play_cb cb)); void ast_uninstall_vm_functions(void); +#ifdef TEST_FRAMEWORK +void ast_install_vm_test_functions(int (*vm_test_destroy_user)(const char *context, const char *mailbox), + int (*vm_test_create_user)(const char *context, const char *mailbox)); + +void ast_uninstall_vm_test_functions(void); +#endif + /*! * \brief * param[in] vm_rec_data Contains data needed to make the recording. @@ -311,6 +392,131 @@ int ast_app_sayname(struct ast_channel *chan, const char *mailbox, const char *c */ int ast_app_messagecount(const char *context, const char *mailbox, const char *folder); +/*! + * \brief Return name of folder, given an id + * \param[in] id Folder id + * \return Name of folder + */ +const char *ast_vm_index_to_foldername(int id); + +/* + * \brief Create a snapshot of a mailbox which contains information about every msg. + * + * \param mailbox, the mailbox to look for + * \param context, the context to look for the mailbox in + * \param folder, OPTIONAL. When not NULL only msgs from the specified folder will be included. + * \param desending, list the msgs in descending order rather than ascending order. + * \param combine_INBOX_and_OLD, When this argument is set, The OLD folder will be represented + * in the INBOX folder of the snapshot. This allows the snapshot to represent the + * OLD and INBOX messages in sorted order merged together. + * + * \retval snapshot on success + * \retval NULL on failure + */ +struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_create(const char *mailbox, + const char *context, + const char *folder, + int descending, + enum ast_vm_snapshot_sort_val sort_val, + int combine_INBOX_and_OLD); + +/* + * \brief destroy a snapshot + * + * \param mailbox_snapshot The snapshot to destroy. + * \retval NULL + */ +struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_destroy(struct ast_vm_mailbox_snapshot *mailbox_snapshot); + +/*! + * \brief Move messages from one folder to another + * + * \param mailbox The mailbox to which the folders belong + * \param context The voicemail context for the mailbox + * \param num_msgs The number of messages to move + * \param oldfolder The folder from where messages should be moved + * \param old_msg_nums The message IDs of the messages to move + * \param newfolder The folder to which messages should be moved + * new folder. This array must be num_msgs sized. + * + * \retval -1 Failure + * \retval 0 Success + */ +int ast_vm_msg_move(const char *mailbox, + const char *context, + size_t num_msgs, + const char *oldfolder, + const char *old_msg_ids[], + const char *newfolder); + +/*! + * \brief Remove/delete messages from a mailbox folder. + * + * \param mailbox The mailbox from which to delete messages + * \param context The voicemail context for the mailbox + * \param num_msgs The number of messages to delete + * \param folder The folder from which to remove messages + * \param msgs The message IDs of the messages to delete + * + * \retval -1 Failure + * \retval 0 Success + */ +int ast_vm_msg_remove(const char *mailbox, + const char *context, + size_t num_msgs, + const char *folder, + const char *msgs[]); + +/*! + * \brief forward a message from one mailbox to another. + * + * \brief from_mailbox The original mailbox the message is being forwarded from + * \brief from_context The voicemail context of the from_mailbox + * \brief from_folder The folder from which the message is being forwarded + * \brief to_mailbox The mailbox to forward the message to + * \brief to_context The voicemail context of the to_mailbox + * \brief to_folder The folder to which the message is being forwarded + * \brief num_msgs The number of messages being forwarded + * \brief msg_ids The message IDs of the messages in from_mailbox to forward + * \brief delete_old If non-zero, the forwarded messages are also deleted from from_mailbox. + * Otherwise, the messages will remain in the from_mailbox. + * + * \retval -1 Failure + * \retval 0 Success + */ +int ast_vm_msg_forward(const char *from_mailbox, + const char *from_context, + const char *from_folder, + const char *to_mailbox, + const char *to_context, + const char *to_folder, + size_t num_msgs, + const char *msg_ids[], + int delete_old); + +/*! + * \brief Play a voicemail msg back on a channel. + * + * \param mailbox msg is in. + * \param context of mailbox. + * \param voicemail folder to look in. + * \param message number in the voicemailbox to playback to the channel. + * + * \retval 0 success + * \retval -1 failure + */ +int ast_vm_msg_play(struct ast_channel *chan, + const char *mailbox, + const char *context, + const char *folder, + const char *msg_num, + ast_vm_msg_play_cb cb); + +#ifdef TEST_FRAMEWORK +int ast_vm_test_destroy_user(const char *context, const char *mailbox); +int ast_vm_test_create_user(const char *context, const char *mailbox); +#endif + /*! \brief Safely spawn an external program while closing file descriptors \note This replaces the \b system call in all Asterisk modules */ diff --git a/include/asterisk/app_voicemail.h b/include/asterisk/app_voicemail.h deleted file mode 100644 index 8a42bd7bb6c954f2c1032d700c6de8baba7d24f3..0000000000000000000000000000000000000000 --- a/include/asterisk/app_voicemail.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Asterisk -- An open source telephony toolkit. - * - * Copyright (C) 2011, Digium, Inc. - * - * David Vossel <dvossel@digium.com> - * - * See http://www.asterisk.org for more information about - * the Asterisk project. Please do not directly contact - * any of the maintainers of this project for assistance; - * the project provides a web site, mailing lists and IRC - * channels for your use. - * - * This program is free software, distributed under the terms of - * the GNU General Public License Version 2. See the LICENSE file - * at the top of the source tree. - */ - -/*! \file - * \brief Voice Mail API - * \author David Vossel <dvossel@digium.com> - */ - -#ifndef _ASTERISK_VM_H -#define _ASTERISK_VM_H - -#include "asterisk/stringfields.h" -#include "asterisk/linkedlists.h" - -#define AST_VM_FOLDER_NUMBER 12 - -enum ast_vm_snapshot_sort_val { - AST_VM_SNAPSHOT_SORT_BY_ID = 0, - AST_VM_SNAPSHOT_SORT_BY_TIME, -}; - -struct ast_vm_msg_snapshot { - AST_DECLARE_STRING_FIELDS( - AST_STRING_FIELD(msg_id); - AST_STRING_FIELD(callerid); - AST_STRING_FIELD(callerchan); - AST_STRING_FIELD(exten); - AST_STRING_FIELD(origdate); - AST_STRING_FIELD(origtime); - AST_STRING_FIELD(duration); - AST_STRING_FIELD(folder_name); - AST_STRING_FIELD(flag); - ); - unsigned int msg_number; - - AST_LIST_ENTRY(ast_vm_msg_snapshot) msg; -}; - -struct ast_vm_mailbox_snapshot { - int total_msg_num; - AST_LIST_HEAD_NOLOCK(, ast_vm_msg_snapshot) snapshots[AST_VM_FOLDER_NUMBER]; -}; - -/* - * \brief Create a snapshot of a mailbox which contains information about every msg. - * - * \param mailbox, the mailbox to look for - * \param context, the context to look for the mailbox in - * \param folder, OPTIONAL. When not NULL only msgs from the specified folder will be included. - * \param desending, list the msgs in descending order rather than ascending order. - * \param combine_INBOX_and_OLD, When this argument is set, The OLD folder will be represented - * in the INBOX folder of the snapshot. This allows the snapshot to represent the - * OLD and INBOX messages in sorted order merged together. - * - * \retval snapshot on success - * \retval NULL on failure - */ -struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_create(const char *mailbox, - const char *context, - const char *folder, - int descending, - enum ast_vm_snapshot_sort_val sort_val, - int combine_INBOX_and_OLD); - -/* - * \brief destroy a snapshot - * - * \param mailbox_snapshot The snapshot to destroy. - * \retval NULL - */ -struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_destroy(struct ast_vm_mailbox_snapshot *mailbox_snapshot); - -/*! - * \brief Move messages from one folder to another - * - * \param mailbox The mailbox to which the folders belong - * \param context The voicemail context for the mailbox - * \param num_msgs The number of messages to move - * \param oldfolder The folder from where messages should be moved - * \param old_msg_nums The message IDs of the messages to move - * \param newfolder The folder to which messages should be moved - * \param new_msg_ids[out] An array of message IDs for the messages as they are in the - * new folder. This array must be num_msgs sized. - * - * \retval -1 Failure - * \retval 0 Success - */ -int ast_vm_msg_move(const char *mailbox, - const char *context, - size_t num_msgs, - const char *oldfolder, - const char *old_msg_ids [], - const char *newfolder); - -/*! - * \brief Remove/delete messages from a mailbox folder. - * - * \param mailbox The mailbox from which to delete messages - * \param context The voicemail context for the mailbox - * \param num_msgs The number of messages to delete - * \param folder The folder from which to remove messages - * \param msgs The message IDs of the messages to delete - * - * \retval -1 Failure - * \retval 0 Success - */ -int ast_vm_msg_remove(const char *mailbox, - const char *context, - size_t num_msgs, - const char *folder, - const char *msgs []); - -/*! - * \brief forward a message from one mailbox to another. - * - * \brief from_mailbox The original mailbox the message is being forwarded from - * \brief from_context The voicemail context of the from_mailbox - * \brief from_folder The folder from which the message is being forwarded - * \brief to_mailbox The mailbox to forward the message to - * \brief to_context The voicemail context of the to_mailbox - * \brief to_folder The voicemail folder to forward the message to - * \brief num_msgs The number of messages being forwarded - * \brief msg_ids The message IDs of the messages in from_mailbox to forward - * \brief delete_old If non-zero, the forwarded messages are also deleted from from_mailbox. - * Otherwise, the messages will remain in the from_mailbox. - * - * \retval -1 Failure - * \retval 0 Success - */ -int ast_vm_msg_forward(const char *from_mailbox, - const char *from_context, - const char *from_folder, - const char *to_mailbox, - const char *to_context, - const char *to_folder, - size_t num_msgs, - const char *msg_ids [], - int delete_old); - -/*! - * \brief Voicemail playback callback function definition - * - * \param channel to play the file back on. - * \param location of file on disk - * \param duration of file in seconds. This will be zero if msg is very short or - * has an unknown duration. - */ -typedef void (ast_vm_msg_play_cb)(struct ast_channel *chan, const char *playfile, int duration); - -/*! - * \brief Play a voicemail msg back on a channel. - * - * \param mailbox msg is in. - * \param context of mailbox. - * \param voicemail folder to look in. - * \param message number in the voicemailbox to playback to the channel. - * - * \retval 0 success - * \retval -1 failure - */ -int ast_vm_msg_play(struct ast_channel *chan, - const char *mailbox, - const char *context, - const char *folder, - const char *msg_id, - ast_vm_msg_play_cb cb); - -/*! - * \brief Get the name of a folder given its numeric index - * - * \param index The integer value of the mailbox. - * \retval "" Invalid index provided - * \retval other The name of the mailbox - */ -const char *ast_vm_index_to_foldername(unsigned int index); - -#ifdef TEST_FRAMEWORK -/*! - * \brief Add a user to the voicemail system for test purposes - * \param context The context of the mailbox - * \param mailbox The mailbox for the user - * \retval 0 success - * \retval other failure - */ -int ast_vm_test_create_user(const char *context, const char *mailbox); - -/*! - * \brief Dispose of a user. This should be used to destroy a user that was - * previously created using ast_vm_test_create_user - * \param context The context of the mailbox - * \param mailbox The mailbox for the user to destroy - */ -int ast_vm_test_destroy_user(const char *context, const char *mailbox); - -#endif - -#endif diff --git a/main/app.c b/main/app.c index 31484a18d4a05c055d2b2a4457fd6362bfbca4cb..8cc22c6c70fb43c7e9919580ab767c9eb2408baa 100644 --- a/main/app.c +++ b/main/app.c @@ -424,13 +424,81 @@ static int (*ast_inboxcount2_func)(const char *mailbox, int *urgentmsgs, int *ne static int (*ast_sayname_func)(struct ast_channel *chan, const char *mailbox, const char *context) = NULL; static int (*ast_messagecount_func)(const char *context, const char *mailbox, const char *folder) = NULL; static int (*ast_copy_recording_to_vm_func)(struct ast_vm_recording_data *vm_rec_data) = NULL; +static const char *(*ast_vm_index_to_foldername_func)(int id) = NULL; +static struct ast_vm_mailbox_snapshot *(*ast_vm_mailbox_snapshot_create_func)(const char *mailbox, + const char *context, + const char *folder, + int descending, + enum ast_vm_snapshot_sort_val sort_val, + int combine_INBOX_and_OLD) = NULL; +static struct ast_vm_mailbox_snapshot *(*ast_vm_mailbox_snapshot_destroy_func)(struct ast_vm_mailbox_snapshot *mailbox_snapshot) = NULL; +static int (*ast_vm_msg_move_func)(const char *mailbox, + const char *context, + size_t num_msgs, + const char *oldfolder, + const char *old_msg_ids[], + const char *newfolder) = NULL; +static int (*ast_vm_msg_remove_func)(const char *mailbox, + const char *context, + size_t num_msgs, + const char *folder, + const char *msgs[]) = NULL; +static int (*ast_vm_msg_forward_func)(const char *from_mailbox, + const char *from_context, + const char *from_folder, + const char *to_mailbox, + const char *to_context, + const char *to_folder, + size_t num_msgs, + const char *msg_ids[], + int delete_old) = NULL; +static int (*ast_vm_msg_play_func)(struct ast_channel *chan, + const char *mailbox, + const char *context, + const char *folder, + const char *msg_num, + ast_vm_msg_play_cb cb) = NULL; void ast_install_vm_functions(int (*has_voicemail_func)(const char *mailbox, const char *folder), int (*inboxcount_func)(const char *mailbox, int *newmsgs, int *oldmsgs), int (*inboxcount2_func)(const char *mailbox, int *urgentmsgs, int *newmsgs, int *oldmsgs), int (*messagecount_func)(const char *context, const char *mailbox, const char *folder), int (*sayname_func)(struct ast_channel *chan, const char *mailbox, const char *context), - int (*copy_recording_to_vm_func)(struct ast_vm_recording_data *vm_rec_data)) + int (*copy_recording_to_vm_func)(struct ast_vm_recording_data *vm_rec_data), + const char *vm_index_to_foldername_func(int id), + struct ast_vm_mailbox_snapshot *(*vm_mailbox_snapshot_create_func)(const char *mailbox, + const char *context, + const char *folder, + int descending, + enum ast_vm_snapshot_sort_val sort_val, + int combine_INBOX_and_OLD), + struct ast_vm_mailbox_snapshot *(*vm_mailbox_snapshot_destroy_func)(struct ast_vm_mailbox_snapshot *mailbox_snapshot), + int (*vm_msg_move_func)(const char *mailbox, + const char *context, + size_t num_msgs, + const char *oldfolder, + const char *old_msg_ids[], + const char *newfolder), + int (*vm_msg_remove_func)(const char *mailbox, + const char *context, + size_t num_msgs, + const char *folder, + const char *msgs[]), + int (*vm_msg_forward_func)(const char *from_mailbox, + const char *from_context, + const char *from_folder, + const char *to_mailbox, + const char *to_context, + const char *to_folder, + size_t num_msgs, + const char *msg_ids[], + int delete_old), + int (*vm_msg_play_func)(struct ast_channel *chan, + const char *mailbox, + const char *context, + const char *folder, + const char *msg_num, + ast_vm_msg_play_cb cb)) { ast_has_voicemail_func = has_voicemail_func; ast_inboxcount_func = inboxcount_func; @@ -438,6 +506,13 @@ void ast_install_vm_functions(int (*has_voicemail_func)(const char *mailbox, con ast_messagecount_func = messagecount_func; ast_sayname_func = sayname_func; ast_copy_recording_to_vm_func = copy_recording_to_vm_func; + ast_vm_index_to_foldername_func = vm_index_to_foldername_func; + ast_vm_mailbox_snapshot_create_func = vm_mailbox_snapshot_create_func; + ast_vm_mailbox_snapshot_destroy_func = vm_mailbox_snapshot_destroy_func; + ast_vm_msg_move_func = vm_msg_move_func; + ast_vm_msg_remove_func = vm_msg_remove_func; + ast_vm_msg_forward_func = vm_msg_forward_func; + ast_vm_msg_play_func = vm_msg_play_func; } void ast_uninstall_vm_functions(void) @@ -448,8 +523,33 @@ void ast_uninstall_vm_functions(void) ast_messagecount_func = NULL; ast_sayname_func = NULL; ast_copy_recording_to_vm_func = NULL; + ast_vm_index_to_foldername_func = NULL; + ast_vm_mailbox_snapshot_create_func = NULL; + ast_vm_mailbox_snapshot_destroy_func = NULL; + ast_vm_msg_move_func = NULL; + ast_vm_msg_remove_func = NULL; + ast_vm_msg_forward_func = NULL; + ast_vm_msg_play_func = NULL; } +#ifdef TEST_FRAMEWORK +int (*ast_vm_test_create_user_func)(const char *context, const char *mailbox) = NULL; +int (*ast_vm_test_destroy_user_func)(const char *context, const char *mailbox) = NULL; + +void ast_install_vm_test_functions(int (*vm_test_create_user_func)(const char *context, const char *mailbox), + int (*vm_test_destroy_user_func)(const char *context, const char *mailbox)) +{ + ast_vm_test_create_user_func = vm_test_create_user_func; + ast_vm_test_destroy_user_func = vm_test_destroy_user_func; +} + +void ast_uninstall_vm_test_functions(void) +{ + ast_vm_test_create_user_func = NULL; + ast_vm_test_destroy_user_func = NULL; +} +#endif + int ast_app_has_voicemail(const char *mailbox, const char *folder) { static int warned = 0; @@ -552,6 +652,107 @@ int ast_app_messagecount(const char *context, const char *mailbox, const char *f return 0; } +const char *ast_vm_index_to_foldername(int id) +{ + if (ast_vm_index_to_foldername_func) { + return ast_vm_index_to_foldername_func(id); + } + return NULL; +} + +struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_create(const char *mailbox, + const char *context, + const char *folder, + int descending, + enum ast_vm_snapshot_sort_val sort_val, + int combine_INBOX_and_OLD) +{ + if (ast_vm_mailbox_snapshot_create_func) { + return ast_vm_mailbox_snapshot_create_func(mailbox, context, folder, descending, sort_val, combine_INBOX_and_OLD); + } + return NULL; +} + +struct ast_vm_mailbox_snapshot *ast_vm_mailbox_snapshot_destroy(struct ast_vm_mailbox_snapshot *mailbox_snapshot) +{ + if (ast_vm_mailbox_snapshot_destroy_func) { + return ast_vm_mailbox_snapshot_destroy_func(mailbox_snapshot); + } + return NULL; +} + +int ast_vm_msg_move(const char *mailbox, + const char *context, + size_t num_msgs, + const char *oldfolder, + const char *old_msg_ids[], + const char *newfolder) +{ + if (ast_vm_msg_move_func) { + return ast_vm_msg_move_func(mailbox, context, num_msgs, oldfolder, old_msg_ids, newfolder); + } + return 0; +} + +int ast_vm_msg_remove(const char *mailbox, + const char *context, + size_t num_msgs, + const char *folder, + const char *msgs[]) +{ + if (ast_vm_msg_remove_func) { + return ast_vm_msg_remove_func(mailbox, context, num_msgs, folder, msgs); + } + return 0; +} + +int ast_vm_msg_forward(const char *from_mailbox, + const char *from_context, + const char *from_folder, + const char *to_mailbox, + const char *to_context, + const char *to_folder, + size_t num_msgs, + const char *msg_ids[], + int delete_old) +{ + if (ast_vm_msg_forward_func) { + return ast_vm_msg_forward_func(from_mailbox, from_context, from_folder, to_mailbox, to_context, to_folder, num_msgs, msg_ids, delete_old); + } + return 0; +} + +int ast_vm_msg_play(struct ast_channel *chan, + const char *mailbox, + const char *context, + const char *folder, + const char *msg_num, + ast_vm_msg_play_cb cb) +{ + if (ast_vm_msg_play_func) { + return ast_vm_msg_play_func(chan, mailbox, context, folder, msg_num, cb); + } + return 0; +} + +#ifdef TEST_FRAMEWORK +int ast_vm_test_create_user(const char *context, const char *mailbox) +{ + if (ast_vm_test_create_user_func) { + return ast_vm_test_create_user_func(context, mailbox); + } + return 0; +} + +int ast_vm_test_destroy_user(const char *context, const char *mailbox) +{ + if (ast_vm_test_destroy_user_func) { + return ast_vm_test_destroy_user_func(context, mailbox); + } + return 0; +} +#endif + int ast_dtmf_stream(struct ast_channel *chan, struct ast_channel *peer, const char *digits, int between, unsigned int duration) { const char *ptr; diff --git a/tests/test_voicemail_api.c b/tests/test_voicemail_api.c index cc83625bf67f5261013e243a79f8a262613e7d5f..f80c5b9c95d0ce0e439dd5d63af28e2562a359a1 100644 --- a/tests/test_voicemail_api.c +++ b/tests/test_voicemail_api.c @@ -43,7 +43,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/paths.h" #include "asterisk/channel.h" #include "asterisk/app.h" -#include "asterisk/app_voicemail.h" /*! \internal \brief Permissions to set on the voicemail directories we create * - taken from app_voicemail */