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