[svn-commits] twilson: branch twilson/config_docs r370308 - in /team/twilson/config_docs: ....

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jul 19 19:20:08 CDT 2012


Author: twilson
Date: Thu Jul 19 19:20:04 2012
New Revision: 370308

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=370308
Log:
Fix automerge

Modified:
    team/twilson/config_docs/   (props changed)
    team/twilson/config_docs/channels/chan_sip.c
    team/twilson/config_docs/doc/appdocsxml.dtd
    team/twilson/config_docs/main/cel.c
    team/twilson/config_docs/main/message.c
    team/twilson/config_docs/main/xmldoc.c
    team/twilson/config_docs/res/res_rtp_asterisk.c
    team/twilson/config_docs/res/res_xmpp.c

Propchange: team/twilson/config_docs/
------------------------------------------------------------------------------
    automerge = *

Propchange: team/twilson/config_docs/
------------------------------------------------------------------------------
Binary property 'branch-10-merged' - no diff available.

Propchange: team/twilson/config_docs/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Thu Jul 19 19:20:04 2012
@@ -1,1 +1,1 @@
-/trunk:1-370269
+/trunk:1-370303

Modified: team/twilson/config_docs/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/channels/chan_sip.c?view=diff&rev=370308&r1=370307&r2=370308
==============================================================================
--- team/twilson/config_docs/channels/chan_sip.c (original)
+++ team/twilson/config_docs/channels/chan_sip.c Thu Jul 19 19:20:04 2012
@@ -572,6 +572,14 @@
 			via multiple <literal>Variable: name=value</literal> sequences.</para>
 		</description>
 	</manager>
+	<info name="SIPMessageFromInfo" 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="SIPMessageToInfo" language="en_US" tech="SIP">
+		<para>Specifying a prefix of <literal>sip:</literal> will send the
+		message as a SIP MESSAGE request.</para>
+	</info>
  ***/
 
 static int min_expiry = DEFAULT_MIN_EXPIRY;        /*!< Minimum accepted registration time */

Modified: team/twilson/config_docs/doc/appdocsxml.dtd
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/doc/appdocsxml.dtd?view=diff&rev=370308&r1=370307&r2=370308
==============================================================================
--- team/twilson/config_docs/doc/appdocsxml.dtd (original)
+++ team/twilson/config_docs/doc/appdocsxml.dtd Thu Jul 19 19:20:04 2012
@@ -1,4 +1,4 @@
-  <!ELEMENT docs (application|function|agi|manager|managerEvent|configInfo)*>
+  <!ELEMENT docs (application|function|agi|manager|managerEvent|info|configInfo)*>
   <!ATTLIST docs xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">
 
   <!ELEMENT xi:include (xi:fallback?) >
@@ -54,6 +54,11 @@
   <!ELEMENT hasObject EMPTY>
   <!ATTLIST hasObject ref IDREF #REQUIRED>
 
