 
//File: TcSignaling.idl
#ifndef _TC_SIGNALING_
#define _TC_SIGNALING_
 
// This module defines base and utility interfaces for
// CORBA-based Telecom SS.7 Transaction Capabilities(TC) users

/* 
#include <Naming.idl>
#include <CosLifeCycle.idl>
#include "ASN1Types.idl"
*/

#include "CosNaming.idl"
#include "CosLifeCycle.idl"
#include "ASN1Types.idl"
 
 
#pragma prefix "omg.org"

module TcSignaling{

    typedef string ScopedName; // Moved by PN

    typedef short ASN1_ExtensionCriticality ;
    // ASN1_ExtensionCriticality values
    const ASN1_ExtensionCriticality ASN1_EXTENSION_ABORT = 0;
    const ASN1_ExtensionCriticality ASN1_EXTENSION_IGNORE = 1;
 
    typedef CosNaming::Istring Istring;
    typedef string AssociationId;
    typedef Istring TcAddress;
    typedef Istring ApplicationContext;
    typedef unsigned long InvokeId;
    // InvokeID values
    const InvokeId NO_ID = 4294967295;
 
    typedef short DialogFlowCtr;
    // DialogFlowCtr values
    const DialogFlowCtr BEGIN = 0;
    const DialogFlowCtr CONTINUE = 1;
    const DialogFlowCtr END = 2;
    const DialogFlowCtr QUEUE_COMPONENT = 3;
    const DialogFlowCtr UNIDIRECTIONAL = 4;
    const DialogFlowCtr NOT_SPECIFIED = 5;
 
    typedef short PAbortReason;
    // PAbortReason values
    const PAbortReason UNRECOG_MESSAGE_TYPE = 0;
    const PAbortReason UNRECOG_TID = 1;
    const PAbortReason BAD_FORMAT_TRANSACTION = 2;
    const PAbortReason INCORRECT_TRANSACTION = 3;
    const PAbortReason RESOURCE_LIMIT = 4;

    typedef short TcContextSetting;
    // TcContextSetting values
    const TcContextSetting TC_CONTEXT_BASE = 0;
    const TcContextSetting TC_CONTEXT_NO_FLOW = 1;
    const TcContextSetting TC_CONTEXT_ALL = 2;
 
    struct TcContext{
        DialogFlowCtr ctr;
        InvokeId ivk_id;
        AssociationId a_id;
    };
    struct TcLinkedContext {
        DialogFlowCtr ctr;
        InvokeId ivk_id;
        InvokeId lnk_id;
        AssociationId a_id;
    };
    typedef sequence<CosLifeCycle::NameValuePair> DialogUserData;
    enum AbortType {P_ABORT,
                    UNSUPPORTED_APPLICATION_CONTEXT,
                    USER_DEFINED_INFO
    };
    union AbortValue switch(AbortType) {
        case P_ABORT: PAbortReason reason;
        case UNSUPPORTED_APPLICATION_CONTEXT:
                             ApplicationContext a_c;
        case USER_DEFINED_INFO: DialogUserData d_u_d;
    };
    exception UnknownAssociation{};
    exception NoMoreAssociations{};
    exception InvalidParameter{};
        exception UnsupportedTcContext{};

    interface TcUser; // Forward declaration PN

    interface TcUserGenericFactory{
 
        TcUser create_tc_userResponder(
                        in ScopedName responder,
                        in TcUser initiator,
                        in AssociationId a_id,
                        in TcContextSetting tc_context_setting)
            raises(CosLifeCycle::NoFactory,
                   NoMoreAssociations, UnsupportedTcContext);
 
        TcUser create_tc_userResponder_with_dialogdata(
                        in ScopedName responder,
                        in TcUser initiator,
                        in AssociationId a_id,
                        in string protocol_version,
                        in DialogUserData d_u_d,
                        in TcContextSetting tc_context_setting)
            raises(CosLifeCycle::NoFactory, NoMoreAssociations,
                   InvalidParameter, UnsupportedTcContext);
 
        TcUser create_tc_userInitiator(
                        in ScopedName initiator)
            raises(CosLifeCycle::NoFactory);
 
    }; // end TcUserGenericFactory
 
    interface TcFactoryFinder{
 
