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 PRETTY Megaco/H.248 text messages from internal form
24%%----------------------------------------------------------------------
25
26-module(megaco_pretty_text_encoder_v1).
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
38-include_lib("megaco/include/megaco.hrl").
39-include_lib("megaco/include/megaco_message_v1.hrl").
40-define(encoder_pre_version_3,true). % version 1 or 2
41-include("megaco_text_tokens.hrl").
42
43
44%%----------------------------------------------------------------------
45%% Convert a 'MegacoMessage' record into a binary
46%% Return {ok, DeepIoList} | {error, Reason}
47%%----------------------------------------------------------------------
48
49encode_message(EC, MegaMsg)
50  when is_list(EC) andalso is_record(MegaMsg, 'MegacoMessage') ->
51    case (catch enc_MegacoMessage(MegaMsg)) of
52	{'EXIT', Reason} ->
53	    {error, Reason};
54	Bin when is_binary(Bin) ->
55	    {ok, Bin};
56	DeepIoList ->
57	    Bin = erlang:list_to_binary(DeepIoList),
58	    {ok, Bin}
59    end;
60encode_message(EC, MegaMsg)
61  when is_record(MegaMsg, 'MegacoMessage')  ->
62    {error, {bad_encoding_config, EC}};
63encode_message(_EC, _MegaMsg) ->
64    {error, bad_megaco_message}.
65
66
67%%----------------------------------------------------------------------
68%% Convert a transaction record into a deep io list
69%% Return {ok, DeepIoList} | {error, Reason}
70%%----------------------------------------------------------------------
71encode_transaction(_EC, Trans) ->
72    case (catch enc_Transaction(Trans)) of
73        {'EXIT', Reason} ->
74            {error, Reason};
75        Bin when is_binary(Bin) ->
76            {ok, Bin};
77        DeepIoList ->
78            Bin = erlang:list_to_binary(DeepIoList),
79            {ok, Bin}
80    end.
81
82%%----------------------------------------------------------------------
83%% Convert a list of ActionRequest record's into a binary
84%% Return {ok, DeepIoList} | {error, Reason}
85%%----------------------------------------------------------------------
86encode_action_requests(_EC, ActReqs) when is_list(ActReqs) ->
87    case (catch enc_ActionRequests(ActReqs)) of
88	{'EXIT', Reason} ->
89	    {error, Reason};
90	Bin when is_binary(Bin) ->
91	    {ok, Bin};
92	DeepIoList ->
93	    Bin = erlang:list_to_binary(DeepIoList),
94	    {ok, Bin}
95    end.
96
97%%----------------------------------------------------------------------
98%% Convert a ActionRequest record into a binary
99%% Return {ok, DeepIoList} | {error, Reason}
100%%----------------------------------------------------------------------
101encode_action_request(_EC, ActReq)
102  when is_record(ActReq, 'ActionRequest') ->
103    case (catch enc_ActionRequest(ActReq)) of
104	{'EXIT', Reason} ->
105	    {error, Reason};
106	Bin when is_binary(Bin) ->
107	    {ok, Bin};
108	DeepIoList ->
109	    Bin = erlang:list_to_binary(DeepIoList),
110	    {ok, Bin}
111    end.
112
113%%----------------------------------------------------------------------
114%% Convert a CommandRequest record into a binary
115%% Return {ok, DeepIoList} | {error, Reason}
116%%----------------------------------------------------------------------
117encode_command_request(_EC, CmdReq)
118  when is_record(CmdReq, 'CommandRequest') ->
119    case (catch enc_CommandRequest(CmdReq)) of
120        {'EXIT', Reason} ->
121            {error, Reason};
122        Bin when is_binary(Bin) ->
123            {ok, Bin};
124        DeepIoList ->
125            Bin = erlang:list_to_binary(DeepIoList),
126            {ok, Bin}
127    end.
128
129%%----------------------------------------------------------------------
130%% Convert a action reply into a deep io list
131%% Return {ok, DeepIoList} | {error, Reason}
132%%----------------------------------------------------------------------
133encode_action_reply(_EC, ActRep)
134  when is_record(ActRep, 'ActionReply') ->
135    case (catch enc_ActionReply(ActRep)) of
136        {'EXIT', Reason} ->
137            {error, Reason};
138        Bin when is_binary(Bin) ->
139            {ok, Bin};
140        DeepIoList ->
141            Bin = erlang:list_to_binary(DeepIoList),
142            {ok, Bin}
143    end.
144
145
146%%----------------------------------------------------------------------
147%% A utility function to pretty print the tags found in a megaco message
148%%----------------------------------------------------------------------
149
150token_tag2string(addReq)                 -> ?PrettyAddToken;
151token_tag2string(addReply)               -> ?PrettyAddToken;
152token_tag2string(auditDescriptor)        -> ?PrettyAuditToken;
153token_tag2string(auditCapRequest)        -> ?PrettyAuditCapToken;
154token_tag2string(auditCapReply)          -> ?PrettyAuditCapToken;
155token_tag2string(auditValueRequest)      -> ?PrettyAuditValueToken;
156token_tag2string(auditValueReply)        -> ?PrettyAuditValueToken;
157%% token_tag2string(X) -> ?PrettyAuthToken;
158token_tag2string(bothway)                -> ?PrettyBothwayToken;
159token_tag2string(brief)                  -> ?PrettyBriefToken;
160%% token_tag2string(X) -> ?PrettyBufferToken;
161%% token_tag2string(X) -> ?PrettyCtxToken;
162%% token_tag2string(X) -> ?PrettyContextAuditToken;
163token_tag2string(digitMapDescriptor)     -> ?PrettyDigitMapToken;
164token_tag2string(digitMapToken)          -> ?PrettyDigitMapToken;
165%% token_tag2string(X) -> ?PrettyDiscardToken;
166%% token_tag2string(X) -> ?PrettyDisconnectedToken;
167%% token_tag2string(X) -> ?PrettyDelayToken;
168token_tag2string(duration)               -> ?PrettyDurationToken;
169%% token_tag2string(X) -> ?PrettyEmbedToken;
170token_tag2string(emergencyAudit)         -> ?PrettyEmergencyToken;
171token_tag2string(errorDescriptor)        -> ?PrettyErrorToken;
172token_tag2string(eventBufferDescriptor)  -> ?PrettyEventBufferToken;
173token_tag2string(eventBufferToken)       -> ?PrettyEventBufferToken;
174token_tag2string(eventsDescriptor)       -> ?PrettyEventsToken;
175token_tag2string(eventsToken)            -> ?PrettyEventsToken;
176%% token_tag2string(X) -> ?PrettyFailoverToken;
177%% token_tag2string(X) -> ?PrettyForcedToken;
178%% token_tag2string(X) -> ?PrettyGracefulToken;
179%% token_tag2string(X) -> ?PrettyH221Token;
180%% token_tag2string(X) -> ?PrettyH223Token;
181%% token_tag2string(X) -> ?PrettyH226Token;
182%% token_tag2string(X) -> ?PrettyHandOffToken;
183%% token_tag2string(X) -> ?PrettyImmAckRequiredToken;
184token_tag2string(inactive)                    -> ?PrettyInactiveToken;
185token_tag2string(onInterruptByEvent)          -> ?PrettyInterruptByEventToken;
186token_tag2string(onInterruptByNewSignalDescr) -> ?PrettyInterruptByNewSignalsDescrToken;
187token_tag2string(isolate)        	 -> ?PrettyIsolateToken;
188token_tag2string(inSvc)          	 -> ?PrettyInSvcToken;
189token_tag2string(keepActive)     	 -> ?PrettyKeepActiveToken;
190token_tag2string(localDescriptor)        -> ?PrettyLocalToken;
191token_tag2string(localControlDescriptor) -> ?PrettyLocalControlToken;
192token_tag2string(lockStep)          	 -> ?PrettyLockStepToken;
193token_tag2string(loopBack)          	 -> ?PrettyLoopbackToken;
194token_tag2string(mediaDescriptor)   	 -> ?PrettyMediaToken;
195token_tag2string(mediaToken)        	 -> ?PrettyMediaToken;
196%% token_tag2string(X) -> ?PrettyMegacopToken;
197%% token_tag2string(X) -> ?PrettyMethodToken;
198%% token_tag2string(X) -> ?PrettyMgcIdToken;
199%% token_tag2string(X) -> ?PrettyModeToken;
200token_tag2string(modReq)               -> ?PrettyModifyToken;
201token_tag2string(modReply)             -> ?PrettyModifyToken;
202token_tag2string(modemDescriptor)      -> ?PrettyModemToken;
203token_tag2string(modemToken)           -> ?PrettyModemToken;
204token_tag2string(moveReq)              -> ?PrettyMoveToken;
205token_tag2string(moveReply)            -> ?PrettyMoveToken;
206%% token_tag2string(X) -> ?PrettyMtpToken;
207token_tag2string(muxDescriptor)        -> ?PrettyMuxToken;
208token_tag2string(muxToken)             -> ?PrettyMuxToken;
209token_tag2string(notifyReq)            -> ?PrettyNotifyToken;
210%% token_tag2string(X) -> ?PrettyNotifyCompletionToken;
211token_tag2string(observedEventsDescriptor) -> ?PrettyObservedEventsToken;
212token_tag2string(observedEventsToken)      -> ?PrettyObservedEventsToken;
213token_tag2string(false)                -> ?PrettyOffToken;
214token_tag2string(off)                  -> ?PrettyOffToken;
215token_tag2string(oneway)               -> ?PrettyOnewayToken;
216token_tag2string(onOff)                -> ?PrettyOnOffToken;
217token_tag2string(true)                 -> ?PrettyOnToken;
218token_tag2string(otherReason)          -> ?PrettyOtherReasonToken;
219token_tag2string(outOfSvc)             -> ?PrettyOutOfSvcToken;
220token_tag2string(packagesDescriptor)   -> ?PrettyPackagesToken;
221token_tag2string(packagesToken)        -> ?PrettyPackagesToken;
222%% token_tag2string(X) -> ?PrettyPendingToken;
223token_tag2string(priorityAudit)        -> ?PrettyPriorityToken;
224%% token_tag2string(X) -> ?PrettyProfileToken;
225%% token_tag2string(X) -> ?PrettyReasonToken;
226token_tag2string(recvOnly)             -> ?PrettyRecvonlyToken;
227%% token_tag2string(X) -> ?PrettyReplyToken;
228%% token_tag2string(X) -> ?PrettyResponseAckToken;
229%% token_tag2string(X) -> ?PrettyRestartToken;
230token_tag2string(remoteDescriptor)     -> ?PrettyRemoteToken;
231%% token_tag2string(X) -> ?PrettyReservedGroupToken;
232%% token_tag2string(X) -> ?PrettyReservedValueToken;
233token_tag2string(sendOnly)             -> ?PrettySendonlyToken;
234token_tag2string(sendRecv)             -> ?PrettySendrecvToken;
235%% token_tag2string(X) -> ?PrettyServicesToken;
236%% token_tag2string(X) -> ?PrettyServiceStatesToken;
237token_tag2string(serviceChangeReq)     -> ?PrettyServiceChangeToken;
238%% token_tag2string(X) -> ?PrettyServiceChangeAddressToken;
239%% token_tag2string(X) -> ?PrettySignalListToken;
240token_tag2string(signalsDescriptor)    -> ?PrettySignalsToken;
241token_tag2string(signalsToken)         -> ?PrettySignalsToken;
242%% token_tag2string(X) -> ?PrettySignalTypeToken;
243token_tag2string(statisticsDescriptor) -> ?PrettyStatsToken;
244token_tag2string(statsToken)           -> ?PrettyStatsToken;
245%% token_tag2string(X) -> ?PrettyStreamToken;
246token_tag2string(subtractReq)          -> ?PrettySubtractToken;
247token_tag2string(subtractReply)        -> ?PrettySubtractToken;
248%% token_tag2string(X) -> ?PrettySynchISDNToken;
249%% token_tag2string(X) -> ?PrettyTerminationStateToken;
250token_tag2string(test)                 -> ?PrettyTestToken;
251token_tag2string(timeOut)              -> ?PrettyTimeOutToken;
252token_tag2string(onTimeOut)            -> ?PrettyTimeOutToken;
253token_tag2string(topologyAudit)        -> ?PrettyTopologyToken;
254%% token_tag2string(X) -> ?PrettyTransToken;
255%% token_tag2string(X) -> ?PrettyV18Token;
256%% token_tag2string(X) -> ?PrettyV22Token;
257%% token_tag2string(X) -> ?PrettyV22bisToken;
258%% token_tag2string(X) -> ?PrettyV32Token;
259%% token_tag2string(X) -> ?PrettyV32bisToken;
260%% token_tag2string(X) -> ?PrettyV34Token;
261%% token_tag2string(X) -> ?PrettyV76Token;
262%% token_tag2string(X) -> ?PrettyV90Token;
263%% token_tag2string(X) -> ?PrettyV91Token;
264%% token_tag2string(X) -> ?PrettyVersionToken;
265token_tag2string(_) -> [].
266
267
268%%----------------------------------------------------------------------
269%% Define various macros used by the actual generator code
270%%----------------------------------------------------------------------
271
272-define(EQUAL,  [?SpToken, ?EqualToken, ?SpToken]).
273-define(COLON,  [?ColonToken]).
274-define(LBRKT,  [?SpToken, ?LbrktToken, ?SpToken]).
275-define(RBRKT,  [?SpToken, ?RbrktToken, ?SpToken]).
276-define(LSBRKT, [?LsbrktToken]).
277-define(RSBRKT, [?RsbrktToken]).
278-define(COMMA,  [?CommaToken, ?SpToken]).
279-define(DOT,    [?DotToken]).
280-define(SLASH,  [?SlashToken]).
281-define(DQUOTE, [?DoubleQuoteToken]).
282-define(SP,     [?SpToken]).
283-define(HTAB,   [?HtabToken]).
284-define(CR,     [?CrToken]).
285-define(LF,     [?LfToken]).
286-define(LWSP,   []).
287-define(EOL,    ?LF).
288-define(WSP,    ?SP).
289-define(SEP,    ?WSP).
290
291-define(INIT_INDENT,          []).
292-define(INC_INDENT(State),    [?HtabToken | State]).
293-define(INDENT(State),        [?LfToken | State]).
294-define(LBRKT_INDENT(State),  [?SpToken, ?LbrktToken, ?INDENT(?INC_INDENT(State))]).
295-define(RBRKT_INDENT(State),  [?INDENT(State), ?RbrktToken]).
296-define(COMMA_INDENT(State),  [?CommaToken, ?INDENT(State)]).
297-define(SEP_INDENT(_State),   [?LfToken]).
298
299%%----------------------------------------------------------------------
300%% Define token macros
301%%----------------------------------------------------------------------
302
303-define(AddToken                   , ?PrettyAddToken).
304-define(AuditToken                 , ?PrettyAuditToken).
305-define(AuditCapToken              , ?PrettyAuditCapToken).
306-define(AuditValueToken            , ?PrettyAuditValueToken).
307-define(AuthToken                  , ?PrettyAuthToken).
308-define(BothwayToken               , ?PrettyBothwayToken).
309-define(BriefToken                 , ?PrettyBriefToken).
310-define(BufferToken                , ?PrettyBufferToken).
311-define(CtxToken                   , ?PrettyCtxToken).
312-define(ContextAuditToken          , ?PrettyContextAuditToken).
313-define(DigitMapToken              , ?PrettyDigitMapToken).
314-define(DiscardToken               , ?PrettyDiscardToken).
315-define(DisconnectedToken          , ?PrettyDisconnectedToken).
316-define(DelayToken                 , ?PrettyDelayToken).
317-define(DeleteToken                , ?PrettyDeleteToken).
318-define(DurationToken              , ?PrettyDurationToken).
319-define(EmbedToken                 , ?PrettyEmbedToken).
320-define(EmergencyToken             , ?PrettyEmergencyToken).
321-define(ErrorToken                 , ?PrettyErrorToken).
322-define(EventBufferToken           , ?PrettyEventBufferToken).
323-define(EventsToken                , ?PrettyEventsToken).
324-define(FailoverToken              , ?PrettyFailoverToken).
325-define(ForcedToken                , ?PrettyForcedToken).
326-define(GracefulToken              , ?PrettyGracefulToken).
327-define(H221Token                  , ?PrettyH221Token).
328-define(H223Token                  , ?PrettyH223Token).
329-define(H226Token                  , ?PrettyH226Token).
330-define(HandOffToken               , ?PrettyHandOffToken).
331-define(ImmAckRequiredToken        , ?PrettyImmAckRequiredToken).
332-define(InactiveToken              , ?PrettyInactiveToken).
333-define(IsolateToken               , ?PrettyIsolateToken).
334-define(InSvcToken                 , ?PrettyInSvcToken).
335-define(InterruptByEventToken      , ?PrettyInterruptByEventToken).
336-define(InterruptByNewSignalsDescrToken, ?PrettyInterruptByNewSignalsDescrToken).
337-define(KeepActiveToken            , ?PrettyKeepActiveToken).
338-define(LocalToken                 , ?PrettyLocalToken).
339-define(LocalControlToken          , ?PrettyLocalControlToken).
340-define(LockStepToken              , ?PrettyLockStepToken).
341-define(LoopbackToken              , ?PrettyLoopbackToken).
342-define(MediaToken                 , ?PrettyMediaToken).
343-define(MegacopToken               , ?PrettyMegacopToken).
344-define(MethodToken                , ?PrettyMethodToken).
345-define(MgcIdToken                 , ?PrettyMgcIdToken).
346-define(ModeToken                  , ?PrettyModeToken).
347-define(ModifyToken                , ?PrettyModifyToken).
348-define(ModemToken                 , ?PrettyModemToken).
349-define(MoveToken                  , ?PrettyMoveToken).
350-define(MtpToken                   , ?PrettyMtpToken).
351-define(MuxToken                   , ?PrettyMuxToken).
352-define(NotifyToken                , ?PrettyNotifyToken).
353-define(NotifyCompletionToken      , ?PrettyNotifyCompletionToken).
354-define(Nx64kToken                 , ?PrettyNx64kToken).
355-define(ObservedEventsToken        , ?PrettyObservedEventsToken).
356-define(OffToken                   , ?PrettyOffToken).
357-define(OnewayToken                , ?PrettyOnewayToken).
358-define(OnOffToken                 , ?PrettyOnOffToken).
359-define(OnToken                    , ?PrettyOnToken).
360-define(OtherReasonToken           , ?PrettyOtherReasonToken).
361-define(OutOfSvcToken              , ?PrettyOutOfSvcToken).
362-define(PackagesToken              , ?PrettyPackagesToken).
363-define(PendingToken               , ?PrettyPendingToken).
364-define(PriorityToken              , ?PrettyPriorityToken).
365-define(ProfileToken               , ?PrettyProfileToken).
366-define(ReasonToken                , ?PrettyReasonToken).
367-define(RecvonlyToken              , ?PrettyRecvonlyToken).
368-define(ReplyToken                 , ?PrettyReplyToken).
369-define(ResponseAckToken           , ?PrettyResponseAckToken).
370-define(RestartToken               , ?PrettyRestartToken).
371-define(RemoteToken                , ?PrettyRemoteToken).
372-define(ReservedGroupToken         , ?PrettyReservedGroupToken).
373-define(ReservedValueToken         , ?PrettyReservedValueToken).
374-define(SendonlyToken              , ?PrettySendonlyToken).
375-define(SendrecvToken              , ?PrettySendrecvToken).
376-define(ServicesToken              , ?PrettyServicesToken).
377-define(ServiceStatesToken         , ?PrettyServiceStatesToken).
378-define(ServiceChangeToken         , ?PrettyServiceChangeToken).
379-define(ServiceChangeAddressToken  , ?PrettyServiceChangeAddressToken).
380-define(SignalListToken            , ?PrettySignalListToken).
381-define(SignalsToken               , ?PrettySignalsToken).
382-define(SignalTypeToken            , ?PrettySignalTypeToken).
383-define(StatsToken                 , ?PrettyStatsToken).
384-define(StreamToken                , ?PrettyStreamToken).
385-define(SubtractToken              , ?PrettySubtractToken).
386-define(SynchISDNToken             , ?PrettySynchISDNToken).
387-define(TerminationStateToken      , ?PrettyTerminationStateToken).
388-define(TestToken                  , ?PrettyTestToken).
389-define(TimeOutToken               , ?PrettyTimeOutToken).
390-define(TopologyToken              , ?PrettyTopologyToken).
391-define(TransToken                 , ?PrettyTransToken).
392-define(V18Token                   , ?PrettyV18Token).
393-define(V22Token                   , ?PrettyV22Token).
394-define(V22bisToken                , ?PrettyV22bisToken).
395-define(V32Token                   , ?PrettyV32Token).
396-define(V32bisToken                , ?PrettyV32bisToken).
397-define(V34Token                   , ?PrettyV34Token).
398-define(V76Token                   , ?PrettyV76Token).
399-define(V90Token                   , ?PrettyV90Token).
400-define(V91Token                   , ?PrettyV91Token).
401-define(VersionToken               , ?PrettyVersionToken).
402
403%%----------------------------------------------------------------------
404%% Include the generator code
405%%----------------------------------------------------------------------
406
407-include("megaco_text_gen_v1.hrl").
408
409