// 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();
      boolean 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: DynAny
   {
      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);
   };


   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
