// -*- c++ -*-

#include <mico/tckind.idl>
#include <mico/orb.idl>

#pragma prefix "omg.org"

module DynamicAny {

local interface DynAny {
    exception InvalidValue {};
    exception TypeMismatch {};

    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 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);
    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 CORBA::AbstractBase value)
      raises (TypeMismatch, InvalidValue);
    CORBA::AbstractBase get_abstract ()
      raises (TypeMismatch, InvalidValue);
};

local interface DynBasic : DynAny {
};

local interface DynFixed : DynAny {
    string get_value ();
    void 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 ();
    void set_members (in NameValuePairSeq values)
        raises (TypeMismatch, InvalidValue);
    NameDynAnyPairSeq get_members_as_dyn_any ();
    void set_members_as_dyn_any (in NameDynAnyPairSeq values)
        raises (TypeMismatch, InvalidValue);
};

local interface DynValueBox : DynValueCommon {
  any get_boxed_value ()
    raises (InvalidValue);
  void set_boxed_value (in any boxed)
    raises (TypeMismatch);
  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 TypeCode type)
        raises (InconsistentTypeCode);
};

}; // module DynamicAny
