24 module "xmlhandlers" |
24 module "xmlhandlers" |
25 |
25 |
26 local ns_prefixes = { |
26 local ns_prefixes = { |
27 ["http://www.w3.org/XML/1998/namespace"] = "xml"; |
27 ["http://www.w3.org/XML/1998/namespace"] = "xml"; |
28 } |
28 } |
|
29 local ns_separator = "\1"; |
|
30 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; |
29 |
31 |
30 function init_xmlhandlers(session, stream_callbacks) |
32 function init_xmlhandlers(session, stream_callbacks) |
31 local ns_stack = { "" }; |
33 local ns_stack = { "" }; |
32 local curr_tag; |
34 local curr_tag; |
33 local chardata = {}; |
35 local chardata = {}; |
47 if stanza and #chardata > 0 then |
49 if stanza and #chardata > 0 then |
48 -- We have some character data in the buffer |
50 -- We have some character data in the buffer |
49 stanza:text(t_concat(chardata)); |
51 stanza:text(t_concat(chardata)); |
50 chardata = {}; |
52 chardata = {}; |
51 end |
53 end |
52 local curr_ns,name = tagname:match("^([^\1]*)\1?(.*)$"); |
54 local curr_ns,name = tagname:match(ns_pattern); |
53 if name == "" then |
55 if name == "" then |
54 curr_ns, name = "", curr_ns; |
56 curr_ns, name = "", curr_ns; |
55 end |
57 end |
56 |
58 |
57 if curr_ns ~= stream_default_ns then |
59 if curr_ns ~= stream_default_ns then |
102 if stanza then |
104 if stanza then |
103 t_insert(chardata, data); |
105 t_insert(chardata, data); |
104 end |
106 end |
105 end |
107 end |
106 function xml_handlers:EndElement(tagname) |
108 function xml_handlers:EndElement(tagname) |
107 local curr_ns,name = tagname:match("^([^\1]*)\1?(.*)$"); |
109 local curr_ns,name = tagname:match(ns_pattern); |
108 if name == "" then |
110 if name == "" then |
109 curr_ns, name = "", curr_ns; |
111 curr_ns, name = "", curr_ns; |
110 end |
112 end |
111 if (not stanza) or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then |
113 if (not stanza) or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then |
112 if tagname == stream_tag then |
114 if tagname == stream_tag then |