Multiple revisions 368963,368965
authorJason Parker <jparker@digium.com>
Thu, 14 Jun 2012 19:40:11 +0000 (19:40 +0000)
committerJason Parker <jparker@digium.com>
Thu, 14 Jun 2012 19:40:11 +0000 (19:40 +0000)
........
  r368963 | qwell | 2012-06-14 13:47:03 -0500 (Thu, 14 Jun 2012) | 14 lines

  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
........
  r368965 | qwell | 2012-06-14 14:04:57 -0500 (Thu, 14 Jun 2012) | 11 lines

  These functions that were moved need to be static.

  Also wrap test functions in a #ifdef.

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

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

Merged revisions 368963,368965 from http://svn.asterisk.org/svn/asterisk/branches/10-digiumphones

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@368966 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_voicemail.c
include/asterisk/app.h
include/asterisk/app_voicemail.h [deleted file]
main/app.c
tests/test_voicemail_api.c

index 8ee8367..55072cf 100644 (file)
@@ -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,
index d438790..9053fc6 100644 (file)
@@ -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.
@@ -230,12 +260,22 @@ 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 (file)
index 8a42bd7..0000000
+++ /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
index 31484a1..8cc22c6 100644 (file)
@@ -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;
index cc83625..f80c5b9 100644 (file)
@@ -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 */