From cabc0995c0e0964ecbef18470c6a483022879071 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 4 Oct 2010 06:04:19 +0200 Subject: Major reorganisation of the core, still unfinished... --- src/core/ephraim_conn.erl | 96 ++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 51 deletions(-) (limited to 'src/core/ephraim_conn.erl') 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}. -- cgit v1.2.3