summaryrefslogtreecommitdiffstats
path: root/src/core/ephraim.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ephraim.erl')
-rw-r--r--src/core/ephraim.erl38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/core/ephraim.erl b/src/core/ephraim.erl
index 523749c..bd36118 100644
--- a/src/core/ephraim.erl
+++ b/src/core/ephraim.erl
@@ -4,6 +4,7 @@
-record(state, {
conn :: pid(),
roster :: pid(),
+ event :: pid(),
convs :: dict(),
uis :: set()
}).
@@ -25,29 +26,35 @@ init() ->
Conn = spawn(ephraim_conn, init, []),
Roster = spawn(ephraim_roster, init, []),
- loop(#state{conn=Conn,roster=Roster,convs=dict:new(),uis=sets:new()}),
+ Event = spawn(ephraim_event, init, []),
+ loop(#state{conn=Conn,roster=Roster,event=Event,convs=dict:new(),uis=sets:new()}),
init:stop().
--spec get_conv(#state{},exmpp_jid:jid()) -> {#state{},pid()}.
+-spec get_conv(#state{},exmpp_jid:jid()) -> {#state{},pid()|undefined}.
get_conv(State, JID) ->
Key = exmpp_jid:to_lower(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}
+ case Key of
+ {_,_,undefined} ->
+ {State, undefined};
+ _ ->
+ 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
end.
-spec loop(#state{}) -> ok.
loop(State) ->
receive
stop ->
- %dict:fold(fun(_,Conv,Msg) -> Conv ! Msg end, stop, State#state.convs),
ephraim_util:send_all_values(State#state.convs, stop),
State#state.conn ! stop,
State#state.roster ! stop,
+ State#state.event ! stop,
ok;
{register_ui, Pid} ->
@@ -78,9 +85,18 @@ loop(State) ->
{receive_message, From, Packet} ->
{State2, Conv} = get_conv(State, From),
- Conv ! {receive_message, Packet},
+ case Conv of
+ undefined ->
+ io:format("~p~n", [Packet]);
+ _ ->
+ Conv ! {receive_message, Packet}
+ end,
loop(State2);
+ {receive_event, From, Packet} ->
+ State#state.event ! {receive_event, From, Packet},
+ loop(State);
+
{receive_iq, IQ} ->
case IQ of
{iq, response, result, _, 'jabber:iq:roster', Payload, _, _, 'jabber:client'} ->