Remove global symbol requirement from app_voicemail.

This uses the existing "function installation" stuff that already existed for
other functions, like getting message counts.

(closes issue AST-807)
(issue AST-901)
(issue AST-908)

Review: https://reviewboard.asterisk.org/r/1965/
........

Merged revisions 368962 from http://svn.asterisk.org/svn/asterisk/certified/branches/1.8.11


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10-digiumphones@368963 65c4cc65-6c06-0410-ace0-fbb531ad65f3
10-digiumphones
Jason Parker 14 years ago
parent e58c3f3441
commit 6b9dfb9061

@ -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"
@ -969,9 +968,20 @@ 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 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, int *msg_ids, int delete_old);
static int vm_msg_move(const char *mailbox, const char *context, size_t num_msgs, const char *oldfolder, int *old_msg_nums, const char *newfolder, int *new_msg_nums);
static int vm_msg_remove(const char *mailbox, const char *context, size_t num_msgs, const char *folder, int *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);
int vm_test_destroy_user(const char *context, const char *mailbox);
int vm_test_create_user(const char *context, const char *mailbox);
struct ao2_container *inprocess_container;
struct inprocess {
@ -1757,6 +1767,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;
@ -10281,7 +10297,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;
@ -13568,6 +13584,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)
@ -13624,7 +13643,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);
@ -14159,7 +14186,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)
int vm_test_destroy_user(const char *context, const char *mailbox)
{
struct ast_vm_user *vmu;
@ -14177,7 +14204,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)
int vm_test_create_user(const char *context, const char *mailbox)
{
struct ast_vm_user *vmu;
@ -14304,7 +14331,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,
@ -14330,7 +14357,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;
@ -14350,7 +14377,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;
@ -14405,62 +14439,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 tests the following:
*
* 1. No negative indexes are given.
@ -14512,7 +14510,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,
int vm_msg_forward(const char *from_mailbox,
const char *from_context,
const char *from_folder,
const char *to_mailbox,
@ -14649,7 +14647,7 @@ vm_forward_cleanup:
return res;
}
int ast_vm_msg_move(const char *mailbox,
int vm_msg_move(const char *mailbox,
const char *context,
size_t num_msgs,
const char *oldfolder,
@ -14744,7 +14742,7 @@ vm_move_cleanup:
return res;
}
int ast_vm_msg_remove(const char *mailbox,
int vm_msg_remove(const char *mailbox,
const char *context,
size_t num_msgs,
const char *folder,
@ -14838,15 +14836,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,
int vm_msg_play(struct ast_channel *chan,
const char *mailbox,
const char *context,
const char *folder,
@ -14964,7 +14954,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,

@ -27,6 +27,7 @@
#include "asterisk/strings.h"
#include "asterisk/threadstorage.h"
#include "asterisk/file.h"
#include "asterisk/linkedlists.h"
struct ast_flags64;
@ -157,13 +158,52 @@ int ast_app_getdata_full(struct ast_channel *c, const char *prompt, char *s, int
int ast_app_run_macro(struct ast_channel *autoservice_chan, struct ast_channel
*macro_chan, const char * const macro_name, const char * const 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;
};
/*!
* \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),
@ -171,10 +211,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,
int *old_msg_ids,
const char *newfolder,
int *new_msg_ids),
int (*vm_msg_remove)(const char *mailbox,
const char *context,
size_t num_msgs,
const char *folder,
int *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,
int *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.
@ -238,6 +320,133 @@ 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
* \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,
int *old_msg_ids,
const char *newfolder,
int *new_msg_ids);
/*!
* \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,
int *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,
int *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
*/

@ -1,213 +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,
int *old_msg_ids,
const char *newfolder,
int *new_msg_ids);
/*!
* \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,
int *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,
int *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_num,
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

@ -275,13 +275,83 @@ 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,
int *old_msg_ids,
const char *newfolder,
int *new_msg_ids) = NULL;
static int (*ast_vm_msg_remove_func)(const char *mailbox,
const char *context,
size_t num_msgs,
const char *folder,
int *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,
int *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,
int *old_msg_ids,
const char *newfolder,
int *new_msg_ids),
int (*vm_msg_remove_func)(const char *mailbox,
const char *context,
size_t num_msgs,
const char *folder,
int *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,
int *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;
@ -289,6 +359,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)
@ -299,8 +376,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;
@ -403,6 +505,108 @@ 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,
int *old_msg_ids,
const char *newfolder,
int *new_msg_ids)
{
if (ast_vm_msg_move_func) {
return ast_vm_msg_move_func(mailbox, context, num_msgs, oldfolder, old_msg_ids, newfolder, new_msg_ids);
}
return 0;
}
int ast_vm_msg_remove(const char *mailbox,
const char *context,
size_t num_msgs,
const char *folder,
int *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,
int *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;

@ -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 */

Loading…
Cancel
Save