///////////////////////////////////////////////////////////////////////////////
//
// 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-10-01
//  Contact:  http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////

/* -*- ttcn3 -*- */

/** @file C:\Users\eantwuh\workspace\SIPsim\MBT_Qtronic_Types.ttcn
 *
 * @author Conformiq TTCN3 Script Backend 0.1
 * @date Thu Sep 30 14:15:29 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 userInPort message
    {
        inout UserInput;
    } with {extension "internal"}
    type port userOutPort message
    {
        inout TimeOutIndication;
    } with {extension "internal"}
    type record SIPReq
    {
        charstring op,
        charstring param_
    }
    type record SIPResp
    {
        integer status,
        charstring cseq
    }
    type record UserInput
    {
        charstring input1,
        charstring input2
    }
    type record AnyRecord
    {
        
    }
    type record TimeOutIndication
    {
        
    }
    type component Qtronic_CT extends MBT_Qtronic_Demo_Main_CT
    {
        port userInPort userIn;
        port userOutPort userOut;
        timer harnessTimer := 0.0;
    }
}
