diff options
author | Harald Welte <laforge@gnumonks.org> | 2013-06-23 21:19:05 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2013-06-24 09:41:10 +0200 |
commit | 63a908e2209a5fc7165ab9e9b9143aecc3c58975 (patch) | |
tree | 429245e33a2b2797a0548dc29014b27bc273c260 | |
parent | d7932419d95ea62447e7535985a1f4498d5e5fbb (diff) |
TCAP CCO: implement indication of 'lastComponent' to TC-USER
The TC-User can now look at the 'lastComponent' member of the
component in order to determine if this is the last component
within the current message, or if there will be more components.
-rw-r--r-- | TCAP/src/ITU/tcap_cco_server.erl | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/TCAP/src/ITU/tcap_cco_server.erl b/TCAP/src/ITU/tcap_cco_server.erl index 1e5f78b..13732c0 100644 --- a/TCAP/src/ITU/tcap_cco_server.erl +++ b/TCAP/src/ITU/tcap_cco_server.erl @@ -311,42 +311,48 @@ uprim_to_asn_rec(#'TC-U-REJECT'{invokeID = InvId, problemCode = Pcode}) -> {reject, #'Reject'{invokeId = InvId, problem = Pcode}}. % Convert from asn1ct-generated record to the primitive records -asn_rec_to_uprim({invoke, AsnRec}, DlgId) when is_record(AsnRec, 'Invoke') -> +asn_rec_to_uprim({invoke, AsnRec}, DlgId, Last) when is_record(AsnRec, 'Invoke') -> #'TC-INVOKE'{dialogueID = DlgId, invokeID = inv_id_to_uprim(AsnRec#'Invoke'.invokeId), linkedID = inv_id_to_uprim(AsnRec#'Invoke'.linkedId), operation = AsnRec#'Invoke'.opcode, - parameters = AsnRec#'Invoke'.argument}; -asn_rec_to_uprim({returnResultNotLast, AsnRec}, DlgId) when is_record(AsnRec, 'ReturnResult') -> + parameters = AsnRec#'Invoke'.argument, + lastComponent = Last}; +asn_rec_to_uprim({returnResultNotLast, AsnRec}, DlgId, Last) when is_record(AsnRec, 'ReturnResult') -> #'ReturnResult_result'{opcode = Op, result = Result} = AsnRec#'ReturnResult'.result, #'TC-RESULT-NL'{dialogueID = DlgId, invokeID = inv_id_to_uprim(AsnRec#'ReturnResult'.invokeId), operation = Op, - parameters = Result}; -asn_rec_to_uprim({returnResult, AsnRec}, DlgId) when is_record(AsnRec, 'ReturnResult') -> + parameters = Result, + lastComponent = Last}; +asn_rec_to_uprim({returnResult, AsnRec}, DlgId, Last) when is_record(AsnRec, 'ReturnResult') -> #'ReturnResult_result'{opcode = Op, result = Result} = AsnRec#'ReturnResult'.result, #'TC-RESULT-L'{dialogueID = DlgId, invokeID = inv_id_to_uprim(AsnRec#'ReturnResult'.invokeId), operation = Op, - parameters = Result}; -asn_rec_to_uprim({returnError, AsnRec}, DlgId) when is_record(AsnRec, 'ReturnError') -> + parameters = Result, + lastComponent = Last}; +asn_rec_to_uprim({returnError, AsnRec}, DlgId, Last) when is_record(AsnRec, 'ReturnError') -> #'TC-U-ERROR'{dialogueID = DlgId, invokeID = inv_id_to_uprim(AsnRec#'ReturnError'.invokeId), error = AsnRec#'ReturnError'.errcode, - parameters = AsnRec#'ReturnError'.parameter}; -asn_rec_to_uprim({reject, AsnRec}, DlgId) when is_record(AsnRec, 'Reject') -> + parameters = AsnRec#'ReturnError'.parameter, + lastComponent = Last}; +asn_rec_to_uprim({reject, AsnRec}, DlgId, Last) when is_record(AsnRec, 'Reject') -> #'TC-U-REJECT'{dialogueID = DlgId, invokeID = inv_id_to_uprim(AsnRec#'Reject'.invokeId), - problemCode = AsnRec#'Reject'.problem}. + problemCode = AsnRec#'Reject'.problem, + lastComponent = Last}. -process_rx_components(_ISMs, _Usap, _DlgId, []) -> +process_rx_components(ISMs, Usap, DlgId, [Head|[]]) -> + process_rx_component(ISMs, Usap, DlgId, Head, true), ok; process_rx_components(ISMs, Usap, DlgId, [Head|Tail]) -> - process_rx_component(ISMs, Usap, DlgId, Head), + process_rx_component(ISMs, Usap, DlgId, Head, false), process_rx_components(ISMs, Usap, DlgId, Tail). -process_rx_component(ISMs, Usap, DlgId, C={invoke, #'Invoke'{}}) -> +process_rx_component(ISMs, Usap, DlgId, C={invoke, #'Invoke'{}}, Last) -> InvId = get_invoke_id_from_comp(C), {invoke, I} = C, case I#'Invoke'.linkedId of @@ -357,9 +363,9 @@ process_rx_component(ISMs, Usap, DlgId, C={invoke, #'Invoke'{}}) -> % FIXME ok end, - Prim = asn_rec_to_uprim(C, DlgId), + Prim = asn_rec_to_uprim(C, DlgId, Last), gen_fsm:send_event(Usap, {'TC','INVOKE',indication,Prim}); -process_rx_component(ISMs, _Usap, DlgId, C={reject, #'Reject'{problem=Problem}}) -> +process_rx_component(ISMs, _Usap, DlgId, C={reject, #'Reject'{problem=Problem}}, Last) -> InvId = get_invoke_id_from_comp(C), ISM = lists:keyfind(InvId, 1, ISMs), case Problem of @@ -370,15 +376,15 @@ process_rx_component(ISMs, _Usap, DlgId, C={reject, #'Reject'{problem=Problem}}) ok end, % FIXME: decide on TC-U-REJECT or TC-R-REJECT - Prim = asn_rec_to_uprim(C, DlgId), + Prim = asn_rec_to_uprim(C, DlgId, Last), {InvId, ISM} = lists:keyfind(InvId, 1, ISMs), gen_fsm:send_event(ISM, Prim); -process_rx_component(ISMs, _Usap, DlgId, Comp) -> +process_rx_component(ISMs, _Usap, DlgId, Comp, Last) -> % syntax error? InvId = get_invoke_id_from_comp(Comp), {InvId, ISM} = lists:keyfind(InvId, 1, ISMs), % FIXME: ISM active (No -> 6) - Prim = asn_rec_to_uprim(Comp, DlgId), + Prim = asn_rec_to_uprim(Comp, DlgId, Last), gen_fsm:send_event(ISM, Prim). add_components_to_state(State = #state{components=CompOld}, CompNew) when is_list(CompNew) -> |