[asterisk-commits] phsultan: trunk r118020 - in /trunk: channels/chan_gtalk.c res/res_jabber.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri May 23 05:33:58 CDT 2008


Author: phsultan
Date: Fri May 23 05:33:21 2008
New Revision: 118020

URL: http://svn.digium.com/view/asterisk?view=rev&rev=118020
Log:
- remove whitespaces between tags in received XML packets before giving
them to the parser ;
- report Gtalk error messages from a buddy to the console.

This patch makes Asterisk "Google Jingle" (chan_gtalk) implementation
work with Empathy. Note that this is only true for audio streams, not
video.

Thank you to PH for his great help!

(closes issue #12647)
Reported by: PH
Patches:
      trunk-12647-1.diff uploaded by phsultan (license 73)
Tested by: phsultan, PH

Modified:
    trunk/channels/chan_gtalk.c
    trunk/res/res_jabber.c

Modified: trunk/channels/chan_gtalk.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_gtalk.c?view=diff&rev=118020&r1=118019&r2=118020
==============================================================================
--- trunk/channels/chan_gtalk.c (original)
+++ trunk/channels/chan_gtalk.c Fri May 23 05:33:21 2008
@@ -1702,7 +1702,10 @@
 {
 	struct gtalk *client = ASTOBJ_REF((struct gtalk *) data);
 
-	if (iks_find_with_attrib(pak->x, "session", "type", "initiate")) {
+	if (iks_find_attrib(pak->x, "type") && !strcmp(iks_find_attrib (pak->x, "type"),"error")) {
+		ast_log(LOG_NOTICE, "Remote peer reported an error, trying to establish the call anyway\n");
+	}
+	else if (iks_find_with_attrib(pak->x, "session", "type", "initiate")) {
 		/* New call */
 		gtalk_newcall(client, pak);
 	} else if (iks_find_with_attrib(pak->x, "session", "type", "candidates") || iks_find_with_attrib(pak->x, "session", "type", "transport-info")) {

Modified: trunk/res/res_jabber.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_jabber.c?view=diff&rev=118020&r1=118019&r2=118020
==============================================================================
--- trunk/res/res_jabber.c (original)
+++ trunk/res/res_jabber.c Fri May 23 05:33:21 2008
@@ -35,6 +35,7 @@
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
+#include <ctype.h>
 #include <iksemel.h>
 
 #include "asterisk/channel.h"
@@ -638,23 +639,53 @@
 {
 	int len, ret;
 	char buf[NET_IO_BUF_SIZE -1];
+	char newbuf[NET_IO_BUF_SIZE -1];
+	int pos = 0;
+	int newbufpos = 0;
+	unsigned char c;
 
 	memset(buf, 0, sizeof(buf));
+	memset(newbuf, 0, sizeof(newbuf));
 
 	while (1) {
 		len = aji_io_recv(client, buf, NET_IO_BUF_SIZE - 1, timeout);
 		if (len < 0) return IKS_NET_RWERR;
 		if (len == 0) return IKS_NET_EXPIRED;
 		buf[len] = '\0';
-		
+
+		/* our iksemel parser won't work as expected if we feed
+		   it with XML packets that contain multiple whitespace 
+		   characters between tags */
+		while (pos < len) {
+			c = buf[pos];
+			/* if we stumble on the ending tag character,
+			   we skip any whitespace that follows it*/
+			if (c == '>') {
+				while (isspace(buf[pos+1])) {
+					pos++;
+				}
+			}
+			newbuf[newbufpos] = c;
+			newbufpos ++;
+			pos++;
+		}
+		pos = 0;
+		newbufpos = 0;
+
 		/* Log the message here, because iksemel's logHook is 
 		   unaccessible */
 		aji_log_hook(client, buf, len, 1);
-		
-		ret = iks_parse(client->p, buf, len, 0);
+
+		/* let iksemel deal with the string length, 
+		   and reset our buffer */
+		ret = iks_parse(client->p, newbuf, 0, 0);
+		memset(newbuf, 0, sizeof(newbuf));
+
 		if (ret != IKS_OK) {
+			ast_log(LOG_WARNING, "XML parsing failed\n");
 			return ret;
 		}
+		ast_debug(3, "XML parsing successful\n");	
 	}
 	return IKS_OK;
 }




More information about the asterisk-commits mailing list