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