Mercurial > prosody-hg
comparison util/xmppstream.lua @ 3032:38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 09 May 2010 20:45:53 +0100 |
| parents | fc96d439453b |
| children | 9e0df614e5d0 |
comparison
equal
deleted
inserted
replaced
| 3031:421890f3f247 | 3032:38459cffaf67 |
|---|---|
| 30 | 30 |
| 31 local ns_separator = "\1"; | 31 local ns_separator = "\1"; |
| 32 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; | 32 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; |
| 33 | 33 |
| 34 function new_sax_handlers(session, stream_callbacks) | 34 function new_sax_handlers(session, stream_callbacks) |
| 35 local chardata = {}; | |
| 36 local xml_handlers = {}; | 35 local xml_handlers = {}; |
| 36 | |
| 37 local log = session.log or default_log; | 37 local log = session.log or default_log; |
| 38 | 38 |
| 39 local cb_streamopened = stream_callbacks.streamopened; | 39 local cb_streamopened = stream_callbacks.streamopened; |
| 40 local cb_streamclosed = stream_callbacks.streamclosed; | 40 local cb_streamclosed = stream_callbacks.streamclosed; |
| 41 local cb_error = stream_callbacks.error or function(session, e) error("XML stream error: "..tostring(e)); end; | 41 local cb_error = stream_callbacks.error or function(session, e) error("XML stream error: "..tostring(e)); end; |
| 45 local stream_tag = stream_ns..ns_separator..(stream_callbacks.stream_tag or "stream"); | 45 local stream_tag = stream_ns..ns_separator..(stream_callbacks.stream_tag or "stream"); |
| 46 local stream_error_tag = stream_ns..ns_separator..(stream_callbacks.error_tag or "error"); | 46 local stream_error_tag = stream_ns..ns_separator..(stream_callbacks.error_tag or "error"); |
| 47 | 47 |
| 48 local stream_default_ns = stream_callbacks.default_ns; | 48 local stream_default_ns = stream_callbacks.default_ns; |
| 49 | 49 |
| 50 local stanza; | 50 local chardata, stanza = {}; |
| 51 function xml_handlers:StartElement(tagname, attr) | 51 function xml_handlers:StartElement(tagname, attr) |
| 52 if stanza and #chardata > 0 then | 52 if stanza and #chardata > 0 then |
| 53 -- We have some character data in the buffer | 53 -- We have some character data in the buffer |
| 54 stanza:text(t_concat(chardata)); | 54 stanza:text(t_concat(chardata)); |
| 55 chardata = {}; | 55 chardata = {}; |
| 138 cb_error(session, "parse-error", "unexpected-element-close", name); | 138 cb_error(session, "parse-error", "unexpected-element-close", name); |
| 139 end | 139 end |
| 140 stanza, chardata = nil, {}; | 140 stanza, chardata = nil, {}; |
| 141 end | 141 end |
| 142 end | 142 end |
| 143 return xml_handlers; | 143 |
| 144 local function reset() | |
| 145 stanza, chardata = nil, {}; | |
| 146 end | |
| 147 | |
| 148 return xml_handlers, { reset = reset }; | |
| 144 end | 149 end |
| 145 | 150 |
| 146 function new(session, stream_callbacks) | 151 function new(session, stream_callbacks) |
| 147 return new_parser(new_sax_handlers(session, stream_callbacks), ns_separator); | 152 local handlers, meta = new_sax_handlers(session, stream_callbacks); |
| 153 local parser = new_parser(handlers, ns_separator); | |
| 154 local parse = parser.parse; | |
| 155 | |
| 156 return { | |
| 157 reset = function () | |
| 158 parser = new_parser(handlers, ns_separator); | |
| 159 parse = parser.parse; | |
| 160 meta.reset(); | |
| 161 end, | |
| 162 feed = function (self, data) | |
| 163 return parse(parser, data); | |
| 164 end | |
| 165 }; | |
| 148 end | 166 end |
| 149 | 167 |
| 150 return _M; | 168 return _M; |
