1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2003-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: Encode COMPACT Megaco/H.248 text messages from internal form
24%%----------------------------------------------------------------------
25
26-module(megaco_compact_text_encoder_v2).
27
28-export([encode_message/2,
29	 encode_transaction/2,
30	 encode_action_requests/2,
31	 encode_action_request/2,
32	 encode_command_request/2,
33	 encode_action_reply/2]).
34
35-export([token_tag2string/1]).
36
37-include_lib("megaco/include/megaco.hrl").
38-include_lib("megaco/include/megaco_message_v2.hrl").
39-define(encoder_pre_version_3,true). % version 1 or 2
40-include("megaco_text_tokens.hrl").
41
42
43%%----------------------------------------------------------------------
44%% Convert a 'MegacoMessage' record into a binary
45%% Return {ok, DeepIoList} | {error, Reason}
46%%----------------------------------------------------------------------
47
48encode_message(EC, MegaMsg)
49  when is_list(EC) andalso is_record(MegaMsg, 'MegacoMessage') ->
50    case (catch enc_MegacoMessage(MegaMsg)) of
51	{'EXIT', Reason} ->
52	    {error, Reason};
53	Bin when is_binary(Bin) ->
54	    {ok, Bin};
55	DeepIoList ->
56	    Bin = erlang:list_to_binary(DeepIoList),
57	    {ok, Bin}
58    end;
59encode_message(EncodingConfig, MegaMsg)
60  when is_record(MegaMsg, 'MegacoMessage')  ->
61    {error, {bad_encoding_config, EncodingConfig}};
62encode_message(_EncodingConfig, _MegaMsg) ->
63    {error, bad_megaco_message}.
64
65
66
67
68%%----------------------------------------------------------------------
69%% Convert a transaction record into a deep io list
70%% Return {ok, DeepIoList} | {error, Reason}
71%%----------------------------------------------------------------------
72encode_transaction(_EC, Trans) ->
73    case (catch enc_Transaction(Trans)) of
74	{'EXIT', Reason} ->
75	    {error, Reason};
76	Bin when is_binary(Bin) ->
77	    {ok, Bin};
78	DeepIoList ->
79	    Bin = erlang:list_to_binary(DeepIoList),
80	    {ok, Bin}
81    end.
82
83
84%%----------------------------------------------------------------------
85%% Convert a list of ActionRequest record's into a binary
86%% Return {ok, DeepIoList} | {error, Reason}
87%%----------------------------------------------------------------------
88encode_action_requests(_EC, ActReqs) ->
89    case (catch enc_ActionRequests(ActReqs)) of
90	{'EXIT', Reason} ->
91	    {error, Reason};
92	Bin when is_binary(Bin) ->
93	    {ok, Bin};
94	DeepIoList ->
95	    Bin = erlang:list_to_binary(DeepIoList),
96	    {ok, Bin}
97    end.
98
99%%----------------------------------------------------------------------
100%% Convert a ActionRequest record into a binary
101%% Return {ok, DeepIoList} | {error, Reason}
102%%----------------------------------------------------------------------
103encode_action_request(_EC, ActReq)
104  when is_record(ActReq, 'ActionRequest') ->
105    case (catch enc_ActionRequest(ActReq)) of
106	{'EXIT', Reason} ->
107	    {error, Reason};
108	Bin when is_binary(Bin) ->
109	    {ok, Bin};
110	DeepIoList ->
111	    Bin = erlang:list_to_binary(DeepIoList),
112	    {ok, Bin}
113    end.
114
115%%----------------------------------------------------------------------
116%% Convert a CommandRequest record into a deep io list
117%% Return {ok, DeepIoList} | {error, Reason}
118%%----------------------------------------------------------------------
119encode_command_request(_EC, CmdReq)
120  when is_record(CmdReq, 'CommandRequest') ->
121    case (catch enc_CommandRequest(CmdReq)) of
122	{'EXIT', Reason} ->
123	    {error, Reason};
124	Bin when is_binary(Bin) ->
125	    {ok, Bin};
126	DeepIoList ->
127	    Bin = erlang:list_to_binary(DeepIoList),
128	    {ok, Bin}
129    end.
130
131%%----------------------------------------------------------------------
132%% Convert a action reply into a deep io list
133%% Return {ok, DeepIoList} | {error, Reason}
134%%----------------------------------------------------------------------
135encode_action_reply(_EC, ActRep)
136  when is_record(ActRep, 'ActionReply') ->
137    case (catch enc_ActionReply(ActRep)) of
138	{'EXIT', Reason} ->
139	    {error, Reason};
140	Bin when is_binary(Bin) ->
141	    {ok, Bin};
142	DeepIoList ->
143	    Bin = erlang:list_to_binary(DeepIoList),
144	    {ok, Bin}
145    end.
146
147
148%%----------------------------------------------------------------------
149%% A utility function to pretty print the tags found in a megaco message
150%%----------------------------------------------------------------------
151
152token_tag2string(addReq)                 -> ?CompactAddToken;
153token_tag2string(addReply)               -> ?CompactAddToken;
154token_tag2string(auditDescriptor)        -> ?CompactAuditToken;
155token_tag2string(auditCapRequest)        -> ?CompactAuditCapToken;
156token_tag2string(auditCapReply)          -> ?CompactAuditCapToken;
157token_tag2string(auditValueRequest)      -> ?CompactAuditValueToken;
158token_tag2string(auditValueReply)        -> ?CompactAuditValueToken;
159%% token_tag2string(X) -> ?CompactAuthToken;
160token_tag2string(bothway)                -> ?CompactBothwayToken;
161token_tag2string(brief)                  -> ?CompactBriefToken;
162%% token_tag2string(X) -> ?CompactBufferToken;
163%% token_tag2string(X) -> ?CompactCtxToken;
164%% token_tag2string(X) -> ?CompactContextAuditToken;
165token_tag2string(digitMapDescriptor)     -> ?CompactDigitMapToken;
166token_tag2string(digitMapToken)          -> ?CompactDigitMapToken;
167%% token_tag2string(X) -> ?CompactDiscardToken;
168%% token_tag2string(X) -> ?CompactDisconnectedToken;
169%% token_tag2string(X) -> ?CompactDelayToken;
170token_tag2string(duration)               -> ?CompactDurationToken;
171%% token_tag2string(X) -> ?CompactEmbedToken;
172token_tag2string(emergencyAudit)         -> ?CompactEmergencyToken;
173%% token_tag2string(X)         -> ?CompactEmergencyOffToken;
174token_tag2string(errorDescriptor)        -> ?CompactErrorToken;
175token_tag2string(eventBufferDescriptor)  -> ?CompactEventBufferToken;
176token_tag2string(eventBufferToken)       -> ?CompactEventBufferToken;
177token_tag2string(eventsDescriptor)       -> ?CompactEventsToken;
178token_tag2string(eventsToken)            -> ?CompactEventsToken;
179%% token_tag2string(X) -> ?CompactFailoverToken;
180%% token_tag2string(X) -> ?CompactForcedToken;
181%% token_tag2string(X) -> ?CompactGracefulToken;
182%% token_tag2string(X) -> ?CompactH221Token;
183%% token_tag2string(X) -> ?CompactH223Token;
184%% token_tag2string(X) -> ?CompactH226Token;
185%% token_tag2string(X) -> ?CompactHandOffToken;
186%% token_tag2string(X) -> ?CompactImmAckRequiredToken;
187token_tag2string(inactive)                    -> ?CompactInactiveToken;
188token_tag2string(onInterruptByEvent)          -> ?CompactInterruptByEventToken;
189token_tag2string(onInterruptByNewSignalDescr) -> ?CompactInterruptByNewSignalsDescrToken;
190token_tag2string(isolate)        	 -> ?CompactIsolateToken;
191token_tag2string(inSvc)          	 -> ?CompactInSvcToken;
192token_tag2string(keepActive)     	 -> ?CompactKeepActiveToken;
193token_tag2string(localDescriptor)        -> ?CompactLocalToken;
194token_tag2string(localControlDescriptor) -> ?CompactLocalControlToken;
195token_tag2string(lockStep)          	 -> ?CompactLockStepToken;
196token_tag2string(loopBack)          	 -> ?CompactLoopbackToken;
197token_tag2string(mediaDescriptor)   	 -> ?CompactMediaToken;
198token_tag2string(mediaToken)        	 -> ?CompactMediaToken;
199%% token_tag2string(X) -> ?CompactMegacopToken;
200%% token_tag2string(X) -> ?CompactMethodToken;
201%% token_tag2string(X) -> ?CompactMgcIdToken;
202%% token_tag2string(X) -> ?CompactModeToken;
203token_tag2string(modReq)               -> ?CompactModifyToken;
204token_tag2string(modReply)             -> ?CompactModifyToken;
205token_tag2string(modemDescriptor)      -> ?CompactModemToken;
206token_tag2string(modemToken)           -> ?CompactModemToken;
207token_tag2string(moveReq)              -> ?CompactMoveToken;
208token_tag2string(moveReply)            -> ?CompactMoveToken;
209%% token_tag2string(X) -> ?CompactMtpToken;
210token_tag2string(muxDescriptor)        -> ?CompactMuxToken;
211token_tag2string(muxToken)             -> ?CompactMuxToken;
212token_tag2string(notifyReq)            -> ?CompactNotifyToken;
213%% token_tag2string(X) -> ?CompactNotifyCompletionToken;
214%% token_tag2string(X) -> ?CompactNx64kToken;
215token_tag2string(observedEventsDescriptor) -> ?CompactObservedEventsToken;
216token_tag2string(observedEventsToken)      -> ?CompactObservedEventsToken;
217token_tag2string(false)                -> ?CompactOffToken;
218token_tag2string(off)                  -> ?CompactOffToken;
219token_tag2string(oneway)               -> ?CompactOnewayToken;
220token_tag2string(onOff)                -> ?CompactOnOffToken;
221token_tag2string(true)                 -> ?CompactOnToken;
222token_tag2string(otherReason)          -> ?CompactOtherReasonToken;
223token_tag2string(outOfSvc)             -> ?CompactOutOfSvcToken;
224token_tag2string(packagesDescriptor)   -> ?CompactPackagesToken;
225token_tag2string(packagesToken)        -> ?CompactPackagesToken;
226%% token_tag2string(X) -> ?CompactPendingToken;
227token_tag2string(priorityAudit)        -> ?CompactPriorityToken;
228%% token_tag2string(X) -> ?CompactProfileToken;
229%% token_tag2string(X) -> ?CompactReasonToken;
230token_tag2string(recvOnly)             -> ?CompactRecvonlyToken;
231%% token_tag2string(X) -> ?CompactReplyToken;
232%% token_tag2string(X) -> ?CompactResponseAckToken;
233%% token_tag2string(X) -> ?CompactRestartToken;
234token_tag2string(remoteDescriptor)     -> ?CompactRemoteToken;
235%% token_tag2string(X) -> ?CompactReservedGroupToken;
236%% token_tag2string(X) -> ?CompactReservedValueToken;
237token_tag2string(sendOnly)             -> ?CompactSendonlyToken;
238token_tag2string(sendRecv)             -> ?CompactSendrecvToken;
239%% token_tag2string(X) -> ?CompactServicesToken;
240%% token_tag2string(X) -> ?CompactServiceStatesToken;
241token_tag2string(serviceChangeReq)     -> ?CompactServiceChangeToken;
242%% token_tag2string(X) -> ?CompactServiceChangeAddressToken;
243%% token_tag2string(X) -> ?CompactSignalListToken;
244token_tag2string(signalsDescriptor)    -> ?CompactSignalsToken;
245token_tag2string(signalsToken)         -> ?CompactSignalsToken;
246%% token_tag2string(X) -> ?CompactSignalTypeToken;
247token_tag2string(statisticsDescriptor) -> ?CompactStatsToken;
248token_tag2string(statsToken)           -> ?CompactStatsToken;
249%% token_tag2string(X) -> ?CompactStreamToken;
250token_tag2string(subtractReq)          -> ?CompactSubtractToken;
251token_tag2string(subtractReply)        -> ?CompactSubtractToken;
252%% token_tag2string(X) -> ?CompactSynchISDNToken;
253%% token_tag2string(X) -> ?CompactTerminationStateToken;
254token_tag2string(test)                 -> ?CompactTestToken;
255token_tag2string(timeOut)              -> ?CompactTimeOutToken;
256token_tag2string(onTimeOut)            -> ?CompactTimeOutToken;
257token_tag2string(topologyAudit)        -> ?CompactTopologyToken;
258%% token_tag2string(X) -> ?CompactTransToken;
259%% token_tag2string(X) -> ?CompactV18Token;
260%% token_tag2string(X) -> ?CompactV22Token;
261%% token_tag2string(X) -> ?CompactV22bisToken;
262%% token_tag2string(X) -> ?CompactV32Token;
263%% token_tag2string(X) -> ?CompactV32bisToken;
264%% token_tag2string(X) -> ?CompactV34Token;
265%% token_tag2string(X) -> ?CompactV76Token;
266%% token_tag2string(X) -> ?CompactV90Token;
267%% token_tag2string(X) -> ?CompactV91Token;
268%% token_tag2string(X) -> ?CompactVersionToken;
269token_tag2string(_) -> [].
270
271
272
273%%----------------------------------------------------------------------
274%% Define various macros used by the actual generator code
275%%----------------------------------------------------------------------
276
277-define(EQUAL,  [?EqualToken]).
278-define(COLON,  [?ColonToken]).
279-define(LBRKT,  [?LbrktToken]).
280-define(RBRKT,  [?RbrktToken]).
281-define(LSBRKT, [?LsbrktToken]).
282-define(RSBRKT, [?RsbrktToken]).
283-define(COMMA,  [?CommaToken]).
284-define(DOT,    [?DotToken]).
285-define(SLASH,  [?SlashToken]).
286-define(DQUOTE, [?DoubleQuoteToken]).
287-define(SP,     [?SpToken]).
288-define(HTAB,   [?HtabToken]).
289-define(CR,     [?CrToken]).
290-define(LF,     [?LfToken]).
291-define(LWSP,   []).
292-define(EOL,    ?LF).
293-define(WSP,    ?SP).
294-define(SEP,    ?WSP).
295
296-define(INIT_INDENT,           []).
297-define(INC_INDENT(State),     State).
298-define(INDENT(State),         State).
299-define(LBRKT_INDENT(_State),  [?LbrktToken]).
300-define(RBRKT_INDENT(_State),  [?RbrktToken]).
301-define(COMMA_INDENT(_State),  [?CommaToken]).
302-define(SEP_INDENT(_State),    [?LfToken]).
303
304%%----------------------------------------------------------------------
305%% Define token macros
306%%----------------------------------------------------------------------
307
308-define(AddToken                   , ?CompactAddToken).
309-define(AuditToken                 , ?CompactAuditToken).
310-define(AuditCapToken              , ?CompactAuditCapToken).
311-define(AuditValueToken            , ?CompactAuditValueToken).
312-define(AuthToken                  , ?CompactAuthToken).
313-define(BothwayToken               , ?CompactBothwayToken).
314-define(BriefToken                 , ?CompactBriefToken).
315-define(BufferToken                , ?CompactBufferToken).
316-define(CtxToken                   , ?CompactCtxToken).
317-define(ContextAuditToken          , ?CompactContextAuditToken).
318-define(DigitMapToken              , ?CompactDigitMapToken).
319-define(DiscardToken               , ?CompactDiscardToken).
320-define(DisconnectedToken          , ?CompactDisconnectedToken).
321-define(DelayToken                 , ?CompactDelayToken).
322-define(DeleteToken                , ?CompactDeleteToken).
323-define(DurationToken              , ?CompactDurationToken).
324-define(EmbedToken                 , ?CompactEmbedToken).
325-define(EmergencyToken             , ?CompactEmergencyToken).
326-define(EmergencyOffToken          , ?CompactEmergencyOffToken).
327-define(ErrorToken                 , ?CompactErrorToken).
328-define(EventBufferToken           , ?CompactEventBufferToken).
329-define(EventsToken                , ?CompactEventsToken).
330-define(FailoverToken              , ?CompactFailoverToken).
331-define(ForcedToken                , ?CompactForcedToken).
332-define(GracefulToken              , ?CompactGracefulToken).
333-define(H221Token                  , ?CompactH221Token).
334-define(H223Token                  , ?CompactH223Token).
335-define(H226Token                  , ?CompactH226Token).
336-define(HandOffToken               , ?CompactHandOffToken).
337-define(ImmAckRequiredToken        , ?CompactImmAckRequiredToken).
338-define(InactiveToken              , ?CompactInactiveToken).
339-define(InterruptByEventToken      , ?CompactInterruptByEventToken).
340-define(InterruptByNewSignalsDescrToken, ?CompactInterruptByNewSignalsDescrToken).
341-define(IsolateToken               , ?CompactIsolateToken).
342-define(InSvcToken                 , ?CompactInSvcToken).
343-define(KeepActiveToken            , ?CompactKeepActiveToken).
344-define(LocalToken                 , ?CompactLocalToken).
345-define(LocalControlToken          , ?CompactLocalControlToken).
346-define(LockStepToken              , ?CompactLockStepToken).
347-define(LoopbackToken              , ?CompactLoopbackToken).
348-define(MediaToken                 , ?CompactMediaToken).
349-define(MegacopToken               , ?CompactMegacopToken).
350-define(MethodToken                , ?CompactMethodToken).
351-define(MgcIdToken                 , ?CompactMgcIdToken).
352-define(ModeToken                  , ?CompactModeToken).
353-define(ModifyToken                , ?CompactModifyToken).
354-define(ModemToken                 , ?CompactModemToken).
355-define(MoveToken                  , ?CompactMoveToken).
356-define(MtpToken                   , ?CompactMtpToken).
357-define(MuxToken                   , ?CompactMuxToken).
358-define(NotifyToken                , ?CompactNotifyToken).
359-define(NotifyCompletionToken      , ?CompactNotifyCompletionToken).
360-define(Nx64kToken                 , ?CompactNx64kToken).
361-define(ObservedEventsToken        , ?CompactObservedEventsToken).
362-define(OffToken                   , ?CompactOffToken).
363-define(OnewayToken                , ?CompactOnewayToken).
364-define(OnOffToken                 , ?CompactOnOffToken).
365-define(OnToken                    , ?CompactOnToken).
366-define(OtherReasonToken           , ?CompactOtherReasonToken).
367-define(OutOfSvcToken              , ?CompactOutOfSvcToken).
368-define(PackagesToken              , ?CompactPackagesToken).
369-define(PendingToken               , ?CompactPendingToken).
370-define(PriorityToken              , ?CompactPriorityToken).
371-define(ProfileToken               , ?CompactProfileToken).
372-define(ReasonToken                , ?CompactReasonToken).
373-define(RecvonlyToken              , ?CompactRecvonlyToken).
374-define(ReplyToken                 , ?CompactReplyToken).
375-define(ResponseAckToken           , ?CompactResponseAckToken).
376-define(RestartToken               , ?CompactRestartToken).
377-define(RemoteToken                , ?CompactRemoteToken).
378-define(ReservedGroupToken         , ?CompactReservedGroupToken).
379-define(ReservedValueToken         , ?CompactReservedValueToken).
380-define(SendonlyToken              , ?CompactSendonlyToken).
381-define(SendrecvToken              , ?CompactSendrecvToken).
382-define(ServicesToken              , ?CompactServicesToken).
383-define(ServiceStatesToken         , ?CompactServiceStatesToken).
384-define(ServiceChangeToken         , ?CompactServiceChangeToken).
385-define(ServiceChangeAddressToken  , ?CompactServiceChangeAddressToken).
386-define(SignalListToken            , ?CompactSignalListToken).
387-define(SignalsToken               , ?CompactSignalsToken).
388-define(SignalTypeToken            , ?CompactSignalTypeToken).
389-define(StatsToken                 , ?CompactStatsToken).
390-define(StreamToken                , ?CompactStreamToken).
391-define(SubtractToken              , ?CompactSubtractToken).
392-define(SynchISDNToken             , ?CompactSynchISDNToken).
393-define(TerminationStateToken      , ?CompactTerminationStateToken).
394-define(TestToken                  , ?CompactTestToken).
395-define(TimeOutToken               , ?CompactTimeOutToken).
396-define(TopologyToken              , ?CompactTopologyToken).
397-define(TransToken                 , ?CompactTransToken).
398-define(V18Token                   , ?CompactV18Token).
399-define(V22Token                   , ?CompactV22Token).
400-define(V22bisToken                , ?CompactV22bisToken).
401-define(V32Token                   , ?CompactV32Token).
402-define(V32bisToken                , ?CompactV32bisToken).
403-define(V34Token                   , ?CompactV34Token).
404-define(V76Token                   , ?CompactV76Token).
405-define(V90Token                   , ?CompactV90Token).
406-define(V91Token                   , ?CompactV91Token).
407-define(VersionToken               , ?CompactVersionToken).
408
409%%----------------------------------------------------------------------
410%% Include the generator code
411%%----------------------------------------------------------------------
412
413-include("megaco_text_gen_v2.hrl").
414
415