summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/ephraim.erl62
-rw-r--r--core/ephraim_conn.erl45
-rw-r--r--core/ephraim_conv.erl23
3 files changed, 130 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.
diff --git a/core/ephraim_conn.erl b/core/ephraim_conn.erl
new file mode 100644
index 0000000..18edd6a
--- /dev/null
+++ b/core/ephraim_conn.erl
@@ -0,0 +1,45 @@
+-module(ephraim_conn).
+-include_lib("exmpp/include/exmpp_client.hrl").
+-compile([debug_info, export_all]).
+
+-record(conn_state, {
+ session :: any(),
+ roster :: any()
+ }).
+
+-spec init() -> ok.
+init() ->
+ application:start(exmpp),
+ Session = exmpp_session:start(),
+ JID = exmpp_jid:make("ephraim-test", "jabber.ccc.de", "Bar"),
+ exmpp_session:auth_basic_digest(Session, JID, "foobarbla"),
+ exmpp_session:connect_TCP(Session, "jabber.ccc.de", 5222),
+ session(#conn_state{session=Session}).
+
+-spec session(#conn_state{}) -> ok.
+session(State) ->
+ exmpp_session:login(State#conn_state.session),
+ exmpp_session:send_packet(State#conn_state.session, exmpp_presence:set_status(exmpp_presence:available(), "Foo/Test\\Bar")),
+ loop(State).
+
+-spec loop(#conn_state{}) -> ok.
+loop(State) ->
+ receive
+ stop ->
+ exmpp_session:stop(State#conn_state.session);
+
+ #received_packet{packet_type=presence, raw_packet=Packet} ->
+ From = exmpp_xml:get_attribute(Packet, from, <<"unknown">>),
+ Type = atom_to_list(exmpp_presence:get_type(Packet)),
+ Status = exmpp_presence:get_status(Packet),
+ io:format("~ts is now ~ts: ~ts~n", [From, Type, Status]),
+ loop(State);
+
+ #received_packet{packet_type=message, raw_packet=Packet} ->
+ From = exmpp_xml:get_attribute(Packet, from, <<"unknown">>),
+ ephraim ! {receive_message, From, Packet},
+ loop(State);
+ Msg ->
+ io:format("ephraim_conn: ~p~n", [Msg]),
+ loop(State)
+ end.
diff --git a/core/ephraim_conv.erl b/core/ephraim_conv.erl
new file mode 100644
index 0000000..99c7668
--- /dev/null
+++ b/core/ephraim_conv.erl
@@ -0,0 +1,23 @@
+-module(ephraim_conv).
+-compile([debug_info, export_all]).
+
+-record(conv_state, {
+ jid :: exmpp_jid:jid()
+ }).
+
+-spec init(exmpp_jid:jid()) -> ok.
+init(JID) ->
+ loop(#conv_state{jid=JID}).
+
+-spec loop(#conv_state{}) -> ok.
+loop(State) ->
+ receive
+ stop ->
+ ok;
+ {receive_message, Packet} ->
+ io:format("Received packet from ~p: ~p~n", [State#conv_state.jid, Packet]),
+ loop(State);
+ Msg ->
+ io:format("ephraim_conv (~p): ~p~n", [State#conv_state.jid, Msg]),
+ loop(State)
+ end.