Updates for the MessageSend Dialplan App

Enhancements:

 * The MessageSend dialplan application now takes an optional
   third argument that can set the message's "To" field on
   outgoing messages.  It's an alternative to using the
   MESSAGE(to) dialplan function.

   NOTE: No channel driver currently implements this field.  A
   follow-on commit for res_pjsip_messaging will implement it for
   the chan_pjsip channel driver.

 * To prevent confusion with the first argument, currently named
   "to", it's been renamed to "destination". Its function,
   creating the request URI, hasn't changed.

 * The documentation for MessageSend was updated to be
   more clear about the parameters and how they interact
   the MESSAGE() dialplan function.

 * With the rename of MessageSend's first parameter, and the fact
   that message.c references <info> elements in chan_sip.c,
   res_pjsip_messaging.c and res_xmpp, they each needed
   documentation updates to use MessageDestinationInfo instead of
   MessageToInfo.

 * appdocsxml.dtd was updated to include a missing element
   declaration for "dataType".  This was showing up as an error
   in Eclipse's dtd editor.

 * Despite the changes in this commit, there should be
   no impact to current users of MessageSend.

Change-Id: I6fb5b569657a02866a66ea352fd53d30d8ac965a
This commit is contained in:
George Joseph 2021-04-22 12:07:22 -06:00 committed by Friendly Automation
parent 78f518622d
commit 40bdfff73b
6 changed files with 81 additions and 17 deletions

View File

@ -618,13 +618,16 @@
for all of the sip peers will be retrieved.</para> for all of the sip peers will be retrieved.</para>
</description> </description>
</manager> </manager>
<info name="MessageDestinationInfo" language="en_US" tech="SIP">
<para>Specifying a prefix of <literal>sip:</literal> will send the
message as a SIP MESSAGE request.</para>
</info>
<info name="MessageFromInfo" language="en_US" tech="SIP"> <info name="MessageFromInfo" language="en_US" tech="SIP">
<para>The <literal>from</literal> parameter can be a configured peer name <para>The <literal>from</literal> parameter can be a configured peer name
or in the form of "display-name" &lt;URI&gt;.</para> or in the form of "display-name" &lt;URI&gt;.</para>
</info> </info>
<info name="MessageToInfo" language="en_US" tech="SIP"> <info name="MessageToInfo" language="en_US" tech="SIP">
<para>Specifying a prefix of <literal>sip:</literal> will send the <para>Ignored</para>
message as a SIP MESSAGE request.</para>
</info> </info>
<managerEvent language="en_US" name="SIPQualifyPeerDone"> <managerEvent language="en_US" name="SIPQualifyPeerDone">
<managerEventInstance class="EVENT_FLAG_CALL"> <managerEventInstance class="EVENT_FLAG_CALL">

View File

@ -0,0 +1,16 @@
Subject: MessageSend
The MessageSend dialplan application now takes an
optional third argument that can set the message's
"To" field on outgoing messages. It's an alternative
to using the MESSAGE(to) dialplan function.
To prevent confusion with the first argument, currently
named "to", it's been renamed to "destination".
Its function, creating the request URI, hasn't changed.
The online documentation has also been enhanced to
explain the behavior.
Despite the changes in this commit, there should be
no impact to current users of MessageSend.

View File

