/*
 * Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * This file contains OMG IDL from  CORBA V2.0, July 1995.
 * It also contains the TypeCode creation APIs in CORBA::ORB
 **/

#pragma prefix "omg.org"

module CORBA {
    typedef string Identifier;
    typedef string ScopedName;
    typedef string RepositoryId;

    enum DefinitionKind {
	dk_none, dk_all,
	dk_Attribute, dk_Constant, dk_Exception, dk_Interface,
	dk_Module, dk_Operation, dk_Typedef,
	dk_Alias, dk_Struct, dk_Union, dk_Enum,
	dk_Primitive, dk_String, dk_Sequence, dk_Array,
	dk_Repository,
	dk_Wstring, dk_Fixed,
	dk_Value, dk_ValueBox, dk_ValueMember, // orbos 98-01-18: Objects By Value
	dk_Native
    };


    interface IRObject
    /**
      An IRObject IDL interface represents the most generic interface
      from which all other Interface Repository interfaces are derived,
      even the Repository itself.
     */
    {
	// read interface
	readonly attribute DefinitionKind def_kind;

	// write interface
	void destroy ();
    };



    typedef string VersionSpec;

    interface Contained;
    interface Repository;
    interface Container;

    interface Contained : IRObject
    /**
       The Contained Interface is inherited by all Interface Repository
       interfaces that are contained by other objects.
     */
    {
	// read/write interface

	attribute RepositoryId id;
	attribute Identifier name;
	attribute VersionSpec version;

	// read interface

	readonly attribute Container defined_in;
	readonly attribute ScopedName absolute_name;
	readonly attribute Repository containing_repository;

	struct Description {
	    DefinitionKind kind;
	    any value;
	};

	Description describe ();

	// write interface

	void move (
	    in Container new_container,
	    in Identifier new_name,
	    in VersionSpec new_version
	    );
    };


    interface ModuleDef;
    interface ConstantDef;
    interface IDLType;
    interface StructDef;
    interface UnionDef;
    interface EnumDef;
    interface AliasDef;
    interface InterfaceDef;
    interface ExceptionDef;
    interface ValueDef;		// orbos 98-01-18: Objects By Value
    interface ValueMemberDef;	// orbos 98-01-18: Objects By Value
    interface ValueBoxDef;	// orbos 98-01-18: Objects By Value
    interface NativeDef;


    typedef sequence <InterfaceDef> InterfaceDefSeq;


    typedef sequence <Contained> ContainedSeq;

    struct StructMember {
	Identifier name;
	TypeCode type;
	IDLType type_def;
    };
    typedef sequence <StructMember> StructMemberSeq;

    struct UnionMember {
	Identifier name;
	any label;
	TypeCode type;
	IDLType type_def;
    };
    typedef sequence <UnionMember> UnionMemberSeq;


    typedef sequence <Identifier> EnumMemberSeq;

    // orbos 98-01-18: Objects By Value -- begin
    typedef short Visibility;	
    const Visibility PRIVATE_MEMBER = 0; 
    const Visibility PUBLIC_MEMBER = 1;

    struct ValueMember {
        Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
        TypeCode type;
        IDLType type_def;
        Visibility access;
    };
    typedef sequence <ValueMember> ValueMemberSeq;

    struct Initializer {
        StructMemberSeq members;
    };
    typedef sequence <Initializer> InitializerSeq;

    typedef sequence <ValueDef> ValueDefSeq;
    
    // orbos 98-01-18: Objects By Value -- end