+  <!ELEMENT info (para|note|warning|variablelist|enumlist|info|xi:include)*>
+  <!ATTLIST info name CDATA #REQUIRED>
+  <!ATTLIST info language CDATA #REQUIRED>
+  <!ATTLIST info tech CDATA #REQUIRED>
+
   <!ELEMENT see-also (ref|xi:include)*>
 
   <!ELEMENT ref (#PCDATA)>
@@ -73,9 +78,9 @@
   <!ELEMENT syntax (parameter|dataType|category|xi:include)*>
   <!ATTLIST syntax argsep CDATA ",">
 
-  <!ELEMENT description (para|note|warning|variablelist|enumlist|xi:include)*>
+  <!ELEMENT description (para|note|warning|variablelist|enumlist|info|xi:include)*>
 
-  <!ELEMENT parameter (optionlist|enumlist|argument|para|note|warning|parameter|xi:include)*>
+  <!ELEMENT parameter (optionlist|enumlist|argument|para|note|warning|parameter|info|xi:include)*>
   <!ATTLIST parameter name CDATA "">
   <!ATTLIST parameter required (yes|no|true|false) "false">
   <!ATTLIST parameter multiple (yes|no|true|false) "false">
@@ -85,17 +90,17 @@
   <!ATTLIST parameter argsep CDATA ",">
 
   <!ELEMENT optionlist (option+)>
-  <!ELEMENT option (argument|para|note|warning|variablelist|enumlist|xi:include)*>
+  <!ELEMENT option (argument|para|note|warning|variablelist|enumlist|info|xi:include)*>
   <!ATTLIST option name CDATA #REQUIRED>
   <!ATTLIST option argsep CDATA ",">
   <!ATTLIST option implies CDATA "">
   <!ATTLIST option hasparams CDATA "">
 
   <!ELEMENT enumlist (enum+)>
-  <!ELEMENT enum (para|note|warning|parameter|enumlist|xi:include)*>
+  <!ELEMENT enum (para|note|warning|parameter|enumlist|info|xi:include)*>
   <!ATTLIST enum name CDATA "">
 
-  <!ELEMENT argument (para|note|warning|variablelist|argument|xi:include)*>
+  <!ELEMENT argument (para|note|warning|variablelist|argument|info|xi:include)*>
   <!ATTLIST argument name CDATA #REQUIRED>
   <!ATTLIST argument multiple (yes|no|true|false) "false">
   <!ATTLIST argument required (yes|no|true|false) "false">
@@ -114,7 +119,7 @@
   <!ELEMENT warning (para+|xi:include*)>
 
   <!ELEMENT variablelist (variable+|xi:include*)>
-  <!ELEMENT variable (#PCDATA|value|para|xi:include)*>
+  <!ELEMENT variable (#PCDATA|value|para|info|xi:include)*>
   <!ATTLIST variable name CDATA "">
 
   <!ELEMENT value (#PCDATA)>

Modified: team/twilson/config_docs/main/cel.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/main/cel.c?view=diff&rev=370308&r1=370307&r2=370308
==============================================================================
--- team/twilson/config_docs/main/cel.c (original)
+++ team/twilson/config_docs/main/cel.c Thu Jul 19 19:20:04 2012
@@ -395,7 +395,7 @@
  */
 static const struct ast_datastore_info fabricated_channel_datastore = {
 	.type = "CEL fabricated channel",
-	.destroy = ast_free,
+	.destroy = ast_free_ptr,
 };
 
 struct ast_channel *ast_cel_fabricate_channel_from_event(const struct ast_event *event)
@@ -505,11 +505,10 @@
 		return NULL;
 	}
 
-	ast_channel_appl_set(tchan, app_data);
-	ast_channel_data_set(tchan, app_data + strlen(record.application_name) + 1);
-
-	strcpy((char *) ast_channel_appl(tchan), record.application_name);
-	strcpy((char *) ast_channel_data(tchan), record.application_data);
+	ast_channel_appl_set(tchan, strcpy(app_data, record.application_name));
+	ast_channel_data_set(tchan, strcpy(app_data + strlen(record.application_name) + 1,
+		record.application_data));
+
 	datastore->data = app_data;
 	ast_channel_datastore_add(tchan, datastore);
 

Modified: team/twilson/config_docs/main/message.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/main/message.c?view=diff&rev=370308&r1=370307&r2=370308
==============================================================================
--- team/twilson/config_docs/main/message.c (original)
+++ team/twilson/config_docs/main/message.c Thu Jul 19 19:20:04 2012
@@ -122,20 +122,20 @@
 		<syntax>
 			<parameter name="to" required="true">
 				<para>A To URI for the message.</para>
+				<xi:include xpointer="xpointer(/docs/info[@name='SIPMessageToInfo'])" />
+				<xi:include xpointer="xpointer(/docs/info[@name='XMPPMessageToInfo'])" />
 			</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.</para>
-				<note>
-					<para>For SIP the from parameter can be a configured peer name
-					or in the form of "display-name" &lt;URI&gt;.</para>
-				</note>
+				<xi:include xpointer="xpointer(/docs/info[@name='SIPMessageFromInfo'])" />
 			</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>.</para>
-
+			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>
 			<para>This application sets the following channel variables:</para>
 			<variablelist>
 				<variable name="MESSAGE_SEND_STATUS">
@@ -164,14 +164,13 @@
 			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
 			<parameter name="To" required="true">
 				<para>The URI the message is to be sent to.</para>
+				<xi:include xpointer="xpointer(/docs/info[@name='SIPMessageToInfo'])" />
+				<xi:include xpointer="xpointer(/docs/info[@name='XMPPMessageToInfo'])" />
 			</parameter>
 			<parameter name="From">
 				<para>A From URI for the message if needed for the
 				message technology being used to send this message.</para>
-				<note>
-					<para>For SIP the from parameter can be a configured peer name
-					or in the form of "display-name" &lt;URI&gt;.</para>
-				</note>
+				<xi:include xpointer="xpointer(/docs/info[@name='SIPMessageFromInfo'])" />
 			</parameter>
 			<parameter name="Body">
 				<para>The message body text.  This must not contain any newlines as that

Modified: team/twilson/config_docs/main/xmldoc.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/main/xmldoc.c?view=diff&rev=370308&r1=370307&r2=370308
==============================================================================
--- team/twilson/config_docs/main/xmldoc.c (original)
+++ team/twilson/config_docs/main/xmldoc.c Thu Jul 19 19:20:04 2012
@@ -65,6 +65,10 @@
 
 static char *xmldoc_get_syntax_cmd(struct ast_xml_node *fixnode, const char *name, int printname);
 static int xmldoc_parse_enumlist(struct ast_xml_node *fixnode, const char *tabs, struct ast_str **buffer);
+static int xmldoc_parse_info(struct ast_xml_node *node, const char *tabs, const char *posttabs, struct ast_str **buffer);
+static int xmldoc_parse_para(struct ast_xml_node *node, const char *tabs, const char *posttabs, struct ast_str **buffer);
+static int xmldoc_parse_specialtags(struct ast_xml_node *fixnode, const char *tabs, const char *posttabs, struct ast_str **buffer);
+
 
 /*!
  * \brief Container of documentation trees
@@ -1248,6 +1252,26 @@
 }
 
 /*! \internal
+ *  \brief Parse common internal elements.  This includes paragraphs, special
+ *         tags, and information nodes.
+ *  \param node The element to parse
+ *  \param tabs Add this string before the content of the parsed element.
+ *  \param posttabs Add this string after the content of the parsed element.
+ *  \param buffer This must be an already allocated ast_str. It will be used to
+ *                store the result (if something has already been placed in the
+ *                buffer, the parsed elements will be appended)
+ *  \retval 1 if any data was appended to the buffer
+ *  \retval 2 if the data appended to the buffer contained a text paragraph
+ *  \retval 0 if no data was appended to the buffer
+ */
+static int xmldoc_parse_common_elements(struct ast_xml_node *node, const char *tabs, const char *posttabs, struct ast_str **buffer)
+{
+	return (xmldoc_parse_para(node, tabs, posttabs, buffer)
+		|| xmldoc_parse_specialtags(node, tabs, posttabs, buffer)
+		|| xmldoc_parse_info(node, tabs, posttabs, buffer));
+}
+
+/*! \internal
  *  \brief Parse a <para> element.
  *  \param node The <para> element pointer.
  *  \param tabs Added this string before the content of the <para> element.
@@ -1338,7 +1362,8 @@
 		/* parse <para> elements inside special tags. */
 		for (node = ast_xml_node_get_children(node); node; node = ast_xml_node_get_next(node)) {
 			/* first <para> just print it without tabs at the begining. */
-			if (xmldoc_parse_para(node, (!count ? "" : tabs), posttabs, buffer) == 2) {
+			if ((xmldoc_parse_para(node, (!count ? "" : tabs), posttabs, buffer) == 2)
+				|| (xmldoc_parse_info(node, (!count ? "": tabs), posttabs, buffer) == 2)) {
 				ret = 2;
 			}
 		}
@@ -1349,6 +1374,55 @@
 
 		break;
 	}
+
+	return ret;
+}
+
+/*! \internal
+ *  \brief Parse an 'info' tag inside an element.
+ *  \param node A pointer to the 'info' xml node.
+ *  \param tabs A string to be appended at the beginning of each line being printed
+ *              inside 'buffer'
+ *  \param posttabs Add this string after the content of the <para> element, if one exists
+ *  \param String buffer to put values found inide the info element.
+ *  \ret 2 if the information contained a para element, and it returned a value of 2
+ *  \ret 1 if information was put into the buffer
+ *  \ret 0 if no information was put into the buffer or error
+ */
+static int xmldoc_parse_info(struct ast_xml_node *node, const char *tabs, const char *posttabs, struct ast_str **buffer)
+{
+	const char *tech;
+	char *internaltabs;
+	int internal_ret;
+	int ret = 0;
+
+	if (strcasecmp(ast_xml_node_get_name(node), "info")) {
+		return ret;
+	}
+
+	ast_asprintf(&internaltabs, "%s    ", tabs);
+	if (!internaltabs) {
+		return ret;
+	}
+
+	tech = ast_xml_get_attribute(node, "tech");
+	if (tech) {
+		ast_str_append(buffer, 0, "%s<note>Technology: %s</note>\n", internaltabs, tech);
+		ast_xml_free_attr(tech);
+	}
+
+	ret = 1;
+
+	for (node = ast_xml_node_get_children(node); node; node = ast_xml_node_get_next(node)) {
+		if (!strcasecmp(ast_xml_node_get_name(node), "enumlist")) {
+			xmldoc_parse_enumlist(node, internaltabs, buffer);
+		} else if ((internal_ret = xmldoc_parse_common_elements(node, internaltabs, posttabs, buffer))) {
+			if (internal_ret > ret) {
+				ret = internal_ret;
+			}
+		}
+	}
+	ast_free(internaltabs);
 
 	return ret;
 }
@@ -1378,7 +1452,7 @@
 	if (!argname) {
 		return 0;
 	}
-	if (xmldoc_has_inside(node, "para") || xmldoc_has_specialtags(node)) {
+	if (xmldoc_has_inside(node, "para") || xmldoc_has_inside(node, "info") || xmldoc_has_specialtags(node)) {
 		ast_str_append(buffer, 0, "%s%s%s", tabs, argname, (insideparameter ? "\n" : ""));
 		ast_xml_free_attr(argname);
 	} else {
@@ -1387,10 +1461,7 @@
 	}
 
 	for (node = ast_xml_node_get_children(node); node; node = ast_xml_node_get_next(node)) {
-		if (xmldoc_parse_para(node, (insideparameter ? paramtabs : (!count ? " - " : tabs)), "\n", buffer) == 2) {
-			count++;
-			ret = 1;
-		} else if (xmldoc_parse_specialtags(node, (insideparameter ? paramtabs : (!count ? " - " : tabs)), "\n", buffer) == 2) {
+		if (xmldoc_parse_common_elements(node, (insideparameter ? paramtabs : (!count ? " - " : tabs)), "\n", buffer) == 2) {
 			count++;
 			ret = 1;
 		}
@@ -1419,10 +1490,7 @@
 	int ret = 0, printedpara=0;
 
 	for (tmp = ast_xml_node_get_children(node); tmp; tmp = ast_xml_node_get_next(tmp)) {
-		if (xmldoc_parse_para(tmp, (ret ? tabs : ""), "\n", buffer)) {
-			printedpara = 1;
-			continue;
-		} else if (xmldoc_parse_specialtags(tmp, (ret ? tabs : ""), "\n", buffer)) {
+		if (xmldoc_parse_common_elements(tmp, (ret ? tabs : ""), "\n", buffer)) {
 			printedpara = 1;
 			continue;
 		}
@@ -1493,10 +1561,7 @@
 	}
 	for (tmp = ast_xml_node_get_children(node); tmp; tmp = ast_xml_node_get_next(tmp)) {
 		/* We can have a <para> element inside the variable list */
-		if ((xmldoc_parse_para(tmp, (ret ? tabs : ""), "\n", buffer))) {
-			ret = 1;
-			continue;
-		} else if ((xmldoc_parse_specialtags(tmp, (ret ? tabs : ""), "\n", buffer))) {
+		if (xmldoc_parse_common_elements(tmp, (ret ? tabs : ""), "\n", buffer)) {
 			ret = 1;
 			continue;
 		}
@@ -1630,9 +1695,7 @@
 	ast_asprintf(&optiontabs, "%s    ", tabs);
 
 	for (node = ast_xml_node_get_children(node); node; node = ast_xml_node_get_next(node)) {
-		if ((xmldoc_parse_para(node, (ret ? tabs : " - "), "\n", buffer))) {
-			ret = 1;
-		} else if ((xmldoc_parse_specialtags(node, (ret ? tabs : " - "), "\n", buffer))) {
+		if (xmldoc_parse_common_elements(node, (ret ? tabs : " - "), "\n", buffer)) {
 			ret = 1;
 		}
 
@@ -1710,9 +1773,7 @@
 			continue;
 		}
 
-		if (xmldoc_parse_para(node, (ret ? tabs :  ""), "\n", buffer)) {
-			ret = 1;
-		} else if (xmldoc_parse_specialtags(node, (ret ? tabs :  ""), "\n", buffer)) {
+		if (xmldoc_parse_common_elements(node, (ret ? tabs :  ""), "\n", buffer)) {
 			ret = 1;
 		}
 
@@ -1830,6 +1891,18 @@
 				continue;
 			}
 			continue;
+		} else if (!strcasecmp(ast_xml_node_get_name(node), "info")) {
+			if (!printed) {
+				ast_str_append(buffer, 0, "%s\n", paramname);
+				ast_xml_free_attr(paramname);
+				printed = 1;
+			}
+			if (xmldoc_parse_info(node, internaltabs, "\n", buffer)) {
+				/* If anything ever goes in below this condition before the continue below,
+				 * we should probably continue immediately. */
+				continue;
+			}
+			continue;
 		} else if ((xmldoc_parse_specialtags(node, internaltabs, "\n", buffer))) {
 			continue;
 		}
@@ -1932,9 +2005,7 @@
 	} else {
 		for (tmp = ast_xml_node_get_children(node); tmp; tmp = ast_xml_node_get_next(tmp)) {
 			/* if found, parse a <para> element. */
-			if (xmldoc_parse_para(tmp, "", "\n", &ret)) {
-				continue;
-			} else if (xmldoc_parse_specialtags(tmp, "", "\n", &ret)) {
+			if (xmldoc_parse_common_elements(tmp, "", "\n", &ret)) {
 				continue;
 			}
 			/* if found, parse a <variablelist> element. */

Modified: team/twilson/config_docs/res/res_rtp_asterisk.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/res/res_rtp_asterisk.c?view=diff&rev=370308&r1=370307&r2=370308
==============================================================================
--- team/twilson/config_docs/res/res_rtp_asterisk.c (original)
+++ team/twilson/config_docs/res/res_rtp_asterisk.c Thu Jul 19 19:20:04 2012
@@ -191,12 +191,13 @@
 	int rtpkeepalive;		/*!< Send RTP comfort noice packets for keepalive */
 
 	/* DTMF Reception Variables */
-	char resp;
-	unsigned int lastevent;
-	unsigned int dtmf_duration;     /*!< Total duration in samples since the digit start event */
-	unsigned int dtmf_timeout;      /*!< When this timestamp is reached we consider END frame lost and forcibly abort digit */
+	char resp;                        /*!< The current digit being processed */
+	unsigned int last_seqno;          /*!< The last known sequence number for any DTMF packet */
+	unsigned int last_end_timestamp;  /*!< The last known timestamp received from an END packet */
+	unsigned int dtmf_duration;       /*!< Total duration in samples since the digit start event */
+	unsigned int dtmf_timeout;        /*!< When this timestamp is reached we consider END frame lost and forcibly abort digit */
 	unsigned int dtmfsamples;
-	enum ast_rtp_dtmf_mode dtmfmode;/*!< The current DTMF mode of the RTP stream */
+	enum ast_rtp_dtmf_mode dtmfmode;  /*!< The current DTMF mode of the RTP stream */
 	/* DTMF Transmission Variables */
 	unsigned int lastdigitts;
 	char sending_digit;	/*!< boolean - are we sending digits */
@@ -2155,8 +2156,10 @@
 		rtp->dtmfsamples = 0;
 		return &ast_null_frame;
 	}
-	ast_debug(1, "Sending dtmf: %d (%c), at %s\n", rtp->resp, rtp->resp,
-		  ast_sockaddr_stringify(&remote_address));
+	ast_debug(1, "Creating %s DTMF Frame: %d (%c), at %s\n",
+		type == AST_FRAME_DTMF_END ? "END" : "BEGIN",
+		rtp->resp, rtp->resp,
+		ast_sockaddr_stringify(&remote_address));
 	if (rtp->resp == 'X') {
 		rtp->f.frametype = AST_FRAME_CONTROL;
 		rtp->f.subclass.integer = AST_CONTROL_FLASH;
@@ -2220,12 +2223,12 @@
 	}
 
 	if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
-		if ((rtp->lastevent != timestamp) || (rtp->resp && rtp->resp != resp)) {
+		if ((rtp->last_end_timestamp != timestamp) || (rtp->resp && rtp->resp != resp)) {
 			rtp->resp = resp;
 			rtp->dtmf_timeout = 0;
 			f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)));
 			f->len = 0;
-			rtp->lastevent = timestamp;
+			rtp->last_end_timestamp = timestamp;
 			AST_LIST_INSERT_TAIL(frames, f, frame_list);
 		}
 	} else {
@@ -2242,30 +2245,40 @@
 		}
 		new_duration = (new_duration & ~0xFFFF) | samples;
 
-		/* The second portion of this check is to not mistakenly
-		 * stop accepting DTMF if the seqno rolls over beyond
-		 * 65535.
-		 */
-		if (rtp->lastevent > seqno && rtp->lastevent - seqno < 50) {
-			/* Out of order frame. Processing this can cause us to
-			 * improperly duplicate incoming DTMF, so just drop
-			 * this.
-			 */
-			return;
-		}
-
 		if (event_end & 0x80) {
 			/* End event */
-			if ((rtp->lastevent != seqno) && rtp->resp) {
+			if ((rtp->last_seqno != seqno) && (timestamp > rtp->last_end_timestamp)) {
+				rtp->last_end_timestamp = timestamp;
 				rtp->dtmf_duration = new_duration;
+				rtp->resp = resp;
 				f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0));
 				f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(&f->subclass.format)), ast_tv(0, 0));
 				rtp->resp = 0;
 				rtp->dtmf_duration = rtp->dtmf_timeout = 0;
 				AST_LIST_INSERT_TAIL(frames, f, frame_list);
+			} else if (rtpdebug) {
+				ast_debug(1, "Dropping duplicate or out of order DTMF END frame (seqno: %d, ts %d, digit %c)\n",
+					seqno, timestamp, resp);
 			}
 		} else {
 			/* Begin/continuation */
+
+			/* The second portion of the seqno check is to not mistakenly
+			 * stop accepting DTMF if the seqno rolls over beyond
+			 * 65535.
+			 */
+			if ((rtp->last_seqno > seqno && rtp->last_seqno - seqno < 50)
+				|| timestamp <= rtp->last_end_timestamp) {
+				/* Out of order frame. Processing this can cause us to
+				 * improperly duplicate incoming DTMF, so just drop
+				 * this.
+				 */
+				if (rtpdebug) {
+					ast_debug(1, "Dropping out of order DTMF frame (seqno %d, ts %d, digit %c)\n",
+						seqno, timestamp, resp);
+				}
+				return;
+			}
 
 			if (rtp->resp && rtp->resp != resp) {
 				/* Another digit already began. End it */
@@ -2290,7 +2303,7 @@
 			rtp->dtmf_timeout = timestamp + rtp->dtmf_duration + dtmftimeout;
 		}
 
-		rtp->lastevent = seqno;
+		rtp->last_seqno = seqno;
 	}
 
 	rtp->dtmfsamples = samples;

Modified: team/twilson/config_docs/res/res_xmpp.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_docs/res/res_xmpp.c?view=diff&rev=370308&r1=370307&r2=370308
==============================================================================
--- team/twilson/config_docs/res/res_xmpp.c (original)
+++ team/twilson/config_docs/res/res_xmpp.c Thu Jul 19 19:20:04 2012
@@ -270,6 +270,10 @@
 			<para>Sends a message to a Jabber Client.</para>
 		</description>
 	</manager>
+	<info name="XMPPMessageToInfo" language="en_US" tech="XMPP">
+		<para>Specifying a prefix of <literal>xmpp:</literal> will send the
+		message as an XMPP chat message.</para>
+	</info>
 ***/
 
 /*! \brief Supported general configuration flags */




More information about the svn-commits mailing list