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