-module(ephraim). -compile([debug_info, export_all]). -record(state, { conn :: pid(), convs :: dict(), guis :: set() }). -spec start() -> ok. start() -> Pid = spawn(?MODULE, init, []), case register(ephraim, Pid) of true -> ok end. -spec stop() -> ok. stop() -> ephraim ! stop, ok. -spec init() -> ok. init() -> Conn = spawn(ephraim_conn, init, []), loop(#state{conn=Conn,convs=dict:new(),guis=sets:new()}). -spec get_conv(#state{},exmpp_jid:jid()) -> {#state{},pid()}. 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. -spec loop(#state{}) -> ok. loop(State) -> receive stop -> dict:fold(fun(_,Conv,Msg) -> Conv ! Msg end, stop, State#state.convs), State#state.conn ! stop, ok; {register_gui, Pid} -> GUIs = State#state.guis, State2 = State#state{guis=sets:add_element(Pid,GUIs)}, loop(State2); {unregister_gui, Pid} -> GUIs = State#state.guis, State2 = State#state{guis=sets:del_element(Pid,GUIs)}, loop(State2); {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.