1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 1999-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 BER encoding of Megaco/H.248
24%%----------------------------------------------------------------------
25
26-module(megaco_ber_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_ber_media_gateway_control_v1).
46-define(V2_ASN1_MOD,     megaco_ber_media_gateway_control_v2).
47-define(V3_ASN1_MOD,     megaco_ber_media_gateway_control_v3).
48
49%% <DEPRECATED>
50-define(PREV3A_ASN1_MOD, megaco_ber_media_gateway_control_prev3a).
51-define(PREV3B_ASN1_MOD, megaco_ber_media_gateway_control_prev3b).
52-define(PREV3C_ASN1_MOD, megaco_ber_media_gateway_control_prev3c).
53%% </DEPRECATED>
54
55-define(V1_TRANS_MOD,     megaco_binary_transformer_v1).
56-define(V2_TRANS_MOD,     megaco_binary_transformer_v2).
57-define(V3_TRANS_MOD,     megaco_binary_transformer_v3).
58
59%% <DEPRECATED>
60-define(PREV3A_TRANS_MOD, megaco_binary_transformer_prev3a).
61-define(PREV3B_TRANS_MOD, megaco_binary_transformer_prev3b).
62-define(PREV3C_TRANS_MOD, megaco_binary_transformer_prev3c).
63%% </DEPRECATED>
64
65-define(BIN_LIB, megaco_binary_encoder_lib).
66
67
68%%----------------------------------------------------------------------
69%% Detect (check/get) message version
70%% Return {ok, Version} | {error, Reason}
71%%----------------------------------------------------------------------
72
73%% <DEPRECATED>
74version_of([{version3,prev3c}|EC], Binary) ->
75    Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3C_ASN1_MOD],
76    ?BIN_LIB:version_of(EC, Binary, 1, Decoders);
77version_of([{version3,prev3b}|EC], Binary) ->
78    Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3B_ASN1_MOD],
79    ?BIN_LIB:version_of(EC, Binary, 1, Decoders);
80version_of([{version3,prev3a}|EC], Binary) ->
81    Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3A_ASN1_MOD],
82    ?BIN_LIB:version_of(EC, Binary, 1, Decoders);
83%% <DEPRECATED>
84
85%% <BACKWARD-COMPAT-CLAUSE>
86version_of([{version3,v3}|EC], Binary) ->
87    Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
88    ?BIN_LIB:version_of(EC, Binary, 1, Decoders);
89%% </BACKWARD-COMPAT-CLAUSE>
90
91version_of(EC, Binary) ->
92    Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
93    ?BIN_LIB:version_of(EC, Binary, 1, Decoders).
94
95
96%%----------------------------------------------------------------------
97%% Convert a 'MegacoMessage' record into a binary
98%% Return {ok, Binary} | {error, Reason}
99%%----------------------------------------------------------------------
100
101encode_message(EC,
102	       #'MegacoMessage'{mess = #'Message'{version = V}} = MegaMsg) ->
103    encode_message(EC, V, MegaMsg).
104
105
106%% -- Version 1 --
107
108%% <BACKWARD-COMPAT-CLAUSE>
109encode_message([{version3,_}|EC], 1, MegaMsg) ->
110    AsnMod   = ?V1_ASN1_MOD,
111    TransMod = ?V1_TRANS_MOD,
112    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
113%% </BACKWARD-COMPAT-CLAUSE>
114
115encode_message(EC, 1, MegaMsg) ->
116    AsnMod   = ?V1_ASN1_MOD,
117    TransMod = ?V1_TRANS_MOD,
118    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
119
120
121%% -- Version 2 --
122
123%% <BACKWARD-COMPAT-CLAUSE>
124encode_message([{version3,_}|EC], 2, MegaMsg) ->
125    AsnMod   = ?V2_ASN1_MOD,
126    TransMod = ?V2_TRANS_MOD,
127    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
128%% </BACKWARD-COMPAT-CLAUSE>
129
130encode_message(EC, 2, MegaMsg) ->
131    AsnMod   = ?V2_ASN1_MOD,
132    TransMod = ?V2_TRANS_MOD,
133    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
134
135
136%% -- Version 3 --
137
138%% <DEPRECATED>
139encode_message([{version3,prev3c}|EC], 3, MegaMsg) ->
140    AsnMod   = ?PREV3C_ASN1_MOD,
141    TransMod = ?PREV3C_TRANS_MOD,
142    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
143encode_message([{version3,prev3b}|EC], 3, MegaMsg) ->
144    AsnMod   = ?PREV3B_ASN1_MOD,
145    TransMod = ?PREV3B_TRANS_MOD,
146    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
147encode_message([{version3,prev3a}|EC], 3, MegaMsg) ->
148    AsnMod   = ?PREV3A_ASN1_MOD,
149    TransMod = ?PREV3A_TRANS_MOD,
150    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
151%% </DEPRECATED>
152
153%% <BACKWARD-COMPAT-CLAUSE>
154encode_message([{version3,v3}|EC], 3, MegaMsg) ->
155    AsnMod   = ?V3_ASN1_MOD,
156    TransMod = ?V3_TRANS_MOD,
157    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
158%% </BACKWARD-COMPAT-CLAUSE>
159
160encode_message(EC, 3, MegaMsg) ->
161    AsnMod   = ?V3_ASN1_MOD,
162    TransMod = ?V3_TRANS_MOD,
163    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list).
164
165
166%%----------------------------------------------------------------------
167%% Convert a transaction (or transactions in the case of ack) record(s)
168%% into a binary
169%% Return {ok, Binary} | {error, Reason}
170%%----------------------------------------------------------------------
171
172encode_transaction(_EC, 1, _Trans) ->
173%%     AsnMod   = ?V1_ASN1_MOD,
174%%     TransMod = ?V1_TRANS_MOD,
175%%     ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod,
176%% 					     io_list);
177    {error, not_implemented};
178encode_transaction(_EC, 2, _Trans) ->
179%%     AsnMod   = ?V2_ASN1_MOD,
180%%     TransMod = ?V2_TRANS_MOD,
181%%     ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod,
182%% 					     io_list);
183    {error, not_implemented};
184encode_transaction(_EC, 3, _Trans) ->
185%%     AsnMod   = ?V3_ASN1_MOD,
186%%     TransMod = ?V3_TRANS_MOD,
187%%     ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod,
188%% 					     io_list);
189    {error, not_implemented}.
190
191
192%%----------------------------------------------------------------------
193%% Convert a list of ActionRequest record's into a binary
194%% Return {ok, DeepIoList} | {error, Reason}
195%%----------------------------------------------------------------------
196encode_action_requests(_EC, 1, ActReqs) when is_list(ActReqs) ->
197%%     AsnMod   = ?V1_ASN1_MOD,
198%%     TransMod = ?V1_TRANS_MOD,
199%%     ?BIN_LIB:encode_action_requests(EC, ActReqs,
200%% 						    AsnMod, TransMod,
201%% 						    io_list);
202    {error, not_implemented};
203encode_action_requests(_EC, 2, ActReqs) when is_list(ActReqs) ->
204%%     AsnMod   = ?V2_ASN1_MOD,
205%%     TransMod = ?V2_TRANS_MOD,
206%%     ?BIN_LIB:encode_action_requests(EC, ActReqs,
207%% 						    AsnMod, TransMod,
208%% 						    io_list);
209    {error, not_implemented};
210encode_action_requests(_EC, 3, ActReqs) when is_list(ActReqs) ->
211%%     AsnMod   = ?V3_ASN1_MOD,
212%%     TransMod = ?V3_TRANS_MOD,
213%%     ?BIN_LIB:encode_action_requests(EC, ActReqs,
214%% 						    AsnMod, TransMod,
215%% 						    io_list);
216    {error, not_implemented}.
217
218
219%%----------------------------------------------------------------------
220%% Convert a ActionRequest record into a binary
221%% Return {ok, DeepIoList} | {error, Reason}
222%%----------------------------------------------------------------------
223encode_action_request(_EC, 1, _ActReq) ->
224%%     AsnMod   = ?V1_ASN1_MOD,
225%%     TransMod = ?V1_TRANS_MOD,
226%%     ?BIN_LIB:encode_action_request(EC, ActReq,
227%% 						   AsnMod, TransMod,
228%% 						   io_list);
229    {error, not_implemented};
230encode_action_request(_EC, 2, _ActReq) ->
231%%     AsnMod   = ?V2_ASN1_MOD,
232%%     TransMod = ?V2_TRANS_MOD,
233%%     ?BIN_LIB:encode_action_request(EC, ActReq,
234%% 						   AsnMod, TransMod,
235%% 						   io_list);
236    {error, not_implemented};
237encode_action_request(_EC, 3, _ActReq) ->
238%%     AsnMod   = ?V3_ASN1_MOD,
239%%     TransMod = ?V3_TRANS_MOD,
240%%     ?BIN_LIB:encode_action_request(EC, ActReq,
241%% 						   AsnMod, TransMod,
242%% 						   io_list);
243    {error, not_implemented}.
244
245
246%%----------------------------------------------------------------------
247%% Convert a action reply into a deep io list
248%% Not yest supported by this binary codec!
249%% Return {ok, DeepIoList} | {error, Reason}
250%%----------------------------------------------------------------------
251
252encode_action_reply(_EC, _V, _AcionReply) ->
253    {error, not_implemented}.
254
255
256%%----------------------------------------------------------------------
257%% Convert a binary into a 'MegacoMessage' record
258%% Return {ok, MegacoMessageRecord} | {error, Reason}
259%%----------------------------------------------------------------------
260
261decode_message(EC, Binary) ->
262    decode_message(EC, 1, Binary).
263
264%% Not supported for this codec, revert to version 1
265decode_message(EC, dynamic, Binary) ->
266    decode_message(EC, 1, Binary);
267
268
269%% -- Version 1 --
270
271%% <BACKWARD-COMPAT-CLAUSE>
272decode_message([{version3,_}|EC], 1, Binary) ->
273    AsnMod   = ?V1_ASN1_MOD,
274    TransMod = ?V1_TRANS_MOD,
275    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
276%% </BACKWARD-COMPAT-CLAUSE>
277
278decode_message(EC, 1, Binary) ->
279    AsnMod   = ?V1_ASN1_MOD,
280    TransMod = ?V1_TRANS_MOD,
281    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
282
283
284%% -- Version 2 --
285
286%% <BACKWARD-COMPAT-CLAUSE>
287decode_message([{version3,_}|EC], 2, Binary) ->
288    AsnMod   = ?V2_ASN1_MOD,
289    TransMod = ?V2_TRANS_MOD,
290    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
291%% </BACKWARD-COMPAT-CLAUSE>
292
293decode_message(EC, 2, Binary) ->
294    AsnMod   = ?V2_ASN1_MOD,
295    TransMod = ?V2_TRANS_MOD,
296    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
297
298
299%% -- Version 3 --
300
301%% <DEPRECATED>
302decode_message([{version3,prev3c}|EC], 3, Binary) ->
303    AsnMod   = ?PREV3C_ASN1_MOD,
304    TransMod = ?PREV3C_TRANS_MOD,
305    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
306decode_message([{version3,prev3b}|EC], 3, Binary) ->
307    AsnMod   = ?PREV3B_ASN1_MOD,
308    TransMod = ?PREV3B_TRANS_MOD,
309    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
310decode_message([{version3,prev3a}|EC], 3, Binary) ->
311    AsnMod   = ?PREV3A_ASN1_MOD,
312    TransMod = ?PREV3A_TRANS_MOD,
313    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
314%% </DEPRECATED>
315
316%% <BACKWARD-COMPAT-CLAUSE>
317decode_message([{version3,v3}|EC], 3, Binary) ->
318    AsnMod   = ?V3_ASN1_MOD,
319    TransMod = ?V3_TRANS_MOD,
320    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
321%% </BACKWARD-COMPAT-CLAUSE>
322
323decode_message(EC, 3, Binary) ->
324    AsnMod   = ?V3_ASN1_MOD,
325    TransMod = ?V3_TRANS_MOD,
326    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary).
327
328
329%% <DEPRECATED>
330decode_mini_message([{version3,prev3c}|EC], dynamic, Bin) ->
331    Mods = [?V1_ASN1_MOD,
332	    ?V2_ASN1_MOD,
333	    ?PREV3C_ASN1_MOD],
334    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
335decode_mini_message([{version3,prev3b}|EC], dynamic, Bin) ->
336    Mods = [?V1_ASN1_MOD,
337	    ?V2_ASN1_MOD,
338	    ?PREV3B_ASN1_MOD],
339    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
340decode_mini_message([{version3,prev3a}|EC], dynamic, Bin) ->
341    Mods = [?V1_ASN1_MOD,
342	    ?V2_ASN1_MOD,
343	    ?PREV3A_ASN1_MOD],
344    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
345%% </DEPRECATED>
346
347%% <BACKWARD-COMPAT-CLAUSE>
348decode_mini_message([{version3,v3}|EC], dynamic, Bin) ->
349    Mods = [?V1_ASN1_MOD,
350	    ?V2_ASN1_MOD,
351	    ?V3_ASN1_MOD],
352    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
353%% </BACKWARD-COMPAT-CLAUSE>
354
355decode_mini_message(EC, dynamic, Bin) ->
356    Mods = [?V1_ASN1_MOD,
357	    ?V2_ASN1_MOD,
358	    ?V3_ASN1_MOD],
359    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
360
361%% <BACKWARD-COMPAT-CLAUSE>
362decode_mini_message([{version3,_}|EC], 1, Bin) ->
363    AsnMod = ?V1_ASN1_MOD,
364    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
365%% </BACKWARD-COMPAT-CLAUSE>
366
367decode_mini_message(EC, 1, Bin) ->
368    AsnMod = ?V1_ASN1_MOD,
369    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
370
371%% <BACKWARD-COMPAT-CLAUSE>
372decode_mini_message([{version3,_}|EC], 2, Bin) ->
373    AsnMod = ?V2_ASN1_MOD,
374    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
375%% </BACKWARD-COMPAT-CLAUSE>
376
377decode_mini_message(EC, 2, Bin) ->
378    AsnMod = ?V2_ASN1_MOD,
379    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
380
381%% <DEPRECATED>
382decode_mini_message([{version3,prev3c}|EC], 3, Bin) ->
383    AsnMod = ?PREV3C_ASN1_MOD,
384    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
385decode_mini_message([{version3,prev3b}|EC], 3, Bin) ->
386    AsnMod = ?PREV3B_ASN1_MOD,
387    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
388decode_mini_message([{version3,prev3a}|EC], 3, Bin) ->
389    AsnMod = ?PREV3A_ASN1_MOD,
390    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
391%% </DEPRECATED>
392
393
394%% <BACKWARD-COMPAT-CLAUSE>
395decode_mini_message([{version3,v3}|EC], 3, Bin) ->
396    AsnMod = ?V3_ASN1_MOD,
397    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
398%% </BACKWARD-COMPAT-CLAUSE>
399
400decode_mini_message(EC, 3, Bin) ->
401    AsnMod = ?V3_ASN1_MOD,
402    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary).
403
404
405