summaryrefslogtreecommitdiff
path: root/src/pbx_conn.erl
blob: 4c570d614cf68a9fcb741691f03fa27f5ad1e7a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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, 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())).