diff options
Diffstat (limited to 'ejabberd-1.1.2/src/xml_stream.erl')
-rw-r--r-- | ejabberd-1.1.2/src/xml_stream.erl | 164 |
1 files changed, 0 insertions, 164 deletions
diff --git a/ejabberd-1.1.2/src/xml_stream.erl b/ejabberd-1.1.2/src/xml_stream.erl deleted file mode 100644 index c923b6ae7..000000000 --- a/ejabberd-1.1.2/src/xml_stream.erl +++ /dev/null @@ -1,164 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : xml_stream.erl -%%% Author : Alexey Shchepin <alexey@sevcom.net> -%%% Purpose : Parse XML streams -%%% Created : 17 Nov 2002 by Alexey Shchepin <alexey@sevcom.net> -%%% Id : $Id$ -%%%---------------------------------------------------------------------- - --module(xml_stream). --author('alexey@sevcom.net'). --vsn('$Revision$ '). - --export([new/1, - new/2, - parse/2, - close/1, - parse_element/1]). - --define(XML_START, 0). --define(XML_END, 1). --define(XML_CDATA, 2). --define(XML_ERROR, 3). - --define(PARSE_COMMAND, 0). --define(PARSE_FINAL_COMMAND, 1). - --record(xml_stream_state, {callback_pid, port, stack, size, maxsize}). - -process_data(CallbackPid, Stack, Data) -> - case Data of - {?XML_START, {Name, Attrs}} -> - if - Stack == [] -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamstart, Name, Attrs}); - true -> - ok - end, - [{xmlelement, Name, Attrs, []} | Stack]; - {?XML_END, EndName} -> - case Stack of - [{xmlelement, Name, Attrs, Els} | Tail] -> - NewEl = {xmlelement, Name, Attrs, lists:reverse(Els)}, - case Tail of - [] -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamend, EndName}), - Tail; - [_] -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamelement, NewEl}), - Tail; - [{xmlelement, Name1, Attrs1, Els1} | Tail1] -> - [{xmlelement, Name1, Attrs1, [NewEl | Els1]} | - Tail1] - end - end; - {?XML_CDATA, CData} -> - case Stack of - [El] -> - [El]; - [{xmlelement, Name, Attrs, Els} | Tail] -> - [{xmlelement, Name, Attrs, [{xmlcdata, CData} | Els]} | - Tail]; - [] -> [] - end; - {?XML_ERROR, Err} -> - catch gen_fsm:send_event(CallbackPid, {xmlstreamerror, Err}) - end. - - -new(CallbackPid) -> - new(CallbackPid, infinity). - -new(CallbackPid, MaxSize) -> - Port = open_port({spawn, expat_erl}, [binary]), - #xml_stream_state{callback_pid = CallbackPid, - port = Port, - stack = [], - size = 0, - maxsize = MaxSize}. - - -parse(#xml_stream_state{callback_pid = CallbackPid, - port = Port, - stack = Stack, - size = Size, - maxsize = MaxSize} = State, Str) -> - StrSize = if - is_list(Str) -> length(Str); - is_binary(Str) -> size(Str) - end, - Res = port_control(Port, ?PARSE_COMMAND, Str), - {NewStack, NewSize} = - lists:foldl( - fun(Data, {St, Sz}) -> - NewSt = process_data(CallbackPid, St, Data), - case NewSt of - [_] -> {NewSt, 0}; - _ -> {NewSt, Sz} - end - end, {Stack, Size + StrSize}, binary_to_term(Res)), - if - NewSize > MaxSize -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamerror, "XML stanza is too big"}); - true -> - ok - end, - State#xml_stream_state{stack = NewStack, size = NewSize}. - -close(#xml_stream_state{port = Port}) -> - port_close(Port). - - -parse_element(Str) -> - Port = open_port({spawn, expat_erl}, [binary]), - Res = port_control(Port, ?PARSE_FINAL_COMMAND, Str), - port_close(Port), - process_element_events(binary_to_term(Res)). - -process_element_events(Events) -> - process_element_events(Events, []). - -process_element_events([], _Stack) -> - {error, parse_error}; -process_element_events([Event | Events], Stack) -> - case Event of - {?XML_START, {Name, Attrs}} -> - process_element_events( - Events, [{xmlelement, Name, Attrs, []} | Stack]); - {?XML_END, _EndName} -> - case Stack of - [{xmlelement, Name, Attrs, Els} | Tail] -> - NewEl = {xmlelement, Name, Attrs, lists:reverse(Els)}, - case Tail of - [] -> - if - Events == [] -> - NewEl; - true -> - {error, parse_error} - end; - [{xmlelement, Name1, Attrs1, Els1} | Tail1] -> - process_element_events( - Events, - [{xmlelement, Name1, Attrs1, [NewEl | Els1]} | - Tail1]) - end - end; - {?XML_CDATA, CData} -> - case Stack of - [{xmlelement, Name, Attrs, Els} | Tail] -> - process_element_events( - Events, - [{xmlelement, Name, Attrs, [{xmlcdata, CData} | Els]} | - Tail]); - [] -> - process_element_events(Events, []) - end; - {?XML_ERROR, Err} -> - {error, Err} - end. - |