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.erl167
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).