summaryrefslogtreecommitdiff
path: root/src/pbx_rose.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/pbx_rose.erl')
-rw-r--r--src/pbx_rose.erl80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/pbx_rose.erl b/src/pbx_rose.erl
new file mode 100644
index 0000000..3e6f730
--- /dev/null
+++ b/src/pbx_rose.erl
@@ -0,0 +1,80 @@
+-module(pbx_rose).
+
+-export([decode/1, invoke/2, dispatch/1]).
+
+-include("opcodes.hrl").
+-include("Remote-Operations-Generic-ROS-PDUs.hrl").
+
+decode(Data) ->
+ 'Remote-Operations-Generic-ROS-PDUs':decode('ROS', Data).
+
+return(Id, Op, {ok, Data}) ->
+ 'Remote-Operations-Generic-ROS-PDUs':encode('ROS', {returnResult,
+ #'ReturnResult'{invokeId = Id,
+ result = #'ReturnResult_result'{opcode = Op, result = Data}}}).
+
+invoke(Op, {ok, Data}) ->
+ Id = pbx_invoke:next(),
+ 'Remote-Operations-Generic-ROS-PDUs':encode('ROS', {invoke,
+ #'Invoke'{invokeId = Id, opcode = Op, argument = Data}}).
+
+dispatch({invoke, #'Invoke'{invokeId = Id, opcode = Op, argument = Data}}) ->
+ pbx_invoke:set(Id),
+ case Op of
+ ?MAKECALL ->
+ ok;
+ ?BUTTON ->
+ ok;
+ ?EVENT ->
+ {ok, Event} = event:decode(Data),
+ io:format("Event: ~p~n", [Event]),
+ ok;
+ ?ESCAPE ->
+ escape:privateData(escape:decode(Data));
+ ?MONITOR ->
+ ok;
+ ?SNAPSHOT ->
+ ok;
+ ?STATUS ->
+ %io:format("Status: ~p~n", [status:value(Data)]),
+ tapi:send(return(Id, Op, status:encode()));
+ _ ->
+ error
+ end;
+
+dispatch({returnResult, #'ReturnResult'{invokeId = Id, result = Data}}) ->
+ pbx_invoke:set(Id),
+ dispatch(Data);
+
+dispatch({returnError, #'ReturnError'{invokeId = Id, errcode = Op, parameter = Data}}) ->
+ pbx_invoke:set(Id),
+ case Op of
+ ?ERROR ->
+ {ok, Error} = error:decode(Data),
+ io:format("Error: ~p~n", [Error])
+ end,
+ error;
+
+dispatch({reject, #'Reject'{invokeId = Id, problem = Problem}}) ->
+ pbx_invoke:set(Id),
+ io:format("Problem: ~p~n", [Problem]),
+ error;
+
+dispatch(#'ReturnResult_result'{opcode = Op, result = Data}) ->
+ case Op of
+ ?MAKECALL ->
+ {ok, Result} = dial:decode(Data),
+ io:format("Make call: ~p~n", [Result]);
+ ?BUTTON ->
+ {ok, List} = button:decode(Data),
+ io:format("List: ~p~n", [List]);
+ ?MONITOR ->
+ {ok, Status} = monitor:decode(Data),
+ io:format("Result: ~p~n", [Status]);
+ ?SNAPSHOT ->
+ {ok, Status} = snapshot:decode(Data),
+ io:format("Result: ~p~n", [Status]);
+ _ ->
+ io:format("Result: ~p~n", [Data])
+ end,
+ ok.