summaryrefslogtreecommitdiff
path: root/src/xml_stream.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/xml_stream.erl')
-rw-r--r--src/xml_stream.erl31
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).