// **********************************************************************
//
// Copyright (c) 2002
// IONA Technologies, Inc.
// Waltham, MA, USA
//
// All Rights Reserved
//
// **********************************************************************

#ifndef DYNAMIC_ANY_IDL
#define DYNAMIC_ANY_IDL

#include <OB/TCKind.idl>
#include <OB/TypeCode.idl>
#include <OB/Native.idl>
#include <OB/Types.idl>

#pragma prefix "omg.org"

module DynamicAny
{

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);
#ifdef OB_CPLUSPLUS
    void insert_longdouble(in long double value)
	raises(TypeMismatch, InvalidValue);
#endif
    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);
    void insert_abstract(in CORBA::AbstractBase value)
	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_wchar_seq(in CORBA::WCharSeq 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_longlong_seq(in CORBA::LongLongSeq value)
	raises(TypeMismatch, InvalidValue);
    void insert_ulonglong_seq(in CORBA::ULongLongSeq 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);
#ifdef OB_CPLUSPLUS
    void insert_longdouble_seq(in CORBA::LongDoubleSeq value)
	raises(TypeMismatch, InvalidValue);
#endif

    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);
#ifdef OB_CPLUSPLUS
    long double get_longdouble()
	raises(TypeMismatch, InvalidValue);
#endif
    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);
    CORBA::AbstractBase get_abstract()
	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::WCharSeq get_wchar_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::LongLongSeq get_longlong_seq()
	raises(TypeMismatch, InvalidValue);
    CORBA::ULongLongSeq get_ulonglong_seq()
	raises(TypeMismatch, InvalidValue);
    CORBA::FloatSeq get_float_seq()
	raises(TypeMismatch, InvalidValue);
    CORBA::DoubleSeq get_double_seq()
	raises(TypeMismatch, InvalidValue);
#ifdef OB_CPLUSPLUS
    CORBA::LongDoubleSeq get_longdouble_seq()
	raises(TypeMismatch, InvalidValue);
#endif

    boolean seek(in long index);
    void rewind();
    boolean next();

    unsigned long component_count();
    DynAny current_component()
	raises(TypeMismatch);
};

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);
    boolean is_set_to_default_member();
};

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);
};

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);
};

}; // End of module DynamicAny

#endif