    interface Container : IRObject
    /**
      The Container interface is used to form a containment hierarchy
      in the Interface Repository. A Container can contain any number
      of objects derived from the Contained interface.
    */
    {
	// read interface

	Contained lookup ( in ScopedName search_name);

	ContainedSeq contents (
	    in DefinitionKind limit_type,
	    in boolean exclude_inherited
	    );

	ContainedSeq lookup_name (
	    in Identifier search_name,
	    in long levels_to_search,
	    in DefinitionKind limit_type,
	    in boolean exclude_inherited
	    );

	struct Description {
	    Contained contained_object;
	    DefinitionKind kind;
	    any value;
	};

	typedef sequence<Description> DescriptionSeq;

	DescriptionSeq describe_contents (
	    in DefinitionKind limit_type,
	    in boolean exclude_inherited,
	    in long max_returned_objs
	    );

	// write interface

	ModuleDef create_module (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version
	    );

	ConstantDef create_constant (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in IDLType type,
	    in any value
	    );

	StructDef create_struct (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in StructMemberSeq members
	    );

	UnionDef create_union (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in IDLType discriminator_type,
	    in UnionMemberSeq members
	    );

	EnumDef create_enum (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in EnumMemberSeq members
	    );

	AliasDef create_alias (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in IDLType original_type
	    );

        ExceptionDef create_exception (
            in RepositoryId    id,
            in Identifier      name,
            in VersionSpec     version,
            in StructMemberSeq members
        );


	InterfaceDef create_interface (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in boolean is_abstract,
	    in InterfaceDefSeq base_interfaces
	    );

	// orbos 98-01-18: Objects By Value
	ValueDef create_value(
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in boolean is_custom,
	    in boolean is_abstract,
	    in octet flags,	// must be 0
	    in ValueDef base_value,
	    in boolean has_safe_base,
	    in ValueDefSeq abstract_base_values,
	    in InterfaceDefSeq supported_interfaces,
	    in InitializerSeq initializers
	    );
	
	// orbos 98-01-18: Objects By Value
	ValueBoxDef create_value_box(
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in IDLType original_type_def
	    );
	
	NativeDef create_native(
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version
	    );
	
    };



    interface IDLType : IRObject
    /**
       The IDLType interface is an abstract interface inherited by all
       IR objects that represent the OMG IDL types. It provides access
       to the TypeCode describing the type, and is used in defining the
       other interfaces wherever definitions of IDLType must be referenced.
    */
    {
	readonly attribute TypeCode type;
    };



    interface PrimitiveDef;
    interface StringDef;
    interface SequenceDef;
    interface ArrayDef;

    enum PrimitiveKind {
	pk_null, pk_void, pk_short, pk_long, pk_ushort, pk_ulong,
	pk_float, pk_double, pk_boolean, pk_char, pk_octet,
	pk_any, pk_TypeCode, pk_Principal, pk_string, pk_objref
    };

    interface Repository : Container
    /**
      Repository is an interface that provides global access to the
      Interface Repository. Repository objects can contain constants,
      typedefs, exceptions, interfaces, and modules.
    */
    {
	// read interface

	Contained lookup_id (in RepositoryId search_id);

	PrimitiveDef get_primitive (in PrimitiveKind kind);

	// write interface

	StringDef create_string (in unsigned long bound);

	SequenceDef create_sequence (
	    in unsigned long bound,
	    in IDLType element_type
	    );

	ArrayDef create_array (
	    in unsigned long length,
	    in IDLType element_type
	    );
    };


    interface ModuleDef : Container, Contained
    /**
      A ModuleDef can contain constants, typedefs, exceptions, interfaces,
      and other module objects.
    */
    {
    };

    struct ModuleDescription {
	Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
    };


    interface ConstantDef : Contained
    /**
      A ConstantDef object defines a named constant.
    */
    {
	readonly attribute TypeCode type;
	attribute IDLType type_def;
	attribute any value;
    };

    struct ConstantDescription {
	Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
	TypeCode type;
	any value;
    };


    interface TypedefDef : Contained, IDLType
    /**
      TypedefDef is an abstract interface used as a base interface for
      all named non-object types(structures, unions, enumerations,
      aliases). The TypedefDef interface is not inherited by the definition
      objects for the primitive or anonymous types.
    */
    {
    };

    struct TypeDescription {
	Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
	TypeCode type;
    };


    interface StructDef : TypedefDef, Container
    /**
       A StructDef represents an OMG IDL structure definition.
    */
    {
	attribute StructMemberSeq members;
    };


    interface UnionDef : TypedefDef, Container
    /**
       A UnionDef represents an OMG IDL union definition.
     */
    {
	readonly attribute TypeCode discriminator_type;
	attribute IDLType discriminator_type_def;
	attribute UnionMemberSeq members;
    };


    interface EnumDef : TypedefDef
    /**
      A EnumDef represents an OMG IDL enum definition.
     */
    {
	attribute EnumMemberSeq members;
    };


    interface AliasDef : TypedefDef
    /**
       An AliasDef represents an OMG IDL typedef that aliases other
       definition.
    */
    {
	attribute IDLType original_type_def;
    };


