///////////////////////////////////////////////////////////////////////////////
// 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
///////////////////////////////////////////////////////////////////////////////

module Thrift_Common{

  type boolean bool
  type integer byte
  type integer i16
  type integer i32
  type integer i64
  type charstring string
  type octetstring binary

  type enumerated Thrift_port_operation { OP_OPEN(0),OP_CLOSE(1) }
  type enumerated Thrift_port_mode { MODE_CLIENT(0),MODE_SERVER(1) }
  type record Thrift_conn_data {
    Thrift_transport_data  transport optional,
    Thrift_protocol_data   protocol optional
  }
  
  type union Thrift_transport_data{
    Thrift_socket_transport  socket,
    Thrift_socket_transport  framed
  }
  
  type union Thrift_protocol_data{
    Thrift_binary_protocol binary
  }
  
  type record Thrift_socket_transport {
    charstring   host_name optional,
    integer      port_num
  }
  
  type record Thrift_binary_protocol {
  }
  
  type enumerated Thrift_control_code{ CRTL_RES_OK(0), CTRL_RES_FAIL(1), CTRL_RES_ERR(2)}
  type record Thrift_control_result {
    Thrift_control_code result_code,
    Thrift_port_error   result_desc optional
  }
  
  signature Thrift_control(in Thrift_port_operation operation,
                           in Thrift_port_mode port_mode,
                           in Thrift_conn_data conn_data) return Thrift_control_result
                           

  type record Thrift_port_error{
    integer error_code,
    charstring error_text
  }

}
