// File: DynamicAny.idl
// CORBA 3.0, Chapter 9

#ifndef _DYNAMIC_ANY_IDL_
#define _DYNAMIC_ANY_IDL_

#ifdef _PRE_3_0_COMPILER_ 
#pragma prefix "omg.org"
#include <orb.idl>
#else
import ::CORBA;
#endif // _PRE_3_0_COMPILER_

module DynamicAny {

#ifndef _PRE_3_0_COMPILER_ 
    typeprefix DynamicAny "omg.org";
#endif // _PRE_3_0_COMPILER_

    local interface DynAny {
        exception InvalidValue {};
        exception TypeMismatch {};
                
        CORBA::TypeCode type();

        void assign(        in DynAny   dyn_any)   
	  raises(TypeMismatch);
        void from_any(      in any      value)      
	  raises(TypeMismatch, InvalidValue);
        any to_any();

        boolean equal(      in DynAny   dyn_any);

        void destroy();
        DynAny copy();

        void insert_boolean(in boolean  value)      
	  raises(TypeMismatch, InvalidValue);
        void insert_octet(  in octet    value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_char(   in char     value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_short(  in short    value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_ushort( in unsigned short 
                                        value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_long(   in long     value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_ulong(  in unsigned long 
                                        value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_float(  in float    value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_double( in double   value)      
	  raises(TypeMismatch, InvalidValue);
        void insert_string( in string   value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_reference(in Object value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_typecode(in CORBA::TypeCode 
                                        value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_longlong(in long long value)   
	  raises(TypeMismatch, InvalidValue);
        void insert_ulonglong(in unsigned long long 
                                        value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_longdouble(in long double 
                                        value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_wchar(  in wchar    value)      
	  raises(TypeMismatch, InvalidValue);
        void insert_wstring(in wstring  value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_any(    in any      value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_dyn_any(in DynAny   value)     
	  raises(TypeMismatch, InvalidValue);
        void insert_val(    in ValueBase value)     
	  raises(TypeMismatch, InvalidValue);

        boolean         get_boolean()               
	  raises(TypeMismatch, InvalidValue);
        octet           get_octet()                 
	  raises(TypeMismatch, InvalidValue);
        char            get_char()                 
	  raises(TypeMismatch, InvalidValue);
        short           get_short()                 
	  raises(TypeMismatch, InvalidValue);
        unsigned short  get_ushort()                
	  raises(TypeMismatch, InvalidValue);
        long            get_long()                  
	  raises(TypeMismatch, InvalidValue);
        unsigned long   get_ulong()                
	  raises(TypeMismatch, InvalidValue);
        float           get_float()                 
	  raises(TypeMismatch, InvalidValue);
        double          get_double()                
	  raises(TypeMismatch, InvalidValue);
        string          get_string()               
	  raises(TypeMismatch, InvalidValue);
        Object          get_reference()            
	  raises(TypeMismatch, InvalidValue);
        CORBA::TypeCode get_typecode()             
	  raises(TypeMismatch, InvalidValue);
        long long       get_longlong()             
	  raises(TypeMismatch, InvalidValue);
        unsigned long long get_ulonglong()          
	  raises(TypeMismatch, InvalidValue);
        long double     get_longdouble()            
	  raises(TypeMismatch, InvalidValue);
        wchar           get_wchar()                
	  raises(TypeMismatch, InvalidValue);
        wstring         get_wstring()              
	  raises(TypeMismatch, InvalidValue);
        any             get_any()                   
	  raises(TypeMismatch, InvalidValue);
        DynAny          get_dyn_any()               
	  raises(TypeMismatch, InvalidValue);
        ValueBase       get_val()                   
	  raises(TypeMismatch, InvalidValue);

        boolean         seek(in long index);
        void            rewind();
        boolean         next();
        unsigned long   component_count();
        DynAny          current_component()        
	  raises(TypeMismatch);

        void insert_abstract(in AbstractBase value)
	  raises(TypeMismatch, InvalidValue);
        AbstractBase get_abstract()
	  raises(TypeMismatch, InvalidValue);

        void insert_boolean_seq(in CORBA::BooleanSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_octet_seq(in CORBA::OctetSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_char_seq(in CORBA::CharSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_short_seq(in CORBA::ShortSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_ushort_seq(in CORBA::UShortSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_long_seq(in CORBA::LongSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_ulong_seq(in CORBA::ULongSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_float_seq(in CORBA::FloatSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_double_seq(in CORBA::DoubleSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_longlong_seq(in CORBA::LongLongSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_ulonglong_seq(in CORBA::ULongLongSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_longdouble_seq(in CORBA::LongDoubleSeq value)
	  raises(TypeMismatch, InvalidValue);
        void insert_wchar_seq(in CORBA::WCharSeq value)
	  raises(TypeMismatch, InvalidValue);
        CORBA::BooleanSeq get_boolean_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::OctetSeq get_octet_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::CharSeq get_char_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::ShortSeq get_short_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::UShortSeq get_ushort_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::LongSeq get_long_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::ULongSeq get_ulong_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::FloatSeq get_float_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::DoubleSeq get_double_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::LongLongSeq get_longlong_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::ULongLongSeq get_ulonglong_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::LongDoubleSeq get_longdouble_seq()
	  raises(TypeMismatch, InvalidValue);
        CORBA::WCharSeq get_wchar_seq()
	  raises(TypeMismatch, InvalidValue);
    };
    
    local interface DynFixed : DynAny {
        string          get_value();
        boolean         set_value(in string val)    
	  raises(TypeMismatch, InvalidValue);
    };
    
    local interface DynEnum : DynAny {
        string          get_as_string();
        void            set_as_string(in string value) 
	  raises(InvalidValue);
        unsigned long   get_as_ulong();
        void            set_as_ulong( in unsigned long value) 
	  raises(InvalidValue);
    };
    typedef string FieldName;
    struct NameValuePair {
        FieldName   id;
        any         value;
    };
    
    typedef sequence<NameValuePair> NameValuePairSeq;
    struct NameDynAnyPair {
        FieldName   id;
        DynAny      value;
    };

    typedef sequence<NameDynAnyPair> NameDynAnyPairSeq;
    local interface DynStruct : DynAny {
        FieldName           current_member_name()  
	  raises(TypeMismatch, InvalidValue);
        CORBA::TCKind       current_member_kind()   
	  raises(TypeMismatch, InvalidValue);
        NameValuePairSeq    get_members();
        void                set_members(in NameValuePairSeq value)    
	  raises(TypeMismatch, InvalidValue);
        NameDynAnyPairSeq   get_members_as_dyn_any();
        void  set_members_as_dyn_any(in NameDynAnyPairSeq value)
	  raises(TypeMismatch, InvalidValue);
    };

    local interface DynUnion : DynAny {
        DynAny              get_discriminator();
        void                set_discriminator(in DynAny d) 
	  raises(TypeMismatch);
        void                set_to_default_member() 
	  raises(TypeMismatch);
        void                set_to_no_active_member() 
	  raises(TypeMismatch);
        boolean             has_no_active_member();
        CORBA::TCKind       discriminator_kind();
        DynAny              member()               
	  raises(InvalidValue);
        FieldName           member_name()          
	  raises(InvalidValue);
        CORBA::TCKind       member_kind()           
	  raises(InvalidValue);
    };
    
    typedef sequence<any>    AnySeq;
    typedef sequence<DynAny> DynAnySeq;
    local interface DynSequence : DynAny {
        unsigned long       get_length();
        void                set_length(in unsigned long len) 
	  raises(InvalidValue);
        AnySeq              get_elements();
        void                set_elements(in AnySeq value)
	  raises(TypeMismatch, InvalidValue);
        DynAnySeq           get_elements_as_dyn_any();
        void                set_elements_as_dyn_any(in DynAnySeq value)
	  raises(TypeMismatch, InvalidValue);
    };

    local interface DynArray : DynAny {
        AnySeq              get_elements();
        void                set_elements(in AnySeq value)
	  raises(TypeMismatch, InvalidValue);
        DynAnySeq           get_elements_as_dyn_any();
        void                set_elements_as_dyn_any(in DynAnySeq value)
	  raises(TypeMismatch, InvalidValue);
    };
    
    local interface DynValueCommon : DynAny {
        boolean             is_null();
        void                set_to_null();
        void                set_to_value();
    };

    local interface DynValue : DynValueCommon {
        FieldName           current_member_name()
	  raises(TypeMismatch, InvalidValue);
        CORBA::TCKind       current_member_kind()
	  raises(TypeMismatch, InvalidValue);
        NameValuePairSeq    get_members()
	  raises(InvalidValue);
        void                set_members(in NameValuePairSeq value)
	  raises(TypeMismatch, InvalidValue);
        NameDynAnyPairSeq   get_members_as_dyn_any()
	  raises(InvalidValue);
        void                set_members_as_dyn_any(in NameDynAnyPairSeq value)
	  raises(TypeMismatch, InvalidValue);
    };

    local interface DynValueBox : DynValueCommon {
        any                 get_boxed_value()
	  raises(InvalidValue);
        void                set_boxed_value(in any boxed) 
	  raises(TypeMismatch, InvalidValue);
        DynAny              get_boxed_value_as_dyn_any()
	  raises(InvalidValue);
        void                set_boxed_value_as_dyn_any(in DynAny boxed)
	  raises(TypeMismatch);
    };

    exception MustTruncate { };

    local interface DynAnyFactory {
        exception InconsistentTypeCode {};
        DynAny create_dyn_any(in any value)
	  raises(InconsistentTypeCode);
        DynAny create_dyn_any_from_type_code(in CORBA::TypeCode type)
	  raises(InconsistentTypeCode);
        DynAny create_dyn_any_without_truncation(in any value)
	  raises(InconsistentTypeCode, MustTruncate);
        DynAnySeq create_multiple_dyn_anys(
	  in AnySeq values,
	  in boolean allow_truncate)
	raises(InconsistentTypeCode, MustTruncate);
        AnySeq create_multiple_anys(in DynAnySeq values);
    };



}; // module DynamicAny
#endif // _DYNAMIC_ANY_IDL_
