summaryrefslogtreecommitdiff
path: root/TAO/tao/append.cpp
diff options
context:
space:
mode:
authorkolpackov <kolpackov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2002-01-18 19:06:50 +0000
committerkolpackov <kolpackov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2002-01-18 19:06:50 +0000
commita3d6bdf09bb6498bea3096a8cfae44b2273ca058 (patch)
treec1c4e6979bb26d5bd88b91d73f1afd57de34a342 /TAO/tao/append.cpp
parentc1d53fbcabd2730e07dfbfa4ba36c41fd6334814 (diff)
downloadATCD-a3d6bdf09bb6498bea3096a8cfae44b2273ca058.tar.gz
*** empty log message ***
Diffstat (limited to 'TAO/tao/append.cpp')
-rw-r--r--TAO/tao/append.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/TAO/tao/append.cpp b/TAO/tao/append.cpp
index 2df57c58492..e6ea5de14ac 100644
--- a/TAO/tao/append.cpp
+++ b/TAO/tao/append.cpp
@@ -23,6 +23,7 @@
#include "tao/CDR.h"
#include "tao/Environment.h"
#include "tao/Any.h"
+#include "tao/ValueBase.h"
#include "tao/debug.h"
ACE_RCSID(tao, append, "$Id$")
@@ -206,6 +207,7 @@ TAO_Marshal_TypeCode::append (CORBA::TypeCode_ptr,
case CORBA::tk_array:
case CORBA::tk_alias:
case CORBA::tk_except:
+ case CORBA::tk_value:
{
// write the encapsulation i.e., octet sequence
retval =
@@ -1156,3 +1158,96 @@ TAO_Marshal_WString::append (CORBA::TypeCode_ptr,
CORBA::COMPLETED_MAYBE),
CORBA::TypeCode::TRAVERSE_STOP);
}
+
+CORBA::TypeCode::traverse_status
+TAO_Marshal_Value::append (CORBA::TypeCode_ptr tc,
+ TAO_InputCDR *src,
+ TAO_OutputCDR *dest
+ TAO_ENV_ARG_DECL)
+{
+ CORBA::TypeCode::traverse_status retval =
+ CORBA::TypeCode::TRAVERSE_CONTINUE;
+ CORBA::TypeCode_var param;
+
+ // Use the same method to append our base valuetype.
+ // To achive this we'll need to distinguish between
+ // first-time/nested appends so that we won't attempt to
+ // append rep_id several times.
+ //
+ if (nested_processing_ == 0)
+ {
+ nested_processing_ = 1;
+
+ CORBA::ULong value_tag;
+
+ if (!src->read_ulong (value_tag) ||
+ !dest->write_ulong (value_tag))
+ {
+ return CORBA::TypeCode::TRAVERSE_STOP;
+ }
+
+ if (value_tag == 0) // Null value type pointer.
+ {
+ //We are done.
+ return retval;
+ }
+ else if (value_tag & TAO_OBV_GIOP_Flags::Type_info_single)
+ {
+ // Append repository id which is of type string.
+ dest->append_string (*src);
+ }
+ else
+ {
+ //@@ boris: VT CDR
+ return CORBA::TypeCode::TRAVERSE_STOP;
+ }
+ }
+
+ // Handle our base valuetype if any.
+ param = tc->concrete_base_type (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP);
+ if (param->kind () != CORBA::tk_null)
+ {
+ retval = this->append (param.in (),
+ src,
+ dest
+ TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP);
+
+ if (retval != CORBA::TypeCode::TRAVERSE_CONTINUE)
+ {
+ return retval;
+ }
+ }
+
+ // Number of fields in the struct.
+ int member_count = tc->member_count (TAO_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP);
+
+ for (int i = 0;
+ i < member_count && retval == CORBA::TypeCode::TRAVERSE_CONTINUE;
+ i++)
+ {
+ // get member type
+ param = tc->member_type (i TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP);
+
+ retval =
+ TAO_Marshal_Object::perform_append (param.in (),
+ src,
+ dest
+ TAO_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP);
+ }
+
+ if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE)
+ return CORBA::TypeCode::TRAVERSE_CONTINUE;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_Marshal_Value::append detected error\n")));
+
+ ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE,
+ CORBA::COMPLETED_MAYBE),
+ CORBA::TypeCode::TRAVERSE_STOP);
+}