1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2000-2020. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20
21%%
22%%----------------------------------------------------------------------
23%% Purpose : Handle ASN.1 PER encoding of Megaco/H.248
24%%----------------------------------------------------------------------
25
26-module(megaco_per_encoder).
27
28-behaviour(megaco_encoder).
29
30-export([encode_message/3, decode_message/3,
31	 decode_mini_message/3,
32
33	 encode_transaction/3,
34	 encode_action_requests/3,
35	 encode_action_request/3,
36	 encode_action_reply/3,
37
38	 version_of/2]).
39
40%% Backward compatible functions:
41-export([encode_message/2, decode_message/2]).
42
43-include_lib("megaco/src/engine/megaco_message_internal.hrl").
44
45-define(V1_ASN1_MOD,     megaco_per_media_gateway_control_v1).
46-define(V2_ASN1_MOD,     megaco_per_media_gateway_control_v2).
47-define(V3_ASN1_MOD,     megaco_per_media_gateway_control_v3).
48
49-define(V1_TRANS_MOD,     megaco_binary_transformer_v1).
50-define(V2_TRANS_MOD,     megaco_binary_transformer_v2).
51-define(V3_TRANS_MOD,     megaco_binary_transformer_v3).
52
53-define(BIN_LIB, megaco_binary_encoder_lib).
54
55
56%%----------------------------------------------------------------------
57%% Detect (check/get) message version
58%% Return {ok, Version} | {error, Reason}
59%%----------------------------------------------------------------------
60
61%% <BACKWARD-COMPAT-CLAUSE>
62version_of([{version3,v3}|EC], Binary) ->
63    Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
64    ?BIN_LIB:version_of(EC, Binary, 1, Decoders);
65%% </BACKWARD-COMPAT-CLAUSE>
66
67version_of(EC, Binary) ->
68    Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
69    ?BIN_LIB:version_of(EC, Binary, 1, Decoders).
70
71
72%%----------------------------------------------------------------------
73%% Convert a 'MegacoMessage' record into a binary
74%% Return {ok, Binary} | {error, Reason}
75%%----------------------------------------------------------------------
76
77encode_message(EC,
78	       #'MegacoMessage'{mess = #'Message'{version = V}} = MegaMsg) ->
79    encode_message(EC, V, MegaMsg).
80
81
82%% -- Version 1 --
83
84%% <BACKWARD-COMPAT-CLAUSE>
85encode_message([{version3,_}|EC], 1, MegaMsg) ->
86    AsnMod   = ?V1_ASN1_MOD,
87    TransMod = ?V1_TRANS_MOD,
88    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
89%% </BACKWARD-COMPAT-CLAUSE>
90
91encode_message(EC, 1, MegaMsg) ->
92    AsnMod   = ?V1_ASN1_MOD,
93    TransMod = ?V1_TRANS_MOD,
94    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
95
96
97%% -- Version 2 --
98
99%% <BACKWARD-COMPAT-CLAUSE>
100encode_message([{version3,_}|EC], 2, MegaMsg) ->
101    AsnMod   = ?V2_ASN1_MOD,
102    TransMod = ?V2_TRANS_MOD,
103    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
104%% </BACKWARD-COMPAT-CLAUSE>
105
106encode_message(EC, 2, MegaMsg) ->
107    AsnMod   = ?V2_ASN1_MOD,
108    TransMod = ?V2_TRANS_MOD,
109    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
110
111
112%% -- Version 3 --
113
114%% <BACKWARD-COMPAT-CLAUSE>
115encode_message([{version3,v3}|EC], 3, MegaMsg) ->
116    AsnMod   = ?V3_ASN1_MOD,
117    TransMod = ?V3_TRANS_MOD,
118    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
119%% </BACKWARD-COMPAT-CLAUSE>
120
121encode_message(EC, 3, MegaMsg) ->
122    AsnMod   = ?V3_ASN1_MOD,
123    TransMod = ?V3_TRANS_MOD,
124    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list).
125
126
127%%----------------------------------------------------------------------
128%% Convert a transaction (or transactions in the case of ack) record(s)
129%% into a binary
130%% Return {ok, Binary} | {error, Reason}
131%%----------------------------------------------------------------------
132
133encode_transaction(_EC, 1, _Trans) ->
134%%     AsnMod   = ?V1_ASN1_MOD,
135%%     TransMod = ?V1_TRANS_MOD,
136%%     ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod,
137%%                                           io_list);
138    {error, not_implemented};
139encode_transaction(_EC, 2, _Trans) ->
140%%     AsnMod   = ?V2_ASN1_MOD,
141%%     TransMod = ?V2_TRANS_MOD,
142%%     ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod,
143%%                                           io_list);
144    {error, not_implemented};
145encode_transaction(_EC, 3, _Trans) ->
146%%     AsnMod   = ?V3_ASN1_MOD,
147%%     TransMod = ?V3_TRANS_MOD,
148%%     ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod,
149%%                                           io_list);
150    {error, not_implemented}.
151
152
153%%----------------------------------------------------------------------
154%% Convert a list of ActionRequest record's into a binary
155%% Return {ok, DeepIoList} | {error, Reason}
156%%----------------------------------------------------------------------
157encode_action_requests(_EC, 1, ActReqs) when is_list(ActReqs) ->
158%%     AsnMod   = ?V1_ASN1_MOD,
159%%     TransMod = ?V1_TRANS_MOD,
160%%     ?BIN_LIB:encode_action_requests(EC, ActReqs,
161%%                                                  AsnMod, TransMod,
162%%                                                  io_list);
163    {error, not_implemented};
164encode_action_requests(_EC, 2, ActReqs) when is_list(ActReqs) ->
165%%     AsnMod   = ?V2_ASN1_MOD,
166%%     TransMod = ?V2_TRANS_MOD,
167%%     ?BIN_LIB:encode_action_requests(EC, ActReqs,
168%%                                                  AsnMod, TransMod,
169%%                                                  io_list);
170    {error, not_implemented};
171encode_action_requests(_EC, 3, ActReqs) when is_list(ActReqs) ->
172%%     AsnMod   = ?V3_ASN1_MOD,
173%%     TransMod = ?V3_TRANS_MOD,
174%%     ?BIN_LIB:encode_action_requests(EC, ActReqs,
175%%                                                  AsnMod, TransMod,
176%%                                                  io_list);
177    {error, not_implemented}.
178
179
180%%----------------------------------------------------------------------
181%% Convert a ActionRequest record into a binary
182%% Return {ok, DeepIoList} | {error, Reason}
183%%----------------------------------------------------------------------
184encode_action_request(_EC, 1, _ActReq) ->
185%%     AsnMod   = ?V1_ASN1_MOD,
186%%     TransMod = ?V1_TRANS_MOD,
187%%     ?BIN_LIB:encode_action_request(EC, ActReq,
188%%                                                 AsnMod, TransMod,
189%%                                                 io_list);
190    {error, not_implemented};
191encode_action_request(_EC, 2, _ActReq) ->
192%%     AsnMod   = ?V2_ASN1_MOD,
193%%     TransMod = ?V2_TRANS_MOD,
194%%     ?BIN_LIB:encode_action_request(EC, ActReq,
195%%                                                 AsnMod, TransMod,
196%%                                                 io_list);
197    {error, not_implemented};
198encode_action_request(_EC, 3, _ActReq) ->
199%%     AsnMod   = ?V3_ASN1_MOD,
200%%     TransMod = ?V3_TRANS_MOD,
201%%     ?BIN_LIB:encode_action_request(EC, ActReq,
202%%                                                 AsnMod, TransMod,
203%%                                                 io_list);
204    {error, not_implemented}.
205
206
207
208%%----------------------------------------------------------------------
209%% Convert a action reply into a deep io list
210%% Not yest supported by this binary codec!
211%% Return {ok, DeepIoList} | {error, Reason}
212%%----------------------------------------------------------------------
213
214encode_action_reply(_EC, _V, _AcionReply) ->
215    {error, not_implemented}.
216
217
218%%----------------------------------------------------------------------
219%% Convert a binary into a 'MegacoMessage' record
220%% Return {ok, MegacoMessageRecord} | {error, Reason}
221%%----------------------------------------------------------------------
222
223decode_message(EC, Binary) ->
224    decode_message(EC, 1, Binary).
225
226%% PER does not support partial decode, so this means V1
227decode_message(EC, dynamic, Binary) ->
228    decode_message(EC, 1, Binary);
229
230
231%% -- Version 1 --
232
233%% <BACKWARD-COMPAT-CLAUSE>
234decode_message([{version3,_}|EC], 1, Binary) ->
235    AsnMod   = ?V1_ASN1_MOD,
236    TransMod = ?V1_TRANS_MOD,
237    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list);
238%% </BACKWARD-COMPAT-CLAUSE>
239
240decode_message(EC, 1, Binary) ->
241    AsnMod   = ?V1_ASN1_MOD,
242    TransMod = ?V1_TRANS_MOD,
243    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list);
244
245%% -- Version 2 --
246
247%% <BACKWARD-COMPAT-CLAUSE>
248decode_message([{version3,_}|EC], 2, Binary) ->
249    AsnMod   = ?V2_ASN1_MOD,
250    TransMod = ?V2_TRANS_MOD,
251    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list);
252%% </BACKWARD-COMPAT-CLAUSE>
253
254decode_message(EC, 2, Binary) ->
255    AsnMod   = ?V2_ASN1_MOD,
256    TransMod = ?V2_TRANS_MOD,
257    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list);
258
259%% -- Version 3 --
260
261%% <BACKWARD-COMPAT-CLAUSE>
262decode_message([{version3,v3}|EC], 3, Binary) ->
263    AsnMod   = ?V3_ASN1_MOD,
264    TransMod = ?V3_TRANS_MOD,
265    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list);
266%% </BACKWARD-COMPAT-CLAUSE>
267
268decode_message(EC, 3, Binary) ->
269    AsnMod   = ?V3_ASN1_MOD,
270    TransMod = ?V3_TRANS_MOD,
271    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list).
272
273decode_mini_message(_EC, _Vsn, _Bin) ->
274    {error, not_implemented}.
275