From 15a714ae68cdb9ccbe3e5798c604a54d0e4bc2f8 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Thu, 13 Apr 2006 02:08:24 +0000 Subject: [PATCH] * src/xml_stream.erl: Cleanup * src/ejabberd_service.erl: Updated to use ejabberd_receiver SVN Revision: 532 --- ChangeLog | 6 ++++++ src/ejabberd_service.erl | 30 ++++++++++-------------------- src/xml_stream.erl | 39 +-------------------------------------- 3 files changed, 17 insertions(+), 58 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0b8d79011..87e4517bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-04-13 Alexey Shchepin + + * src/xml_stream.erl: Cleanup + + * src/ejabberd_service.erl: Updated to use ejabberd_receiver + 2006-04-12 Alexey Shchepin * src/ejabberd_c2s.erl: Minor fix diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl index 0d3b02176..551ff436e 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -15,7 +15,6 @@ %% External exports -export([start/2, start_link/2, - receiver/3, send_text/2, send_element/2, become_controller/1]). @@ -80,8 +79,8 @@ start(SockData, Opts) -> start_link(SockData, Opts) -> gen_fsm:start_link(ejabberd_service, [SockData, Opts], ?FSMOPTS). -become_controller(_Pid) -> - ok. +become_controller(Pid) -> + gen_fsm:send_all_state_event(Pid, become_controller). %%%---------------------------------------------------------------------- %%% Callback functions from gen_fsm @@ -124,7 +123,7 @@ init([{SockMod, Socket}, Opts]) -> false end end, - ReceiverPid = spawn(?MODULE, receiver, [Socket, SockMod, self()]), + ReceiverPid = ejabberd_receiver:start(Socket, SockMod, none), {ok, wait_for_stream, #state{socket = Socket, receiver = ReceiverPid, streamid = new_id(), @@ -260,6 +259,12 @@ stream_established(closed, StateData) -> %% {next_state, NextStateName, NextStateData, Timeout} | %% {stop, Reason, NewStateData} %%---------------------------------------------------------------------- +handle_event(become_controller, StateName, StateData) -> + ok = (StateData#state.sockmod):controlling_process( + StateData#state.socket, + StateData#state.receiver), + ejabberd_receiver:become_controller(StateData#state.receiver), + {next_state, StateName, StateData}; handle_event(_Event, StateName, StateData) -> {next_state, StateName, StateData}. @@ -323,28 +328,13 @@ terminate(Reason, StateName, StateData) -> _ -> ok end, - (StateData#state.sockmod):close(StateData#state.socket), + ejabberd_receiver:close(StateData#state.receiver), ok. %%%---------------------------------------------------------------------- %%% Internal functions %%%---------------------------------------------------------------------- -receiver(Socket, SockMod, C2SPid) -> - XMLStreamPid = xml_stream:start(C2SPid), - receiver(Socket, SockMod, C2SPid, XMLStreamPid). - -receiver(Socket, SockMod, C2SPid, XMLStreamPid) -> - case SockMod:recv(Socket, 0) of - {ok, Text} -> - xml_stream:send_text(XMLStreamPid, Text), - receiver(Socket, SockMod, C2SPid, XMLStreamPid); - {error, _Reason} -> - exit(XMLStreamPid, closed), - gen_fsm:send_event(C2SPid, closed), - ok - end. - send_text(StateData, Text) -> (StateData#state.sockmod):send(StateData#state.socket,Text). diff --git a/src/xml_stream.erl b/src/xml_stream.erl index a513532a3..324796d8d 100644 --- a/src/xml_stream.erl +++ b/src/xml_stream.erl @@ -10,10 +10,7 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/1, start/2, - init/1, init/2, - send_text/2, - new/1, +-export([new/1, parse/2, close/1, parse_element/1]). @@ -28,37 +25,6 @@ -record(xml_stream_state, {callback_pid, port, stack}). -start(CallbackPid) -> - spawn(?MODULE, init, [CallbackPid]). - -start(Receiver, CallbackPid) -> - spawn(?MODULE, init, [Receiver, CallbackPid]). - -init(CallbackPid) -> - Port = open_port({spawn, expat_erl}, [binary]), - loop(CallbackPid, Port, []). - -init(Receiver, CallbackPid) -> - erlang:monitor(process, Receiver), - Port = open_port({spawn, expat_erl}, [binary]), - loop(CallbackPid, Port, []). - -loop(CallbackPid, Port, Stack) -> - receive - {Port, {data, Bin}} -> - Data = binary_to_term(Bin), - loop(CallbackPid, Port, process_data(CallbackPid, Stack, Data)); - {_From, {send, 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)), - loop(CallbackPid, Port, NewStack); - {'DOWN', _Ref, _Type, _Object, _Info} -> - ok - end. - process_data(CallbackPid, Stack, Data) -> case Data of {?XML_START, {Name, Attrs}} -> @@ -102,9 +68,6 @@ process_data(CallbackPid, Stack, Data) -> end. -send_text(Pid, Text) -> - Pid ! {self(), {send, Text}}. - new(CallbackPid) -> Port = open_port({spawn, expat_erl}, [binary]),