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