1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
-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.
|