util/xmppstream.lua

changeset 4002
2b53b4b5d46e
parent 3995
7214dc7a5642
equal deleted inserted replaced
4001:ed90aace9add 4002:2b53b4b5d46e
8 8
9 local tblinsert = table.insert 9 local tblinsert = table.insert
10 10
11 local lex = require "util.xmllex"; 11 local lex = require "util.xmllex";
12 local index = lex.index 12 local index = lex.index
13 local tagindex_to_tree = lex.tagindex_to_tree 13 local tagindex_to_tree = lex.tagindex_to_tree;
14 local process_starttag = lex.process_starttag 14 local get_name, get_attr = lex.get_name, lex.get_attr;
15 15
16 local default_log = require "util.logger".init("xmppstream"); 16 local default_log = require "util.logger".init("xmppstream");
17 17
18 local xmlns_streams = "http://etherx.jabber.org/streams"; 18 local xmlns_streams = "http://etherx.jabber.org/streams";
19 19
24 24
25 return { 25 return {
26 reset = function ( ) 26 reset = function ( )
27 partial = nil 27 partial = nil
28 openindexes = { } 28 openindexes = { }
29 lastindex = 0
29 end ; 30 end ;
30 feed = function ( stream , data ) 31 feed = function ( stream , data )
31 while true do 32 --print("FFEED", data)
32 partial = index ( data , partial ) 33 partial = index ( data , partial )
33 for i = lastindex + 1 , #partial - 1 do 34 local tmp = lastindex
34 local v = partial [ i ] 35 lastindex = #partial - 1
35 36 for i = tmp + 1 , #partial - 1 do
36 if v.finish then 37 local v = partial [ i ]
37 if v.type == "open" then 38
38 tblinsert ( openindexes , i ) 39 if v.finish then
39 if #openindexes == 1 then 40 if v.type == "open" or v.type == "selfclosing" then
40 local name , attr = process_starttag ( v ) 41 tblinsert ( openindexes , i )
42 if #openindexes == 1 then
43 local vstr = tostring(v);
44 local name = get_name ( vstr )
45 if name == "stream:stream" then
46 local attr = get_attr ( vstr );
41 stream_callbacks.streamopened ( session , attr ) 47 stream_callbacks.streamopened ( session , attr )
42 end 48 end
43 elseif v.type == "close" then 49 end
44 if #openindexes == 2 then -- If closing level 2... 50 end
45 local stanza = tagindex_to_tree ( partial , openindexes [ #openindexes ] , i ) 51 if v.type == "close" or v.type == "selfclosing" then
46 stream_callbacks.handlestanza ( session , stanza ) 52 if #openindexes == 2 then -- If closing level 2...
47 elseif #openindexes == 1 then 53 local attr = get_attr ( tostring(partial[openindexes[1]]) )
54 local stanza = tagindex_to_tree ( partial , openindexes [ #openindexes ] , i , {
55 attr = attr,
56 } )
57 if stanza[1].attr.xmlns == attr.xmlns then
58 stanza[1].attr.xmlns = false;
59 end
60 stream_callbacks.handlestanza ( session , stanza[1] )
61 elseif #openindexes == 1 then
62 local prefix, name = get_name ( tostring(v) )
63 if name == "stream" then
48 stream_callbacks.streamclosed ( session ) 64 stream_callbacks.streamclosed ( session )
49 end 65 end
50 --print ( "Closed level " .. #openindexes )
51 openindexes [ #openindexes ] = nil
52 end 66 end
67 openindexes [ #openindexes ] = nil
53 end 68 end
54 end 69 end
55 lastindex = #partial - 1
56 break
57 end 70 end
71 return true
58 end ; 72 end ;
59 set_session = function ( newsession ) session = newsession end 73 set_session = function ( newsession ) session = newsession end
60 }; 74 };
61 end 75 end
62 76

mercurial