summaryrefslogtreecommitdiff
path: root/src/pbx_conn.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/pbx_conn.erl')
-rw-r--r--src/pbx_conn.erl84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/pbx_conn.erl b/src/pbx_conn.erl
new file mode 100644
index 0000000..af319fb
--- /dev/null
+++ b/src/pbx_conn.erl
@@ -0,0 +1,84 @@
+-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, 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 acse:decode(Data) of
+ {ok, {asn1_ExtAlt, Data}} ->
+ {ok, Rose} = rose:decode(Data),
+ rose:dispatch(Rose);
+ {ok, Acse} ->
+ acse:dispatch(Acse)
+ end,
+ {noreply, Socket};
+
+handle_info({tcp_closed, _}, Socket) ->
+ {stop, normal, Socket}.
+
+terminate(_Reason, State) ->
+ gen_server:cast(?SERVER, acse:release()),
+ gen_tcp:close(State).
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ext() ->
+ gen_server:cast(?SERVER, rose:invoke(?ESCAPE,
+ escape:lines(station))).
+
+co() ->
+ gen_server:cast(?SERVER, rose:invoke(?ESCAPE,
+ escape:lines(networkInterface))).
+
+send(Reply) ->
+ gen_server:cast(?SERVER, Reply).
+
+snapshot(Device) ->
+ gen_server:cast(?SERVER, rose:invoke(?SNAPSHOT,
+ snapshot:encode({dialingNumber, Device}))).
+
+button(Device) ->
+ gen_server:cast(?SERVER, rose:invoke(?BUTTON,
+ button:encode({dialingNumber, Device}))).
+
+monitor(Device) ->
+ gen_server:cast(?SERVER, rose:invoke(?MONITOR,
+ monitor:encode({dialingNumber, Device}))).
+
+dial(From, To) ->
+ gen_server:cast(?SERVER, rose:invoke(?MAKECALL,
+ dial:encode({dialingNumber, From}, {dialingNumber, To}))).
+
+fco(Device) ->
+ gen_server:cast(?SERVER, rose:invoke(?ESCAPE,
+ escape:deviceData({dialingNumber, Device}))).
+
+type() ->
+ gen_server:cast(?SERVER, rose:invoke(?ESCAPE, escape:pbxType())).