// File: CORBA_InterfaceRepository.idl 
// (part of formal/00-04-01)
// CORBA 2.3, Chapter 10

// Forward references to Chapter 10, CORBA_InterfaceRepository.idl

#ifndef InterfaceRepository_IDL
#define InterfaceRepository_IDL

#include <InterfaceRepository.idl>

#pragma prefix "omg.org"

module CORBA {
    interface AliasDef;
    interface ArrayDef;
    interface AttributeDef;
    interface ConstantDef;
    interface Contained;
    interface Container;
    interface EnumDef;
    interface ExceptionDef;
    interface FixedDef;
    interface IDLType;
    interface InterfaceDef;
    interface IRObject;
    interface ModuleDef;
    interface NativeDef;
    interface OperationDef;
    interface PrimitiveDef; 
    interface Repository;
    interface SequenceDef;
    interface StringDef;
    interface StructDef;
    interface TypeCode;
    interface TypedefDef;
    interface UnionDef;
    interface ValueDef;
    interface ValueBoxDef;
    interface ValueMemberDef;
    interface WstringDef;

    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,
        dk_Native
    };
    
    interface IRObject {
        // read interface
        readonly attribute  DefinitionKind  def_kind;
        // write interface
        void                destroy ();
    };
    
    typedef string VersionSpec;

    interface Contained : IRObject {

        // 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
                                    );
    };
    typedef sequence <InterfaceDef> InterfaceDefSeq;
    typedef sequence <ValueDef> ValueDefSeq;
    typedef sequence <Contained> ContainedSeq;
    
    struct StructMember {
        Identifier          name;
        TypeCode            type;
        IDLType             type_def;
    };
    typedef sequence <StructMember> StructMemberSeq;
    struct Initializer {
        StructMemberSeq     members;
        Identifier          name;
    };
    typedef sequence <Initializer> InitializerSeq;
    struct UnionMember {
        Identifier          name;
        any                 label;
        TypeCode            type;
        IDLType             type_def;
    };
    typedef sequence <UnionMember> UnionMemberSeq;
    typedef sequence <Identifier> EnumMemberSeq;
    interface Container : IRObject {
        // 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
                               );
        InterfaceDef create_interface (
                                       in RepositoryId                 id,
                                       in Identifier                   name,
                                       in VersionSpec                  version,
                                       in InterfaceDefSeq              base_interfaces,
                                       in boolean                      is_abstract
                                       );
        ValueDef create_value(
                              in RepositoryId                 id,
                              in Identifier                   name,
                              in VersionSpec                  version,
                              in boolean                      is_custom,
                              in boolean                      is_abstract,
                              in ValueDef                     base_value,
                              in boolean                      is_truncatable,
                              in ValueDefSeq                  abstract_base_values,
                              in InterfaceDefSeq              supported_interfaces,
                              in InitializerSeq               initializers
                              );
        ValueBoxDef create_value_box(
                                     in RepositoryId                 id,
                                     in Identifier                   name,
                                     in VersionSpec                  version,
                                     in IDLType                      original_type_def
                                     );
        ExceptionDef create_exception(
                                      in RepositoryId                 id,
                                      in Identifier                   name,
                                      in VersionSpec                  version,
                                      in StructMemberSeq              members
                                      );
        NativeDef create_native(
                                in RepositoryId                 id,
                                in Identifier                   name,
                                in VersionSpec                  version
                                );
    };
    interface IDLType : IRObject {
        readonly attribute TypeCode     type;
    };

    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,
        pk_longlong,pk_ulonglong, pk_longdouble, 
        pk_wchar,   pk_wstring,   pk_value_base
    };
    
    interface Repository : Container {
        // read interface
        Contained   lookup_id               (in RepositoryId    search_id);
        TypeCode    get_canonical_typecode  (in TypeCode        tc); 
        PrimitiveDef get_primitive          (in PrimitiveKind   kind);
        // write interface
        StringDef   create_string           (in unsigned long   bound);
        WstringDef  create_wstring          (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
                                             );
        FixedDef create_fixed               (in unsigned short  digits,
                                             in short           scale
                                             );
    };
    interface ModuleDef : Container, Contained {
    };
    
    struct ModuleDescription {
        Identifier                      name; 
        RepositoryId                    id; 
        RepositoryId                    defined_in;
        VersionSpec                     version;
    };

    interface ConstantDef : Contained {
        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 {
    };
    
    struct TypeDescription {
        Identifier                      name; 
        RepositoryId                    id; 
        RepositoryId                    defined_in; 
        VersionSpec                     version;
        TypeCode                        type; 
    };
    
    interface StructDef : TypedefDef, Container {
        attribute StructMemberSeq       members;
    };
    
    interface UnionDef : TypedefDef, Container {
        readonly attribute TypeCode     discriminator_type;
        attribute IDLType               discriminator_type_def;
        attribute UnionMemberSeq        members;
    };

    interface EnumDef : TypedefDef {
        attribute EnumMemberSeq         members;
    };
    interface AliasDef : TypedefDef {
        attribute IDLType               original_type_def;
    };
    interface NativeDef : TypedefDef {
    };
    interface PrimitiveDef: IDLType {
        readonly attribute PrimitiveKind kind;
    };
    interface StringDef : IDLType {
        attribute unsigned long         bound;
    };
    interface WstringDef : IDLType {
        attribute unsigned long         bound;
    };
    interface FixedDef : IDLType {
        attribute unsigned short        digits;
        attribute short                 scale;
    };
    interface SequenceDef : IDLType {
        attribute unsigned long         bound;
        readonly attribute TypeCode     element_type;
        attribute IDLType               element_type_def;
    };
    interface ArrayDef : IDLType {
        attribute unsigned long         length;
        readonly attribute TypeCode     element_type;
        attribute IDLType               element_type_def;
    };
    interface ExceptionDef : Contained, Container {
        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 {
        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 {
        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 {

        // 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;
            OpDescriptionSeq            operations;
            AttrDescriptionSeq          attributes;
            RepositoryIdSeq             base_interfaces;
            TypeCode                    type;
            boolean                     is_abstract;
        };

        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;
        boolean                         is_abstract;
    };

    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;

    interface ValueMemberDef : Contained {
        readonly attribute              TypeCode type;
        attribute IDLType               type_def;
        attribute Visibility            access;
    };

    interface ValueDef : Container, Contained, IDLType {
        // 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 boolean               is_truncatable;
        // read interface
        boolean is_a(in RepositoryId    id);

        struct FullValueDescription {
            Identifier                  name;
            RepositoryId                id;
            boolean                     is_abstract;
            boolean                     is_custom;
            RepositoryId                defined_in;
            VersionSpec                 version;
            OpDescriptionSeq            operations;
            AttrDescriptionSeq          attributes;
            ValueMemberSeq              members;
            InitializerSeq              initializers;
            RepositoryIdSeq             supported_interfaces;
            RepositoryIdSeq             abstract_base_values;
            boolean                     is_truncatable;
            RepositoryId                base_value;
            TypeCode                    type;
        };

        FullValueDescription describe_value();

        ValueMemberDef create_value_member(
                                           in RepositoryId             id,
                                           in Identifier               name,
                                           in VersionSpec              version,
                                           in IDLType                  type,
                                           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;
        RepositoryId                    defined_in;
        VersionSpec                     version;
        RepositoryIdSeq                 supported_interfaces;
        RepositoryIdSeq                 abstract_base_values;
        boolean                         is_truncatable;
        RepositoryId                    base_value; 
    };

    interface ValueBoxDef : TypedefDef {
        attribute IDLType original_type_def;
    };

    enum TCKind {                               // PIDL
        tk_null,    tk_void, 
        tk_short,   tk_long,        tk_ushort,  tk_ulong, 
        tk_float,   tk_double,      tk_boolean, tk_char, 
        tk_octet,   tk_any,         tk_TypeCode,tk_Principal, tk_objref, 
        tk_struct,  tk_union,       tk_enum,    tk_string, 
        tk_sequence,tk_array,       tk_alias,   tk_except,
        tk_longlong,tk_ulonglong,   tk_longdouble,
        tk_wchar,   tk_wstring,     tk_fixed,
        tk_value,   tk_value_box,
        tk_native,
        tk_abstract_interface
    };
    typedef short ValueModifier;                        // PIDL
    const ValueModifier VM_NONE         = 0;
    const ValueModifier VM_CUSTOM       = 1;
    const ValueModifier VM_ABSTRACT     = 2;
    const ValueModifier VM_TRUNCATABLE  = 3;

    interface TypeCode {                            // PIDL
        exception   Bounds {};
        exception   BadKind {};
        // for all TypeCode kinds
        boolean     equal       (in TypeCode tc);
        boolean     equivalent  (in TypeCode tc); 
        TypeCode    get_compact_typecode(); 
        TCKind      kind ();
        // for tk_objref, tk_struct,    tk_union,  tk_enum, tk_alias, 
        //     tk_value,  tk_value_box, tk_native, tk_abstract_interface
        // and tk_except
        RepositoryId    id () raises (BadKind);
        // for tk_objref, tk_struct,    tk_union,  tk_enum, tk_alias, 
        //     tk_value,  tk_value_box, tk_native, tk_abstract_interface
        // and tk_except
        Identifier name () raises (BadKind);
        // for tk_struct, tk_union, tk_enum, tk_value, 
        // and tk_except
        unsigned long   member_count () raises (BadKind);
        Identifier      member_name (in unsigned long index) 
            raises (BadKind, Bounds);
        // for tk_struct, tk_union, tk_value, and tk_except
        TypeCode        member_type (in unsigned long index) 
            raises (BadKind, Bounds);
        // for tk_union
        any             member_label (in unsigned long index) 
            raises (BadKind, Bounds);
        TypeCode        discriminator_type ()   raises (BadKind);
        long            default_index ()        raises (BadKind); 
        // for tk_string, tk_sequence, and tk_array
        unsigned long   length ()               raises (BadKind);
        // for tk_sequence, tk_array, tk_value_box, and tk_alias
        TypeCode        content_type ()         raises (BadKind);
        // for tk_fixed
        unsigned short  fixed_digits()          raises (BadKind);
        short           fixed_scale()           raises (BadKind);
        // for tk_value
        Visibility      member_visibility(in unsigned long index)
            raises(BadKind, Bounds);
        ValueModifier   type_modifier()         raises(BadKind);
        TypeCode        concrete_base_type()    raises(BadKind);
    };
};

#endif
