///////////////////////////////////////////////////////////////////////////////
//
// 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 v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:         MTP3asp_PortType.ttcn
//  Reference:    ITU-T Recommendation Q.704, RFC3332 
//  Rev:          R12A
//  Prodnr:       CNL 113 337
//  Updated:      2008-02-07
//  Contact:      http://ttcn.ericsson.se

module MTP3asp_PortType
{

  import from MTP3asp_Types all;
// *************************************************************************
// *  MTP3 port type definitions                                           *
// *************************************************************************

    // MTP3 port type used by the component up to the MTP3 SAP
    // (eg. any component connected to the MTP3 test port)
    type port MTP3asp_PT message
     {
      in  ASP_MTP3_TRANSFERind;
      in  ASP_MTP3_PAUSE;
      in  ASP_MTP3_RESUME;
      in  ASP_MTP3_STATUS;
      out ASP_MTP3_TRANSFERreq;
     } with {extension "provider"}

    // MTP3 port type used by the component up to the MTP3 SAP
    // (e.g. the distribution component)
    type port MTP3asp_SP_PT message
     {
      in  ASP_MTP3_TRANSFERreq;
      out ASP_MTP3_TRANSFERind;
     }
      with {extension "internal"}

//Connecting functions
//----------------------------
external function f_MTP3_SEA_connect
 ( inout MTP3asp_PT  portRef, 
   in charstring  Hostname,
   in integer     Port,
   in charstring  EntityName,
   in boolean     Http //or MPH Port is provided  
 )return boolean;

external function f_MTP3_SEA_disconnect
 ( inout MTP3asp_PT  portRef
 )return boolean;

}//eof module
