27 local ns_stack = { "" }; |
29 local ns_stack = { "" }; |
28 local curr_ns = ""; |
30 local curr_ns = ""; |
29 local curr_tag; |
31 local curr_tag; |
30 local chardata = {}; |
32 local chardata = {}; |
31 local xml_handlers = {}; |
33 local xml_handlers = {}; |
32 local log = session.log; |
34 local log = session.log or default_log; |
33 local print = function (...) log("info", "xmlhandlers", t_concatall({...}, "\t")); end |
35 --local print = function (...) log("info", "xmlhandlers", t_concatall({...}, "\t")); end |
34 |
36 |
35 local send = session.send; |
37 local send = session.send; |
36 |
38 |
37 local stanza |
39 local stanza |
38 function xml_handlers:StartElement(name, attr) |
40 function xml_handlers:StartElement(name, attr) |
39 if stanza and #chardata > 0 then |
41 if stanza and #chardata > 0 then |
40 -- We have some character data in the buffer |
42 -- We have some character data in the buffer |
41 stanza:text(t_concat(chardata)); |
43 stanza:text(t_concat(chardata)); |
42 chardata = {}; |
44 chardata = {}; |
43 end |
45 end |
44 curr_ns,name = name:match("^(.+):(%w+)$"); |
46 curr_ns,name = name:match("^(.+)|([%w%-]+)$"); |
45 if not stanza then |
47 if curr_ns ~= "jabber:server" then |
|
48 attr.xmlns = curr_ns; |
|
49 end |
|
50 |
|
51 -- FIXME !!!!! |
|
52 for i, k in ipairs(attr) do |
|
53 if type(k) == "string" then |
|
54 local ns, nm = k:match("^([^|]+)|?([^|]-)$") |
|
55 if ns and nm then |
|
56 ns = ns_prefixes[ns]; |
|
57 if ns then |
|
58 attr[ns..":"..nm] = attr[k]; |
|
59 attr[i] = ns..":"..nm; |
|
60 attr[k] = nil; |
|
61 end |
|
62 end |
|
63 end |
|
64 end |
|
65 |
|
66 if not stanza then --if we are not currently inside a stanza |
46 if session.notopen then |
67 if session.notopen then |
47 if name == "stream" then |
68 if name == "stream" then |
48 streamopened(session, attr); |
69 streamopened(session, attr); |
49 return; |
70 return; |
50 end |
71 end |
51 error("Client failed to open stream successfully"); |
72 error("Client failed to open stream successfully"); |
52 end |
73 end |
53 if curr_ns == "jabber:client" and name ~= "iq" and name ~= "presence" and name ~= "message" then |
74 if curr_ns == "jabber:client" and name ~= "iq" and name ~= "presence" and name ~= "message" then |
54 error("Client sent invalid top-level stanza"); |
75 error("Client sent invalid top-level stanza"); |
55 end |
76 end |
56 attr.xmlns = curr_ns; |
77 |
57 stanza = st.stanza(name, attr); --{ to = attr.to, type = attr.type, id = attr.id, xmlns = curr_ns }); |
78 stanza = st.stanza(name, attr); --{ to = attr.to, type = attr.type, id = attr.id, xmlns = curr_ns }); |
58 curr_tag = stanza; |
79 curr_tag = stanza; |
59 else |
80 else -- we are inside a stanza, so add a tag |
60 attr.xmlns = curr_ns; |
81 attr.xmlns = nil; |
|
82 if curr_ns ~= "jabber:server" and curr_ns ~= "jabber:client" then |
|
83 attr.xmlns = curr_ns; |
|
84 end |
61 stanza:tag(name, attr); |
85 stanza:tag(name, attr); |
62 end |
86 end |
63 end |
87 end |
64 function xml_handlers:CharacterData(data) |
88 function xml_handlers:CharacterData(data) |
65 if stanza then |
89 if stanza then |
66 t_insert(chardata, data); |
90 t_insert(chardata, data); |
67 end |
91 end |
68 end |
92 end |
69 function xml_handlers:EndElement(name) |
93 function xml_handlers:EndElement(name) |
70 curr_ns,name = name:match("^(.+):(%w+)$"); |
94 curr_ns,name = name:match("^(.+)|([%w%-]+)$"); |
71 if (not stanza) or #stanza.last_add < 0 or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then |
95 if (not stanza) or #stanza.last_add < 0 or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then |
72 if name == "stream" then |
96 if name == "stream" then |
73 log("debug", "Stream closed"); |
97 log("debug", "Stream closed"); |
74 sm_destroy_session(session); |
98 sm_destroy_session(session); |
75 return; |
99 return; |
|
100 elseif name == "error" then |
|
101 error("Stream error: "..tostring(name)..": "..tostring(stanza)); |
76 else |
102 else |
77 error("XML parse error in client stream"); |
103 error("XML parse error in client stream"); |
78 end |
104 end |
79 end |
105 end |
80 if stanza and #chardata > 0 then |
106 if stanza and #chardata > 0 then |