summaryrefslogtreecommitdiff
path: root/TAO/tao/typecode.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/typecode.h')
-rw-r--r--TAO/tao/typecode.h500
1 files changed, 500 insertions, 0 deletions
diff --git a/TAO/tao/typecode.h b/TAO/tao/typecode.h
new file mode 100644
index 00000000000..db1cb634940
--- /dev/null
+++ b/TAO/tao/typecode.h
@@ -0,0 +1,500 @@
+// This may look like C, but it's really -*- C++ -*-
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO
+//
+// = FILENAME
+// typecode.h
+//
+// = DESCRIPTION
+//
+// Header file for Win32 C/C++/COM interface to CORBA's "TypeCode" type.
+//
+// = AUTHOR
+// Copyright 1994-1995 by Sun Microsystems, Inc.
+//
+// ============================================================================
+
+#if !defined (TAO_TYPECODE_H)
+# define TAO_TYPECODE_H
+
+class CDR;
+
+// Two "user exceptions" are defined for manipulating TypeCodes. These two
+// classes are really to be defined inside the TypeCode class
+
+//extern CORBA::TypeCode_ptr CORBA::_tc_Bounds;
+class CORBA_Bounds : public CORBA_UserException
+{
+public:
+ CORBA_Bounds (void)
+ : CORBA_UserException (CORBA::_tc_Bounds) {}
+};
+
+//extern CORBA::TypeCode_ptr CORBA::_tc_BadKind;
+class CORBA_BadKind : public CORBA_UserException
+{
+public:
+ CORBA_BadKind (void)
+ : CORBA_UserException (CORBA::_tc_BadKind) {}
+};
+
+// A TypeCode describes data. This one's as thin a wrapper around CDR
+// octet sequences as is practical. There are guesses here about how
+// the OMG C++ mapping and CORBA 2.0 IFR specification will interact.
+//
+// NOTE: Use TypeCode_ptr, except in code (e.g. output of and OMG-IDL
+// compiler) that needs to create typecodes from their octet-sequence
+// encodings.
+
+class TC_Private_State;
+
+class TAO_Export CORBA_TypeCode
+ // = TITLE
+ // The CORBA TypeCode class. It maintains the in-memory
+ // representation of any OMG CORBA IDL data type.
+ //
+ // = DESCRIPTION
+ // Implements the CORBA::TypeCode interface specified by CORBA 2.0
+ // spec.
+{
+public:
+ // Help debug free-non-heap-memory problems
+ void operator delete (void*);
+
+ typedef CORBA_Bounds Bounds;
+ typedef CORBA_BadKind BadKind;
+ // As per the spec, these two exception classes are supposed to be
+ // nested inside the TypeCode class. Since we are trying to avoid
+ // nesting of classes, we use the above typedef.
+
+ static CORBA::TypeCode_ptr _duplicate (CORBA::TypeCode_ptr tc);
+ // duplicates i.e., increments ref count
+
+ static CORBA::TypeCode_ptr _nil (void);
+ // returns a NULL typecode
+
+ CORBA::Boolean equal (const CORBA::TypeCode_ptr,
+ CORBA::Environment &env) const;
+ // compares two typecodes
+
+ CORBA::TCKind kind (CORBA::Environment &) const;
+ // For all TypeCode kinds, returns the "kind" of the typecode
+
+ const char *id (CORBA::Environment &) const;
+ // For tk_{objref,struct,union,enum,alias,except}. Returns the
+ // repository ID, raises BadKind.
+
+ const char *name (CORBA::Environment &) const;
+ // returns name (), raises (BadKind)
+
+ CORBA::ULong member_count (CORBA::Environment &) const;
+ // returns member_count (), raises (BadKind). Useful for tk_struct,
+ // tk_union, tk_enum, tk_alias, and tk_except.
+
+ const char *member_name (CORBA::ULong index,
+ CORBA::Environment &) const;
+ // returns member_name (...), raises (BadKind, Bounds); Useful for
+ // tk_struct, tk_union, tk_enum, tk_alias, and tk_except.
+
+ CORBA::TypeCode_ptr member_type (CORBA::ULong index,
+ CORBA::Environment &) const;
+ // returns member_type (...), raises (BadKind, Bounds); Useful for
+ // tk_struct, tk_union, and tk_except
+
+ CORBA::Any_ptr member_label (CORBA::ULong n,
+ CORBA::Environment&) const;
+ // For tk_union. Returns the label. Raises BadKind, Bounds.
+
+ CORBA::TypeCode_ptr discriminator_type (CORBA::Environment &) const;
+ // returns the discriminator type for tk_union. raises (BadKind);
+
+ CORBA::Long default_index (CORBA::Environment &) const;
+ // returns the default index for the tk_union. Raises (BadKind);
+
+ CORBA::ULong length (CORBA::Environment &) const;
+ // returns length, raises (BadKind). Used for tk_string,
+ // tk_sequence, and tk_array
+
+ CORBA::TypeCode_ptr content_type (CORBA::Environment &) const;
+ // returns the content type (element type). Raises (BadKind); Useful
+ // for tk_sequence, tk_array, and tk_alias
+
+ CORBA::ULong TAO_discrim_pad_size (CORBA::Environment &);
+ // Calculates the padded size of discriminant type TAO Extension
+
+ // = Creation/refcounting
+
+ // These aren't really public APIs, but an IDL compiler will need to
+ // be able to create TypeCodes as part of creating stubs.
+
+ CORBA_TypeCode (CORBA::TCKind kind);
+ // This constructor is used only for built-in TypeCode constants,
+ // with no parameters.
+
+ CORBA_TypeCode (CORBA::TCKind kind,
+ size_t length,
+ char *buffer,
+ CORBA::Boolean orb_owns_tc,
+ CORBA::TypeCode_ptr parent = 0);
+ // This constructor is used both for typecode constants and for
+ // heap-allocated TypeCodes. The two are distinguished by the
+ // orb_owns_tc flag passed in by the creator.
+ //
+ // For simple param lists with a single numeric parameter, only
+ // 'length' matters.
+ //
+ // For complex param lists, or simple param lists for which the
+ // parameter is a string or typecode, length _and_ buffer matter.
+ //
+ // For typecodes that are precomputed from the encapsulation stream
+ // of the parent, even the "parent" argument matters because this
+ // implies that all children will share the octet buffers of its
+ // parent
+
+ // = Class-specific allocation.
+ void *operator new (size_t, void *p);
+ void *operator new (size_t s);
+
+ ~CORBA_TypeCode (void);
+ // destructor
+
+ enum traverse_status
+ {
+ TRAVERSE_STOP,
+ TRAVERSE_CONTINUE
+ };
+ // these are used to indicate the status of marshaling
+
+ // = The following traverse function is unused in TAO.
+ typedef traverse_status (_FAR * VisitRoutine) (CORBA::TypeCode_ptr tc,
+ const void *value1,
+ const void *value2,
+ void *context,
+ CORBA::Environment &env);
+
+ traverse_status traverse (const void *value1,
+ const void *value2,
+ VisitRoutine visit,
+ void *context,
+ CORBA::Environment &env);
+ // This routine calls visit () on each component of one (or two)
+ // structurally equivalent data values. "Components" are either
+ // primitive (long, string, ...) or constructed (struct, ...) data
+ // elements.
+ //
+ // It will NOT descend into those nodes if they're constructed; it's
+ // the job of the visit () routine to do that as needed.
+ //
+ // "Context" can be used to hold state used by the visit () routine.
+ // To terminate traversal "early", visit () returns TRAVERSE_STOP.
+ //
+ // The "value1" and "value2" parameters are pointers to data values
+ // of the structure described by the TypeCode. Using the normal
+ // size, alignment, and padding rules used by the compilers on a
+ // given platform, the visit () routine is called with pointers to
+ // subsidiary elements.
+ //
+ // As all this routine does is appropriate pointer adjustments, it
+ // any value at all can be passed in as "value1" or "value2". You
+ // could ignore one value and examine a data structure; copy from
+ // one to the other; compare one to the other; and more.
+ //
+ // Normal usage is to have application code call its visit () routine
+ // directly, and have that decide whether to use the typecode
+ // interpereter's knowledge of data structure layout through mutual
+ // recursion.
+
+ size_t size (CORBA::Environment &env);
+ // returns the size. Used by the IIOP marshaling engine.
+
+ size_t alignment (CORBA::Environment &env);
+ // returns the alignment requirements for this typecode. used by the
+ // IIOP marshaling engine.
+
+ CORBA::ULong AddRef (void);
+ CORBA::ULong Release (void);
+
+ // = Following three are deprecated
+
+ CORBA::ULong param_count (CORBA::Environment &) const;
+ // Deprecated, CORBA 1.2, not fully usable. Returns the number of
+ // parameters that the typecode takes.
+
+ CORBA::ULong ulong_param (CORBA::ULong n,
+ CORBA::Environment &) const;
+
+ CORBA::TypeCode_ptr typecode_param (CORBA::ULong n,
+ CORBA::Environment &) const;
+ // Internal utilities, pending CORBA 2.0 IFR APIs; just enough to
+ // make array and sequence typecode interpretation cheap
+
+ // private:
+ //
+ // = The guts of the typecode implementation class
+
+ // This is implemented as a counted set of bytes, in marshaled CDR
+ // format.
+
+ size_t length_;
+ // length of the encapsulated stream
+
+ char* buffer_;
+ // the encapsulated stream
+
+ CORBA::TCKind kind_;
+ // the TypeCode kind
+
+ CORBA::TypeCode_ptr parent_;
+ // Indirected typecodes share "buffer" with a parent, and hold a
+ // reference to that parent to ensure its memory is not freed
+ // inappropriately.
+
+ static CORBA::Boolean skip_typecode (CDR &stream);
+ // skip a typecode encoding in a given CDR stream. This is just a
+ // helper function.
+
+private:
+ // All the private/helper methods
+
+ CORBA::Boolean private_equal (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // Compares the typecodes.
+
+ const char *private_id (CORBA::Environment &) const;
+ // For tk_{objref,struct,union,enum,alias,except}. Returns the
+ // repository ID, raises BadKind.
+
+ const char *private_name (CORBA::Environment &) const;
+ // returns name (), raises (BadKind)
+
+ CORBA::ULong private_member_count (CORBA::Environment &) const;
+ // returns member_count (), raises (BadKind). Useful for tk_struct,
+ // tk_union, tk_enum, tk_alias, and tk_except.
+
+ CORBA::TypeCode_ptr private_member_type (CORBA::ULong index,
+ CORBA::Environment &) const;
+ // returns member_type (...), raises (BadKind, Bounds); Useful for
+ // tk_struct, tk_union, and tk_except
+
+ const char *private_member_name (CORBA::ULong index,
+ CORBA::Environment &) const;
+ // returns member_name (...), raises (BadKind, Bounds); Useful for tk_union,
+ // tk_struct, tk_except, and tk_enum
+
+ CORBA::Any_ptr private_member_label (CORBA::ULong n,
+ CORBA::Environment&) const;
+ // For tk_union. Returns the label. Raises BadKind, Bounds.
+
+ CORBA::TypeCode_ptr private_discriminator_type (CORBA::Environment &) const;
+ // returns the discriminator type for tk_union. raises (BadKind);
+
+ CORBA::Long private_default_index (CORBA::Environment &) const;
+ // returns the default index for the tk_union. Raises (BadKind);
+
+ CORBA::Long private_length (CORBA::Environment &) const;
+ // returns length, raises (BadKind). Used for tk_string,
+ // tk_sequence, and tk_array
+
+ CORBA::TypeCode_ptr private_content_type (CORBA::Environment &) const;
+ // returns the content type (element type). Raises (BadKind); Useful
+ // for tk_sequence, tk_array, and tk_alias
+
+ size_t private_size (CORBA::Environment &env);
+ // returns the size. Used by the IIOP marshaling engine.
+
+ size_t private_alignment (CORBA::Environment &env);
+ // returns the alignment requirements for this typecode. used by the
+ // IIOP marshaling engine.
+
+ CORBA::ULong private_discrim_pad_size (CORBA::Environment &);
+ // Calculates the padded size of discriminant type TAO Extension
+
+ // = All the private helpers testing for equality of typecodes
+
+ CORBA::Boolean private_equal_objref (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of objrefs
+
+ CORBA::Boolean private_equal_struct (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of structs
+
+ CORBA::Boolean private_equal_union (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of unions
+
+ CORBA::Boolean private_equal_enum (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of enums
+
+ CORBA::Boolean private_equal_string (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of strings
+
+ CORBA::Boolean private_equal_wstring (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of wide strings
+
+ CORBA::Boolean private_equal_sequence (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of sequences
+
+ CORBA::Boolean private_equal_array (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of array
+
+ CORBA::Boolean private_equal_alias (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of typedefs
+
+ CORBA::Boolean private_equal_except (CORBA::TypeCode_ptr tc,
+ CORBA::Environment &env) const;
+ // test equality for typecodes of exceptions
+
+ CORBA::ULong refcount_;
+ // if refcount reaches 0, free this typecode
+
+ CORBA::Boolean delete_flag_;
+ // indicates if we are freeing ourselves. This flag serves as an indication
+ // to the children that they can delete themselves and their children if this
+ // flag is set.
+
+ CORBA::Boolean orb_owns_;
+ // TAO's approach differs from the SunSoft IIOP. Constant typecodes
+ // are owned by the ORB and get freed only when the ORB dies.
+
+ // If "orb_owns" is false, the value is a not a constant typecode
+ // with both the typecode and the buffer allocated (typically, this
+ // will be created by the IDL compiler generated code)
+
+ TC_Private_State *private_state_;
+ // maintains precomputed state. We need a separate class that
+ // maintains the precomputed state since most of the TypeCode class
+ // operations keep the state of the object constant. However, for
+ // the purpose of precomputation, we need to update the state. We
+ // cannot update state directly in the TypeCode class as that
+ // defeats the constness. However, we can keep an object in our
+ // typecode class that remains constant, but we can update its
+ // state.
+
+ // = No copy constructor or assignment operator supported;
+
+ // Use TypeCode_ptr values, duplicate (), release ().
+ CORBA_TypeCode (const CORBA::TypeCode &src);
+ CORBA_TypeCode &operator = (const CORBA::TypeCode &src);
+
+ char *non_aligned_buffer_;
+ // original buffer that may possibly be non-aligned. We still need a
+ // handle to the allocated memory so that all of it can be freed by
+ // the destructor
+};
+
+class TAO_Export TC_Private_State
+ // = TITLE
+ // Private state of the TypeCode.
+ //
+ // = DESCRIPTION
+ // Used to store precomputed values
+{
+public:
+ TC_Private_State (CORBA::TCKind kind);
+ // constructor
+
+ ~TC_Private_State (void);
+ // destructor
+
+ CORBA::TCKind tc_kind_;
+ // our kind that will determine what kind of children we may have
+
+ // = data members that indicate if the desired quantify was precomputed or not.
+ CORBA::Boolean tc_id_known_;
+ CORBA::Boolean tc_name_known_;
+ CORBA::Boolean tc_member_count_known_;
+ CORBA::Boolean tc_member_type_list_known_;
+ CORBA::Boolean tc_member_name_list_known_;
+ CORBA::Boolean tc_member_label_list_known_;
+ CORBA::Boolean tc_discriminator_type_known_;
+ CORBA::Boolean tc_default_index_used_known_;
+ CORBA::Boolean tc_length_known_;
+ CORBA::Boolean tc_content_type_known_;
+ CORBA::Boolean tc_size_known_;
+ CORBA::Boolean tc_alignment_known_;
+ CORBA::Boolean tc_discrim_pad_size_known_;
+
+ // = These data members store the precomputed values
+ CORBA::String tc_id_;
+ CORBA::String tc_name_;
+ CORBA::ULong tc_member_count_;
+ CORBA::TypeCode_ptr *tc_member_type_list_;
+ char **tc_member_name_list_;
+ CORBA::Any_ptr *tc_member_label_list_;
+ CORBA::TypeCode_ptr tc_discriminator_type_;
+ CORBA::Long tc_default_index_used_;
+ CORBA::ULong tc_length_;
+ CORBA::TypeCode_ptr tc_content_type_;
+ CORBA::ULong tc_size_;
+ CORBA::ULong tc_alignment_;
+ CORBA::ULong tc_discrim_pad_size_;
+
+};
+
+class TAO_Export CORBA_TypeCode_var
+{
+ //
+ // = TITLE
+ // A smart pointer for TypeCodes.
+ //
+ // = DESCRIPTION
+ // Implements the _var class for the TypeCode pseudo object.
+ //
+public:
+ CORBA_TypeCode_var (void); // default constructor
+ CORBA_TypeCode_var (CORBA_TypeCode_ptr);
+ CORBA_TypeCode_var (const CORBA_TypeCode_var &); // copy constructor
+ ~CORBA_TypeCode_var (void); // destructor
+
+ CORBA_TypeCode_var &operator= (CORBA_TypeCode_ptr);
+ CORBA_TypeCode_var &operator= (const CORBA_TypeCode_var &);
+ CORBA_TypeCode_ptr operator-> (void) const;
+
+ operator const CORBA_TypeCode_ptr &() const;
+ operator CORBA_TypeCode_ptr &();
+ // in, inout, out, _retn
+ CORBA_TypeCode_ptr in (void) const;
+ CORBA_TypeCode_ptr &inout (void);
+ CORBA_TypeCode_ptr &out (void);
+ CORBA_TypeCode_ptr _retn (void);
+ CORBA_TypeCode_ptr ptr (void) const;
+
+private:
+ CORBA_TypeCode_ptr ptr_;
+};
+
+class TAO_Export CORBA_TypeCode_out
+{
+ //
+ // = TITLE
+ // The _out class for TypeCode.
+ //
+ // = DESCRIPTION
+ // Implements the _out class for the TypeCode pseudo object.
+ //
+public:
+ CORBA_TypeCode_out (CORBA_TypeCode_ptr &);
+ CORBA_TypeCode_out (CORBA_TypeCode_var &);
+ CORBA_TypeCode_out (CORBA_TypeCode_out &);
+ CORBA_TypeCode_out &operator= (CORBA_TypeCode_out &);
+ CORBA_TypeCode_out &operator= (const CORBA_TypeCode_var &);
+ CORBA_TypeCode_out &operator= (CORBA_TypeCode_ptr);
+ operator CORBA_TypeCode_ptr &();
+ CORBA_TypeCode_ptr &ptr (void);
+ CORBA_TypeCode_ptr operator-> (void);
+
+private:
+ CORBA_TypeCode_ptr &ptr_;
+};
+
+#endif /* TAO_TYPECODE_H */