         void bind(in TcAddress addr,
                      in ApplicationContext a_c,
                      in ScopedName resp_iface,
                      in ScopedName init_iface,
                      in TcUserGenericFactory resp_tc_user_factory)
             raises(CosNaming::NamingContext::NotFound,
                    CosNaming::NamingContext::CannotProceed,
                    CosNaming::NamingContext::InvalidName,
                    CosNaming::NamingContext::AlreadyBound);
 
         void unbind(in TcAddress addr,
                        in ApplicationContext a_c,
                        in ScopedName resp_iface,
                        in ScopedName init_iface,
                        in TcUserGenericFactory resp_tc_user_factory)
             raises(CosNaming::NamingContext::NotFound,
                    CosNaming::NamingContext::CannotProceed,
                    CosNaming::NamingContext::InvalidName);
 
         void rebind(in TcAddress addr,
                        in ApplicationContext a_c,
                        in ScopedName resp_iface,
                        in ScopedName init_iface,
                        in TcUserGenericFactory resp_tc_user_factory)
             raises(CosNaming::NamingContext::NotFound,
                    CosNaming::NamingContext::CannotProceed,
                    CosNaming::NamingContext::InvalidName);
 
         TcUserGenericFactory resolve(in TcAddress addr,
                               in ApplicationContext a_c,
                               out ScopedName resp_iface,
                               out ScopedName init_iface)
             raises (CosNaming::NamingContext::NotFound,
                     CosNaming::NamingContext::CannotProceed,
                     CosNaming::NamingContext::InvalidName);
 
    }; // end TcFactoryFinder

    interface TcPduProviderFactory; //forward definition
 
    interface GwAdmin{
 
        readonly attribute TcFactoryFinder tc_user_factory_naming_if;
 
        readonly attribute TcPduProviderFactory tc_pdu_handler_factory_if;
 
    }; // end GwAdmin

    enum IdType {LOCAL_ID, OID};
    union IdValue switch(IdType) {
        case LOCAL_ID: ASN1_Integer local_id;
        case OID: ASN1_ObjectIdentifier oid;
    };
 
    interface TcRepository {
 
        ScopedName get_error_name(in ScopedName iface,
                                  in IdValue code );
 
        ScopedName get_operation_name(in ScopedName iface,
                                  in IdValue code );
 
        ScopedName get_extension_name(in ScopedName iface,
                                      in IdValue code );
 
        IdValue get_id(in ScopedName scoped_name);
 
        ASN1_ExtensionCriticality get_extension_criticality(
                             in ScopedName extension_scoped_name);
 
        unsigned long get_operation_timer(in ScopedName
                                    op_scoped_name );
 
    }; //end TcRepository
 
 
    interface TcServiceFinder{
 
        readonly attribute CosNaming::NamingContext gt_root;
        readonly attribute GwAdmin gw_admin_if;
        readonly attribute TcRepository tc_repository_if;

    }; //end TcServiceFinder
 
    typedef short ProblemType;
    typedef short ProblemCode;
    // ProblemType values
    const ProblemType GENERAL_PROBLEM = 0;
    const ProblemType INVOKE_PROBLEM = 1;
    const ProblemType RETURN_RESULT_PROBLEM = 2;
    const ProblemType RETURN_ERROR_PROBLEM = 3;
   // ProblemCode values
    const ProblemCode GP_UNRECOGNIZED_COMPONENT = 0;
    const ProblemCode GP_MISTYPED_COMPONENT = 1;
    const ProblemCode GP_BAD_STRUCTURED_COMPONENT = 2;
    const ProblemCode IP_DUPLICATE_INV_ID = 0;
    const ProblemCode IP_UNRECOG_OPERATION = 1;
    const ProblemCode IP_MISTYPED_PARAM = 2;
    const ProblemCode IP_RESOURCE_LIMIT = 3;
    const ProblemCode IP_INIT_RELEASE = 4;
    const ProblemCode IP_UNRECOG_LINK_ID = 5;
    const ProblemCode IP_LINKED_RESP_EXPECTED = 6;
    const ProblemCode IP_UNEXPECTED_LINKED_OP = 7;
    const ProblemCode RRP_UNRECOG_INV_ID = 0;
    const ProblemCode RRP_RR_UNEXPECTED = 1;
    const ProblemCode RRP_MISTYPED_PARAM = 2;
    const ProblemCode REP_UNRECOG_INV_ID = 0;
    const ProblemCode REP_RE_UNEXPECTED = 1;
    const ProblemCode REP_UNRECOG_ERROR = 2;
    const ProblemCode REP_UNEXPECTED_ERROR = 3;
    const ProblemCode REP_MISTYPED_PARAM = 4;
 
    typedef unsigned long Timeout;
    typedef sequence<octet> BerData;
    typedef unsigned short OperationClass;
    // OperationClass values
    const OperationClass TC_CLASS_1 = 1;
    const OperationClass TC_CLASS_2 = 2;
    const OperationClass TC_CLASS_3 = 3;
    const OperationClass TC_CLASS_4 = 4;
 
    struct RejectProblem{
               ProblemType type;
               ProblemCode code;
           };
    enum TerminationType{
             PREARRANGED,
             BASIC
         };
    union DialogPortion switch(boolean) {
               case TRUE: ApplicationContext a_c;
               case FALSE: BerData dialog_info;
           };
 
    typedef unsigned long DialogId;
    typedef short DialogQos;
     // DialogQos values
    const DialogQos SCCP_CLASS_0_NO_ERROR = 0;
    const DialogQos SCCP_CLASS_0_WITH_ERROR = 1;
    const DialogQos SCCP_CLASS_1_NO_ERROR = 2;
    const DialogQos SCCP_CLASS_1_WITH_ERROR = 3;
    const DialogQos QOS_NOT_SPECIFIED = 3;
 
    exception DialogStillOpen{};
    exception InvalidDialogId{};
    exception NoMoreDialogs{};

    interface TcPduProvider{
 
        DialogId get_dialog_id()
            raises (NoMoreDialogs);
 
        void uni_req(in DialogQos qos,
                     in TcAddress dest,
                     in TcAddress orig,
                     in DialogId d_id,
                     in DialogPortion d_p)
            raises (NoMoreDialogs);
 
        void begin_req(in DialogQos qos,
                       in TcAddress dest,
                       in TcAddress orig,
                       in DialogId d_id,
                       in DialogPortion d_p)
            raises (NoMoreDialogs);
 
        void continue_confirm_req(
                 in TcAddress orig,
                 in DialogId d_id,
                 in DialogPortion d_p)
            raises (InvalidDialogId);

        void continue_req(in DialogId d_id,
                          in DialogPortion d_p)
            raises (InvalidDialogId);
 
        void end_req(in DialogId d_id,
                     in DialogPortion d_p,
                     in TerminationType term)
            raises (InvalidDialogId);
 
        void u_abort_req(in DialogId d_id,
                         in DialogPortion d_p)
            raises (InvalidDialogId);
 
        void set_dialog_qos(in DialogId d_id,
                            in DialogQos qos)
            raises(InvalidDialogId, InvalidParameter);
 
        DialogQos get_dialog_qos(in DialogId d_id)
            raises(InvalidDialogId);

        void invoke_req(in DialogId d_id,
                        in OperationClass op_class,
                        in InvokeId ivk_id,
                        in InvokeId lnk_id,
                        in BerData oper,
                        in Timeout op_timer)
           raises(InvalidDialogId);
 
        void result_l_req(in DialogId d_id,
                          in InvokeId ivk_id,
                          in BerData result)
           raises(InvalidDialogId);
 
        void result_nl_req(in DialogId d_id,
                           in InvokeId ivk_id,
                           in BerData result)
           raises(InvalidDialogId);
 
        void u_error_req(in DialogId d_id,
                         in InvokeId ivk_id,
                         in BerData error)
           raises(InvalidDialogId);
 
        void u_reject_req(in DialogId d_id,
                          in InvokeId ivk_id,
                          in RejectProblem problem)
           raises(InvalidDialogId);
 
        void u_cancel_req(in DialogId d_id,
                          in InvokeId ivk_id)
           raises(InvalidDialogId);
 
        void destroy()
            raises(DialogStillOpen);
 
    }; // end TcPduProvider
 
  interface TcPduUser{
 
        void uni_ind(in TcPduProvider sender,
                     in DialogQos qos,
                     in TcAddress dest,
                     in TcAddress orig,
                     in DialogId d_id,
                     in DialogPortion d_p,
                     in boolean comp_present)
            raises (NoMoreDialogs);
 
        void begin_ind(in TcPduProvider sender,
                       in DialogQos qos,
                       in TcAddress dest,
                       in TcAddress orig,
                       in DialogId d_id,
                       in DialogPortion d_p,
                       in boolean comp_present)
            raises (NoMoreDialogs);
 
        void continue_ind(in DialogId d_id,
                          in DialogPortion d_p,
                          in boolean comp_present)
            raises (InvalidDialogId);
 
        void end_ind(in DialogId d_id,
                     in DialogPortion d_p,
                     in boolean comp_present)
            raises (InvalidDialogId);
 
        void u_abort_ind(in DialogId d_id,
                         in DialogPortion d_p)
            raises (InvalidDialogId);

         void notice_ind(in DialogId d_id,
                        in short report_cause)
            raises (InvalidDialogId);
 
        void invoke_ind(in DialogId d_id,
                        in InvokeId ivk_id,
                        in InvokeId lnk_id,
                        in BerData oper,
                        in boolean last_comp)
           raises(InvalidDialogId);
 
        void result_l_ind(in DialogId d_id,
                          in InvokeId ivk_id,
                          in BerData result,
                          in boolean last_comp)
           raises(InvalidDialogId);

        void result_nl_ind(in DialogId d_id,
                           in InvokeId ivk_id,
                           in BerData result,
                           in boolean last_comp)
           raises(InvalidDialogId);
 
        void u_error_ind(in DialogId d_id,
                         in InvokeId ivk_id,
                         in BerData error,
                         in boolean last_comp)
           raises(InvalidDialogId);
 
        void u_reject_ind(in DialogId d_id,
                          in InvokeId ivk_id,
                          in RejectProblem problem,
                          in boolean last_comp)
           raises(InvalidDialogId);
 
        void l_cancel_ind(in DialogId d_id,
                          in InvokeId ivk_id)
           raises(InvalidDialogId, InvalidParameter);

        void l_reject_ind(in DialogId d_id,
                          in InvokeId ivk_id,
                          in RejectProblem problem,
                          in boolean last_comp)
            raises (InvalidDialogId);
 
        void r_reject_ind(in DialogId d_id,
                          in InvokeId ivk_id,
                          in RejectProblem problem,
                          in boolean last_comp)
            raises (InvalidDialogId);
 
        void p_abort_ind(in DialogId d_id,
                         in PAbortReason reason)
            raises (InvalidDialogId);
 
        DialogQos get_dialog_qos(in DialogId d_id)
            raises(InvalidDialogId);
  
        void set_dialog_qos(in DialogId d_id,
                            in DialogQos qos)
            raises(InvalidDialogId, InvalidParameter);

    }; // end TcPduUser

    exception UnknownTcAddress{};
    exception AlreadyBound{};

    interface TcPduProviderFactory{

        TcPduProvider create_tc_pdu_provider(
                         in TcPduUser user,
                         out DialogId d_id)
            raises(NoMoreDialogs);

        void register(in TcAddress dest,
                      in ApplicationContext a_c,
                      in TcPduUser user)
            raises(AlreadyBound);

        void deregister(in TcAddress dest,
                        in ApplicationContext a_c)
            raises(UnknownTcAddress);

    }; // end TcPduProviderFactory

    // Moved here PN
    interface TcUser:CosLifeCycle::LifeCycleObject {

        // TOVE specific PN
        void setParameters(in TcPduProvider stack, in DialogId dialogId);

        void abort_association(in AssociationId a_id)
            raises (UnknownAssociation);

         void abort_association_with_data(in AbortValue abort_value,
                               in AssociationId a_id)
            raises (UnknownAssociation, InvalidParameter);

        void end_association (in AssociationId a_id)
            raises (UnknownAssociation);

        void new_association(in TcUser initiator,
                             in AssociationId a_id)
            raises(NoMoreAssociations);

        void new_association_with_dialogdata(
                         in TcUser initiator,
                         in AssociationId a_id,
                         in string protocol_version,
                         in DialogUserData d_u_d)
            raises(NoMoreAssociations, InvalidParameter);

        readonly attribute TcContextSetting tc_context_setting;

    }; //end TcUser

}; //end TcSignaling

#endif  // _TC_SIGNALING_
