diff --git a/TCAP/src/tcap_user.erl b/TCAP/src/tcap_user.erl index 566f56b..107cfb8 100644 --- a/TCAP/src/tcap_user.erl +++ b/TCAP/src/tcap_user.erl @@ -62,20 +62,71 @@ get_or_start_dha(TCO, DialgId) -> DHA end. +get_dha(_TCO, DialgId) -> + case ets:lookup(tcap_dha, DialgId) of + [{DialgId, DHA}] -> + {ok, DHA}; + _ -> + {error, notfound} + end. + + +get_dialg_id(#'TC-INVOKE'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-RESULT-L'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-RESULT-NL'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-BEGIN'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-CONTINUE'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-END'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-U-ERROR'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-U-REJECT'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-U-CANCEL'{dialogueID = DlgId}) -> + DlgId; +get_dialg_id(#'TC-U-ABORT'{dialogueID = DlgId}) -> + DlgId. + % the user (TCU) sends us a primitive. We decide where to route it -send_prim(TCO, P={'TC', 'INVOKE', request, Param}) when - is_record(Param, 'TC-INVOKE') -> - DialgId = Param#'TC-INVOKE'.dialogueID, +send_prim(TCO, P={'TC', 'INVOKE', request, Param}) -> + % component primitive establishing new dialogue + DialgId = get_dialg_id(Param), DHA = get_or_start_dha(TCO, DialgId), CCO = tcap_dha_fsm:get_cco_pid(DHA), gen_server:cast(CCO, P); +send_prim(TCO, P={'TC', What, request, Param}) when + What == 'RESULT-L'; + What == 'INVOKE'; + What == 'RESULT-NL'; + What == 'U-ERROR'; + What == 'U-CANCEL'; + What == 'U-REJECT' -> + % component primitive relating to existing components + DialgId = get_dialg_id(Param), + {ok, DHA} = get_dha(TCO, DialgId), + CCO = tcap_dha_fsm:get_cco_pid(DHA), + gen_server:cast(CCO, P); send_prim(TCO, P={'TC', 'BEGIN', request, Param}) when is_record(Param, 'TC-BEGIN') -> + % dialogue primitives establishing new dialogue DialgId = Param#'TC-BEGIN'.dialogueID, DHA = get_or_start_dha(TCO, DialgId), gen_fsm:send_event(DHA, P); +send_prim(TCO, P={'TC', What, request, Param}) when + What == 'CONTINUE'; + What == 'END'; + What == 'U-ABORT' -> + % dialogue primitives for already-existing dialogues + DialgId = get_dialg_id(Param), + {ok, DHA} = get_dha(TCO, DialgId), + gen_fsm:send_event(DHA, P); send_prim(_TCO, P) -> - {errror, {unknown_prim, P}}. + {error, {unknown_prim, P}}. % high-level user API to start the TCAP SAP supervisor + TCO server for a given SAP start_sap(SccpModule, Args, Opts) ->