-module(ephraim). -compile([debug_info, export_all]). -record(state, { conn :: pid(), convs :: dict:dictionary() }). start() -> Pid = spawn(?MODULE, init, []), register(ephraim, Pid). stop() -> ephraim ! stop. init() -> Conn = spawn(ephraim_conn, init, []), loop(#state{conn=Conn,convs=dict:new()}). get_conv(State, JID) -> case dict:find(JID, State#state.convs) of {ok, Conv} -> {State, Conv}; error -> Conv = spawn(ephraim_conv, init, [JID]), Dict = dict:store(JID, Conv, State#state.convs), {State#state{convs=Dict}, Conv} end. loop(State) -> receive stop -> dict:fold(fun(_,Conv,Msg) -> Conv ! Msg end, stop, State#state.convs), State#state.conn ! stop; {receive_message, From, Packet} -> {State2, Conv} = get_conv(State, From), Conv ! {receive_message, Packet}, loop(State2); Msg -> io:format("ephraim: ~p~n", [Msg]), loop(State) end.