summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2013-06-23 21:19:05 +0200
committerHarald Welte <laforge@gnumonks.org>2013-06-24 09:41:10 +0200
commit63a908e2209a5fc7165ab9e9b9143aecc3c58975 (patch)
tree429245e33a2b2797a0548dc29014b27bc273c260
parentd7932419d95ea62447e7535985a1f4498d5e5fbb (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.erl42
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) ->