@ -83,6 +83,8 @@
<!ELEMENT matchInfo (category|field?)> <!ELEMENT matchInfo (category|field?)>
<!ELEMENT dataType (#PCDATA)>
<!ELEMENT category (#PCDATA)> <!ELEMENT category (#PCDATA)>
<!ATTLIST category match (yes|no|true|false) #REQUIRED> <!ATTLIST category match (yes|no|true|false) #REQUIRED>

View File

@ -52,13 +52,25 @@
<para>Field of the message to get or set.</para> <para>Field of the message to get or set.</para>
<enumlist> <enumlist>
<enum name="to"> <enum name="to">
<para>Read-only. The destination of the message. When processing an <para>When processing an
incoming message, this will be set to the destination listed as incoming message, this will be set to the destination listed as
the recipient of the message that was received by Asterisk.</para> the recipient of the message that was received by Asterisk.</para>
<para>
</para>
<para>For an outgoing message, this will set the To header in the
outgoing SIP message. This may be overridden by the "to" parameter
of MessageSend.
</para>
</enum> </enum>
<enum name="from"> <enum name="from">
<para>Read-only. The source of the message. When processing an <para>When processing an
incoming message, this will be set to the source of the message.</para> incoming message, this will be set to the source of the message.</para>
<para>
</para>
<para>For an outgoing message, this will set the From header in the
outgoing SIP message. This may be overridden by the "from" parameter
of MessageSend.
</para>
</enum> </enum>
<enum name="custom_data"> <enum name="custom_data">
<para>Write-only. Mark or unmark all message headers for an outgoing <para>Write-only. Mark or unmark all message headers for an outgoing
@ -119,23 +131,39 @@
Send a text message. Send a text message.
</synopsis> </synopsis>
<syntax> <syntax>
<parameter name="to" required="true"> <parameter name="destination" required="true">
<para>A To URI for the message.</para> <para>A To URI for the message.</para>
<xi:include xpointer="xpointer(/docs/info[@name='MessageToInfo'])" /> <xi:include xpointer="xpointer(/docs/info[@name='MessageDestinationInfo'])" />
</parameter> </parameter>
<parameter name="from" required="false"> <parameter name="from" required="false">
<para>A From URI for the message if needed for the <para>A From URI for the message if needed for the
message technology being used to send this message. This can be a message technology being used to send this message. This can be a
SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>, SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>,
a string in the format <literal>alice@atlanta.com</literal>, or simply or a string in the format <literal>alice@atlanta.com</literal>.
a username such as <literal>alice</literal>.</para> This will override a <literal>from</literal>
specified using the MESSAGE dialplan function or the <literal>from</literal>
that may have been on an incoming message.
</para>
<xi:include xpointer="xpointer(/docs/info[@name='MessageFromInfo'])" />
</parameter>
<parameter name="to" required="false">
<para>A To URI for the message if needed for the
message technology being used to send this message. This can be a
SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>,
or a string in the format <literal>alice@atlanta.com</literal>.
This will override a <literal>to</literal>
specified using the MESSAGE dialplan function or the <literal>to</literal>
that may have been on an incoming message.
</para>
<xi:include xpointer="xpointer(/docs/info[@name='MessageToInfo'])" />
</parameter> </parameter>
</syntax> </syntax>
<description> <description>
<para>Send a text message. The body of the message that will be <para>Send a text message. The body of the message that will be
sent is what is currently set to <literal>MESSAGE(body)</literal>. sent is what is currently set to <literal>MESSAGE(body)</literal>.
The technology chosen for sending the message is determined This may he come from an incoming message.
based on a prefix to the <literal>to</literal> parameter.</para> The technology chosen for sending the message is determined
based on a prefix to the <literal>destination</literal> parameter.</para>
<para>This application sets the following channel variables:</para> <para>This application sets the following channel variables:</para>
<variablelist> <variablelist>
<variable name="MESSAGE_SEND_STATUS"> <variable name="MESSAGE_SEND_STATUS">
@ -1204,8 +1232,9 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
char *parse; char *parse;
int res = -1; int res = -1;
AST_DECLARE_APP_ARGS(args, AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(to); AST_APP_ARG(destination);
AST_APP_ARG(from); AST_APP_ARG(from);
AST_APP_ARG(to);
); );
if (ast_strlen_zero(data)) { if (ast_strlen_zero(data)) {
@ -1217,7 +1246,7 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
parse = ast_strdupa(data); parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse); AST_STANDARD_APP_ARGS(args, parse);
if (ast_strlen_zero(args.to)) { if (ast_strlen_zero(args.destination)) {
ast_log(LOG_WARNING, "A 'to' URI is required for MessageSend()\n"); ast_log(LOG_WARNING, "A 'to' URI is required for MessageSend()\n");
pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", "INVALID_URI"); pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", "INVALID_URI");
return 0; return 0;
@ -1236,7 +1265,7 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
ao2_ref(msg, +1); ao2_ref(msg, +1);
ast_channel_unlock(chan); ast_channel_unlock(chan);
tech_name = ast_strdupa(args.to); tech_name = ast_strdupa(args.destination);
tech_name = strsep(&tech_name, ":"); tech_name = strsep(&tech_name, ":");
ast_rwlock_rdlock(&msg_techs_lock); ast_rwlock_rdlock(&msg_techs_lock);
@ -1248,13 +1277,21 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
goto exit_cleanup; goto exit_cleanup;
} }
/*
* If there was a "to" in the call to MessageSend,
* replace the to already in the channel datastore.
*/
if (!ast_strlen_zero(args.to)) {
ast_string_field_set(msg, to, args.to);
}
/* /*
* The message lock is held here to safely allow the technology * The message lock is held here to safely allow the technology
* implementation to access the message fields without worrying * implementation to access the message fields without worrying
* that they could change. * that they could change.
*/ */
ao2_lock(msg); ao2_lock(msg);
res = msg_tech->msg_send(msg, S_OR(args.to, ""), S_OR(args.from, "")); res = msg_tech->msg_send(msg, S_OR(args.destination, ""), S_OR(args.from, ""));
ao2_unlock(msg); ao2_unlock(msg);
pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", res ? "FAILURE" : "SUCCESS"); pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", res ? "FAILURE" : "SUCCESS");

