summaryrefslogtreecommitdiff
path: root/TAO/tao/AnyTypeCode/Alias_TypeCode_Static.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/AnyTypeCode/Alias_TypeCode_Static.cpp')
-rw-r--r--TAO/tao/AnyTypeCode/Alias_TypeCode_Static.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/TAO/tao/AnyTypeCode/Alias_TypeCode_Static.cpp b/TAO/tao/AnyTypeCode/Alias_TypeCode_Static.cpp
new file mode 100644
index 00000000000..8c80bcb81d3
--- /dev/null
+++ b/TAO/tao/AnyTypeCode/Alias_TypeCode_Static.cpp
@@ -0,0 +1,166 @@
+// $Id$
+
+#include "tao/AnyTypeCode/Alias_TypeCode_Static.h"
+
+#ifndef __ACE_INLINE__
+# include "tao/AnyTypeCode/Alias_TypeCode_Static.inl"
+#endif /* !__ACE_INLINE__ */
+
+#include "tao/AnyTypeCode/TypeCode_Traits.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/CDR.h"
+#include "tao/TypeCodeFactory_Adapter.h"
+#include "tao/SystemException.h"
+
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID (AnyTypeCode,
+ Alias_TypeCode_Static,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+bool
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::tao_marshal (
+ TAO_OutputCDR & cdr,
+ CORBA::ULong offset) const
+{
+ // A tk_alias TypeCode has a "complex" parameter list type (see
+ // Table 15-2 in Section 15.3.5.1 "TypeCode" in the CDR section of
+ // the CORBA specification), meaning that it must be marshaled into
+ // a CDR encapsulation.
+
+ // Create a CDR encapsulation.
+
+ TAO_OutputCDR enc;
+
+ // Account for the encoded CDR encapsulation length and byte order.
+ //
+ // Aligning on an octet since the next value after the CDR
+ // encapsulation length will always be the byte order octet/boolean
+ // in this case.
+ offset = ACE_align_binary (offset + 4,
+ ACE_CDR::OCTET_ALIGN);
+
+ return
+ enc << TAO_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)
+ && enc << TAO_OutputCDR::from_string (this->attributes_.id (), 0)
+ && enc << TAO_OutputCDR::from_string (this->attributes_.name (), 0)
+ && marshal (enc,
+ Traits<char const *>::get_typecode (this->content_type_),
+ offset + enc.total_length ())
+ && cdr << static_cast<CORBA::ULong> (enc.total_length ())
+ && cdr.write_octet_array_mb (enc.begin ());
+}
+
+void
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::tao_duplicate (void)
+{
+}
+
+void
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::tao_release (void)
+{
+}
+
+CORBA::Boolean
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::equal_i (
+ CORBA::TypeCode_ptr tc) const
+{
+ // The CORBA::TypeCode base class already verified equality of the
+ // base attributes (id and name). Perform an equality comparison of
+ // the content.
+
+ CORBA::TypeCode_var rhs_content_type = tc->content_type ();
+
+ return
+ Traits<char const *>::get_typecode (this->content_type_)->equal (
+ rhs_content_type.in ());
+}
+
+CORBA::Boolean
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::equivalent_i (
+ CORBA::TypeCode_ptr) const
+{
+ // Equivalence already verified in the base class
+ // CORBA::TypeCode::equivalent() method.
+
+ return true;
+}
+
+CORBA::TypeCode_ptr
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::get_compact_typecode_i (
+ void) const
+{
+ TAO_TypeCodeFactory_Adapter * const adapter =
+ ACE_Dynamic_Service<TAO_TypeCodeFactory_Adapter>::instance (
+ TAO_ORB_Core::typecodefactory_adapter_name ()
+ );
+
+ if (adapter == 0)
+ {
+ throw ::CORBA::INITIALIZE ();
+ }
+
+ CORBA::TypeCode_var compact_content_type =
+ Traits<char const *>::get_typecode (
+ this->content_type_)->get_compact_typecode ();
+
+ if (this->kind_ == CORBA::tk_alias)
+ {
+ return adapter->create_alias_tc (this->attributes_.id (),
+ "", /* empty name */
+ compact_content_type.in ());
+ }
+ else
+ {
+ return adapter->create_value_box_tc (this->attributes_.id (),
+ "", /* empty name */
+ compact_content_type.in ());
+ }
+}
+
+char const *
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::id_i (void) const
+{
+ // Ownership is retained by the TypeCode, as required by the C++
+ // mapping.
+ return this->attributes_.id ();
+}
+
+char const *
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::name_i (void) const
+{
+ // Ownership is retained by the TypeCode, as required by the C++
+ // mapping.
+ return this->attributes_.name ();
+}
+
+CORBA::TypeCode_ptr
+TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>::content_type_i (void) const
+{
+ return
+ CORBA::TypeCode::_duplicate (
+ Traits<char const *>::get_typecode (this->content_type_));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL