Skip to content
LibIms_Steps.ttcn 64.8 KiB
Newer Older
/**
 * @author STF471
 * @version $Id$
 * @desc This module provides the steps used by the test component for SIP-IMS tests.
 *       This module is part of LibImsV3.
 */
module LibIms_Steps {
    // LibSip
    import from LibSip_SIPTypesAndValues all;
    import from LibSip_Templates all;
    import from LibSip_Steps all;
    import from LibSip_PIXITS all;
    import from LibSip_Interface all;
    import from LibSip_MessageBodyTypes all;
    import from LibSip_Common all;
    // LibIms
    import from LibIms_Templates all;
    import from LibIms_Interface all;
    import from LibIms_SIPTypesAndValues all;

    group externalfunctions {
    } // end group externalfunctions
    group parameterOperations {

        /**
         * @desc Adds new Via parameter
         * @param p_message (request) SIP message to be used to prepair via header
         */
        function f_addNewViaParameter(
            in Request p_message
        ) runs on ImsComponent  {
            var integer v_intVia;
            var integer i := 0;
            if (isvalue(p_message.msgHeader.via)) {

                v_intVia := lengthof(p_message.msgHeader.via.viaBody);
                while (i < v_intVia) {
                    p_message.msgHeader.via.viaBody[v_intVia] := p_message.msgHeader.via.viaBody[v_intVia - 1];
                    v_intVia := v_intVia - 1;
                }
                vc_branch := c_branchCookie & f_getRndTag();
                p_message.msgHeader.via.viaBody[0] := valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile));
                vc_via := p_message.msgHeader.via;
            }
        }

        /**
         * @desc Removes own Via parameter
         * @param p_message (request) SIP message to be used to prepair via header
         */
        function f_removeOwnViaParameter(
            in Response p_message
        ) runs on ImsComponent  {
            var integer v_intVia;
            var Via v_via := c_empty_Via;
            var integer i := 0;

            if (ispresent(p_message.msgHeader.via)) {

                v_intVia := lengthof(p_message.msgHeader.via.viaBody) - 1;

                for (i := 0; i < v_intVia; i := i + 1) {
                    v_via.viaBody[i] := p_message.msgHeader.via.viaBody[i + 1];
                }
                vc_via := v_via;
            }
        }

        /**
         * @desc Adds new RecordRoute parameter and removes Route parameter
         * @param p_message (request) SIP message to be used to prepair via header
         */
        function f_addNewRecordRouteAndRemoveRoutParameter(
            in Request p_message
        ) runs on ImsComponent  {
            var integer v_intRoute, v_intRecordRoute;
            var integer i := 1;
            var RouteBody v_route1;
            var Route v_newRoute;
            v_newRoute.fieldName := ROUTE_E;
            if (isvalue(p_message.msgHeader.route)) {
                v_intRoute := lengthof(p_message.msgHeader.route.routeBody);
                v_route1 := p_message.msgHeader.route.routeBody[0];
                while (i < v_intRoute) {
                    v_newRoute.routeBody[i - 1] := p_message.msgHeader.route.routeBody[i];
                    i := i + 1;
                }
                vc_route := v_newRoute;
            }

            if (isvalue(p_message.msgHeader.recordRoute)) {

                v_intRecordRoute := lengthof(p_message.msgHeader.recordRoute.routeBody);
                while (0 < v_intRecordRoute) {
                    p_message.msgHeader.recordRoute.routeBody[v_intRecordRoute] := p_message.msgHeader.recordRoute.routeBody[v_intRecordRoute - 1];
                    v_intRecordRoute := v_intRecordRoute - 1;
                }
                p_message.msgHeader.recordRoute.routeBody[0] := v_route1;
                vc_recordRoute := valueof(p_message.msgHeader.recordRoute);
            }
        }

        /**
         * @desc Adds new RecordRoute parameter (IMS)
         * @param p_rr The recordRoute parameter to add
         */
        function f_addNewRecordRouteIMS(
            in RecordRoute p_rr
        ) runs on ImsComponent 
        return template RecordRoute  {
            var integer v_intRecordRoute;
            var template RecordRoute v_recordRoute := omit;

            v_intRecordRoute := lengthof(p_rr.routeBody);
            if (v_intRecordRoute > 0) {
                while (0 < v_intRecordRoute) {
                    p_rr.routeBody[v_intRecordRoute] := p_rr.routeBody[v_intRecordRoute - 1];
                    v_intRecordRoute := v_intRecordRoute - 1;
                }
                p_rr.routeBody[0] := valueof(m_routeBody_currIpAddr(vc_userprofile));
                vc_recordRoute := p_rr;
                return vc_recordRoute;
            }
            else {
                return (v_recordRoute);
            }
        }

    } // end group parameterOperations

    group fieldOperations {

        /**
         * @desc Sets BYE header fields (IMS addresses) extension of general settings from LibSip basic function
         * @param p_cSeq_s The current cSeq
         * @param p_to_user The selected user's SIP URL
         */
        function f_setHeadersBYE(
            inout CSeq p_cSeq_s,
            in SipUrl p_to_user
        ) runs on ImsComponent  {
            vc_requestUri := p_to_user; // Request URI of Invite is identical with To header
            vc_route := f_route(); // update the route header field depending on vc_boo_route
            vc_recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
            LibSip_Steps.f_setHeadersBYE(p_cSeq_s);
        } // end f_setHeadersBYE

        /**
         * @desc Sets CANCEL header fields (IMS addresses) extension of general settings from LibSip basic function
         * @param p_cSeq_s The current cSeq
         */
        function f_setHeadersCANCEL(
            inout CSeq p_cSeq_s
        ) runs on ImsComponent  {
            vc_route := f_route(); // update the route header field depending on vc_boo_route
            vc_recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
            LibSip_Steps.f_setHeadersCANCEL(p_cSeq_s);
        } // end f_setHeadersCANCEL

        /**
         * @desc Sets headers for forward request from AS in case if AS acts as Proxy
         * @param p_cSeq_s The current cSeq
         * @param p_proxyMode true = proxyMode, false = B2BMode
         */
        function f_setHeadersForwardRequestFromAS(
            inout CSeq p_cSeq_s,
            boolean p_proxyMode
        ) runs on ImsComponent  {
            var Request v_request;
            v_request := vc_request;

            if (p_proxyMode) {
                vc_requestUri2 := v_request.requestLine.requestUri;
                vc_to := v_request.msgHeader.toField;
                vc_contact := v_request.msgHeader.contact;
                f_addNewViaParameter(v_request);
                f_addNewRecordRouteAndRemoveRoutParameter(v_request);
            }
            else {
                // B2Bmode
                vc_contact := m_Contact(m_SipUrl_contactIpaddr(vc_userprofile));
                if (PX_SEED) {
                  vc_callId := {
                      fieldName := CALL_ID_E,
                      callid := f_getRndCallId()
                  };
                } else {
                  vc_callId := {
                      fieldName := CALL_ID_E,
                      callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
                  };
                }
            }
        } // end function f_setHeadersForwardRequest

        /**
         * @desc Sets header fields for forward request from AS in case if AS acts as Proxy
         */
        function f_setHeadersForwardResponseFromAS(
        ) runs on ImsComponent  {
Loading
Loading full blame…