summaryrefslogtreecommitdiffstats
path: root/core/ephraim.erl
blob: 6a68de0ccde64790e3ab5b712ebc14c77e099fb9 (plain)
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
-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) ->
    Key = exmpp_jid:to_lower(exmpp_jid:bare(JID)),
    case dict:find(Key, State#state.convs) of
	{ok, Conv} ->
	    {State, Conv};
	error ->
	    Conv = spawn(ephraim_conv, init, [Key]),
	    Dict = dict:store(Key, 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.