[asterisk-commits] qwell: branch certified-1.8.11 r365395 - /certified/branches/1.8.11/apps/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri May 4 16:17:13 CDT 2012
Author: qwell
Date: Fri May 4 16:17:08 2012
New Revision: 365395
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=365395
Log:
Add support for folders in MixMonitor 'm' option. Backport manager actions.
The manager actions are needed, so MixMonitor can be executed on existing
channels.
(issue DPMA-68)
Modified:
certified/branches/1.8.11/apps/app_mixmonitor.c
certified/branches/1.8.11/apps/app_voicemail.c
Modified: certified/branches/1.8.11/apps/app_mixmonitor.c
URL: http://svnview.digium.com/svn/asterisk/certified/branches/1.8.11/apps/app_mixmonitor.c?view=diff&rev=365395&r1=365394&r2=365395
==============================================================================
--- certified/branches/1.8.11/apps/app_mixmonitor.c (original)
+++ certified/branches/1.8.11/apps/app_mixmonitor.c Fri May 4 16:17:08 2012
@@ -98,7 +98,8 @@
<option name="m">
<argument name="mailbox" required="true" />
<para>Create a copy of the recording as a voicemail in each indicated <emphasis>mailbox</emphasis>
- separated by commas eg. m(1111 at default,2222 at default,...)</para>
+ separated by commas eg. m(1111 at default,2222 at default,...). Folders can be optionally specified using
+ the syntax: mailbox at context/folder</para>
<note><para>The recording will be deleted once all the copies are made.</para></note>
</option>
</optionlist>
@@ -159,6 +160,54 @@
<para>This action may be used to mute a MixMonitor recording.</para>
</description>
</manager>
+ <manager name="MixMonitor" language="en_US">
+ <synopsis>
+ Record a call and mix the audio during the recording. Use of StopMixMonitor is required
+ to guarantee the audio file is available for processing during dialplan execution.
+ </synopsis>
+ <syntax>
+ <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
+ <parameter name="Channel" required="true">
+ <para>Used to specify the channel to record.</para>
+ </parameter>
+ <parameter name="File">
+ <para>Is the name of the file created in the monitor spool directory.
+ Defaults to the same name as the channel (with slashes replaced with dashes).
+ This argument is optional if you specify to record unidirectional audio with
+ either the r(filename) or t(filename) options in the options field. If
+ neither MIXMONITOR_FILENAME or this parameter is set, the mixed stream won't
+ be recorded.</para>
+ </parameter>
+ <parameter name="options">
+ <para>Options that apply to the MixMonitor in the same way as they
+ would apply if invoked from the MixMonitor application. For a list of
+ available options, see the documentation for the mixmonitor application. </para>
+ </parameter>
+ </syntax>
+ <description>
+ <para>This action records the audio on the current channel to the specified file.</para>
+ <variablelist>
+ <variable name="MIXMONITOR_FILENAME">
+ <para>Will contain the filename used to record the mixed stream.</para>
+ </variable>
+ </variablelist>
+ </description>
+ </manager>
+ <manager name="StopMixMonitor" language="en_US">
+ <synopsis>
+ Stop recording a call through MixMonitor, and free the recording's file handle.
+ </synopsis>
+ <syntax>
+ <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
+ <parameter name="Channel" required="true">
+ <para>The name of the channel monitored.</para>
+ </parameter>
+ </syntax>
+ <description>
+ <para>This action stops the audio recording that was started with the <literal>MixMonitor</literal>
+ action on the current channel.</para>
+ </description>
+ </manager>
***/
@@ -177,6 +226,7 @@
struct vm_recipient {
char mailbox[AST_MAX_CONTEXT];
char context[AST_MAX_EXTENSION];
+ char folder[80];
AST_LIST_ENTRY(vm_recipient) list;
};
@@ -310,9 +360,10 @@
*/
static void add_vm_recipients_from_string(struct mixmonitor *mixmonitor, const char *vm_recipients)
{
- /* recipients are in a single string with a format format resembling "mailbox at context,mailbox2 at context2, mailbox3 at context3" */
+ /* recipients are in a single string with a format format resembling "mailbox at context/INBOX,mailbox2 at context2,mailbox3 at context3/Work" */
char *cur_mailbox = ast_strdupa(vm_recipients);
char *cur_context;
+ char *cur_folder;
char *next;
int elements_processed = 0;
@@ -322,6 +373,12 @@
*(next++) = '\0';
}
+ if ((cur_folder = strchr(cur_mailbox, '/'))) {
+ *(cur_folder++) = '\0';
+ } else {
+ cur_folder = "INBOX";
+ }
+
if ((cur_context = strchr(cur_mailbox, '@'))) {
*(cur_context++) = '\0';
} else {
@@ -329,7 +386,6 @@
}
if (!ast_strlen_zero(cur_mailbox) && !ast_strlen_zero(cur_context)) {
-
struct vm_recipient *recipient;
if (!(recipient = ast_malloc(sizeof(*recipient)))) {
ast_log(LOG_ERROR, "Failed to allocate recipient. Aborting function.\n");
@@ -337,11 +393,11 @@
}
ast_copy_string(recipient->context, cur_context, sizeof(recipient->context));
ast_copy_string(recipient->mailbox, cur_mailbox, sizeof(recipient->mailbox));
+ ast_copy_string(recipient->folder, cur_folder, sizeof(recipient->folder));
/* Add to list */
ast_verb(5, "Adding %s@%s to recipient list\n", recipient->mailbox, recipient->context);
AST_LIST_INSERT_HEAD(&mixmonitor->recipient_list, recipient, list);
-
} else {
ast_log(LOG_ERROR, "Failed to properly parse extension and/or context from element %d of recipient string: %s\n", elements_processed, vm_recipients);
}
@@ -410,9 +466,11 @@
recording_data.call_priority = mixmonitor->call_priority;
AST_LIST_TRAVERSE(&mixmonitor->recipient_list, recipient, list) {
- /* context and mailbox need to be set per recipient */
+ /* context, mailbox, and folder need to be set per recipient */
ast_string_field_set(&recording_data, context, recipient->context);
ast_string_field_set(&recording_data, mailbox, recipient->mailbox);
+ ast_string_field_set(&recording_data, folder, recipient->folder);
+
ast_verb(4, "MixMonitor attempting to send voicemail copy to %s@%s\n", recording_data.mailbox,
recording_data.context);
ast_app_copy_recording_to_vm(&recording_data);
@@ -904,6 +962,95 @@
return AMI_SUCCESS;
}
+static int manager_mixmonitor(struct mansession *s, const struct message *m)
+{
+ struct ast_channel *c = NULL;
+
+ const char *name = astman_get_header(m, "Channel");
+ const char *id = astman_get_header(m, "ActionID");
+ const char *file = astman_get_header(m, "File");
+ const char *options = astman_get_header(m, "Options");
+
+ int res;
+ char args[PATH_MAX] = "";
+ if (ast_strlen_zero(name)) {
+ astman_send_error(s, m, "No channel specified");
+ return AMI_SUCCESS;
+ }
+
+ c = ast_channel_get_by_name(name);
+
+ if (!c) {
+ astman_send_error(s, m, "No such channel");
+ return AMI_SUCCESS;
+ }
+
+ strcpy(args, file);
+ strcat(args, ",");
+ strcat(args, options);
+
+ ast_channel_lock(c);
+ res = mixmonitor_exec(c, args);
+ ast_channel_unlock(c);
+
+ if (res) {
+ astman_send_error(s, m, "Could not start monitoring channel");
+ return AMI_SUCCESS;
+ }
+
+ astman_append(s, "Response: Success\r\n");
+
+ if (!ast_strlen_zero(id)) {
+ astman_append(s, "ActionID: %s\r\n", id);
+ }
+
+ astman_append(s, "\r\n");
+
+ c = ast_channel_unref(c);
+
+ return AMI_SUCCESS;
+}
+
+static int manager_stop_mixmonitor(struct mansession *s, const struct message *m)
+{
+ struct ast_channel *c = NULL;
+
+ const char *name = astman_get_header(m, "Channel");
+ const char *id = astman_get_header(m, "ActionID");
+
+ int res;
+ if (ast_strlen_zero(name)) {
+ astman_send_error(s, m, "No channel specified");
+ return AMI_SUCCESS;
+ }
+
+ c = ast_channel_get_by_name(name);
+
+ if (!c) {
+ astman_send_error(s, m, "No such channel");
+ return AMI_SUCCESS;
+ }
+
+ res = stop_mixmonitor_exec(c, NULL);
+
+ if (res) {
+ astman_send_error(s, m, "Could not stop monitoring channel");
+ return AMI_SUCCESS;
+ }
+
+ astman_append(s, "Response: Success\r\n");
+
+ if (!ast_strlen_zero(id)) {
+ astman_append(s, "ActionID: %s\r\n", id);
+ }
+
+ astman_append(s, "\r\n");
+
+ c = ast_channel_unref(c);
+
+ return AMI_SUCCESS;
+}
+
static struct ast_cli_entry cli_mixmonitor[] = {
AST_CLI_DEFINE(handle_cli_mixmonitor, "Execute a MixMonitor command")
};
@@ -916,6 +1063,8 @@
res = ast_unregister_application(stop_app);
res |= ast_unregister_application(app);
res |= ast_manager_unregister("MixMonitorMute");
+ res |= ast_manager_unregister("MixMonitor");
+ res |= ast_manager_unregister("StopMixMonitor");
return res;
}
@@ -928,6 +1077,8 @@
res = ast_register_application_xml(app, mixmonitor_exec);
res |= ast_register_application_xml(stop_app, stop_mixmonitor_exec);
res |= ast_manager_register_xml("MixMonitorMute", 0, manager_mute_mixmonitor);
+ res |= ast_manager_register_xml("MixMonitor", 0, manager_mixmonitor);
+ res |= ast_manager_register_xml("StopMixMonitor", 0, manager_stop_mixmonitor);
return res;
}
Modified: certified/branches/1.8.11/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/certified/branches/1.8.11/apps/app_voicemail.c?view=diff&rev=365395&r1=365394&r2=365395
==============================================================================
--- certified/branches/1.8.11/apps/app_voicemail.c (original)
+++ certified/branches/1.8.11/apps/app_voicemail.c Fri May 4 16:17:08 2012
@@ -5757,7 +5757,7 @@
/* At this point, the actual creation of a voicemail message should be finished.
* Now we just need to copy the files being recorded into the receiving folder. */
- create_dirpath(dir, sizeof(dir), recipient->context, recipient->mailbox, "INBOX");
+ create_dirpath(dir, sizeof(dir), recipient->context, recipient->mailbox, recdata->folder);
#ifdef IMAP_STORAGE
/* make recipient info into an inboxcount friendly string */
More information about the asterisk-commits
mailing list