diff options
Diffstat (limited to 'src/core/ephraim.erl')
-rw-r--r-- | src/core/ephraim.erl | 167 |
1 files changed, 21 insertions, 146 deletions
diff --git a/src/core/ephraim.erl b/src/core/ephraim.erl index 61387a5..c0736c6 100644 --- a/src/core/ephraim.erl +++ b/src/core/ephraim.erl @@ -1,152 +1,27 @@ -module(ephraim). --compile([debug_info, export_all]). +-behaviour(application). +-behaviour(supervisor). +-export([start/2, stop/1]). +-export([init/1]). +-export([notify/1]). --record(state, { - conn :: pid(), - roster :: pid(), - event :: pid(), - gui :: pid(), - convs :: dict(), - uis :: set() - }). +%-spec start() -> ok. +start(_Type, _Args) -> + Result = supervisor:start_link(?MODULE, []), + ephraim_gui:start(), + Result. --spec start() -> ok. -start() -> - spawn(?MODULE, init, []), +%-spec stop() -> ok. +stop(_State) -> ok. --spec stop() -> ok. -stop() -> - ephraim ! stop, - ok. - --spec init() -> ok. -init() -> - register(ephraim, self()), - - ephraim_config:start_link(), - - GUI = spawn(ephraim_gui, init, []), - Conn = spawn(ephraim_conn, init, []), - Roster = spawn(ephraim_roster, init, []), - Event = spawn(ephraim_event, init, []), - loop(#state{conn=Conn,roster=Roster,event=Event,gui=GUI,convs=dict:new(),uis=sets:new()}), - init:stop(). - --spec get_conv(#state{},exmpp_jid:jid()) -> {#state{},pid()|undefined}. -get_conv(State, JID) -> - {Node, Domain, Resource} = exmpp_jid:to_lower(exmpp_jid:parse(JID)), - - case Resource of - undefined -> - {State, undefined}; - _ -> - Key = list_to_binary([Node, <<"@">>, Domain, <<"/">>, Resource]), - - 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), - self() ! {ui_update, {new_conversation, Key}}, - {State#state{convs=Dict}, Conv} - end - end. - --spec get_alias(binary()) -> binary(). -get_alias(JID) -> - ephraim ! {self(),get_alias,JID}, - receive - {alias,JID,Alias} -> - Alias - end. +-spec init(term()) -> ok. +init(_Args) -> + {ok, {{rest_for_one, 1, 60}, + [{event_man, {gen_event, start_link, [{local, ephraim_event_man}]}, permanent, 1000, worker, [gen_event]}, + {config, {ephraim_config, start_link, []}, permanent, 1000, worker, [ephraim_config]}, + {accounts, {ephraim_accounts, start_link, []}, permanent, infinity, supervisor, [ephraim_accounts]}]}}. --spec loop(#state{}) -> ok. -loop(State) -> - receive - stop -> - ephraim_util:send_all_values(State#state.convs, stop), - State#state.conn ! stop, - State#state.roster ! stop, - State#state.event ! stop, - State#state.gui ! stop, - ok; - - {register_ui, Pid} -> - io:format("Registered UI ~p~n", [Pid]), - UIs = State#state.uis, - State2 = State#state{uis=sets:add_element(Pid,UIs)}, - loop(State2); - - {unregister_ui, Pid} -> - io:format("Unregistered UI ~p~n", [Pid]), - UIs = State#state.uis, - State2 = State#state{uis=sets:del_element(Pid,UIs)}, - Size = sets:size(State2#state.uis), - if Size =:= 0 -> - self() ! stop; - true -> - ok - end, - loop(State2); - - {ui_update, Msg} -> - ephraim_util:send_all(sets:to_list(State#state.uis), Msg), - loop(State); - - {roster, Packet} -> - State#state.roster ! Packet, - loop(State); - - {receive_message, From, Packet} -> - {State2, Conv} = get_conv(State, From), - case Conv of - undefined -> - io:format("~p~n", [Packet]); - _ -> - Conv ! {receive_message, Packet} - end, - loop(State2); - - {send_message, To, Type, Message} -> - {State2, Conv} = get_conv(State, To), - case Conv of - undefined -> - io:format("ephraim: send_message: ~p~n", [Message]); - _ -> - Conv ! {send_message, Type, Message} - end, - loop(State2); - - {start_conversation, To} -> - {State2, _Conv} = get_conv(State, To), - loop(State2); - - {send_packet, Packet} -> - State#state.conn ! {send_packet, Packet}, - loop(State); - - {receive_event, From, Packet} -> - State#state.event ! {receive_event, From, Packet}, - loop(State); - - {receive_iq, From, IQ} -> - case IQ of - {iq, response, result, _, 'jabber:iq:roster', Payload, _, _, 'jabber:client'} -> - State#state.roster ! {roster_iq, Payload}; - {iq, response, result, _, 'vcard-temp', Payload, _, _, 'jabber:client'} -> - State#state.roster ! {vcard_iq, From, Payload}; - _ -> - ok %io:format("ephraim: IQ from ~p: ~p~n", [From, IQ]) - end, - loop(State); - - {Pid, get_alias, JID} -> - State#state.roster ! {Pid,get_alias,JID}, - loop(State); - - Msg -> - io:format("ephraim: ~p~n", [Msg]), - loop(State) - end. +-spec notify(term()) -> ok. +notify(Event) -> + gen_event:notify(ephraim_event_man, Event). |