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