📄 megaco_text_parser_v1.hrl
字号:
SCP#'ServiceChangeParm'.serviceChangeMethod; time_stamp -> SCP#'ServiceChangeParm'.timeStamp end, exit({at_most_once_serviceChangeParm, {Tag, Val, Val2}}).merge_ServiceChangeResParm(Parms) -> merge_ServiceChangeResParm(Parms, #'ServiceChangeResParm'{}).merge_ServiceChangeResParm([], SCRP) -> SCRP;merge_ServiceChangeResParm([{address, Val}|Parms], SCRP0) when SCRP0#'ServiceChangeResParm'.serviceChangeAddress == asn1_NOVALUE, SCRP0#'ServiceChangeResParm'.serviceChangeMgcId == asn1_NOVALUE -> SCRP = SCRP0#'ServiceChangeResParm'{serviceChangeAddress = Val}, merge_ServiceChangeResParm(Parms, SCRP);merge_ServiceChangeResParm([{address, Val}|_Parms], SCRP0) when SCRP0#'ServiceChangeResParm'.serviceChangeAddress == asn1_NOVALUE -> MgcId = SCRP0#'ServiceChangeResParm'.serviceChangeMgcId, exit({not_both_address_mgcid_servChgReplyParm, Val, MgcId});merge_ServiceChangeResParm([{mgc_id, Val}|Parms], SCRP0) when SCRP0#'ServiceChangeResParm'.serviceChangeMgcId == asn1_NOVALUE, SCRP0#'ServiceChangeResParm'.serviceChangeAddress == asn1_NOVALUE -> SCRP = SCRP0#'ServiceChangeResParm'{serviceChangeMgcId = Val}, merge_ServiceChangeResParm(Parms, SCRP);merge_ServiceChangeResParm([{mgc_id, Val}|_Parms], SCRP0) when SCRP0#'ServiceChangeResParm'.serviceChangeMgcId == asn1_NOVALUE -> Addr = SCRP0#'ServiceChangeResParm'.serviceChangeAddress, exit({not_both_address_mgcid_servChgReplyParm, Val, Addr});merge_ServiceChangeResParm([{profile, Val}|Parms], SCRP0) when SCRP0#'ServiceChangeResParm'.serviceChangeProfile == asn1_NOVALUE -> SCRP = SCRP0#'ServiceChangeResParm'{serviceChangeProfile = Val}, merge_ServiceChangeResParm(Parms, SCRP);merge_ServiceChangeResParm([{version, Val}|Parms], SCRP0) when SCRP0#'ServiceChangeResParm'.serviceChangeVersion == asn1_NOVALUE -> SCRP = SCRP0#'ServiceChangeResParm'{serviceChangeVersion = Val}, merge_ServiceChangeResParm(Parms, SCRP);merge_ServiceChangeResParm([{time_stamp, Val}|Parms], SCRP0) when SCRP0#'ServiceChangeResParm'.timeStamp == asn1_NOVALUE -> SCRP = SCRP0#'ServiceChangeResParm'{timeStamp = Val}, merge_ServiceChangeResParm(Parms, SCRP);merge_ServiceChangeResParm([{Tag, Val}|_Parms], SCRP) -> Val2 = case Tag of address -> SCRP#'ServiceChangeResParm'.serviceChangeAddress; mgc_id -> SCRP#'ServiceChangeResParm'.serviceChangeMgcId; profile -> SCRP#'ServiceChangeResParm'.serviceChangeProfile; version -> SCRP#'ServiceChangeResParm'.serviceChangeVersion; time_stamp -> SCRP#'ServiceChangeResParm'.timeStamp end, exit({at_most_once_servChgReplyParm, {Tag, Val, Val2}}). ensure_serviceChangeMethod({safeToken, _Line, "fl"}) -> failover;ensure_serviceChangeMethod({safeToken, _Line, "failover"}) -> failover;ensure_serviceChangeMethod({safeToken, _Line, "fo"}) -> forced;ensure_serviceChangeMethod({safeToken, _Line, "forced"}) -> forced;ensure_serviceChangeMethod({safeToken, _Line, "gr"}) -> graceful;ensure_serviceChangeMethod({safeToken, _Line, "graceful"}) -> graceful;ensure_serviceChangeMethod({safeToken, _Line, "rs"}) -> restart;ensure_serviceChangeMethod({safeToken, _Line, "restart"}) -> restart;ensure_serviceChangeMethod({safeToken, _Line, "dc"}) -> disconnected;ensure_serviceChangeMethod({safeToken, _Line, "disconnected"}) -> disconnected;ensure_serviceChangeMethod({safeToken, _Line, "ho"}) -> handOff;ensure_serviceChangeMethod({safeToken, _Line, "handoff"}) -> handOff;ensure_serviceChangeMethod({safeToken, Line, Text}) -> return_error(Line, {bad_serviceChangeMethod, Text}).ensure_profile({_TokenTag, Line, Text}) -> case string:tokens(Text, [$/]) of [Name, Version] -> Version2 = ensure_version(Version), #'ServiceChangeProfile'{profileName = Name, version = Version2}; _ -> return_error(Line, {bad_profile, Text}) end.ensure_version(Version) -> ensure_uint(Version, 0, 99).merge_signalRequest(SignalName, PropertyParms) -> Sig = #'Signal'{signalName = SignalName}, SPL = [], do_merge_signalRequest(Sig, PropertyParms, SPL).do_merge_signalRequest(Sig, [H | T], SPL) -> case H of {stream, StreamId} when Sig#'Signal'.streamID == asn1_NOVALUE -> do_merge_signalRequest(Sig#'Signal'{streamID = StreamId}, 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]); _ -> 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}.%% Version 2 of the DigitMapValue has an extra item (after extension mark), %% durationTimer, which does not exist in version 1. The record was created%% as defined in megaco_message_internal.hrl, e.g. as in version 2, so we %% have to fix it here.ensure_eventDM({_TokenTag, Line, DMD}) when record(DMD, 'DigitMapDescriptor') -> Name = DMD#'DigitMapDescriptor'.digitMapName, Val = DMD#'DigitMapDescriptor'.digitMapValue, if Name == asn1_NOVALUE, Val /= asn1_NOVALUE -> %% Convert to version 1 DigitMapValue {'DigitMapValue', Start, Short, Long, _DurationTimer, Body} = Val, DMV = #'DigitMapValue'{startTimer = Start, shortTimer = Short, longTimer = Long, digitMapBody = Body}, {eventDM, {digitMapValue, DMV}}; Name /= asn1_NOVALUE, Val == asn1_NOVALUE -> {eventDM, {digitMapName, Name}}; true -> return_error(Line, {bad_eventDM, DMD}) end.%% Version 2 of the DigitMapValue has an extra item (after extension mark), %% durationTimer, which does not exist in version 1. The record is defined %% (in megaco_message_internal.hrl) as in version 2, so we have to fix%% it here.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', Start, Short, Long, _DurationTimer, Body} -> %% Convert to version 1 DigitMapValue #'DigitMapValue'{startTimer = Start, shortTimer = Short, longTimer = Long, digitMapBody = Body}; 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_action_requests(ContextId, Items) -> CtxReq = #'ContextRequest'{}, CtxAuditReq = #'ContextAttrAuditRequest'{}, CmdReq = [], TopReq = [], do_merge_action_requests(ContextId, CtxReq, CtxAuditReq, CmdReq, TopReq, Items).do_merge_action_requests(ContextId, CtxReq, CtxAuditReq, CmdReq, TopReq, [H | T]) -> case H of _ when record(H, 'CommandRequest') -> do_merge_action_requests(ContextId, CtxReq, CtxAuditReq, [H | CmdReq], TopReq, T); {priority, Int} when CtxReq#'ContextRequest'.priority == asn1_NOVALUE -> CtxReq2 = CtxReq#'ContextRequest'{priority = Int}, do_merge_action_requests(ContextId, CtxReq2, CtxAuditReq, CmdReq, TopReq, T); {emergency, Bool} when CtxReq#'ContextRequest'.emergency == asn1_NOVALUE -> CtxReq2 = CtxReq#'ContextRequest'{emergency = Bool}, do_merge_action_requests(ContextId, CtxReq2, CtxAuditReq, CmdReq, TopReq, T);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -