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