summaryrefslogtreecommitdiffstats
path: root/src/core/ephraim_conn.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ephraim_conn.erl')
-rw-r--r--src/core/ephraim_conn.erl96
1 files changed, 45 insertions, 51 deletions
diff --git a/src/core/ephraim_conn.erl b/src/core/ephraim_conn.erl
index 1ac5236..f4e14e0 100644
--- a/src/core/ephraim_conn.erl
+++ b/src/core/ephraim_conn.erl
@@ -1,15 +1,23 @@
-module(ephraim_conn).
--compile([debug_info, export_all]).
-include_lib("exmpp/include/exmpp_client.hrl").
-include_lib("exmpp/include/exmpp_xml.hrl").
+-behaviour(gen_server).
+-export([start_link/1]).
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
+-export([send_packet/2]).
-record(conn_state, {
- session :: any()
+ event_manager :: pid(),
+ session :: any()
}).
--spec init() -> ok.
-init() ->
- application:start(exmpp),
+start_link(EventManager) ->
+ gen_server:start_link(?MODULE, EventManager, []).
+
+%-spec init() -> ok.
+init(EventManager) ->
+ process_flag(trap_exit, true),
+
Session = exmpp_session:start(),
{jid, JID} = ephraim_config:get(jid),
@@ -20,55 +28,41 @@ init() ->
io:format("Connecting...~n"),
exmpp_session:connect_TCP(Session, Server, Port),
io:format("Connected.~n"),
- session(#conn_state{session=Session}).
+ session(Session),
+ {ok, #conn_state{event_manager=EventManager,session=Session}}.
--spec session(#conn_state{}) -> ok.
-session(State) ->
+-spec session(any()) -> ok.
+session(Session) ->
io:format("Logging in...~n"),
- exmpp_session:login(State#conn_state.session),
+ exmpp_session:login(Session),
io:format("Getting profile...~n"),
- exmpp_session:send_packet(State#conn_state.session, exmpp_iq:get('jabber:client', #xmlel{ns='vcard-temp',name='vCard'})),
+ exmpp_session:send_packet(Session, exmpp_iq:get('jabber:client', #xmlel{ns='vcard-temp',name='vCard'})),
io:format("Getting roster...~n"),
- exmpp_session:send_packet(State#conn_state.session, exmpp_client_roster:get_roster("foo")),
+ exmpp_session:send_packet(Session, exmpp_client_roster:get_roster("foo")),
io:format("Setting presence...~n"),
- exmpp_session:send_packet(State#conn_state.session, exmpp_presence:set_status(exmpp_presence:available(), "Foo/Test\\Bar")),
- io:format("Ok.~n"),
- loop(State).
+ exmpp_session:send_packet(Session, exmpp_presence:set_status(exmpp_presence:available(), "Foo/Test\\Bar")),
+ io:format("Ok.~n").
+
+send_packet(Connection, Packet) ->
+ gen_server:cast(Connection, {send_packet, Packet}).
+
+handle_call(_Msg, _From, State) ->
+ {noreply, State}.
+
+handle_cast({send_packet, Packet}, State) ->
+ exmpp_session:send_packet(State#conn_state.session, Packet),
+ {noreply, State}.
+
+handle_info(Msg = #received_packet{}, State) ->
+ gen_event:notify(State#conn_state.event_manager, {received_packet,Msg}),
+ {noreply, State};
+handle_info(Msg, State) ->
+ io:format("ephraim_conn: ~p~n", [Msg]),
+ {noreply, State}.
+
+terminate(_Reason, State) ->
+ io:format("Disconnecting...~n"),
+ exmpp_session:stop(State#conn_state.session).
--spec loop(#conn_state{}) -> ok.
-loop(State) ->
- receive
- stop ->
- exmpp_session:stop(State#conn_state.session);
-
- #received_packet{packet_type=presence, raw_packet=Packet} ->
- %io:format("Received packet ~p~n", [Packet]),
- ephraim ! {roster, {presence, Packet}},
- loop(State);
-
- #received_packet{packet_type=message, raw_packet=Packet} ->
- %io:format("Received packet ~p~n", [Packet]),
- From = exmpp_xml:get_attribute(Packet, from, <<"unknown">>),
- HasElement = exmpp_xml:has_element(Packet,'http://jabber.org/protocol/pubsub#event',event),
- if HasElement ->
- ephraim ! {receive_event, From, Packet};
- true ->
- ephraim ! {receive_message, From, Packet}
- end,
- loop(State);
-
- #received_packet{packet_type=iq, raw_packet=Packet} ->
- %io:format("Received packet ~p~n", [Packet]),
- From = exmpp_stanza:get_sender(Packet),
- IQ = exmpp_iq:xmlel_to_iq(Packet),
- ephraim ! {receive_iq, From, IQ},
- loop(State);
-
- {send_packet, Packet} ->
- exmpp_session:send_packet(State#conn_state.session, Packet),
- loop(State);
-
- Msg ->
- io:format("ephraim_conn: ~p~n", [Msg]),
- loop(State)
- end.
+code_change(_OldVersion, State, _Extra) ->
+ {ok, State}.