From 2444ac841fad00133f231e9667ab427c4ce4d39e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 5 Oct 2010 01:44:25 +0200 Subject: Receiving messages works again (kinda) --- src/core/ephraim_conv_handler.erl | 71 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/core/ephraim_conv_handler.erl (limited to 'src/core/ephraim_conv_handler.erl') diff --git a/src/core/ephraim_conv_handler.erl b/src/core/ephraim_conv_handler.erl new file mode 100644 index 0000000..e525d99 --- /dev/null +++ b/src/core/ephraim_conv_handler.erl @@ -0,0 +1,71 @@ +-module(ephraim_conv_handler). +-include_lib("exmpp/include/exmpp_client.hrl"). +-behaviour(gen_event). +-export([start/2]). +-export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]). + +-record(conv_handler_state, { + supervisor :: pid(), + event_manager :: pid(), + convs = dict:new() :: dict() + }). + +start(Supervisor, EventManager) -> + gen_event:add_handler(EventManager, ?MODULE, {Supervisor, EventManager}). + +init({Supervisor, EventManager}) -> + State = #conv_handler_state{supervisor=Supervisor,event_manager=EventManager}, + {ok, State}. + +-spec get_conv(#conv_handler_state{},exmpp_jid:jid()) -> {#conv_handler_state{},pid()|undefined}. +get_conv(State, JID) -> + {Node, Domain, Resource} = exmpp_jid:to_lower(exmpp_jid:parse(JID)), + + case Resource of + undefined -> + {State, undefined}; + _ -> + Key = list_to_binary([Node, <<"@">>, Domain, <<"/">>, Resource]), + + case dict:find(Key, State#conv_handler_state.convs) of + {ok, Conv} -> + {State, Conv}; + error -> + {ok, Conv} = supervisor:start_child(State#conv_handler_state.supervisor, + {Key, {ephraim_conv, start_link, [State#conv_handler_state.event_manager, JID]}, transient, 1000, worker, [ephraim_conv]}), + Dict = dict:store(Key, Conv, State#conv_handler_state.convs), + {State#conv_handler_state{convs=Dict}, Conv} + end + end. + +handle_event({received_packet, #received_packet{packet_type=message, raw_packet=Packet}}, State) -> + From = exmpp_xml:get_attribute(Packet, from, <<"unknown">>), + Type = exmpp_message:get_type(Packet), + Body = exmpp_message:get_body(Packet), + NewState = if + Body =/= undefined -> + {State2, Conv} = get_conv(State, From), + if + Conv =/= undefined -> + ephraim_conv:received_message(Conv, From, Type, Body); + true -> + ok + end, + State2; + true -> + io:format("Received strange message from ~p:~n~p~n", [From, Packet]), + State + end, + {ok, NewState}; + +handle_event(_Event, State) -> + {ok, State}. + +handle_call(_Msg, State) -> + {noreply, State}. +handle_info(_Msg, State) -> + {ok, State}. +terminate(_Reason, _State) -> + ok. +code_change(_OldVersion, State, _Extra) -> + {ok, State}. -- cgit v1.2.3