1%% 2%% %CopyrightBegin% 3%% 4%% Copyright Ericsson AB 2000-2016. 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-define(PREV3A_ASN1_MOD, megaco_per_media_gateway_control_prev3a). 49-define(PREV3B_ASN1_MOD, megaco_per_media_gateway_control_prev3b). 50-define(PREV3C_ASN1_MOD, megaco_per_media_gateway_control_prev3c). 51 52-define(V1_TRANS_MOD, megaco_binary_transformer_v1). 53-define(V2_TRANS_MOD, megaco_binary_transformer_v2). 54-define(V3_TRANS_MOD, megaco_binary_transformer_v3). 55-define(PREV3A_TRANS_MOD, megaco_binary_transformer_prev3a). 56-define(PREV3B_TRANS_MOD, megaco_binary_transformer_prev3b). 57-define(PREV3C_TRANS_MOD, megaco_binary_transformer_prev3c). 58 59-define(BIN_LIB, megaco_binary_encoder_lib). 60 61 62%%---------------------------------------------------------------------- 63%% Detect (check/get) message version 64%% Return {ok, Version} | {error, Reason} 65%%---------------------------------------------------------------------- 66 67version_of([{version3,v3}|EC], Binary) -> 68 Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD], 69 ?BIN_LIB:version_of(EC, Binary, 1, Decoders); 70version_of([{version3,prev3c}|EC], Binary) -> 71 Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3C_ASN1_MOD], 72 ?BIN_LIB:version_of(EC, Binary, 1, Decoders); 73version_of([{version3,prev3b}|EC], Binary) -> 74 Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3B_ASN1_MOD], 75 ?BIN_LIB:version_of(EC, Binary, 1, Decoders); 76version_of([{version3,prev3a}|EC], Binary) -> 77 Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?PREV3A_ASN1_MOD], 78 ?BIN_LIB:version_of(EC, Binary, 1, Decoders); 79version_of(EC, Binary) -> 80 Decoders = [?V1_ASN1_MOD, ?V2_ASN1_MOD, ?V3_ASN1_MOD], 81 ?BIN_LIB:version_of(EC, Binary, 1, Decoders). 82 83 84%%---------------------------------------------------------------------- 85%% Convert a 'MegacoMessage' record into a binary 86%% Return {ok, Binary} | {error, Reason} 87%%---------------------------------------------------------------------- 88 89encode_message(EC, 90 #'MegacoMessage'{mess = #'Message'{version = V}} = MegaMsg) -> 91 encode_message(EC, V, MegaMsg). 92 93 94%% -- Version 1 -- 95 96encode_message([{version3,_}|EC], 1, MegaMsg) -> 97 AsnMod = ?V1_ASN1_MOD, 98 TransMod = ?V1_TRANS_MOD, 99 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 100encode_message(EC, 1, MegaMsg) -> 101 AsnMod = ?V1_ASN1_MOD, 102 TransMod = ?V1_TRANS_MOD, 103 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 104 105 106%% -- Version 2 -- 107 108encode_message([{version3,_}|EC], 2, MegaMsg) -> 109 AsnMod = ?V2_ASN1_MOD, 110 TransMod = ?V2_TRANS_MOD, 111 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 112encode_message(EC, 2, MegaMsg) -> 113 AsnMod = ?V2_ASN1_MOD, 114 TransMod = ?V2_TRANS_MOD, 115 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 116 117 118%% -- Version 3 -- 119 120encode_message([{version3,v3}|EC], 3, MegaMsg) -> 121 AsnMod = ?V3_ASN1_MOD, 122 TransMod = ?V3_TRANS_MOD, 123 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 124encode_message([{version3,prev3c}|EC], 3, MegaMsg) -> 125 AsnMod = ?PREV3C_ASN1_MOD, 126 TransMod = ?PREV3C_TRANS_MOD, 127 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 128encode_message([{version3,prev3b}|EC], 3, MegaMsg) -> 129 AsnMod = ?PREV3B_ASN1_MOD, 130 TransMod = ?PREV3B_TRANS_MOD, 131 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 132encode_message([{version3,prev3a}|EC], 3, MegaMsg) -> 133 AsnMod = ?PREV3A_ASN1_MOD, 134 TransMod = ?PREV3A_TRANS_MOD, 135 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list); 136encode_message(EC, 3, MegaMsg) -> 137 AsnMod = ?V3_ASN1_MOD, 138 TransMod = ?V3_TRANS_MOD, 139 ?BIN_LIB:encode_message(EC, MegaMsg, AsnMod, TransMod, io_list). 140 141 142%%---------------------------------------------------------------------- 143%% Convert a transaction (or transactions in the case of ack) record(s) 144%% into a binary 145%% Return {ok, Binary} | {error, Reason} 146%%---------------------------------------------------------------------- 147 148encode_transaction(_EC, 1, _Trans) -> 149%% AsnMod = ?V1_ASN1_MOD, 150%% TransMod = ?V1_TRANS_MOD, 151%% ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, 152%% io_list); 153 {error, not_implemented}; 154encode_transaction(_EC, 2, _Trans) -> 155%% AsnMod = ?V2_ASN1_MOD, 156%% TransMod = ?V2_TRANS_MOD, 157%% ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, 158%% io_list); 159 {error, not_implemented}; 160encode_transaction(_EC, 3, _Trans) -> 161%% AsnMod = ?V3_ASN1_MOD, 162%% TransMod = ?V3_TRANS_MOD, 163%% ?BIN_LIB:encode_transaction(EC, Trans, AsnMod, TransMod, 164%% io_list); 165 {error, not_implemented}. 166 167 168%%---------------------------------------------------------------------- 169%% Convert a list of ActionRequest record's into a binary 170%% Return {ok, DeepIoList} | {error, Reason} 171%%---------------------------------------------------------------------- 172encode_action_requests(_EC, 1, ActReqs) when is_list(ActReqs) -> 173%% AsnMod = ?V1_ASN1_MOD, 174%% TransMod = ?V1_TRANS_MOD, 175%% ?BIN_LIB:encode_action_requests(EC, ActReqs, 176%% AsnMod, TransMod, 177%% io_list); 178 {error, not_implemented}; 179encode_action_requests(_EC, 2, ActReqs) when is_list(ActReqs) -> 180%% AsnMod = ?V2_ASN1_MOD, 181%% TransMod = ?V2_TRANS_MOD, 182%% ?BIN_LIB:encode_action_requests(EC, ActReqs, 183%% AsnMod, TransMod, 184%% io_list); 185 {error, not_implemented}; 186encode_action_requests(_EC, 3, ActReqs) when is_list(ActReqs) -> 187%% AsnMod = ?V3_ASN1_MOD, 188%% TransMod = ?V3_TRANS_MOD, 189%% ?BIN_LIB:encode_action_requests(EC, ActReqs, 190%% AsnMod, TransMod, 191%% io_list); 192 {error, not_implemented}. 193 194 195%%---------------------------------------------------------------------- 196%% Convert a ActionRequest record into a binary 197%% Return {ok, DeepIoList} | {error, Reason} 198%%---------------------------------------------------------------------- 199encode_action_request(_EC, 1, _ActReq) -> 200%% AsnMod = ?V1_ASN1_MOD, 201%% TransMod = ?V1_TRANS_MOD, 202%% ?BIN_LIB:encode_action_request(EC, ActReq, 203%% AsnMod, TransMod, 204%% io_list); 205 {error, not_implemented}; 206encode_action_request(_EC, 2, _ActReq) -> 207%% AsnMod = ?V2_ASN1_MOD, 208%% TransMod = ?V2_TRANS_MOD, 209%% ?BIN_LIB:encode_action_request(EC, ActReq, 210%% AsnMod, TransMod, 211%% io_list); 212 {error, not_implemented}; 213encode_action_request(_EC, 3, _ActReq) -> 214%% AsnMod = ?V3_ASN1_MOD, 215%% TransMod = ?V3_TRANS_MOD, 216%% ?BIN_LIB:encode_action_request(EC, ActReq, 217%% AsnMod, TransMod, 218%% io_list); 219 {error, not_implemented}. 220 221 222 223%%---------------------------------------------------------------------- 224%% Convert a action reply into a deep io list 225%% Not yest supported by this binary codec! 226%% Return {ok, DeepIoList} | {error, Reason} 227%%---------------------------------------------------------------------- 228 229encode_action_reply(_EC, _V, _AcionReply) -> 230 {error, not_implemented}. 231 232 233%%---------------------------------------------------------------------- 234%% Convert a binary into a 'MegacoMessage' record 235%% Return {ok, MegacoMessageRecord} | {error, Reason} 236%%---------------------------------------------------------------------- 237 238decode_message(EC, Binary) -> 239 decode_message(EC, 1, Binary). 240 241%% PER does not support partial decode, so this means V1 242decode_message(EC, dynamic, Binary) -> 243 decode_message(EC, 1, Binary); 244 245 246%% -- Version 1 -- 247 248decode_message([{version3,_}|EC], 1, Binary) -> 249 AsnMod = ?V1_ASN1_MOD, 250 TransMod = ?V1_TRANS_MOD, 251 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 252decode_message(EC, 1, Binary) -> 253 AsnMod = ?V1_ASN1_MOD, 254 TransMod = ?V1_TRANS_MOD, 255 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 256 257%% -- Version 2 -- 258 259decode_message([{version3,_}|EC], 2, Binary) -> 260 AsnMod = ?V2_ASN1_MOD, 261 TransMod = ?V2_TRANS_MOD, 262 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 263decode_message(EC, 2, Binary) -> 264 AsnMod = ?V2_ASN1_MOD, 265 TransMod = ?V2_TRANS_MOD, 266 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 267 268%% -- Version 3 -- 269 270decode_message([{version3,v3}|EC], 3, Binary) -> 271 AsnMod = ?V3_ASN1_MOD, 272 TransMod = ?V3_TRANS_MOD, 273 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 274decode_message([{version3,prev3c}|EC], 3, Binary) -> 275 AsnMod = ?PREV3C_ASN1_MOD, 276 TransMod = ?PREV3C_TRANS_MOD, 277 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 278decode_message([{version3,prev3b}|EC], 3, Binary) -> 279 AsnMod = ?PREV3B_ASN1_MOD, 280 TransMod = ?PREV3B_TRANS_MOD, 281 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 282decode_message([{version3,prev3a}|EC], 3, Binary) -> 283 AsnMod = ?PREV3A_ASN1_MOD, 284 TransMod = ?PREV3A_TRANS_MOD, 285 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list); 286decode_message(EC, 3, Binary) -> 287 AsnMod = ?V3_ASN1_MOD, 288 TransMod = ?V3_TRANS_MOD, 289 ?BIN_LIB:decode_message(EC, Binary, AsnMod, TransMod, io_list). 290 291decode_mini_message(_EC, _Vsn, _Bin) -> 292 {error, not_implemented}. 293