    interface PrimitiveDef: IDLType
    /**
      A PrimitiveDef represents one of the IDL primitive types. As
      primitive types are unnamed, this interface is not derived from
      TypedefDef or Contained.
     */
    {
	readonly attribute PrimitiveKind kind;
    };


    interface StringDef : IDLType
    /**
      A StringDef represents an OMG IDL string type. As string
      types are anonymous, this interface is not derived from TypedefDef
      or Contained.
    */
    {
	attribute unsigned long bound;
    };


    interface SequenceDef : IDLType
    /**
      A SequenceDef represents an OMG IDL sequence type. As sequence
      types are anonymous, this interface is not derived from TypedefDef
      or Contained.
     */
    {
	attribute unsigned long bound;
	readonly attribute TypeCode element_type;
	attribute IDLType element_type_def;
    };

    interface ArrayDef : IDLType
    /**
      An ArrayDef represents an OMG IDL array type. As array
      types are anonymous, this interface is not derived from TypedefDef
      or Contained.
    */
    {
	attribute unsigned long length;
	readonly attribute TypeCode element_type;
	attribute IDLType element_type_def;
    };


    interface ExceptionDef : Contained, Container
    /**
      An ExceptionDef represents an exception definition.
    */
    {
	readonly attribute TypeCode type;
	attribute StructMemberSeq members;
    };
    struct ExceptionDescription {
	Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
	TypeCode type;
    };



    enum AttributeMode {ATTR_NORMAL, ATTR_READONLY};

    interface AttributeDef : Contained
    /**
      An AttributeDef represents the information that defines an
      attribute of an interface.
    */
    {
	readonly attribute TypeCode type;
	attribute IDLType type_def;
	attribute AttributeMode mode;
    };

    struct AttributeDescription {
	Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
	TypeCode type;
	AttributeMode mode;
    };



    enum OperationMode {OP_NORMAL, OP_ONEWAY};

    enum ParameterMode {PARAM_IN, PARAM_OUT, PARAM_INOUT};
    struct ParameterDescription {
	Identifier name;
	TypeCode type;
	IDLType type_def;
	ParameterMode mode;
    };
    typedef sequence <ParameterDescription> ParDescriptionSeq;

    typedef Identifier ContextIdentifier;
    typedef sequence <ContextIdentifier> ContextIdSeq;

    typedef sequence <ExceptionDef> ExceptionDefSeq;
    typedef sequence <ExceptionDescription> ExcDescriptionSeq;

    interface OperationDef : Contained
    /**
      An OperationDef represents the information that defines an
      operation of an interface.
     */
    {
	readonly attribute TypeCode result;
	attribute IDLType result_def;
	attribute ParDescriptionSeq params;
	attribute OperationMode mode;
	attribute ContextIdSeq contexts;
	attribute ExceptionDefSeq exceptions;
    };

    struct OperationDescription {
	Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
	TypeCode result;
	OperationMode mode;
	ContextIdSeq contexts;
	ParDescriptionSeq parameters;
	ExcDescriptionSeq exceptions;
    };



    typedef sequence <RepositoryId> RepositoryIdSeq;
    typedef sequence <OperationDescription> OpDescriptionSeq;
    typedef sequence <AttributeDescription> AttrDescriptionSeq;

    interface InterfaceDef : Container, Contained, IDLType
    /**
      An InterfaceDef object represents an interface definition. It can
      contains constants, typedefs, exceptions, operations, and
      attributes.
     */
    {
	// read/write interface

	attribute InterfaceDefSeq base_interfaces;
	attribute boolean is_abstract;

	// read interface

	boolean is_a (in RepositoryId interface_id);

	struct FullInterfaceDescription {
	    Identifier name;
	    RepositoryId id;
	    RepositoryId defined_in;
	    VersionSpec version;
	    boolean is_abstract;
	    OpDescriptionSeq operations;
	    AttrDescriptionSeq attributes;
	    RepositoryIdSeq base_interfaces;
	    TypeCode type;
	};

	FullInterfaceDescription describe_interface();

	// write interface

	AttributeDef create_attribute (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in IDLType type,
	    in AttributeMode mode
	    );

	OperationDef create_operation (
	    in RepositoryId id,
	    in Identifier name,
	    in VersionSpec version,
	    in IDLType result,
	    in OperationMode mode,
	    in ParDescriptionSeq params,
	    in ExceptionDefSeq exceptions,
	    in ContextIdSeq contexts
	    );
    };

