diff options
Diffstat (limited to 'src/xml_stream.erl')
-rw-r--r-- | src/xml_stream.erl | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/xml_stream.erl b/src/xml_stream.erl index 8a892bf3..d5fbd937 100644 --- a/src/xml_stream.erl +++ b/src/xml_stream.erl @@ -1,7 +1,7 @@ %%%---------------------------------------------------------------------- %%% File : xml_stream.erl %%% Author : Alexey Shchepin <alexey@sevcom.net> -%%% Purpose : +%%% Purpose : Parse XML streams %%% Created : 17 Nov 2002 by Alexey Shchepin <alexey@sevcom.net> %%% Id : $Id$ %%%---------------------------------------------------------------------- @@ -10,7 +10,12 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/1, start/2, init/1, init/2, send_text/2]). +-export([start/1, start/2, + init/1, init/2, + send_text/2, + new/1, + parse/2, + close/1]). -define(XML_START, 0). -define(XML_END, 1). @@ -19,6 +24,8 @@ -define(PARSE_COMMAND, 0). +-record(xml_stream_state, {callback_pid, port, stack}). + start(CallbackPid) -> spawn(?MODULE, init, [CallbackPid]). @@ -96,3 +103,23 @@ process_data(CallbackPid, Stack, Data) -> send_text(Pid, Text) -> Pid ! {self(), {send, Text}}. + +new(CallbackPid) -> + Port = open_port({spawn, expat_erl}, [binary]), + #xml_stream_state{callback_pid = CallbackPid, + port = Port, + stack = []}. + + +parse(#xml_stream_state{callback_pid = CallbackPid, + port = Port, + stack = Stack} = State, Str) -> + Res = port_control(Port, ?PARSE_COMMAND, Str), + NewStack = lists:foldl( + fun(Data, St) -> + process_data(CallbackPid, St, Data) + end, Stack, binary_to_term(Res)), + State#xml_stream_state{stack = NewStack}. + +close(#xml_stream_state{port = Port}) -> + port_close(Port). |