View File

@ -24,13 +24,16 @@
***/ ***/
/*** DOCUMENTATION /*** DOCUMENTATION
<info name="MessageDestinationInfo" language="en_US" tech="PJSIP">
<para>Specifying a prefix of <literal>pjsip:</literal> will send the
message as a SIP MESSAGE request.</para>
</info>
<info name="MessageFromInfo" language="en_US" tech="PJSIP"> <info name="MessageFromInfo" language="en_US" tech="PJSIP">
<para>The <literal>from</literal> parameter can be a configured endpoint <para>The <literal>from</literal> parameter can be a configured endpoint
or in the form of "display-name" &lt;URI&gt;.</para> or in the form of "display-name" &lt;URI&gt;.</para>
</info> </info>
<info name="MessageToInfo" language="en_US" tech="PJSIP"> <info name="MessageToInfo" language="en_US" tech="PJSIP">
<para>Specifying a prefix of <literal>pjsip:</literal> will send the <para>Ignored</para>
message as a SIP MESSAGE request.</para>
</info> </info>
***/ ***/
#include "asterisk.h" #include "asterisk.h"

View File

@ -251,7 +251,7 @@
<para>Sends a message to a Jabber Client.</para> <para>Sends a message to a Jabber Client.</para>
</description> </description>
</manager> </manager>
<info name="MessageToInfo" language="en_US" tech="XMPP"> <info name="MessageDestinationInfo" language="en_US" tech="XMPP">
<para>Specifying a prefix of <literal>xmpp:</literal> will send the <para>Specifying a prefix of <literal>xmpp:</literal> will send the
message as an XMPP chat message.</para> message as an XMPP chat message.</para>
</info> </info>
@ -260,6 +260,9 @@
account defined in <literal>xmpp.conf</literal> to send the message from. account defined in <literal>xmpp.conf</literal> to send the message from.
Note that this field is required for XMPP messages.</para> Note that this field is required for XMPP messages.</para>
</info> </info>
<info name="MessageToInfo" language="en_US" tech="XMPP">
<para>Ignored</para>
</info>
<configInfo name="res_xmpp" language="en_US"> <configInfo name="res_xmpp" language="en_US">
<synopsis>XMPP Messaging</synopsis> <synopsis>XMPP Messaging</synopsis>
<configFile name="xmpp.conf"> <configFile name="xmpp.conf">