// IDL
// File: DynamicAny.idl

#ifndef _DYNAMIC_ANY_IDL
#define _DYNAMIC_ANY_IDL

#pragma prefix "omg.org"
#include <orb.idl>

module DynamicAny
{
    // Dynamic Management of Anys

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

	CORBA::TypeCode type();

	void assign(in DynAny dyn_any) raises (TypeMismatch);

	void from_any(in any value ) raises (InvalidValue, TypeMismatch);
	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);

	// not yet supported by the Java language mapping:
	//	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);

       	// not yet supported by the Java language mapping
	//	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);
    };

    interface DynFixed : DynAny {
	string get_value();
	void set_value( in string val ) 
	    raises (TypeMismatch, InvalidValue );
    };

    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 ;


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

	CORBA::TCKind member_kind()
	    raises (InvalidValue);

	FieldName member_name()
	    raises (InvalidValue );
    };

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

    
    typedef sequence<any> AnySeq;
    typedef sequence<DynAny> DynAnySeq;

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

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

    interface DynValue
    {
	//
    };


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

};

#endif // _DYNAMIC_ANY_IDL


