util/xmppstream.lua

changeset 3995
7214dc7a5642
parent 3989
692d221ef9bd
child 4002
2b53b4b5d46e
--- a/util/xmppstream.lua	Mon Jan 03 22:20:49 2011 +0000
+++ b/util/xmppstream.lua	Tue Jan 04 00:23:51 2011 +0000
@@ -6,44 +6,60 @@
 -- COPYING file in the source package for more information.
 --
 
-
-local lxp = require "lxp";
-local lex = require "util.xmllex";
-local st = require "util.stanza";
-local stanza_mt = st.stanza_mt;
+local tblinsert = table.insert
 
-local tostring = tostring;
-local t_insert = table.insert;
-local t_concat = table.concat;
-local t_remove = table.remove;
-local setmetatable = setmetatable;
+local lex = require "util.xmllex";
+local index = lex.index
+local tagindex_to_tree  = lex.tagindex_to_tree
+local process_starttag = lex.process_starttag
 
 local default_log = require "util.logger".init("xmppstream");
 
-local error = error;
-
-module "xmppstream"
-
 local xmlns_streams = "http://etherx.jabber.org/streams";
 
-function new(session, stream_callbacks)
-	local partial;
+local function new(session, stream_callbacks)
+	local partial
+	local openindexes = { }
+	local lastindex = 0
 	
-	local function feed(stream, data)
-		index(data, 
-	end
-
 	return {
-		reset = function ()
-			parser = new_parser(handlers, ns_separator);
-			parse = parser.parse;
-			meta.reset();
-		end,
-		feed = function (self, data)
-			return parse(parser, data);
-		end,
-		set_session = meta.set_session;
+		reset = function ( )
+			partial = nil
+			openindexes = { }
+		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 )
+								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
+								stream_callbacks.streamclosed ( session )
+							end
+							--print ( "Closed level " .. #openindexes )
+							openindexes [ #openindexes ] = nil
+						end
+					end
+				end
+				lastindex = #partial - 1
+				break
+			end
+		end ;
+		set_session = function ( newsession ) session = newsession end
 	};
 end
 
-return _M;
+return {
+	new = new ;
+}

mercurial