From: Philippe Sultan Date: Fri, 23 May 2008 10:33:21 +0000 (+0000) Subject: - remove whitespaces between tags in received XML packets before giving X-Git-Tag: 1.6.2.0-beta1~2171 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=de98d48a0dcc1861be136e0c7a832cd6ecb91dc1;p=thirdparty%2Fasterisk.git - 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 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@118020 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index 4e5e5a36fb..90b2cde242 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -1702,7 +1702,10 @@ static int gtalk_parser(void *data, ikspak *pak) { 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")) { diff --git a/res/res_jabber.c b/res/res_jabber.c index d56505af8c..653537df49 100644 --- a/res/res_jabber.c +++ b/res/res_jabber.c @@ -35,6 +35,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") +#include #include #include "asterisk/channel.h" @@ -638,23 +639,53 @@ static int aji_recv (struct aji_client *client, int timeout) { 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; }