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 |