    struct InterfaceDescription {
	Identifier name;
	RepositoryId id;
	RepositoryId defined_in;
	VersionSpec version;
	RepositoryIdSeq base_interfaces;
    };


    // orbos 98-01-18: Objects By Value -- begin

    interface ValueMemberDef : Contained

      /** A <code>ValueMemberDef</code> object represents the public
      and private data member definition of a <code>Value</code> type
      */

 {
        readonly attribute TypeCode type;
	         attribute IDLType type_def;
		 attribute Visibility access;
    };

    interface ValueDef : Container, Contained, IDLType
      /**
	A ValueDef object represents the definition of the
	<code>Value</code> object used to pass the object state
	between hosts
	*/

      {
	   // read/write interface
	    attribute InterfaceDefSeq supported_interfaces;
	    attribute InitializerSeq initializers;
	    attribute ValueDef base_value;
	    attribute ValueDefSeq abstract_base_values;
	    attribute boolean is_abstract;
	    attribute boolean is_custom;
	    attribute octet flags; // always 0
	    attribute boolean has_safe_base;

	    // read interface
	    boolean is_a(in RepositoryId value_id);

	    struct FullValueDescription {
	      Identifier 	name;
	      RepositoryId 	id;
	      boolean 	is_abstract;
	      boolean 	is_custom;
	      octet 		flags; // always 0
	      RepositoryId 	defined_in;
	      VersionSpec 	version;
	      OpDescriptionSeq operations;
	      AttrDescriptionSeq attributes;
	      ValueMemberSeq 	members;
	      InitializerSeq 	initializers;
	      RepositoryIdSeq supported_interfaces;
	      RepositoryIdSeq abstract_base_values;
	      boolean 	has_safe_base;
	      RepositoryId	base_value;
	      TypeCode	type;
	  };

	  FullValueDescription describe_value();

	  // write interface

	  ValueMemberDef create_value_member(
	      in RepositoryId id,
	      in Identifier name,
	      in VersionSpec version,
	      in IDLType type_def,
	      in Visibility access
	  );

	  AttributeDef create_attribute(
	      in RepositoryId id,
	      in Identifier   name,
	      in VersionSpec  version,
	      in IDLType      type,
	      in AttributeMode mode
	  );

	  OperationDef create_operation(
	      in RepositoryId id,
	      in Identifier   name,
	      in VersionSpec  version,
	      in IDLType      result,
	      in OperationMode     mode,
	      in ParDescriptionSeq params,
	      in ExceptionDefSeq   exceptions,
	      in ContextIdSeq contexts
	  );
    };
    struct ValueDescription {
        Identifier name;
        RepositoryId id;
        boolean is_abstract;
        boolean is_custom;
        octet   flags; // always 0
        RepositoryId defined_in;
        VersionSpec version;
        RepositoryIdSeq supported_interfaces;
        RepositoryIdSeq abstract_base_values;
        boolean has_safe_base;
        RepositoryId base_value;
    };

    interface ValueBoxDef : IDLType 

      /** ValueBoxDef is an interface that reresents a value type with
	a single data member inside its state section and no
	inheritance or methods. For example, when transmitting a
	string or sequence as an actual parameter on an interface
	operation or as a data member of a value type that is an
	actual parameter, it may be important to preserve any sharing
	of the string or sequence within the object graph being
	transmitted. Because current IDL data types do not preserve
	referential integrity in this way, this requirement is
	conveniently handled by using a value type. Value types also
	support the transmission of nulls (as a distinguished value),
	whereas IDL data types such as string and sequence (which are
	mapped to empty strings and sequences) do not. The Java to IDL
	mapping requires both preservation of referential integrity
	and transmission of nulls. Because it would be cumbersome to
	require the full IDL syntax for a value type for this specific
	usage, this shorthand notation is introduced to cover this use
	of value types for simple containment of a single data member.
	*/

{
        attribute IDLType original_type_def;
    };
    
    // orbos 98-01-18: Objects By Value -- end

    interface NativeDef : TypedefDef {
    };
};
