///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2018 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:     MBT_Qtronic_Types.ttcn
//  Rev:      <RnXnn>
//  Prodnr:   CNL 113 659
//  Updated:  2010-04-14
//  Contact:  http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////
/* -*- ttcn3 -*- */

/** @file C:\Users\eantwuh\workspace\SIPeval\MBT_Qtronic_Types.ttcn
 *
 * @author Conformiq TTCN3 Script Backend
 * @date Wed Apr 14 13:17:47 CEST 2010
 *
 * WARNING! This file has been automatically generated using
 * Ericsson Qtronic TTCN3 Script Backend (based on the original Conformiq Backend).DO NOT EDIT.
 */

module MBT_Qtronic_Types
{
    /* User provided imports begin */
    import from MBT_Qtronic_Demo all; import from EPTF_MBT_LGen_Definitions all;
    /* User provided imports end */
    type port netInPort message
    {
        inout SIPResp;
        inout SIPReq;
    } with {extension "internal"}
    type port userInPort message
    {
        inout UserInput;
    } with {extension "internal"}
    type port netOutPort message
    {
        inout SIPResp;
        inout SIPReq;
    } with {extension "internal"}
    type port userOutPort message
    {
        inout TimeOutIndication;
    } with {extension "internal"}
    type record SIPResp
    {
        integer status,
        charstring cseq
    }
    type record UserInput
    {
        charstring input1,
        charstring input2
    }
    type record TimeOutIndication
    {
        
    }
    type record SIPReq
    {
        charstring op,
        charstring param_
    }
    type component Qtronic_CT extends MBT_Qtronic_Demo_Main_CT
    {
        port netInPort netIn;
        port userInPort userIn;
        port netOutPort netOut;
        port userOutPort userOut;
        timer harnessTimer := 0.0;
    }
}
