📄 megaco_text_parser_prev3b.hrl
字号:
do_merge_signalRequest(Sig#'Signal'{streamID = SID}, T, SPL); {signal_type, SigType} when Sig#'Signal'.sigType == asn1_NOVALUE -> do_merge_signalRequest(Sig#'Signal'{sigType = SigType}, T, SPL); {duration, Duration} when Sig#'Signal'.duration == asn1_NOVALUE -> do_merge_signalRequest(Sig#'Signal'{duration = Duration}, T, SPL); {notify_completion, NC} when Sig#'Signal'.notifyCompletion == asn1_NOVALUE -> do_merge_signalRequest(Sig#'Signal'{notifyCompletion = NC}, T, SPL); keepActive when Sig#'Signal'.keepActive == asn1_NOVALUE-> 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(asn1_NOVALUE, Prop) -> merge_context_request(#'ContextRequest'{}, Prop);merge_context_request(#'ContextRequest'{priority = asn1_NOVALUE} = CR, {priority, Int}) -> CR#'ContextRequest'{priority = Int};merge_context_request(#'ContextRequest'{emergency = asn1_NOVALUE} = CR, {emergency, Bool}) -> CR#'ContextRequest'{emergency = Bool};merge_context_request(#'ContextRequest'{topologyReq = asn1_NOVALUE} = CR, {topology, Desc}) -> CR#'ContextRequest'{topologyReq = Desc};merge_context_request(#'ContextRequest'{iepscallind = asn1_NOVALUE} = CR, {iepsCallind, Ind}) -> CR#'ContextRequest'{iepscallind = Ind};merge_context_request(#'ContextRequest'{contextProp = asn1_NOVALUE} = CR, {contextProp, Props}) -> CR#'ContextRequest'{contextProp = Props};%% The parser handles this, but we drop it in this version%% merge_context_request(#'ContextRequest'{contextList = asn1_NOVALUE} = CR, %% {contextList, _IDs}) -> %% CR#'ContextRequest'{contextList = IDs};merge_context_request(CR, {contextList, _IDs}) -> CR;merge_context_request(CR, {Tag, Val}) -> Val2 = case Tag of priority -> CR#'ContextRequest'.priority; emergency -> CR#'ContextRequest'.emergency; topology -> CR#'ContextRequest'.topologyReq; iepsCallind -> CR#'ContextRequest'.iepscallind; contextProp -> CR#'ContextRequest'.contextProp%% ; %% contextList -> CR#'ContextRequest'.contextList end, exit({at_most_once_contextProperty, {Tag, Val, Val2}}). 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); {contextProp, ContextProp} -> do_merge_action_request(T, CmdReqs, merge_context_request(CtxReq, ContextProp), 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, CR, Cmds) -> case H of
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -