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 BER encoding of Megaco/H.248
24%%----------------------------------------------------------------------
25
26-module(megaco_binary_encoder).
27
28-behaviour(megaco_encoder).
29
30%% API
31-export([encode_message/3, decode_message/3,
32	 decode_mini_message/3,
33
34	 encode_transaction/3,
35	 encode_action_requests/3,
36	 encode_action_request/3,
37	 encode_action_reply/3,
38
39	 version_of/2]).
40
41%% Backward compatible functions:
42-export([encode_message/2, decode_message/2]).
43
44-include_lib("megaco/src/engine/megaco_message_internal.hrl").
45
46-define(BIN_LIB, megaco_binary_encoder_lib).
47
48
49%%----------------------------------------------------------------------
50%% Convert a 'MegacoMessage' record into a binary
51%% Return {ok, Binary} | {error, Reason}
52%%----------------------------------------------------------------------
53
54encode_message(EC,
55	       #'MegacoMessage'{mess = #'Message'{version = V}} = MegaMsg) ->
56    encode_message(EC, V, MegaMsg).
57
58%% <BACKWARD-COMPAT-CLAUSE>
59encode_message([{version3,_}|EC], 1, MegaMsg) ->
60    AsnMod   = megaco_ber_media_gateway_control_v1,
61    TransMod = megaco_binary_transformer_v1,
62    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
63%% </BACKWARD-COMPAT-CLAUSE>
64
65encode_message(EC, 1, MegaMsg) ->
66    AsnMod   = megaco_ber_media_gateway_control_v1,
67    TransMod = megaco_binary_transformer_v1,
68    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
69
70%% <BACKWARD-COMPAT-CLAUSE>
71encode_message([{version3,_}|EC], 2, MegaMsg) ->
72    AsnMod   = megaco_ber_media_gateway_control_v2,
73    TransMod = megaco_binary_transformer_v2,
74    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
75%% </BACKWARD-COMPAT-CLAUSE>
76
77encode_message(EC, 2, MegaMsg) ->
78    AsnMod   = megaco_ber_media_gateway_control_v2,
79    TransMod = megaco_binary_transformer_v2,
80    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
81
82%% <DEPRECATED>
83encode_message([{version3,prev3c}|EC], 3, MegaMsg) ->
84    AsnMod   = megaco_ber_media_gateway_control_prev3c,
85    TransMod = megaco_binary_transformer_prev3c,
86    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
87encode_message([{version3,prev3b}|EC], 3, MegaMsg) ->
88    AsnMod   = megaco_ber_media_gateway_control_prev3b,
89    TransMod = megaco_binary_transformer_prev3b,
90    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
91encode_message([{version3,prev3a}|EC], 3, MegaMsg) ->
92    AsnMod   = megaco_ber_media_gateway_control_prev3a,
93    TransMod = megaco_binary_transformer_prev3a,
94    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
95%% </DEPRECATED>
96
97%% <BACKWARD-COMPAT-CLAUSE>
98encode_message([{version3,v3}|EC], 3, MegaMsg) ->
99    AsnMod   = megaco_ber_media_gateway_control_v3,
100    TransMod = megaco_binary_transformer_v3,
101    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list);
102%% </BACKWARD-COMPAT-CLAUSE>
103
104encode_message(EC, 3, MegaMsg) ->
105    AsnMod   = megaco_ber_media_gateway_control_v3,
106    TransMod = megaco_binary_transformer_v3,
107    ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list).
108
109
110%%----------------------------------------------------------------------
111%% Convert a transaction (or transactions in the case of ack) record(s)
112%% into a binary
113%% Return {ok, Binary} | {error, Reason}
114%%----------------------------------------------------------------------
115
116%% <BACKWARD-COMPAT-CLAUSE>
117encode_transaction([{version3,_}|EC], 1, Trans) ->
118    AsnMod   = megaco_ber_media_gateway_control_v1,
119    TransMod = megaco_binary_transformer_v1,
120    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
121%% </BACKWARD-COMPAT-CLAUSE>
122
123encode_transaction(EC, 1, Trans) ->
124    AsnMod   = megaco_ber_media_gateway_control_v1,
125    TransMod = megaco_binary_transformer_v1,
126    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
127
128%% <BACKWARD-COMPAT-CLAUSE>
129encode_transaction([{version3,_}|EC], 2, Trans) ->
130    AsnMod   = megaco_ber_media_gateway_control_v2,
131    TransMod = megaco_binary_transformer_v2,
132    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
133%% </BACKWARD-COMPAT-CLAUSE>
134
135encode_transaction(EC, 2, Trans) ->
136    AsnMod   = megaco_ber_media_gateway_control_v2,
137    TransMod = megaco_binary_transformer_v2,
138    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
139
140%% <DEPRECATED>
141encode_transaction([{version3,prev3c}|EC], 3, Trans) ->
142    AsnMod   = megaco_ber_media_gateway_control_prev3c,
143    TransMod = megaco_binary_transformer_prev3c,
144    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
145encode_transaction([{version3,prev3b}|EC], 3, Trans) ->
146    AsnMod   = megaco_ber_media_gateway_control_prev3b,
147    TransMod = megaco_binary_transformer_prev3b,
148    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
149encode_transaction([{version3,prev3a}|EC], 3, Trans) ->
150    AsnMod   = megaco_ber_media_gateway_control_prev3a,
151    TransMod = megaco_binary_transformer_prev3a,
152    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
153%% </DEPRECATED>
154
155%% <BACKWARD-COMPAT-CLAUSE>
156encode_transaction([{version3,v3}|EC], 3, Trans) ->
157    AsnMod   = megaco_ber_media_gateway_control_v3,
158    TransMod = megaco_binary_transformer_v3,
159    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list);
160%% </BACKWARD-COMPAT-CLAUSE>
161
162encode_transaction(EC, 3, Trans) ->
163    AsnMod   = megaco_ber_media_gateway_control_v3,
164    TransMod = megaco_binary_transformer_v3,
165    ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, io_list).
166
167
168%%----------------------------------------------------------------------
169%% Convert a list of ActionRequest record's into a binary
170%% Return {ok, DeepIoList} | {error, Reason}
171%%----------------------------------------------------------------------
172
173%% <BACKWARD-COMPAT-CLAUSE>
174encode_action_requests([{version3,_}|EC], 1, ActReqs)
175  when is_list(ActReqs) ->
176    AsnMod   = megaco_ber_media_gateway_control_v1,
177    TransMod = megaco_binary_transformer_v1,
178    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
179%% </BACKWARD-COMPAT-CLAUSE>
180
181encode_action_requests(EC, 1, ActReqs) when is_list(ActReqs) ->
182    AsnMod   = megaco_ber_media_gateway_control_v1,
183    TransMod = megaco_binary_transformer_v1,
184    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
185
186%% <BACKWARD-COMPAT-CLAUSE>
187encode_action_requests([{version3,_}|EC], 2, ActReqs)
188  when is_list(ActReqs) ->
189    AsnMod   = megaco_ber_media_gateway_control_v2,
190    TransMod = megaco_binary_transformer_v2,
191    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
192%% </BACKWARD-COMPAT-CLAUSE>
193
194encode_action_requests(EC, 2, ActReqs) when is_list(ActReqs) ->
195    AsnMod   = megaco_ber_media_gateway_control_v2,
196    TransMod = megaco_binary_transformer_v2,
197    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
198
199%% <DEPRECATED>
200encode_action_requests([{version3,prev3c}|EC], 3, ActReqs)
201  when is_list(ActReqs) ->
202    AsnMod   = megaco_ber_media_gateway_control_prev3c,
203    TransMod = megaco_binary_transformer_prev3c,
204    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
205encode_action_requests([{version3,prev3b}|EC], 3, ActReqs)
206  when is_list(ActReqs) ->
207    AsnMod   = megaco_ber_media_gateway_control_prev3b,
208    TransMod = megaco_binary_transformer_prev3b,
209    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
210encode_action_requests([{version3,prev3a}|EC], 3, ActReqs)
211  when is_list(ActReqs) ->
212    AsnMod   = megaco_ber_media_gateway_control_prev3a,
213    TransMod = megaco_binary_transformer_prev3a,
214    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
215%% </DEPRECATED>
216
217%% <BACKWARD-COMPAT-CLAUSE>
218encode_action_requests([{version3,v3}|EC], 3, ActReqs)
219  when is_list(ActReqs) ->
220    AsnMod   = megaco_ber_media_gateway_control_v3,
221    TransMod = megaco_binary_transformer_v3,
222    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list);
223%% </BACKWARD-COMPAT-CLAUSE>
224
225encode_action_requests(EC, 3, ActReqs) when is_list(ActReqs) ->
226    AsnMod   = megaco_ber_media_gateway_control_v3,
227    TransMod = megaco_binary_transformer_v3,
228    ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list).
229
230
231%%----------------------------------------------------------------------
232%% Convert a ActionRequest record into a binary
233%% Return {ok, DeepIoList} | {error, Reason}
234%%----------------------------------------------------------------------
235
236%% <BACKWARD-COMPAT-CLAUSE>
237encode_action_request([{version3,_}|EC], 1, ActReq) ->
238    AsnMod   = megaco_ber_media_gateway_control_v1,
239    TransMod = megaco_binary_transformer_v1,
240    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
241%% </BACKWARD-COMPAT-CLAUSE>
242
243encode_action_request(EC, 1, ActReq) ->
244    AsnMod   = megaco_ber_media_gateway_control_v1,
245    TransMod = megaco_binary_transformer_v1,
246    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
247
248%% <BACKWARD-COMPAT-CLAUSE>
249encode_action_request([{version3,_}|EC], 2, ActReq) ->
250    AsnMod   = megaco_ber_media_gateway_control_v2,
251    TransMod = megaco_binary_transformer_v2,
252    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
253%% </BACKWARD-COMPAT-CLAUSE>
254
255encode_action_request(EC, 2, ActReq) ->
256    AsnMod   = megaco_ber_media_gateway_control_v2,
257    TransMod = megaco_binary_transformer_v2,
258    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
259
260%% <DEPRECATED>
261encode_action_request([{version3,prev3c}|EC], 3, ActReq) ->
262    AsnMod   = megaco_ber_media_gateway_control_prev3c,
263    TransMod = megaco_binary_transformer_prev3c,
264    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
265encode_action_request([{version3,prev3b}|EC], 3, ActReq) ->
266    AsnMod   = megaco_ber_media_gateway_control_prev3b,
267    TransMod = megaco_binary_transformer_prev3b,
268    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
269encode_action_request([{version3,prev3a}|EC], 3, ActReq) ->
270    AsnMod   = megaco_ber_media_gateway_control_prev3a,
271    TransMod = megaco_binary_transformer_prev3a,
272    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
273%% </DEPRECATED>
274
275%% <BACKWARD-COMPAT-CLAUSE>
276encode_action_request([{version3,v3}|EC], 3, ActReq) ->
277    AsnMod   = megaco_ber_media_gateway_control_v3,
278    TransMod = megaco_binary_transformer_v3,
279    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list);
280%% </BACKWARD-COMPAT-CLAUSE>
281
282encode_action_request(EC, 3, ActReq) ->
283    AsnMod   = megaco_ber_media_gateway_control_v3,
284    TransMod = megaco_binary_transformer_v3,
285    ?BIN_LIB:encode_action_request(EC, ActReq, AsnMod, TransMod, io_list).
286
287
288%%----------------------------------------------------------------------
289%% Convert a action reply into a deep io list
290%% Not yest supported by this binary codec!
291%% Return {ok, DeepIoList} | {error, Reason}
292%%----------------------------------------------------------------------
293
294encode_action_reply(_EC, _V, _AcionReply) ->
295    {error, not_implemented}.
296
297
298%%----------------------------------------------------------------------
299%% Detect (check) which version a message is
300%% Return {ok, Version} | {error, Reason}
301%%----------------------------------------------------------------------
302
303%% <DEPRECATED>
304version_of([{version3,prev3c}|EC], Binary) ->
305    Decoders = [megaco_ber_media_gateway_control_v1,
306		megaco_ber_media_gateway_control_v2,
307		megaco_ber_media_gateway_control_prev3c],
308    ?BIN_LIB:version_of(EC, Binary, dynamic, Decoders);
309version_of([{version3,prev3b}|EC], Binary) ->
310    Decoders = [megaco_ber_media_gateway_control_v1,
311		megaco_ber_media_gateway_control_v2,
312		megaco_ber_media_gateway_control_prev3b],
313    ?BIN_LIB:version_of(EC, Binary, dynamic, Decoders);
314version_of([{version3,prev3a}|EC], Binary) ->
315    Decoders = [megaco_ber_media_gateway_control_v1,
316		megaco_ber_media_gateway_control_v2,
317		megaco_ber_media_gateway_control_prev3a],
318    ?BIN_LIB:version_of(EC, Binary, dynamic, Decoders);
319%% </DEPRECATED>
320
321%% <BACKWARD-COMPAT-CLAUSE>
322version_of([{version3,v3}|EC], Binary) ->
323    Decoders = [megaco_ber_media_gateway_control_v1,
324		megaco_ber_media_gateway_control_v2,
325		megaco_ber_media_gateway_control_v3],
326    ?BIN_LIB:version_of(EC, Binary, dynamic, Decoders);
327%% </BACKWARD-COMPAT-CLAUSE>
328
329version_of(EC, Binary) ->
330    Decoders = [megaco_ber_media_gateway_control_v1,
331		megaco_ber_media_gateway_control_v2,
332		megaco_ber_media_gateway_control_v3],
333    ?BIN_LIB:version_of(EC, Binary, dynamic, Decoders).
334
335
336%%----------------------------------------------------------------------
337%% Convert a binary into a 'MegacoMessage' record
338%% Return {ok, MegacoMessageRecord} | {error, Reason}
339%%----------------------------------------------------------------------
340
341decode_message(EC, Binary) ->
342    decode_message(EC, 1, Binary).
343
344%% <DEPRECATED>
345decode_message([{version3,prev3c}|EC], dynamic, Binary) ->
346    Decoders = [{megaco_ber_media_gateway_control_v1,
347		 megaco_binary_transformer_v1},
348		{megaco_ber_media_gateway_control_v2,
349		 megaco_binary_transformer_v2},
350		{megaco_ber_media_gateway_control_prev3c,
351		 megaco_binary_transformer_prev3c}],
352    ?BIN_LIB:decode_message_dynamic(EC, Binary, Decoders, binary);
353decode_message([{version3,prev3b}|EC], dynamic, Binary) ->
354    Decoders = [{megaco_ber_media_gateway_control_v1,
355		 megaco_binary_transformer_v1},
356		{megaco_ber_media_gateway_control_v2,
357		 megaco_binary_transformer_v2},
358		{megaco_ber_media_gateway_control_prev3b,
359		 megaco_binary_transformer_prev3b}],
360    ?BIN_LIB:decode_message_dynamic(EC, Binary, Decoders, binary);
361decode_message([{version3,prev3a}|EC], dynamic, Binary) ->
362    Decoders = [{megaco_ber_media_gateway_control_v1,
363		 megaco_binary_transformer_v1},
364		{megaco_ber_media_gateway_control_v2,
365		 megaco_binary_transformer_v2},
366		{megaco_ber_media_gateway_control_prev3a,
367		 megaco_binary_transformer_prev3a}],
368    ?BIN_LIB:decode_message_dynamic(EC, Binary, Decoders, binary);
369%% </DEPRECATED>
370
371%% <BACKWARD-COMPAT-CLAUSE>
372decode_message([{version3,v3}|EC], dynamic, Binary) ->
373    Decoders = [{megaco_ber_media_gateway_control_v1,
374		 megaco_binary_transformer_v1},
375		{megaco_ber_media_gateway_control_v2,
376		 megaco_binary_transformer_v2},
377		{megaco_ber_media_gateway_control_v3,
378		 megaco_binary_transformer_v3}],
379    ?BIN_LIB:decode_message_dynamic(EC, Binary, Decoders, binary);
380%% </BACKWARD-COMPAT-CLAUSE>
381
382decode_message(EC, dynamic, Binary) ->
383    Decoders = [{megaco_ber_media_gateway_control_v1,
384		 megaco_binary_transformer_v1},
385		{megaco_ber_media_gateway_control_v2,
386		 megaco_binary_transformer_v2},
387		{megaco_ber_media_gateway_control_v3,
388		 megaco_binary_transformer_v3}],
389    ?BIN_LIB:decode_message_dynamic(EC, Binary, Decoders, binary);
390
391
392%% -- Version 1 --
393
394%% <BACKWARD-COMPAT-CLAUSE>
395decode_message([{version3,_}|EC], 1, Binary) ->
396    AsnMod   = megaco_ber_media_gateway_control_v1,
397    TransMod = megaco_binary_transformer_v1,
398    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
399%% </BACKWARD-COMPAT-CLAUSE>
400
401decode_message(EC, 1, Binary) ->
402    AsnMod   = megaco_ber_media_gateway_control_v1,
403    TransMod = megaco_binary_transformer_v1,
404    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
405
406
407%% -- Version 2 --
408
409%% <BACKWARD-COMPAT-CLAUSE>
410decode_message([{version3,_}|EC], 2, Binary) ->
411    AsnMod   = megaco_ber_media_gateway_control_v2,
412    TransMod = megaco_binary_transformer_v2,
413    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
414%% </BACKWARD-COMPAT-CLAUSE>
415
416decode_message(EC, 2, Binary) ->
417    AsnMod   = megaco_ber_media_gateway_control_v2,
418    TransMod = megaco_binary_transformer_v2,
419    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
420
421
422%% -- Version 3 --
423
424%% <DEPRECATED>
425decode_message([{version3,prev3c}|EC], 3, Binary) ->
426    AsnMod   = megaco_ber_media_gateway_control_prev3c,
427    TransMod = megaco_binary_transformer_prev3c,
428    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
429decode_message([{version3,prev3b}|EC], 3, Binary) ->
430    AsnMod   = megaco_ber_media_gateway_control_prev3b,
431    TransMod = megaco_binary_transformer_prev3b,
432    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
433decode_message([{version3,prev3a}|EC], 3, Binary) ->
434    AsnMod   = megaco_ber_media_gateway_control_prev3a,
435    TransMod = megaco_binary_transformer_prev3a,
436    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
437%% </DEPRECATED>
438
439%% <BACKWARD-COMPAT-CLAUSE>
440decode_message([{version3,v3}|EC], 3, Binary) ->
441    AsnMod   = megaco_ber_media_gateway_control_v3,
442    TransMod = megaco_binary_transformer_v3,
443    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
444%% </BACKWARD-COMPAT-CLAUSE>
445
446decode_message(EC, 3, Binary) ->
447    AsnMod   = megaco_ber_media_gateway_control_v3,
448    TransMod = megaco_binary_transformer_v3,
449    ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary).
450
451
452%% <DEPRECATED>
453decode_mini_message([{version3,prev3c}|EC], dynamic, Bin) ->
454    Mods = [megaco_ber_media_gateway_control_v1,
455	    megaco_ber_media_gateway_control_v2,
456	    megaco_ber_media_gateway_control_prev3c],
457    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
458decode_mini_message([{version3,prev3b}|EC], dynamic, Bin) ->
459    Mods = [megaco_ber_media_gateway_control_v1,
460	    megaco_ber_media_gateway_control_v2,
461	    megaco_ber_media_gateway_control_prev3b],
462    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
463decode_mini_message([{version3,prev3a}|EC], dynamic, Bin) ->
464    Mods = [megaco_ber_media_gateway_control_v1,
465	    megaco_ber_media_gateway_control_v2,
466	    megaco_ber_media_gateway_control_prev3a],
467    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
468%% </DEPRECATED>
469
470%% <BACKWARD-COMPAT-CLAUSE>
471decode_mini_message([{version3,v3}|EC], dynamic, Bin) ->
472    Mods = [megaco_ber_media_gateway_control_v1,
473	    megaco_ber_media_gateway_control_v2,
474	    megaco_ber_media_gateway_control_v3],
475    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
476%% </BACKWARD-COMPAT-CLAUSE>
477
478decode_mini_message(EC, dynamic, Bin) ->
479    Mods = [megaco_ber_media_gateway_control_v1,
480	    megaco_ber_media_gateway_control_v2,
481	    megaco_ber_media_gateway_control_v3],
482    ?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
483
484%% <BACKWARD-COMPAT-CLAUSE>
485decode_mini_message([{version3,_}|EC], 1, Bin) ->
486    AsnMod = megaco_ber_media_gateway_control_v1,
487    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
488%% </BACKWARD-COMPAT-CLAUSE>
489
490decode_mini_message(EC, 1, Bin) ->
491    AsnMod = megaco_ber_media_gateway_control_v1,
492    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
493
494%% <BACKWARD-COMPAT-CLAUSE>
495decode_mini_message([{version3,_}|EC], 2, Bin) ->
496    AsnMod = megaco_ber_media_gateway_control_v2,
497    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
498%% </BACKWARD-COMPAT-CLAUSE>
499
500decode_mini_message(EC, 2, Bin) ->
501    AsnMod = megaco_ber_media_gateway_control_v2,
502    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
503
504%% <DEPRECATED>
505decode_mini_message([{version3,prev3c}|EC], 3, Bin) ->
506    AsnMod = megaco_ber_media_gateway_control_prev3c,
507    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
508decode_mini_message([{version3,prev3b}|EC], 3, Bin) ->
509    AsnMod = megaco_ber_media_gateway_control_prev3b,
510    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
511decode_mini_message([{version3,prev3a}|EC], 3, Bin) ->
512    AsnMod = megaco_ber_media_gateway_control_prev3a,
513    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
514%% </DEPRECATED>
515
516%% <BACKWARD-COMPAT-CLAUSE>
517decode_mini_message([{version3,v3}|EC], 3, Bin) ->
518    AsnMod = megaco_ber_media_gateway_control_v3,
519    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
520%% </BACKWARD-COMPAT-CLAUSE>
521
522decode_mini_message(EC, 3, Bin) ->
523    AsnMod = megaco_ber_media_gateway_control_v3,
524    ?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary).
525
526
527
528