Updates for the MessageSend Dialplan App master
authorGeorge Joseph <gjoseph@digium.com>
Thu, 22 Apr 2021 18:07:22 +0000 (12:07 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Thu, 6 May 2021 11:23:51 +0000 (06:23 -0500)
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

channels/chan_sip.c
doc/CHANGES-staging/messagesend.txt [new file with mode: 0644]
doc/appdocsxml.dtd
main/message.c
res/res_pjsip_messaging.c
res/res_xmpp.c

index da0e0de..77e1b24 100644 (file)
                        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">
diff --git a/doc/CHANGES-staging/messagesend.txt b/doc/CHANGES-staging/messagesend.txt
new file mode 100644 (file)
index 0000000..7977ff1
--- /dev/null
@@ -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.
index 7723bd5..93fdd3a 100644 (file)
@@ -83,6 +83,8 @@
 
   <!ELEMENT matchInfo (category|field?)>
 
+  <!ELEMENT dataType (#PCDATA)>
+
   <!ELEMENT category (#PCDATA)>
   <!ATTLIST category match (yes|no|true|false) #REQUIRED>
 
index b6f254d..c667b0c 100644 (file)
                        <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 ourgoing 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 ourgoing 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
                        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);
@@ -1249,12 +1278,20 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
        }
 
        /*
+        * 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");
index 5378b8c..9287324 100644 (file)
  ***/
 
 /*** 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"
index 0f30437..63dc257 100644 (file)
                        <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>
                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">