summaryrefslogtreecommitdiffstats
path: root/core/ephraim.erl
diff options
context:
space:
mode:
Diffstat (limited to 'core/ephraim.erl')
-rw-r--r--core/ephraim.erl62
1 files changed, 62 insertions, 0 deletions
diff --git a/core/ephraim.erl b/core/ephraim.erl
new file mode 100644
index 0000000..6a68de0
--- /dev/null
+++ b/core/ephraim.erl
@@ -0,0 +1,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.