diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2010-10-05 01:44:25 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2010-10-05 01:44:25 +0200 |
commit | 2444ac841fad00133f231e9667ab427c4ce4d39e (patch) | |
tree | f85d6a82d7aed6aa4d758fc3045858ec8f4452bc /src/core/ephraim_conv_handler.erl | |
parent | cabc0995c0e0964ecbef18470c6a483022879071 (diff) | |
download | ephraim-2444ac841fad00133f231e9667ab427c4ce4d39e.tar ephraim-2444ac841fad00133f231e9667ab427c4ce4d39e.zip |
Receiving messages works again (kinda)
Diffstat (limited to 'src/core/ephraim_conv_handler.erl')
-rw-r--r-- | src/core/ephraim_conv_handler.erl | 71 |
1 files changed, 71 insertions, 0 deletions
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}. |