--- a/util/xmppstream.lua Wed Jan 05 05:12:54 2011 +0000 +++ b/util/xmppstream.lua Wed Jan 05 05:14:02 2011 +0000 @@ -10,8 +10,8 @@ local lex = require "util.xmllex"; local index = lex.index -local tagindex_to_tree = lex.tagindex_to_tree -local process_starttag = lex.process_starttag +local tagindex_to_tree = lex.tagindex_to_tree; +local get_name, get_attr = lex.get_name, lex.get_attr; local default_log = require "util.logger".init("xmppstream"); @@ -26,35 +26,49 @@ reset = function ( ) partial = nil openindexes = { } + lastindex = 0 end ; feed = function ( stream , data ) - while true do - partial = index ( data , partial ) - for i = lastindex + 1 , #partial - 1 do - local v = partial [ i ] - - if v.finish then - if v.type == "open" then - tblinsert ( openindexes , i ) - if #openindexes == 1 then - local name , attr = process_starttag ( v ) + --print("FFEED", data) + partial = index ( data , partial ) + local tmp = lastindex + lastindex = #partial - 1 + for i = tmp + 1 , #partial - 1 do + local v = partial [ i ] + + if v.finish then + if v.type == "open" or v.type == "selfclosing" then + tblinsert ( openindexes , i ) + if #openindexes == 1 then + local vstr = tostring(v); + local name = get_name ( vstr ) + if name == "stream:stream" then + local attr = get_attr ( vstr ); stream_callbacks.streamopened ( session , attr ) end - elseif v.type == "close" then - if #openindexes == 2 then -- If closing level 2... - local stanza = tagindex_to_tree ( partial , openindexes [ #openindexes ] , i ) - stream_callbacks.handlestanza ( session , stanza ) - elseif #openindexes == 1 then + end + end + if v.type == "close" or v.type == "selfclosing" then + if #openindexes == 2 then -- If closing level 2... + local attr = get_attr ( tostring(partial[openindexes[1]]) ) + local stanza = tagindex_to_tree ( partial , openindexes [ #openindexes ] , i , { + attr = attr, + } ) + if stanza[1].attr.xmlns == attr.xmlns then + stanza[1].attr.xmlns = false; + end + stream_callbacks.handlestanza ( session , stanza[1] ) + elseif #openindexes == 1 then + local prefix, name = get_name ( tostring(v) ) + if name == "stream" then stream_callbacks.streamclosed ( session ) end - --print ( "Closed level " .. #openindexes ) - openindexes [ #openindexes ] = nil end + openindexes [ #openindexes ] = nil end end - lastindex = #partial - 1 - break end + return true end ; set_session = function ( newsession ) session = newsession end };