37
38
-include_lib("megaco/src/engine/megaco_message_internal.hrl").
39
-define(V1_ASN1_MOD, megaco_ber_bin_drv_media_gateway_control_v1).
40
-define(V2_ASN1_MOD, megaco_ber_bin_drv_media_gateway_control_v2).
42
-define(V1_TRANS_MOD, megaco_binary_transformer_v1).
43
-define(V2_TRANS_MOD, megaco_binary_transformer_v2).
40
-define(V1_ASN1_MOD, megaco_ber_bin_drv_media_gateway_control_v1).
41
-define(V2_ASN1_MOD, megaco_ber_bin_drv_media_gateway_control_v2).
42
-define(V3_ASN1_MOD, megaco_ber_bin_drv_media_gateway_control_v3).
43
-define(PREV3A_ASN1_MOD, megaco_ber_bin_drv_media_gateway_control_prev3a).
44
-define(PREV3B_ASN1_MOD, megaco_ber_bin_drv_media_gateway_control_prev3b).
46
-define(V1_TRANS_MOD, megaco_binary_transformer_v1).
47
-define(V2_TRANS_MOD, megaco_binary_transformer_v2).
48
-define(V3_TRANS_MOD, megaco_binary_transformer_v3).
49
-define(PREV3A_TRANS_MOD, megaco_binary_transformer_prev3a).
50
-define(PREV3B_TRANS_MOD, megaco_binary_transformer_prev3b).
52
-define(BIN_LIB, megaco_binary_encoder_lib).
55
%%----------------------------------------------------------------------
56
%% Detect (check) which version a message is
57
%% Return {ok, Version} | {error, Reason}
58
%%----------------------------------------------------------------------
60
version_of([{version3,prev3b}|EC], Binary) ->
61
Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3B_ASN1_MOD],
62
?BIN_LIB:version_of(EC, Binary, dynamic, Decoders);
63
version_of([{version3,prev3a}|EC], Binary) ->
64
Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3A_ASN1_MOD],
65
?BIN_LIB:version_of(EC, Binary, dynamic, Decoders);
66
version_of([{version3,v3}|EC], Binary) ->
67
Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
68
?BIN_LIB:version_of(EC, Binary, dynamic, Decoders);
69
version_of(EC, Binary) ->
70
Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
71
?BIN_LIB:version_of(EC, Binary, dynamic, Decoders).
46
74
%%----------------------------------------------------------------------
47
75
%% Convert a 'MegacoMessage' record into a binary
49
77
%%----------------------------------------------------------------------
52
encode_message(EncodingConfig,
53
81
#'MegacoMessage'{mess = #'Message'{version = V}} = MegaMsg) ->
54
encode_message(EncodingConfig, V, MegaMsg).
82
encode_message(EC, V, MegaMsg).
56
encode_message(EncodingConfig, 1, MegaMsg) ->
57
megaco_binary_encoder:encode_message(EncodingConfig, MegaMsg,
58
?V1_ASN1_MOD, ?V1_TRANS_MOD,
60
encode_message(EncodingConfig, 2, MegaMsg) ->
61
megaco_binary_encoder:encode_message(EncodingConfig, MegaMsg,
62
?V2_ASN1_MOD, ?V2_TRANS_MOD,
84
encode_message([{version3,_}|EC], 1, MegaMsg) ->
85
?BIN_LIB:encode_message(EC, MegaMsg, ?V1_ASN1_MOD, ?V1_TRANS_MOD, io_list);
86
encode_message(EC, 1, MegaMsg) ->
87
?BIN_LIB:encode_message(EC, MegaMsg, ?V1_ASN1_MOD, ?V1_TRANS_MOD, io_list);
88
encode_message([{version3,_}|EC], 2, MegaMsg) ->
89
?BIN_LIB:encode_message(EC, MegaMsg, ?V2_ASN1_MOD, ?V2_TRANS_MOD, io_list);
90
encode_message(EC, 2, MegaMsg) ->
91
?BIN_LIB:encode_message(EC, MegaMsg, ?V2_ASN1_MOD, ?V2_TRANS_MOD, io_list);
92
encode_message([{version3,prev3b}|EC], 3, MegaMsg) ->
93
?BIN_LIB:encode_message(EC, MegaMsg,
94
?PREV3B_ASN1_MOD, ?PREV3B_TRANS_MOD, io_list);
95
encode_message([{version3,prev3a}|EC], 3, MegaMsg) ->
96
?BIN_LIB:encode_message(EC, MegaMsg,
97
?PREV3A_ASN1_MOD, ?PREV3A_TRANS_MOD, io_list);
98
encode_message([{version3,v3}|EC], 3, MegaMsg) ->
99
?BIN_LIB:encode_message(EC, MegaMsg, ?V3_ASN1_MOD, ?V3_TRANS_MOD, io_list);
100
encode_message(EC, 3, MegaMsg) ->
101
?BIN_LIB:encode_message(EC, MegaMsg, ?V3_ASN1_MOD, ?V3_TRANS_MOD, io_list).
66
104
%%----------------------------------------------------------------------
124
180
%% Return {ok, MegacoMessageRecord} | {error, Reason}
125
181
%%----------------------------------------------------------------------
127
version_of(EncodingConfig, Binary) ->
128
AsnModV1 = ?V1_ASN1_MOD,
129
AsnModV2 = ?V2_ASN1_MOD,
130
megaco_binary_encoder:version_of(EncodingConfig, Binary, dynamic,
133
183
%% Old decode function
134
decode_message(EncodingConfig, Binary) ->
135
decode_message(EncodingConfig, 1, Binary).
184
decode_message(EC, Binary) ->
185
decode_message(EC, 1, Binary).
137
187
%% Select from message
138
188
%% This does not work at the moment so, we use version 1 for this
139
decode_message(EncodingConfig, dynamic, Binary) ->
140
AsnModV1 = ?V1_ASN1_MOD,
141
AsnModV2 = ?V2_ASN1_MOD,
142
megaco_binary_encoder:decode_message_dynamic(EncodingConfig, Binary,
143
AsnModV1, AsnModV2, binary);
145
decode_message(EncodingConfig, 1, Binary) ->
146
AsnMod = ?V1_ASN1_MOD,
147
TransMod = ?V1_TRANS_MOD,
148
megaco_binary_encoder:decode_message(EncodingConfig, Binary,
149
AsnMod, TransMod, binary);
151
decode_message(EncodingConfig, 2, Binary) ->
152
AsnMod = ?V2_ASN1_MOD,
153
TransMod = ?V2_TRANS_MOD,
154
megaco_binary_encoder:decode_message(EncodingConfig, Binary,
155
AsnMod, TransMod, binary).
189
decode_message([{version3,prev3b}|EC], dynamic, Binary) ->
190
Mods = [{?V1_ASN1_MOD, ?V1_TRANS_MOD},
191
{?V2_ASN1_MOD, ?V2_TRANS_MOD},
192
{?PREV3B_ASN1_MOD, ?PREV3B_TRANS_MOD}],
193
?BIN_LIB:decode_message_dynamic(EC, Binary, Mods, binary);
194
decode_message([{version3,prev3a}|EC], dynamic, Binary) ->
195
Mods = [{?V1_ASN1_MOD, ?V1_TRANS_MOD},
196
{?V2_ASN1_MOD, ?V2_TRANS_MOD},
197
{?PREV3A_ASN1_MOD, ?PREV3A_TRANS_MOD}],
198
?BIN_LIB:decode_message_dynamic(EC, Binary, Mods, binary);
199
decode_message([{version3,v3}|EC], dynamic, Binary) ->
200
Mods = [{?V1_ASN1_MOD, ?V1_TRANS_MOD},
201
{?V2_ASN1_MOD, ?V2_TRANS_MOD},
202
{?V3_ASN1_MOD, ?V3_TRANS_MOD}],
203
?BIN_LIB:decode_message_dynamic(EC, Binary, Mods, binary);
204
decode_message(EC, dynamic, Binary) ->
205
Mods = [{?V1_ASN1_MOD, ?V1_TRANS_MOD},
206
{?V2_ASN1_MOD, ?V2_TRANS_MOD},
207
{?V3_ASN1_MOD, ?V3_TRANS_MOD}],
208
?BIN_LIB:decode_message_dynamic(EC, Binary, Mods, binary);
210
decode_message([{version3,_}|EC], 1, Binary) ->
211
AsnMod = ?V1_ASN1_MOD,
212
TransMod = ?V1_TRANS_MOD,
213
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
214
decode_message(EC, 1, Binary) ->
215
AsnMod = ?V1_ASN1_MOD,
216
TransMod = ?V1_TRANS_MOD,
217
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
219
decode_message([{version3,_}|EC], 2, Binary) ->
220
AsnMod = ?V2_ASN1_MOD,
221
TransMod = ?V2_TRANS_MOD,
222
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
223
decode_message(EC, 2, Binary) ->
224
AsnMod = ?V2_ASN1_MOD,
225
TransMod = ?V2_TRANS_MOD,
226
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
228
decode_message([{version3,prev3b}|EC], 3, Binary) ->
229
AsnMod = ?PREV3B_ASN1_MOD,
230
TransMod = ?PREV3B_TRANS_MOD,
231
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
232
decode_message([{version3,prev3a}|EC], 3, Binary) ->
233
AsnMod = ?PREV3A_ASN1_MOD,
234
TransMod = ?PREV3A_TRANS_MOD,
235
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
236
decode_message([{version3,v3}|EC], 3, Binary) ->
237
AsnMod = ?V3_ASN1_MOD,
238
TransMod = ?V3_TRANS_MOD,
239
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
240
decode_message(EC, 3, Binary) ->
241
AsnMod = ?V3_ASN1_MOD,
242
TransMod = ?V3_TRANS_MOD,
243
?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, binary);
246
decode_mini_message([{version3,prev3b}|EC], dynamic, Bin) ->
247
Mods = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3B_ASN1_MOD],
248
?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
249
decode_mini_message([{version3,prev3a}|EC], dynamic, Bin) ->
250
Mods = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3A_ASN1_MOD],
251
?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
252
decode_mini_message([{version3,v3}|EC], dynamic, Bin) ->
253
Mods = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
254
?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
255
decode_mini_message(EC, dynamic, Bin) ->
256
Mods = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD],
257
?BIN_LIB:decode_mini_message_dynamic(EC, Bin, Mods, binary);
259
decode_mini_message([{version3,_}|EC], 1, Bin) ->
260
AsnMod = ?V1_ASN1_MOD,
261
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
262
decode_mini_message(EC, 1, Bin) ->
263
AsnMod = ?V1_ASN1_MOD,
264
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
265
decode_mini_message([{version3,_}|EC], 2, Bin) ->
266
AsnMod = ?V2_ASN1_MOD,
267
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
268
decode_mini_message(EC, 2, Bin) ->
269
AsnMod = ?V2_ASN1_MOD,
270
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
271
decode_mini_message([{version3,prev3b}|EC], 3, Bin) ->
272
AsnMod = ?PREV3B_ASN1_MOD,
273
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
274
decode_mini_message([{version3,prev3a}|EC], 3, Bin) ->
275
AsnMod = ?PREV3A_ASN1_MOD,
276
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
277
decode_mini_message([{version3,v3}|EC], 3, Bin) ->
278
AsnMod = ?V3_ASN1_MOD,
279
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary);
280
decode_mini_message(EC, 3, Bin) ->
281
AsnMod = ?V3_ASN1_MOD,
282
?BIN_LIB:decode_mini_message(EC, Bin, AsnMod, binary).