-module(pbx_conn). -behaviour(gen_server). -define(SERVER, ?MODULE). -export([start_link/0]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([send/1, ext/0, co/0, snapshot/1, monitor/1, button/1, dial/2, fco/1, type/0]). -include("config.hrl"). -include("opcodes.hrl"). start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [?HOST, ?PORT], []). init(Args) -> gen_server:cast(?SERVER, pbx_acse:associate()), [Host, Port] = Args, gen_tcp:connect(Host, Port, [binary, {packet, 2}]). handle_call(_Request, _From, State) -> {reply, ok, State}. handle_cast({ok, Reply}, Socket) -> gen_tcp:send(Socket, Reply), {noreply, Socket}. handle_info({tcp, _, Data}, Socket) -> case pbx_acse:decode(Data) of {ok, {asn1_ExtAlt, Data}} -> {ok, Rose} = pbx_rose:decode(Data), pbx_rose:dispatch(Rose); {ok, Acse} -> pbx_acse:dispatch(Acse) end, {noreply, Socket}; handle_info({tcp_closed, _}, Socket) -> {stop, normal, Socket}. terminate(_Reason, State) -> gen_server:cast(?SERVER, pbx_acse:release()), gen_tcp:close(State). code_change(_OldVsn, State, _Extra) -> {ok, State}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ext() -> gen_server:cast(?SERVER, pbx_rose:invoke(?ESCAPE, escape:lines(station))). co() -> gen_server:cast(?SERVER, pbx_rose:invoke(?ESCAPE, escape:lines(networkInterface))). send(Reply) -> gen_server:cast(?SERVER, Reply). snapshot(Device) -> gen_server:cast(?SERVER, pbx_rose:invoke(?SNAPSHOT, snapshot:encode({dialingNumber, Device}))). button(Device) -> gen_server:cast(?SERVER, pbx_rose:invoke(?BUTTON, button:encode({dialingNumber, Device}))). monitor(Device) -> gen_server:cast(?SERVER, pbx_rose:invoke(?MONITOR, monitor:encode({dialingNumber, Device}))). dial(From, To) -> gen_server:cast(?SERVER, pbx_rose:invoke(?MAKECALL, dial:encode({dialingNumber, From}, {dialingNumber, To}))). fco(Device) -> gen_server:cast(?SERVER, pbx_rose:invoke(?ESCAPE, escape:deviceData({dialingNumber, Device}))). type() -> gen_server:cast(?SERVER, pbx_rose:invoke(?ESCAPE, escape:pbxType())).