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