summaryrefslogtreecommitdiff
path: root/ACE/TAO/tao/CDR.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/tao/CDR.cpp')
-rw-r--r--ACE/TAO/tao/CDR.cpp376
1 files changed, 376 insertions, 0 deletions
diff --git a/ACE/TAO/tao/CDR.cpp b/ACE/TAO/tao/CDR.cpp
new file mode 100644
index 00000000000..e2f77d0b30d
--- /dev/null
+++ b/ACE/TAO/tao/CDR.cpp
@@ -0,0 +1,376 @@
+// $Id$
+
+#include "tao/CDR.h"
+#include "tao/Timeprobe.h"
+#include "tao/ORB_Core.h"
+#include "tao/SystemException.h"
+#include "tao/GIOP_Fragmentation_Strategy.h"
+
+#if !defined (__ACE_INLINE__)
+# include "tao/CDR.inl"
+#endif /* ! __ACE_INLINE__ */
+
+
+ACE_RCSID (tao,
+ CDR,
+ "$Id$")
+
+
+#if defined (ACE_ENABLE_TIMEPROBES)
+
+static const char *TAO_CDR_Timeprobe_Description[] =
+{
+ "OutputCDR::ctor[1] - enter",
+ "OutputCDR::ctor[1] - leave",
+ "OutputCDR::ctor[2] - enter",
+ "OutputCDR::ctor[2] - leave",
+ "OutputCDR::ctor[3] - enter",
+ "OutputCDR::ctor[3] - leave",
+ "OutputCDR::ctor[4] - enter",
+ "OutputCDR::ctor[4] - leave",
+ "OutputCDR::ctor[5] - enter",
+ "OutputCDR::ctor[5] - leave"
+};
+
+enum
+{
+ TAO_OUTPUT_CDR_CTOR1_ENTER = 2000,
+ TAO_OUTPUT_CDR_CTOR1_LEAVE,
+ TAO_OUTPUT_CDR_CTOR2_ENTER,
+ TAO_OUTPUT_CDR_CTOR2_LEAVE,
+ TAO_OUTPUT_CDR_CTOR3_ENTER,
+ TAO_OUTPUT_CDR_CTOR3_LEAVE,
+ TAO_OUTPUT_CDR_CTOR4_ENTER,
+ TAO_OUTPUT_CDR_CTOR4_LEAVE,
+ TAO_OUTPUT_CDR_CTOR5_ENTER,
+ TAO_OUTPUT_CDR_CTOR5_LEAVE
+};
+
+// Setup Timeprobes
+ACE_TIMEPROBE_EVENT_DESCRIPTIONS (TAO_CDR_Timeprobe_Description,
+ TAO_OUTPUT_CDR_CTOR1_ENTER);
+
+#endif /* ACE_ENABLE_TIMEPROBES */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_OutputCDR::TAO_OutputCDR (size_t size,
+ int byte_order,
+ ACE_Allocator *buffer_allocator,
+ ACE_Allocator *data_block_allocator,
+ ACE_Allocator* message_block_allocator,
+ size_t memcpy_tradeoff,
+ ACE_CDR::Octet major_version,
+ ACE_CDR::Octet minor_version)
+ : ACE_OutputCDR (size,
+ byte_order,
+ buffer_allocator,
+ data_block_allocator,
+ message_block_allocator,
+ memcpy_tradeoff,
+ major_version,
+ minor_version)
+ , fragmentation_strategy_ (0)
+ , more_fragments_ (false)
+ , request_id_ (0)
+ , stub_ (0)
+ , message_semantics_ (TAO_TWOWAY_REQUEST)
+ , timeout_ (0)
+{
+ ACE_FUNCTION_TIMEPROBE (TAO_OUTPUT_CDR_CTOR1_ENTER);
+
+#if defined (TAO_ZERO_TAO_OUTPUTCDR_ALLOCATED_BUFFERS)
+ // Zero out the buffer if we allocated the buffer.
+ if (size == 0)
+ (void) ACE_OS::memset (this->current()->wr_ptr(),
+ 0,
+ this->current()->space());
+#endif /* TAO_ZERO_TAO_OUTPUTCDR_ALLOCATED_BUFFERS */
+}
+
+TAO_OutputCDR::TAO_OutputCDR (char *data,
+ size_t size,
+ int byte_order,
+ ACE_Allocator *buffer_allocator,
+ ACE_Allocator *data_block_allocator,
+ ACE_Allocator* message_block_allocator,
+ size_t memcpy_tradeoff,
+ ACE_CDR::Octet major_version,
+ ACE_CDR::Octet minor_version)
+ : ACE_OutputCDR (data,
+ size,
+ byte_order,
+ buffer_allocator,
+ data_block_allocator,
+ message_block_allocator,
+ memcpy_tradeoff,
+ major_version,
+ minor_version)
+ , fragmentation_strategy_ (0)
+ , more_fragments_ (false)
+ , request_id_ (0)
+ , stub_ (0)
+ , message_semantics_ (TAO_TWOWAY_REQUEST)
+ , timeout_ (0)
+{
+ ACE_FUNCTION_TIMEPROBE (TAO_OUTPUT_CDR_CTOR2_ENTER);
+}
+
+TAO_OutputCDR::TAO_OutputCDR (char *data,
+ size_t size,
+ int byte_order,
+ ACE_Allocator* buffer_allocator,
+ ACE_Allocator* data_block_allocator,
+ ACE_Allocator* message_block_allocator,
+ size_t memcpy_tradeoff,
+ TAO_GIOP_Fragmentation_Strategy * fs,
+ ACE_CDR::Octet major_version,
+ ACE_CDR::Octet minor_version)
+ : ACE_OutputCDR (data,
+ size,
+ byte_order,
+ buffer_allocator,
+ data_block_allocator,
+ message_block_allocator,
+ memcpy_tradeoff,
+ major_version,
+ minor_version)
+ , fragmentation_strategy_ (fs)
+ , more_fragments_ (false)
+ , request_id_ (0)
+ , stub_ (0)
+ , message_semantics_ (TAO_TWOWAY_REQUEST)
+ , timeout_ (0)
+{
+ ACE_FUNCTION_TIMEPROBE (TAO_OUTPUT_CDR_CTOR3_ENTER);
+}
+
+TAO_OutputCDR::TAO_OutputCDR (ACE_Message_Block *data,
+ int byte_order,
+ size_t memcpy_tradeoff,
+ ACE_CDR::Octet major_version,
+ ACE_CDR::Octet minor_version)
+ : ACE_OutputCDR (data,
+ byte_order,
+ memcpy_tradeoff,
+ major_version,
+ minor_version)
+ , fragmentation_strategy_ (0)
+ , more_fragments_ (false)
+ , request_id_ (0)
+ , stub_ (0)
+ , message_semantics_ (TAO_TWOWAY_REQUEST)
+ , timeout_ (0)
+{
+ ACE_FUNCTION_TIMEPROBE (TAO_OUTPUT_CDR_CTOR4_ENTER);
+}
+
+TAO_OutputCDR::TAO_OutputCDR (ACE_Data_Block *data_block,
+ int byte_order,
+ ACE_Allocator* message_block_allocator,
+ size_t memcpy_tradeoff,
+ TAO_GIOP_Fragmentation_Strategy * fs,
+ ACE_CDR::Octet major_version,
+ ACE_CDR::Octet minor_version)
+ : ACE_OutputCDR (data_block,
+ byte_order,
+ message_block_allocator,
+ memcpy_tradeoff,
+ major_version,
+ minor_version)
+ , fragmentation_strategy_ (fs)
+ , more_fragments_ (false)
+ , request_id_ (0)
+ , stub_ (0)
+ , message_semantics_ (TAO_TWOWAY_REQUEST)
+ , timeout_ (0)
+{
+ ACE_FUNCTION_TIMEPROBE (TAO_OUTPUT_CDR_CTOR5_ENTER);
+}
+
+void
+TAO_OutputCDR::throw_stub_exception (int error_num)
+{
+ switch (error_num)
+ {
+ case 0 :
+ break;
+ case EINVAL : // wchar from a GIOP 1.0
+ throw ::CORBA::MARSHAL (CORBA::OMGVMCID | 5, CORBA::COMPLETED_NO);
+ ACE_NOTREACHED (break);
+#if (ERANGE != EINVAL)
+ case ERANGE : // untranslatable character
+ throw ::CORBA::DATA_CONVERSION (CORBA::OMGVMCID | 1,
+ CORBA::COMPLETED_NO);
+ ACE_NOTREACHED (break);
+#endif
+ case EACCES : // wchar but no codeset
+ throw ::CORBA::INV_OBJREF (CORBA::OMGVMCID | 2, CORBA::COMPLETED_NO);
+ ACE_NOTREACHED (break);
+ default :
+ throw ::CORBA::MARSHAL ();
+ }
+}
+
+void
+TAO_OutputCDR::throw_skel_exception (int error_num )
+{
+ switch (error_num)
+ {
+ case 0 :
+ break;
+
+ case EINVAL : // wchar from a GIOP 1.0
+ throw ::CORBA::MARSHAL (CORBA::OMGVMCID | 5, CORBA::COMPLETED_YES);
+ ACE_NOTREACHED (break);
+
+ case EACCES : // wchar but no codeset
+ throw ::CORBA::BAD_PARAM (CORBA::OMGVMCID | 23,
+ CORBA::COMPLETED_YES);
+ ACE_NOTREACHED (break);
+
+#if (ERANGE != EINVAL)
+ case ERANGE : // untranslatable character
+ throw ::CORBA::DATA_CONVERSION (CORBA::OMGVMCID | 1,
+ CORBA::COMPLETED_YES);
+ ACE_NOTREACHED (break);
+#endif
+
+ default :
+ throw ::CORBA::MARSHAL (0, CORBA::COMPLETED_YES);
+
+ }
+}
+
+bool
+TAO_OutputCDR::fragment_stream (ACE_CDR::ULong pending_alignment,
+ ACE_CDR::ULong pending_length)
+{
+ if (this->fragmentation_strategy_)
+ {
+ return (this->fragmentation_strategy_->fragment (*this,
+ pending_alignment,
+ pending_length) == 0);
+ }
+
+ return true; // Success.
+}
+
+
+
+int
+TAO_OutputCDR::offset (char* pos)
+{
+ int offset = 0;
+ const ACE_Message_Block * cur_mb = this->begin ();
+ char* wr_ptr = this->current ()->wr_ptr ();
+ bool found = false;
+
+ while (cur_mb != this->end ())
+ {
+ if (pos >= cur_mb->rd_ptr () && pos <= cur_mb->wr_ptr ())
+ {
+ offset += (cur_mb->wr_ptr () - pos);
+ found = true;
+ }
+ else if (found)
+ {
+ offset += cur_mb->length ();
+ }
+
+ if (wr_ptr == cur_mb->wr_ptr ())
+ break;
+
+ cur_mb = cur_mb->cont();
+ }
+
+ if (!found || wr_ptr != cur_mb->wr_ptr ())
+ {
+ throw ::CORBA::INTERNAL ();
+ }
+
+ return offset;
+}
+
+
+// ****************************************************************
+
+TAO_InputCDR::TAO_InputCDR (const TAO_OutputCDR& rhs,
+ ACE_Allocator* buffer_allocator,
+ ACE_Allocator* data_block_allocator,
+ ACE_Allocator* message_block_allocator,
+ TAO_ORB_Core* orb_core)
+ : ACE_InputCDR (rhs,
+ buffer_allocator
+ ? buffer_allocator
+ : (orb_core ? orb_core->output_cdr_buffer_allocator () : 0),
+ data_block_allocator
+ ? data_block_allocator
+ : (orb_core ? orb_core->output_cdr_dblock_allocator () :
+ 0),
+ message_block_allocator
+ ? message_block_allocator
+ : (orb_core ?
+ orb_core->output_cdr_msgblock_allocator () : 0)),
+ orb_core_ (orb_core)
+{
+}
+
+void
+TAO_InputCDR::throw_stub_exception (int error_num )
+{
+ switch (error_num)
+ {
+ case 0 :
+ break;
+ case EINVAL : // wchar from a GIOP 1.0
+ throw ::CORBA::MARSHAL (CORBA::OMGVMCID | 6, CORBA::COMPLETED_YES);
+ ACE_NOTREACHED(break);
+#if (ERANGE != EINVAL)
+ case ERANGE : // untranslatable character
+ throw ::CORBA::DATA_CONVERSION (CORBA::OMGVMCID | 1, CORBA::COMPLETED_YES);
+ ACE_NOTREACHED(break);
+#endif
+ case EACCES : // wchar but no codeset
+ throw ::CORBA::INV_OBJREF (CORBA::OMGVMCID | 2, CORBA::COMPLETED_YES);
+ ACE_NOTREACHED(break);
+ default :
+ throw ::CORBA::MARSHAL (0, CORBA::COMPLETED_YES);
+ }
+}
+
+void
+TAO_InputCDR::throw_skel_exception (int error_num )
+{
+ switch (error_num)
+ {
+ case 0 :
+ break;
+ case EINVAL : // wchar from a GIOP 1.0
+ throw ::CORBA::MARSHAL(CORBA::OMGVMCID | 5, CORBA::COMPLETED_NO);
+ ACE_NOTREACHED(break);
+
+ case EACCES : // wchar but no codeset
+ throw ::CORBA::BAD_PARAM(CORBA::OMGVMCID | 23, CORBA::COMPLETED_NO);
+ ACE_NOTREACHED(break);
+
+#if (ERANGE != EINVAL)
+ case ERANGE : // untranslatable character
+ throw ::CORBA::DATA_CONVERSION(CORBA::OMGVMCID | 1, CORBA::COMPLETED_NO);
+ ACE_NOTREACHED(break);
+#endif
+
+ default :
+ throw ::CORBA::MARSHAL();
+
+ }
+}
+
+ACE_Message_Block::Message_Flags
+TAO_InputCDR::clr_mb_flags( ACE_Message_Block::Message_Flags less_flags )
+{
+ return start_.clr_self_flags( less_flags );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL