forked from erlang/signerl
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.
This commit is contained in:
parent
d7932419d9
commit
63a908e220
|
@ -311,42 +311,48 @@ uprim_to_asn_rec(#'TC-U-REJECT'{invokeID = InvId, problemCode = Pcode}) ->
|
||||||
{reject, #'Reject'{invokeId = InvId, problem = Pcode}}.
|
{reject, #'Reject'{invokeId = InvId, problem = Pcode}}.
|
||||||
|
|
||||||
% Convert from asn1ct-generated record to the primitive records
|
% 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,
|
#'TC-INVOKE'{dialogueID = DlgId,
|
||||||
invokeID = inv_id_to_uprim(AsnRec#'Invoke'.invokeId),
|
invokeID = inv_id_to_uprim(AsnRec#'Invoke'.invokeId),
|
||||||
linkedID = inv_id_to_uprim(AsnRec#'Invoke'.linkedId),
|
linkedID = inv_id_to_uprim(AsnRec#'Invoke'.linkedId),
|
||||||
operation = AsnRec#'Invoke'.opcode,
|
operation = AsnRec#'Invoke'.opcode,
|
||||||
parameters = AsnRec#'Invoke'.argument};
|
parameters = AsnRec#'Invoke'.argument,
|
||||||
asn_rec_to_uprim({returnResultNotLast, AsnRec}, DlgId) when is_record(AsnRec, 'ReturnResult') ->
|
lastComponent = Last};
|
||||||
|
asn_rec_to_uprim({returnResultNotLast, AsnRec}, DlgId, Last) when is_record(AsnRec, 'ReturnResult') ->
|
||||||
#'ReturnResult_result'{opcode = Op, result = Result} = AsnRec#'ReturnResult'.result,
|
#'ReturnResult_result'{opcode = Op, result = Result} = AsnRec#'ReturnResult'.result,
|
||||||
#'TC-RESULT-NL'{dialogueID = DlgId,
|
#'TC-RESULT-NL'{dialogueID = DlgId,
|
||||||
invokeID = inv_id_to_uprim(AsnRec#'ReturnResult'.invokeId),
|
invokeID = inv_id_to_uprim(AsnRec#'ReturnResult'.invokeId),
|
||||||
operation = Op,
|
operation = Op,
|
||||||
parameters = Result};
|
parameters = Result,
|
||||||
asn_rec_to_uprim({returnResult, AsnRec}, DlgId) when is_record(AsnRec, 'ReturnResult') ->
|
lastComponent = Last};
|
||||||
|
asn_rec_to_uprim({returnResult, AsnRec}, DlgId, Last) when is_record(AsnRec, 'ReturnResult') ->
|
||||||
#'ReturnResult_result'{opcode = Op, result = Result} = AsnRec#'ReturnResult'.result,
|
#'ReturnResult_result'{opcode = Op, result = Result} = AsnRec#'ReturnResult'.result,
|
||||||
#'TC-RESULT-L'{dialogueID = DlgId,
|
#'TC-RESULT-L'{dialogueID = DlgId,
|
||||||
invokeID = inv_id_to_uprim(AsnRec#'ReturnResult'.invokeId),
|
invokeID = inv_id_to_uprim(AsnRec#'ReturnResult'.invokeId),
|
||||||
operation = Op,
|
operation = Op,
|
||||||
parameters = Result};
|
parameters = Result,
|
||||||
asn_rec_to_uprim({returnError, AsnRec}, DlgId) when is_record(AsnRec, 'ReturnError') ->
|
lastComponent = Last};
|
||||||
|
asn_rec_to_uprim({returnError, AsnRec}, DlgId, Last) when is_record(AsnRec, 'ReturnError') ->
|
||||||
#'TC-U-ERROR'{dialogueID = DlgId,
|
#'TC-U-ERROR'{dialogueID = DlgId,
|
||||||
invokeID = inv_id_to_uprim(AsnRec#'ReturnError'.invokeId),
|
invokeID = inv_id_to_uprim(AsnRec#'ReturnError'.invokeId),
|
||||||
error = AsnRec#'ReturnError'.errcode,
|
error = AsnRec#'ReturnError'.errcode,
|
||||||
parameters = AsnRec#'ReturnError'.parameter};
|
parameters = AsnRec#'ReturnError'.parameter,
|
||||||
asn_rec_to_uprim({reject, AsnRec}, DlgId) when is_record(AsnRec, 'Reject') ->
|
lastComponent = Last};
|
||||||
|
asn_rec_to_uprim({reject, AsnRec}, DlgId, Last) when is_record(AsnRec, 'Reject') ->
|
||||||
#'TC-U-REJECT'{dialogueID = DlgId,
|
#'TC-U-REJECT'{dialogueID = DlgId,
|
||||||
invokeID = inv_id_to_uprim(AsnRec#'Reject'.invokeId),
|
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;
|
ok;
|
||||||
process_rx_components(ISMs, Usap, DlgId, [Head|Tail]) ->
|
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_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),
|
InvId = get_invoke_id_from_comp(C),
|
||||||
{invoke, I} = C,
|
{invoke, I} = C,
|
||||||
case I#'Invoke'.linkedId of
|
case I#'Invoke'.linkedId of
|
||||||
|
@ -357,9 +363,9 @@ process_rx_component(ISMs, Usap, DlgId, C={invoke, #'Invoke'{}}) ->
|
||||||
% FIXME
|
% FIXME
|
||||||
ok
|
ok
|
||||||
end,
|
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});
|
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),
|
InvId = get_invoke_id_from_comp(C),
|
||||||
ISM = lists:keyfind(InvId, 1, ISMs),
|
ISM = lists:keyfind(InvId, 1, ISMs),
|
||||||
case Problem of
|
case Problem of
|
||||||
|
@ -370,15 +376,15 @@ process_rx_component(ISMs, _Usap, DlgId, C={reject, #'Reject'{problem=Problem}})
|
||||||
ok
|
ok
|
||||||
end,
|
end,
|
||||||
% FIXME: decide on TC-U-REJECT or TC-R-REJECT
|
% 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),
|
{InvId, ISM} = lists:keyfind(InvId, 1, ISMs),
|
||||||
gen_fsm:send_event(ISM, Prim);
|
gen_fsm:send_event(ISM, Prim);
|
||||||
process_rx_component(ISMs, _Usap, DlgId, Comp) ->
|
process_rx_component(ISMs, _Usap, DlgId, Comp, Last) ->
|
||||||
% syntax error?
|
% syntax error?
|
||||||
InvId = get_invoke_id_from_comp(Comp),
|
InvId = get_invoke_id_from_comp(Comp),
|
||||||
{InvId, ISM} = lists:keyfind(InvId, 1, ISMs),
|
{InvId, ISM} = lists:keyfind(InvId, 1, ISMs),
|
||||||
% FIXME: ISM active (No -> 6)
|
% 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).
|
gen_fsm:send_event(ISM, Prim).
|
||||||
|
|
||||||
add_components_to_state(State = #state{components=CompOld}, CompNew) when is_list(CompNew) ->
|
add_components_to_state(State = #state{components=CompOld}, CompNew) when is_list(CompNew) ->
|
||||||
|
|
Loading…
Reference in New Issue