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>
</description>
</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">
<para>The <literal>from</literal> parameter can be a configured peer name
or in the form of "display-name" &lt;URI&gt;.</para>
</info>
<info name="MessageToInfo" language="en_US" tech="SIP">
<para>Specifying a prefix of <literal>sip:</literal> will send the
message as a SIP MESSAGE request.</para>
<para>Ignored</para>
</info>
<managerEvent language="en_US" name="SIPQualifyPeerDone">
<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 dataType (#PCDATA)>
<!ELEMENT category (#PCDATA)>
<!ATTLIST category match (yes|no|true|false) #REQUIRED>

View File

@ -52,13 +52,25 @@
<para>Field of the message to get or set.</para>
<enumlist>
<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
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 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>
<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 name="custom_data">
<para>Write-only. Mark or unmark all message headers for an outgoing
@ -119,23 +131,39 @@
Send a text message.
</synopsis>
<syntax>
<parameter name="to" required="true">
<parameter name="destination" required="true">
<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 name="from" required="false">
<para>A From 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>,
a string in the format <literal>alice@atlanta.com</literal>, or simply
a username such as <literal>alice</literal>.</para>
or a string in the format <literal>alice@atlanta.com</literal>.
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>
</syntax>
<description>
<para>Send a text message. The body of the message that will be
sent is what is currently set to <literal>MESSAGE(body)</literal>.
The technology chosen for sending the message is determined
based on a prefix to the <literal>to</literal> parameter.</para>
This may he come from an incoming message.
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>
<variablelist>
<variable name="MESSAGE_SEND_STATUS">
@ -1204,8 +1232,9 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
char *parse;
int res = -1;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(to);
AST_APP_ARG(destination);
AST_APP_ARG(from);
AST_APP_ARG(to);
);
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);
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");
pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", "INVALID_URI");
return 0;
@ -1236,7 +1265,7 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
ao2_ref(msg, +1);
ast_channel_unlock(chan);
tech_name = ast_strdupa(args.to);
tech_name = ast_strdupa(args.destination);
tech_name = strsep(&tech_name, ":");
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;
}
/*
* 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
* implementation to access the message fields without worrying
* that they could change.
*/
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);
pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", res ? "FAILURE" : "SUCCESS");

View File

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

View File

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