util/xmppstream.lua

changeset 4002
2b53b4b5d46e
parent 3995
7214dc7a5642
--- 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
 	};

mercurial