📄 megaco_text_parser_prev3a.hrl
字号:
do_merge_signalRequest(Sig#'Signal'{keepActive = true}, T, SPL); {other, Name, PP} -> SP = #'SigParameter'{sigParameterName = Name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_signalRequest(Sig, T, [SP | SPL]); {direction, Dir} when Sig#'Signal'.direction == asn1_NOVALUE-> do_merge_signalRequest(Sig#'Signal'{direction = Dir}, T, SPL); {requestId, RID} when Sig#'Signal'.requestID == asn1_NOVALUE-> do_merge_signalRequest(Sig#'Signal'{requestID = RID}, T, SPL); _ -> return_error(0, {bad_sigParm, H}) end;do_merge_signalRequest(Sig, [], SPL) -> Sig#'Signal'{sigParList = lists:reverse(SPL)} .%% eventStream = StreamToken EQUAL StreamID%% eventOther = eventParameterName parmValueselect_stream_or_other("st", #'PropertyParm'{value = [Value]}) -> {stream, ensure_uint16(Value)};select_stream_or_other("st", Value) -> {stream, ensure_uint16(Value)};select_stream_or_other("stream", #'PropertyParm'{value = [Value]}) -> {stream, ensure_uint16(Value)};select_stream_or_other("stream", Value) -> {stream, ensure_uint16(Value)};select_stream_or_other(Name, #'PropertyParm'{value = Value}) -> EP = #'EventParameter'{eventParameterName = Name, value = Value}, {other, EP}.ensure_eventDM({_TokenTag, Line, DMD}) when record(DMD, 'DigitMapDescriptor') -> Name = DMD#'DigitMapDescriptor'.digitMapName, Val = DMD#'DigitMapDescriptor'.digitMapValue, if Name == asn1_NOVALUE, Val /= asn1_NOVALUE -> {'DigitMapValue', Start, Short, Long, Duration, Body} = Val, DMV = #'DigitMapValue'{startTimer = Start, shortTimer = Short, longTimer = Long, digitMapBody = Body, durationTimer = Duration}, {eventDM, {digitMapValue, DMV}}; Name /= asn1_NOVALUE, Val == asn1_NOVALUE -> {eventDM, {digitMapName, Name}}; true -> return_error(Line, {bad_eventDM, DMD}) end. ensure_DMD({_TokenTag, _Line, DMD}) when record(DMD, 'DigitMapDescriptor') -> Val2 = case DMD#'DigitMapDescriptor'.digitMapValue of %% Note that the values of the digitMapBody and durationTimers %% are swapped by the scanner (this is done because of a %% problem in the flex scanner). #'DigitMapValue'{durationTimer = Body, digitMapBody = Duration} = DMV -> %% Convert to version 1 DigitMapValue DMV#'DigitMapValue'{digitMapBody = Body, durationTimer = Duration}; Other -> Other end, DMD#'DigitMapDescriptor'{digitMapValue = Val2}.merge_observed_event(ObservedEvents, EventName, TimeStamp) -> StreamId = asn1_NOVALUE, EPL = [], do_merge_observed_event(ObservedEvents, EventName, TimeStamp, StreamId, EPL).do_merge_observed_event([{stream, StreamID} | T], EventName, TimeStamp, asn1_NOVALUE, EPL) -> do_merge_observed_event(T, EventName, TimeStamp, StreamID, EPL);do_merge_observed_event([{other, PP} | T], EventName, TimeStamp, StreamID, EPL) -> do_merge_observed_event(T, EventName, TimeStamp, StreamID, [PP | EPL]);do_merge_observed_event([], EventName, TimeStamp, StreamID, EPL) -> #'ObservedEvent'{eventName = EventName, timeNotation = TimeStamp, streamID = StreamID, eventParList = lists:reverse(EPL)}.merge_eventSpec(OE) when record(OE, 'ObservedEvent'), OE#'ObservedEvent'.timeNotation == asn1_NOVALUE -> #'EventSpec'{eventName = OE#'ObservedEvent'.eventName, streamID = OE#'ObservedEvent'.streamID, eventParList = OE#'ObservedEvent'.eventParList};merge_eventSpec(OE) -> return_error(0, {bad_event_spec, OE}).merge_eventParameters(Params) -> StreamId = asn1_NOVALUE, EPL = [], RA = #'RequestedActions'{}, HasA = no, do_merge_eventParameters(Params, StreamId, EPL, RA, HasA) . do_merge_eventParameters([H | T], StreamId, EPL, RA, HasA) -> case H of keepActive when RA#'RequestedActions'.keepActive == asn1_NOVALUE -> RA2 = RA#'RequestedActions'{keepActive = true}, do_merge_eventParameters(T, StreamId, EPL, RA2, yes); {embed, SD, SED} when RA#'RequestedActions'.signalsDescriptor == asn1_NOVALUE -> RA2 = RA#'RequestedActions'{signalsDescriptor = SD, secondEvent = SED}, do_merge_eventParameters(T, StreamId, EPL, RA2, yes); {eventDM, DM} when RA#'RequestedActions'.eventDM == asn1_NOVALUE -> RA2 = RA#'RequestedActions'{eventDM = DM}, do_merge_eventParameters(T, StreamId, EPL, RA2, yes); {stream, NewStreamId} when StreamId == asn1_NOVALUE -> do_merge_eventParameters(T, NewStreamId, EPL, RA, HasA); {other, PP} when record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); {other, EP} when record(EP, 'EventParameter') -> do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); _ -> return_error(0, {bad_eventParameter, H}) end;do_merge_eventParameters([], StreamId, EPL, RA, yes) -> #'RequestedEvent'{streamID = StreamId, eventAction = RA, evParList = lists:reverse(EPL)};do_merge_eventParameters([], StreamId, EPL, _RA, no) -> #'RequestedEvent'{streamID = StreamId, eventAction = asn1_NOVALUE, evParList = lists:reverse(EPL)}.merge_secondEventParameters(Params) -> StreamId = asn1_NOVALUE, EPL = [], SRA = #'SecondRequestedActions'{}, HasA = no, do_merge_secondEventParameters(Params, StreamId, EPL, SRA, HasA) . do_merge_secondEventParameters([H | T], StreamId, EPL, SRA, HasA) -> case H of keepActive when SRA#'SecondRequestedActions'.keepActive == asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{keepActive = true}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor == asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{signalsDescriptor = SD}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM == asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{eventDM = DM}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); {stream, NewStreamId} when StreamId == asn1_NOVALUE -> do_merge_secondEventParameters(T, NewStreamId, EPL, SRA, HasA); {other, PP} when record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); {other, EP} when record(EP, 'EventParameter') -> do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); _ -> return_error(0, {bad_secondEventParameter, H}) end;do_merge_secondEventParameters([], StreamId, EPL, SRA, yes) -> #'SecondRequestedEvent'{streamID = StreamId, eventAction = SRA, evParList = lists:reverse(EPL)};do_merge_secondEventParameters([], StreamId, EPL, _SRA, no) -> #'SecondRequestedEvent'{streamID = StreamId, eventAction = asn1_NOVALUE, evParList = lists:reverse(EPL)}.%% terminationID = "ROOT" / pathName / "$" / "*"%% Total length of pathName must not exceed 64 chars.%% pathName = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" )%% ["@" pathDomainName ]%% ABNF allows two or more consecutive "." although it is meaningless%% in a path domain name.%% pathDomainName = (ALPHA / DIGIT / "*" )%% *63(ALPHA / DIGIT / "-" / "*" / ".")ensure_terminationID({safeToken, _Line, LowerText}) -> %% terminationID = "ROOT" / pathName / "$" / "*" decode_term_id(LowerText, false, [], []).decode_term_id([H | T], Wild, Id, Component) -> case H of $/ -> decode_term_id(T, Wild, [lists:reverse(Component) | Id], []); $* -> decode_term_id(T, true, Id, [?megaco_all | Component]); $$ -> decode_term_id(T, true, Id, [?megaco_choose | Component]); _ -> decode_term_id(T, Wild, Id, [H | Component]) end;decode_term_id([], Wild, Id, Component) -> Id2 = [lists:reverse(Component) | Id], #megaco_term_id{contains_wildcards = Wild, id = lists:reverse(Id2)}. ensure_pathName({_TokenTag, _Line, Text}) -> Text. %% BUGBUG: ensure values%% TimeStamp = Date "T" Time ; per ISO 8601:1988%% Date = 8(DIGIT) ; Date = yyyymmdd%% Time = 8(DIGIT) ; Time = hhmmssssensure_timeStamp({'TimeStampToken', Line, Text}) -> case string:tokens(Text, [$T, $t]) of [Date, Time] -> #'TimeNotation'{date = Date, time = Time}; _ -> return_error(Line, {bad_timeStamp, Text}) end.ensure_transactionID(TransId) -> ensure_uint32(TransId).%% transactionAck = transactionID / (transactionID "-" transactionID)ensure_transactionAck({safeToken, _Line, Text}) -> case string:tokens(Text, [$-]) of [Id] -> #'TransactionAck'{firstAck = ensure_transactionID(Id)}; [Id, Id2] -> #'TransactionAck'{firstAck = ensure_transactionID(Id), lastAck = ensure_transactionID(Id2)} end.merge_context_request(CR, []) -> CR;merge_context_request(CR, [H|T]) -> case H of {priority, Int} when CR#'ContextRequest'.priority == asn1_NOVALUE -> merge_context_request(CR#'ContextRequest'{priority = Int}, T); {emergency, Bool} when CR#'ContextRequest'.emergency == asn1_NOVALUE -> merge_context_request(CR#'ContextRequest'{emergency = Bool}, T); {topology, Desc} when CR#'ContextRequest'.topologyReq == asn1_NOVALUE -> merge_context_request(CR#'ContextRequest'{topologyReq = Desc}, T); {iepsCallind, Ind} when CR#'ContextRequest'.iepsCallind == asn1_NOVALUE -> merge_context_request(CR#'ContextRequest'{iepsCallind = Ind}, T); {prop, Prop} when CR#'ContextRequest'.contextProp == asn1_NOVALUE -> merge_context_request(CR#'ContextRequest'{contextProp = [Prop]}, T); {Tag, Val} -> Val2 = case Tag of priority -> CR#'ContextRequest'.priority; emergency -> CR#'ContextRequest'.emergency; topology -> CR#'ContextRequest'.topologyReq; iepsCallind -> CR#'ContextRequest'.iepsCallind; prop -> CR#'ContextRequest'.contextProp end, exit({at_most_once_contextProperty, {Tag, Val, Val2}}) end. merge_context_attr_audit_request(CAAR, []) -> CAAR;merge_context_attr_audit_request(CAAR, [H|T]) -> case H of priorityAudit when CAAR#'ContextAttrAuditRequest'.priority == asn1_NOVALUE -> CAAR2 = CAAR#'ContextAttrAuditRequest'{priority = 'NULL'}, merge_context_attr_audit_request(CAAR2, T); emergencyAudit when CAAR#'ContextAttrAuditRequest'.emergency == asn1_NOVALUE -> CAAR2 = CAAR#'ContextAttrAuditRequest'{emergency = 'NULL'}, merge_context_attr_audit_request(CAAR2, T); topologyAudit when CAAR#'ContextAttrAuditRequest'.topology == asn1_NOVALUE -> CAAR2 = CAAR#'ContextAttrAuditRequest'{topology = 'NULL'}, merge_context_attr_audit_request(CAAR2, T); iepsCallind when CAAR#'ContextAttrAuditRequest'.iepsCallind == asn1_NOVALUE -> CAAR2 = CAAR#'ContextAttrAuditRequest'{iepsCallind = 'NULL'}, merge_context_attr_audit_request(CAAR2, T); {prop, Name} when CAAR#'ContextAttrAuditRequest'.contextPropAud == asn1_NOVALUE -> CPA = [#'IndAudPropertyParm'{name = Name}], CAAR2 = CAAR#'ContextAttrAuditRequest'{contextPropAud = CPA}, merge_context_attr_audit_request(CAAR2, T); {prop, Name} -> CPA = CAAR#'ContextAttrAuditRequest'.contextPropAud, CPA2 = [#'IndAudPropertyParm'{name = Name}|CPA], CAAR2 = CAAR#'ContextAttrAuditRequest'{contextPropAud = CPA2}, merge_context_attr_audit_request(CAAR2, T) end.merge_action_request(CtxId, Items) -> do_merge_action_request(Items, [], asn1_NOVALUE, asn1_NOVALUE, CtxId).do_merge_action_request([H|T], CmdReqs, CtxReq, CtxAuditReq, CtxId) -> case H of {commandRequest, CmdReq} -> do_merge_action_request(T, [CmdReq|CmdReqs], CtxReq, CtxAuditReq, CtxId); {contextProps, ContextReq} when CtxReq == asn1_NOVALUE -> do_merge_action_request(T, CmdReqs, ContextReq, CtxAuditReq, CtxId); {contextAudit, ContextAuditReq} when CtxAuditReq == asn1_NOVALUE -> do_merge_action_request(T, CmdReqs, CtxReq, ContextAuditReq, CtxId) end;do_merge_action_request([], CmdReqs, CtxReq, CtxAuditReq, CtxId) -> #'ActionRequest'{contextId = CtxId, contextRequest = strip_ContextRequest(CtxReq), contextAttrAuditReq = strip_ContextAttrAuditRequest(CtxAuditReq), commandRequests = lists:reverse(CmdReqs)}.%% OTP-5085: %% In order to solve a problem in the parser, the error descriptor%% has been put last in the non-empty commandReplyList, if it is not %% asn1_NOVALUEmerge_action_reply(Items) -> do_merge_action_reply(Items, asn1_NOVALUE, asn1_NOVALUE, []).do_merge_action_reply([], Err, Ctx, Cmds) -> #'ActionReply'{errorDescriptor = Err, contextReply = strip_ContextRequest(Ctx), commandReply = lists:reverse(Cmds)};do_merge_action_reply([H|T], Err0, Ctx0, Cmds) -> case H of {error, Err1} when Err0 == asn1_NOVALUE -> do_merge_action_reply(T, Err1, Ctx0, Cmds); {command, Cmd} -> do_merge_action_reply(T, Err0, Ctx0, [Cmd | Cmds]); {context, Ctx1} when Ctx0 == asn1_NOVALUE -> do_merge_action_reply(T, Err0, Ctx1, Cmds) end.strip_ContextRequest(#'ContextRequest'{priority = asn1_NOVALUE, emergency = asn1_NOVALUE, topologyReq = asn1_NOVALUE,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -