summaryrefslogtreecommitdiff
path: root/src/ejabberd_receiver.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_receiver.erl')
-rw-r--r--src/ejabberd_receiver.erl31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/ejabberd_receiver.erl b/src/ejabberd_receiver.erl
index 424f67e5..5a7a3bf7 100644
--- a/src/ejabberd_receiver.erl
+++ b/src/ejabberd_receiver.erl
@@ -205,7 +205,7 @@ handle_cast(_Msg, State) ->
handle_info({Tag, _TCPSocket, Data},
#state{socket = Socket,
sock_mod = SockMod} = State)
- when (Tag == tcp) or (Tag == ssl) ->
+ when (Tag == tcp) or (Tag == ssl) or (Tag == ejabberd_xml) ->
case SockMod of
tls ->
case tls:recv_data(Socket, Data) of
@@ -294,6 +294,25 @@ activate_socket(#state{socket = Socket,
ok
end.
+%% Data processing for connectors directly generating xmlelement in
+%% Erlang data structure.
+%% WARNING: Shaper does not work with Erlang data structure.
+process_data([], State) ->
+ activate_socket(State),
+ State;
+process_data([Element|Els], #state{c2s_pid = C2SPid} = State)
+ when element(1, Element) == xmlelement;
+ element(1, Element) == xmlstreamstart;
+ element(1, Element) == xmlstreamelement;
+ element(1, Element) == xmlstreamend ->
+ if
+ C2SPid == undefined ->
+ State;
+ true ->
+ catch gen_fsm:send_event(C2SPid, element_wrapper(Element)),
+ process_data(Els, State)
+ end;
+%% Data processing for connectors receivind data as string.
process_data(Data,
#state{xml_stream_state = XMLStreamState,
shaper_state = ShaperState,
@@ -312,6 +331,16 @@ process_data(Data,
State#state{xml_stream_state = XMLStreamState1,
shaper_state = NewShaperState}.
+%% Element coming from XML parser are wrapped inside xmlstreamelement
+%% When we receive directly xmlelement tuple (from a socket module
+%% speaking directly Erlang XML), we wrap it inside the same
+%% xmlstreamelement coming from the XML parser.
+element_wrapper(XMLElement)
+ when element(1, XMLElement) == xmlelement ->
+ {xmlstreamelement, XMLElement};
+element_wrapper(Element) ->
+ Element.
+
close_stream(undefined) ->
ok;
close_stream(XMLStreamState) ->