diff options
Diffstat (limited to 'TAO/tao/encode.cpp')
-rw-r--r-- | TAO/tao/encode.cpp | 1059 |
1 files changed, 528 insertions, 531 deletions
diff --git a/TAO/tao/encode.cpp b/TAO/tao/encode.cpp index 1676ee0183d..8abd7f02742 100644 --- a/TAO/tao/encode.cpp +++ b/TAO/tao/encode.cpp @@ -41,14 +41,12 @@ ACE_RCSID(tao, encode, "$Id$") // components. "context" is the marshaling stream on which to encode // the data value. -typedef TAO_Object_Field_T<CORBA::Object,CORBA::Object_var> TAO_Object_Field_Class; - CORBA::TypeCode::traverse_status TAO_Marshal_Primitive::encode (CORBA::TypeCode_ptr tc, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { CORBA::Boolean continue_encoding = 1; TAO_OutputCDR *stream = (TAO_OutputCDR *) context; @@ -101,9 +99,8 @@ TAO_Marshal_Primitive::encode (CORBA::TypeCode_ptr tc, if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_Marshal_Primitive::encode detected error\n")); - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; } } @@ -112,7 +109,7 @@ TAO_Marshal_Any::encode (CORBA::TypeCode_ptr, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { CORBA::Any *any = (CORBA::Any *) data; @@ -126,9 +123,7 @@ TAO_Marshal_Any::encode (CORBA::TypeCode_ptr, CORBA::TypeCode_ptr elem_tc = any->type_; // Encode the typecode description for the element. - retval = stream->encode (CORBA::_tc_TypeCode, &elem_tc, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - + retval = stream->encode (CORBA::_tc_TypeCode, &elem_tc, 0, env); if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE) { // if the any owns the data, then the value is a CDR stream and @@ -138,14 +133,12 @@ TAO_Marshal_Any::encode (CORBA::TypeCode_ptr, if (any->cdr_ != 0) { TAO_InputCDR in_strm (any->cdr_); - retval = stream->append (elem_tc, &in_strm, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + retval = stream->append (elem_tc, &in_strm, env); } else if (any->value_ != 0) { // encode the value - retval = stream->encode (elem_tc, any->value_, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + retval = stream->encode (elem_tc, any->value_, 0, env); } } @@ -156,9 +149,8 @@ TAO_Marshal_Any::encode (CORBA::TypeCode_ptr, if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_Marshal_Any::encode detected error\n")); - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; } } @@ -167,7 +159,7 @@ TAO_Marshal_TypeCode::encode (CORBA::TypeCode_ptr, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { CORBA::Boolean continue_encoding = 1; TAO_OutputCDR *stream = (TAO_OutputCDR *) context; @@ -189,8 +181,7 @@ TAO_Marshal_TypeCode::encode (CORBA::TypeCode_ptr, // A few have "simple" parameter lists case CORBA::tk_string: case CORBA::tk_wstring: - continue_encoding = stream->write_ulong (tc2->length (ACE_TRY_ENV)); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + continue_encoding = stream->write_ulong (tc2->length (env)); break; // Indirected typecodes can't occur at "top level" like @@ -228,9 +219,8 @@ TAO_Marshal_TypeCode::encode (CORBA::TypeCode_ptr, if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_Marshal_TypeCode::encode detected error\n")); - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; } } @@ -240,7 +230,7 @@ TAO_Marshal_Principal::encode (CORBA::TypeCode_ptr, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { TAO_OutputCDR *stream = (TAO_OutputCDR *) context; @@ -248,9 +238,8 @@ TAO_Marshal_Principal::encode (CORBA::TypeCode_ptr, if ((*stream << p) == 0) { - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; } return CORBA::TypeCode::TRAVERSE_CONTINUE; } @@ -261,7 +250,7 @@ TAO_Marshal_ObjRef::encode (CORBA::TypeCode_ptr, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { TAO_OutputCDR *stream = (TAO_OutputCDR *) context; @@ -276,9 +265,8 @@ TAO_Marshal_ObjRef::encode (CORBA::TypeCode_ptr, if ((*stream << obj) == 0) { - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; } return CORBA::TypeCode::TRAVERSE_CONTINUE; } @@ -289,7 +277,7 @@ TAO_Marshal_Struct::encode (CORBA::TypeCode_ptr tc, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { TAO_OutputCDR *stream = (TAO_OutputCDR *) context; CORBA::TypeCode::traverse_status retval = CORBA::TypeCode::TRAVERSE_CONTINUE; @@ -299,108 +287,122 @@ TAO_Marshal_Struct::encode (CORBA::TypeCode_ptr tc, void *start_addr = (void *)data; - int member_count = tc->member_count (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - for (int i = 0; - i < member_count && retval == CORBA::TypeCode::TRAVERSE_CONTINUE - && continue_encoding == 1; - i++) + if (env.exception () == 0) { - param = tc->member_type (i, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + int member_count = tc->member_count (env); - size = param->size (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - alignment = param->alignment (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - align_offset = - (ptr_arith_t) ptr_align_binary (data, alignment) - - (ptr_arith_t) data - + (ptr_arith_t) ptr_align_binary (start_addr, alignment) - - (ptr_arith_t) start_addr; - // if both the start_addr and data are not aligned as per - // the alignment, we do not add the offset - data = (const void *) ((ptr_arith_t) data + - ((align_offset == alignment) ? - 0 : align_offset)); - switch (param->kind_) + for (int i = 0; + i < member_count && retval == CORBA::TypeCode::TRAVERSE_CONTINUE + && continue_encoding == 1; + i++) { - case CORBA::tk_null: - case CORBA::tk_void: - break; - case CORBA::tk_short: - case CORBA::tk_ushort: - continue_encoding = stream->write_short (*(CORBA::Short *) data); - break; - case CORBA::tk_long: - case CORBA::tk_ulong: - case CORBA::tk_float: - case CORBA::tk_enum: - continue_encoding = stream->write_long (*(CORBA::Long *) data); - break; - case CORBA::tk_double: - case CORBA::tk_longlong: - case CORBA::tk_ulonglong: - continue_encoding = stream->write_longlong (*(CORBA::LongLong *) data); - break; - case CORBA::tk_boolean: - continue_encoding = stream->write_boolean (*(CORBA::Boolean *) data); - break; - case CORBA::tk_char: - case CORBA::tk_octet: - continue_encoding = stream->write_char (*(CORBA::Char *) data); - break; - case CORBA::tk_longdouble: - continue_encoding = stream->write_longdouble (*(CORBA::LongDouble *) data); - break; - case CORBA::tk_wchar: - continue_encoding = stream->write_wchar (*(CORBA::WChar *) data); - break; - case CORBA::tk_any: - case CORBA::tk_Principal: - case CORBA::tk_struct: - case CORBA::tk_union: - case CORBA::tk_sequence: - case CORBA::tk_array: - case CORBA::tk_alias: - case CORBA::tk_except: - case CORBA::tk_string: - case CORBA::tk_wstring: - case CORBA::tk_TypeCode: - retval = stream->encode (param, data, 0, ACE_TRY_ENV); - break; - - case CORBA::tk_objref: - { - // we know that the object pointer is stored in a - // TAO_Object_Field_T parametrized type - TAO_Object_Field_Class* field = - ACE_reinterpret_cast (TAO_Object_Field_Class *, - ACE_const_cast (void *, data)); - CORBA::Object_ptr ptr = field->_upcast (); - retval = stream->encode (param, &ptr, 0, ACE_TRY_ENV); - } - break; - - default: - break; + param = tc->member_type (i, env); + if (env.exception () == 0) + { + size = param->size (env); + if (env.exception () == 0) + { + alignment = param->alignment (env); + if (env.exception () == 0) + { + align_offset = + (ptr_arith_t) ptr_align_binary (data, alignment) + - (ptr_arith_t) data + + (ptr_arith_t) ptr_align_binary (start_addr, alignment) + - (ptr_arith_t) start_addr; + // if both the start_addr and data are not aligned as per + // the alignment, we do not add the offset + data = (const void *) ((ptr_arith_t) data + + ((align_offset == alignment) ? + 0 : align_offset)); + switch (param->kind_) + { + case CORBA::tk_null: + case CORBA::tk_void: + break; + case CORBA::tk_short: + case CORBA::tk_ushort: + continue_encoding = stream->write_short (*(CORBA::Short *) data); + break; + case CORBA::tk_long: + case CORBA::tk_ulong: + case CORBA::tk_float: + case CORBA::tk_enum: + continue_encoding = stream->write_long (*(CORBA::Long *) data); + break; + case CORBA::tk_double: + case CORBA::tk_longlong: + case CORBA::tk_ulonglong: + continue_encoding = stream->write_longlong (*(CORBA::LongLong *) data); + break; + case CORBA::tk_boolean: + continue_encoding = stream->write_boolean (*(CORBA::Boolean *) data); + break; + case CORBA::tk_char: + case CORBA::tk_octet: + continue_encoding = stream->write_char (*(CORBA::Char *) data); + break; + case CORBA::tk_longdouble: + continue_encoding = stream->write_longdouble (*(CORBA::LongDouble *) data); + break; + case CORBA::tk_wchar: + continue_encoding = stream->write_wchar (*(CORBA::WChar *) data); + break; + case CORBA::tk_any: + case CORBA::tk_Principal: + case CORBA::tk_struct: + case CORBA::tk_union: + case CORBA::tk_sequence: + case CORBA::tk_array: + case CORBA::tk_alias: + case CORBA::tk_except: + case CORBA::tk_string: + case CORBA::tk_wstring: + case CORBA::tk_TypeCode: + retval = stream->encode (param, data, 0, env); + break; + + case CORBA::tk_objref: + { + // we know that the object pointer is stored in a + // TAO_Object_Field_T parametrized type + TAO_Object_Field_T<CORBA_Object>* field = + ACE_reinterpret_cast (TAO_Object_Field_T<CORBA_Object> *, + ACE_const_cast (void *, data)); + CORBA::Object_ptr ptr = field->_upcast (); + retval = stream->encode (param, &ptr, 0, env); + } + break; + + default: + break; + } + data = (char *) data + size; + } + else + return CORBA::TypeCode::TRAVERSE_STOP; + } + else + return CORBA::TypeCode::TRAVERSE_STOP; + } + else + return CORBA::TypeCode::TRAVERSE_STOP; } - data = (char *) data + size; } + else + return CORBA::TypeCode::TRAVERSE_STOP; if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE && continue_encoding == 1) return CORBA::TypeCode::TRAVERSE_CONTINUE; - - if (TAO_debug_level > 0) - ACE_DEBUG ((LM_DEBUG, - "TAO_Marshal_Struct::encode detected error\n")); - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + else + { + if (TAO_debug_level > 0) + ACE_DEBUG ((LM_DEBUG, + "TAO_Marshal_Struct::encode detected error\n")); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; + } } // encode unions @@ -464,9 +466,7 @@ TAO_Marshal_Union::encode (CORBA::TypeCode_ptr tc, // do the matching CORBA::TypeCode_var type = member_label->type (); - CORBA::ULong kind = type->kind (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - switch (kind) + switch (type->kind (ACE_TRY_ENV)) { case CORBA::tk_short: { @@ -545,8 +545,7 @@ TAO_Marshal_Union::encode (CORBA::TypeCode_ptr tc, ACE_DEBUG ((LM_DEBUG, "Union::encode - " "Bad discriminant type\n")); - ACE_THROW_RETURN (CORBA::BAD_TYPECODE (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), + ACE_THROW_RETURN (CORBA::BAD_TYPECODE (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE), CORBA::TypeCode::TRAVERSE_STOP); }// end of switch @@ -570,8 +569,8 @@ TAO_Marshal_Union::encode (CORBA::TypeCode_ptr tc, { // we know that the object pointer is stored in a // TAO_Object_Field_T parametrized type - TAO_Object_Field_Class* field = - ACE_reinterpret_cast (TAO_Object_Field_Class *, + TAO_Object_Field_T<CORBA_Object>* field = + ACE_reinterpret_cast (TAO_Object_Field_T<CORBA_Object> *, member_val); CORBA::Object_ptr ptr = field->_upcast (); return stream->encode (member_tc, &ptr, data2, ACE_TRY_ENV); @@ -591,8 +590,8 @@ TAO_Marshal_Union::encode (CORBA::TypeCode_ptr tc, { // we know that the object pointer is stored in a // TAO_Object_Field_T parametrized type - TAO_Object_Field_Class* field = - ACE_reinterpret_cast (TAO_Object_Field_Class *, + TAO_Object_Field_T<CORBA_Object>* field = + ACE_reinterpret_cast (TAO_Object_Field_T<CORBA_Object> *, member_val); CORBA::Object_ptr ptr = field->_upcast (); return stream->encode (default_tc, &ptr, data2, ACE_TRY_ENV); @@ -618,7 +617,7 @@ TAO_Marshal_String::encode (CORBA::TypeCode_ptr tc, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { TAO_OutputCDR *stream = (TAO_OutputCDR *) context; CORBA::String str = *(CORBA::String *) data; @@ -626,9 +625,7 @@ TAO_Marshal_String::encode (CORBA::TypeCode_ptr tc, // Verify string satisfies bounds requirements. We're not so // permissive as to send messages violating the interface spec // by having excessively long strings! - CORBA::ULong bounds = tc->length (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - + CORBA::ULong bounds = tc->length (env); if (str != 0) { CORBA::ULong length = ACE_OS::strlen (str); @@ -650,7 +647,7 @@ TAO_Marshal_Sequence::encode (CORBA::TypeCode_ptr tc, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { CORBA::Boolean continue_encoding = 1; TAO_OutputCDR *stream = (TAO_OutputCDR *) context; @@ -668,26 +665,221 @@ TAO_Marshal_Sequence::encode (CORBA::TypeCode_ptr tc, if (len > 0) { // retrieve the bounds of the sequence - CORBA::ULong bounds = tc->length (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - // encode only if it is an unbounded sequence or if length is - // less/equal to the bounds - if (bounds == 0 || len <= bounds) + CORBA::ULong bounds = tc->length (env); + if (env.exception () == 0) { - // We just encode the current elements in the sequence - bounds = len; - continue_encoding = stream->write_ulong (bounds); - if (continue_encoding && bounds != 0) + // encode only if it is an unbounded sequence or if length is + // less/equal to the bounds + if (bounds == 0 || len <= bounds) { - // get element typecode - tc2 = tc->content_type (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + // We just encode the current elements in the sequence + bounds = len; + continue_encoding = stream->write_ulong (bounds); + if (continue_encoding && bounds != 0) + { + // get element typecode + tc2 = tc->content_type (env); + if (env.exception () == 0) + { + size = tc2->size (env); + if (env.exception () == 0) + { + value = (char *) seq->buffer_; + switch (tc2->kind_) + { + case CORBA::tk_null: + case CORBA::tk_void: + return CORBA::TypeCode::TRAVERSE_CONTINUE; + + case CORBA::tk_short: + case CORBA::tk_ushort: + continue_encoding = continue_encoding && + stream->write_short_array + ((CORBA::Short*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_long: + case CORBA::tk_ulong: + case CORBA::tk_float: + case CORBA::tk_enum: + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_long_array + ((CORBA::Long*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_double: + case CORBA::tk_longlong: + case CORBA::tk_ulonglong: + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_longlong_array + ((CORBA::LongLong*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_boolean: + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_boolean_array + ((CORBA::Boolean*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_char: + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_char_array + ((CORBA::Char*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_octet: +#if !defined (TAO_NO_COPY_OCTET_SEQUENCES) + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_octet_array + ((CORBA::Octet*)value, bounds); +#else + { + TAO_Unbounded_Sequence<CORBA::Octet> *oseq = + ACE_dynamic_cast(TAO_Unbounded_Sequence<CORBA::Octet>*,seq); + if (oseq->mb_ == 0) + { + continue_encoding = continue_encoding && + stream->write_octet_array + ((CORBA::Octet*)value, bounds); + } + else + { + continue_encoding = continue_encoding && + stream->write_octet_array_mb (oseq->mb ()); + } + } +#endif /* TAO_NO_COPY_OCTET_SEQUENCES */ + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_longdouble: + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_longdouble_array + ((CORBA::LongDouble*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_wchar: + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_wchar_array + ((CORBA::WChar*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + // handle all aggregate types here + + case CORBA::tk_any: + case CORBA::tk_TypeCode: + case CORBA::tk_Principal: + case CORBA::tk_struct: + case CORBA::tk_union: + case CORBA::tk_string: + case CORBA::tk_sequence: + case CORBA::tk_array: + case CORBA::tk_alias: + case CORBA::tk_except: + case CORBA::tk_wstring: + // For those aggregate types whose size + // is constant, we compute it only once + while (bounds-- && retval == CORBA::TypeCode::TRAVERSE_CONTINUE) + { + retval = stream->encode (tc2, value, 0, env); + value += size; + } + // CORBA::release (tc2); + if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; + + case CORBA::tk_objref: + { + size = sizeof (CORBA_Object_ptr); + while (bounds-- && + retval == CORBA::TypeCode::TRAVERSE_CONTINUE) + { + CORBA_Object_ptr ptr = + seq->_upcast (value); + retval = stream->encode (tc2, &ptr, 0, env); + if (env.exception () != 0) break; + value += size; + } + if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE) + return retval; + } + break; + + default: + break; + } // end of switch + } // no exception computing size + } // no exception computing content type + } // seq length not 0 + } // within bounds or unbounded + } // no exception computing bounds + } // length is > 0 + else + { + // length is 0, encode it + continue_encoding = stream->write_ulong (len); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + + } + // If an error was detected but no exception was raised then raise a + // marshal exception. + if (env.exception () == 0) + env.exception (new CORBA::MARSHAL ()); + return CORBA::TypeCode::TRAVERSE_STOP; +} - size = tc2->size (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); +// encode array +CORBA::TypeCode::traverse_status +TAO_Marshal_Array::encode (CORBA::TypeCode_ptr tc, + const void *data, + const void *, + void *context, + CORBA::Environment &env) +{ + CORBA::Boolean continue_encoding = 1; + TAO_OutputCDR *stream = (TAO_OutputCDR *) context; + CORBA::TypeCode::traverse_status retval = + CORBA::TypeCode::TRAVERSE_CONTINUE; // return status + size_t size; // size of element + CORBA::ULong bounds; + char *value = (char *) data; - value = (char *) seq->buffer_; + // retrieve the bounds of the array + bounds = tc->length (env); + if (env.exception () == 0) + { + // get element typecode. + CORBA::TypeCode_ptr tc2 = tc->content_type (env); + + if (env.exception () == 0) + { + size = tc2->size (env); + if (env.exception () == 0) + { switch (tc2->kind_) { case CORBA::tk_null: @@ -706,7 +898,6 @@ TAO_Marshal_Sequence::encode (CORBA::TypeCode_ptr tc, case CORBA::tk_long: case CORBA::tk_ulong: case CORBA::tk_float: - case CORBA::tk_enum: // For primitives, compute the size only once continue_encoding = continue_encoding && stream->write_long_array @@ -736,37 +927,11 @@ TAO_Marshal_Sequence::encode (CORBA::TypeCode_ptr tc, break; case CORBA::tk_char: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_char_array - ((CORBA::Char*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - case CORBA::tk_octet: -#if !defined (TAO_NO_COPY_OCTET_SEQUENCES) // For primitives, compute the size only once continue_encoding = continue_encoding && stream->write_octet_array ((CORBA::Octet*)value, bounds); -#else - { - TAO_Unbounded_Sequence<CORBA::Octet> *oseq = - ACE_dynamic_cast(TAO_Unbounded_Sequence<CORBA::Octet>*,seq); - if (oseq->mb_ == 0) - { - continue_encoding = continue_encoding && - stream->write_octet_array - ((CORBA::Octet*)value, bounds); - } - else - { - continue_encoding = continue_encoding && - stream->write_octet_array_mb (oseq->mb ()); - } - } -#endif /* TAO_NO_COPY_OCTET_SEQUENCES */ if (continue_encoding == 1) return CORBA::TypeCode::TRAVERSE_CONTINUE; break; @@ -789,11 +954,20 @@ TAO_Marshal_Sequence::encode (CORBA::TypeCode_ptr tc, return CORBA::TypeCode::TRAVERSE_CONTINUE; break; + case CORBA::tk_enum: + // For primitives, compute the size only once + continue_encoding = continue_encoding && + stream->write_long_array + ((CORBA::Long*)value, bounds); + if (continue_encoding == 1) + return CORBA::TypeCode::TRAVERSE_CONTINUE; + break; // handle all aggregate types here case CORBA::tk_any: case CORBA::tk_TypeCode: case CORBA::tk_Principal: + case CORBA::tk_objref: case CORBA::tk_struct: case CORBA::tk_union: case CORBA::tk_string: @@ -802,202 +976,30 @@ TAO_Marshal_Sequence::encode (CORBA::TypeCode_ptr tc, case CORBA::tk_alias: case CORBA::tk_except: case CORBA::tk_wstring: - // For those aggregate types whose size - // is constant, we compute it only once + // For those aggregate types whose size is constant, we + // compute it only once while (bounds-- && retval == CORBA::TypeCode::TRAVERSE_CONTINUE) { - retval = stream->encode (tc2, value, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + retval = stream->encode (tc2, value, 0, env); value += size; } - // CORBA::release (tc2); + // CORBA::release (tc2); if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE) return CORBA::TypeCode::TRAVERSE_CONTINUE; break; - - case CORBA::tk_objref: - { - size = sizeof (CORBA_Object_ptr); - while (bounds-- && - retval == CORBA::TypeCode::TRAVERSE_CONTINUE) - { - CORBA_Object_ptr ptr = - seq->_upcast (value); - retval = stream->encode (tc2, &ptr, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - value += size; - } - if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE) - return retval; - } - break; - default: break; } // end of switch - } // seq length not 0 - } // within bounds or unbounded - } // length is > 0 - else - { - // length is 0, encode it - continue_encoding = stream->write_ulong (len); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - - } - - // If an error was detected but no exception was raised then raise a - // marshal exception. - ACE_THROW_RETURN (CORBA::MARSHAL (), - CORBA::TypeCode::TRAVERSE_STOP); -} - -// encode array -CORBA::TypeCode::traverse_status -TAO_Marshal_Array::encode (CORBA::TypeCode_ptr tc, - const void *data, - const void *, - void *context, - CORBA::Environment &ACE_TRY_ENV) -{ - CORBA::Boolean continue_encoding = 1; - TAO_OutputCDR *stream = (TAO_OutputCDR *) context; - CORBA::TypeCode::traverse_status retval = - CORBA::TypeCode::TRAVERSE_CONTINUE; // return status - size_t size; // size of element - CORBA::ULong bounds; - char *value = (char *) data; - - // retrieve the bounds of the array - bounds = tc->length (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - // get element typecode. - CORBA::TypeCode_ptr tc2 = tc->content_type (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - size = tc2->size (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - switch (tc2->kind_) - { - case CORBA::tk_null: - case CORBA::tk_void: - return CORBA::TypeCode::TRAVERSE_CONTINUE; - - case CORBA::tk_short: - case CORBA::tk_ushort: - continue_encoding = continue_encoding && - stream->write_short_array - ((CORBA::Short*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - - case CORBA::tk_long: - case CORBA::tk_ulong: - case CORBA::tk_float: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_long_array - ((CORBA::Long*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - - case CORBA::tk_double: - case CORBA::tk_longlong: - case CORBA::tk_ulonglong: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_longlong_array - ((CORBA::LongLong*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - - case CORBA::tk_boolean: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_boolean_array - ((CORBA::Boolean*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - - case CORBA::tk_char: - case CORBA::tk_octet: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_octet_array - ((CORBA::Octet*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - - case CORBA::tk_longdouble: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_longdouble_array - ((CORBA::LongDouble*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - - case CORBA::tk_wchar: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_wchar_array - ((CORBA::WChar*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - - case CORBA::tk_enum: - // For primitives, compute the size only once - continue_encoding = continue_encoding && - stream->write_long_array - ((CORBA::Long*)value, bounds); - if (continue_encoding == 1) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - // handle all aggregate types here - - case CORBA::tk_any: - case CORBA::tk_TypeCode: - case CORBA::tk_Principal: - case CORBA::tk_objref: - case CORBA::tk_struct: - case CORBA::tk_union: - case CORBA::tk_string: - case CORBA::tk_sequence: - case CORBA::tk_array: - case CORBA::tk_alias: - case CORBA::tk_except: - case CORBA::tk_wstring: - // For those aggregate types whose size is constant, we - // compute it only once - while (bounds-- && retval == CORBA::TypeCode::TRAVERSE_CONTINUE) - { - retval = stream->encode (tc2, value, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - value += size; - } - // CORBA::release (tc2); - if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE) - return CORBA::TypeCode::TRAVERSE_CONTINUE; - break; - default: - break; - } // end of switch + } // no exception computing size + } // no exception computing content type + } // no exception computing bounds // error exit if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_Marshal_Sequence::encode detected error\n")); - ACE_THROW_RETURN (CORBA::MARSHAL (), - CORBA::TypeCode::TRAVERSE_STOP); + env.exception (new CORBA::MARSHAL ()); + return CORBA::TypeCode::TRAVERSE_STOP; } CORBA::TypeCode::traverse_status @@ -1005,7 +1007,7 @@ TAO_Marshal_Alias::encode (CORBA::TypeCode_ptr tc, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { CORBA::TypeCode_ptr tc2; // typecode of the aliased type CORBA::Boolean continue_encoding = 1; @@ -1014,75 +1016,75 @@ TAO_Marshal_Alias::encode (CORBA::TypeCode_ptr tc, CORBA::TypeCode::TRAVERSE_CONTINUE; // status of encode operation char *value = (char *) data; - tc2 = tc->content_type (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - // switch on the data type and handle the cases for primitives here for - // efficiency rather than calling - switch (tc2->kind_) + tc2 = tc->content_type (env); + if (env.exception () == 0) { - case CORBA::tk_null: - case CORBA::tk_void: - break; - case CORBA::tk_short: - case CORBA::tk_ushort: - continue_encoding = stream->write_short (*(CORBA::Short *) value); - break; - case CORBA::tk_long: - case CORBA::tk_ulong: - case CORBA::tk_float: - case CORBA::tk_enum: - continue_encoding = stream->write_long (*(CORBA::Long *) value); - break; - case CORBA::tk_double: - case CORBA::tk_longlong: - case CORBA::tk_ulonglong: - continue_encoding = stream->write_longlong (*(CORBA::LongLong *) value); - break; - case CORBA::tk_boolean: - continue_encoding = stream->write_boolean (*(CORBA::Boolean *) value); - break; - case CORBA::tk_char: - case CORBA::tk_octet: - continue_encoding = stream->write_char (*(CORBA::Char *) value); - break; - case CORBA::tk_longdouble: - continue_encoding = stream->write_longdouble (*(CORBA::LongDouble *) value); - break; - case CORBA::tk_wchar: - continue_encoding = stream->write_wchar (*(CORBA::WChar *) value); - break; - case CORBA::tk_any: - case CORBA::tk_TypeCode: - case CORBA::tk_Principal: - case CORBA::tk_objref: - case CORBA::tk_struct: - case CORBA::tk_union: - case CORBA::tk_string: - case CORBA::tk_sequence: - case CORBA::tk_array: - case CORBA::tk_alias: - case CORBA::tk_except: - case CORBA::tk_wstring: - retval = stream->encode (tc2, data, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - break; - default: - // anything else is an error - retval = CORBA::TypeCode::TRAVERSE_STOP; - } - + // switch on the data type and handle the cases for primitives here for + // efficiency rather than calling + switch (tc2->kind_) + { + case CORBA::tk_null: + case CORBA::tk_void: + break; + case CORBA::tk_short: + case CORBA::tk_ushort: + continue_encoding = stream->write_short (*(CORBA::Short *) value); + break; + case CORBA::tk_long: + case CORBA::tk_ulong: + case CORBA::tk_float: + case CORBA::tk_enum: + continue_encoding = stream->write_long (*(CORBA::Long *) value); + break; + case CORBA::tk_double: + case CORBA::tk_longlong: + case CORBA::tk_ulonglong: + continue_encoding = stream->write_longlong (*(CORBA::LongLong *) value); + break; + case CORBA::tk_boolean: + continue_encoding = stream->write_boolean (*(CORBA::Boolean *) value); + break; + case CORBA::tk_char: + case CORBA::tk_octet: + continue_encoding = stream->write_char (*(CORBA::Char *) value); + break; + case CORBA::tk_longdouble: + continue_encoding = stream->write_longdouble (*(CORBA::LongDouble *) value); + break; + case CORBA::tk_wchar: + continue_encoding = stream->write_wchar (*(CORBA::WChar *) value); + break; + case CORBA::tk_any: + case CORBA::tk_TypeCode: + case CORBA::tk_Principal: + case CORBA::tk_objref: + case CORBA::tk_struct: + case CORBA::tk_union: + case CORBA::tk_string: + case CORBA::tk_sequence: + case CORBA::tk_array: + case CORBA::tk_alias: + case CORBA::tk_except: + case CORBA::tk_wstring: + retval = stream->encode (tc2, data, 0, env); + break; + default: + // anything else is an error + retval = CORBA::TypeCode::TRAVERSE_STOP; + } + } // tc2->_decr_refcnt (); if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE && continue_encoding == 1) return CORBA::TypeCode::TRAVERSE_CONTINUE; - - if (TAO_debug_level > 0) - ACE_DEBUG ((LM_DEBUG, - "TAO_Marshal_Alias::encode detected error\n")); - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + else + { + if (TAO_debug_level > 0) + ACE_DEBUG ((LM_DEBUG, + "TAO_Marshal_Alias::encode detected error\n")); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; + } } @@ -1092,124 +1094,119 @@ TAO_Marshal_Except::encode (CORBA::TypeCode_ptr tc, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { CORBA::TypeCode::traverse_status retval = CORBA::TypeCode::TRAVERSE_CONTINUE; CORBA::Boolean continue_encoding = 1; TAO_OutputCDR *stream = (TAO_OutputCDR *) context; - CORBA::TypeCode_ptr param; - CORBA::Long size, alignment; - - // first encode the RepositoryID which we can grab from the - // typecode pointer - continue_encoding = stream->write_string (tc->id (ACE_TRY_ENV)); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - -#if defined (__BORLANDC__) - // Borland C++ Builder 4.0 doesn't seem to align caught exceptions - // along the correct boundaries! Therefore we will assume that the - // data pointer passed in is already aligned correctly and we will - // calculate member alignments relative to this pointer. - char *base_ptr = (char *) data; -#endif /* __BORLANDC__ */ - - data = (char *) data + sizeof (CORBA::Exception); - // @@ (ASG) The reason this is done is because we want to skip the size - // of the the base class and its private data members (type_ and - // refcount_). After skipping these data members, we will have the data - // members of the derived class which must be encoded. - - int member_count = tc->member_count (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - - for (int i = 0; - i < member_count && retval == CORBA::TypeCode::TRAVERSE_CONTINUE - && continue_encoding == 1; - i++) + if (env.exception () == 0) { - param = tc->member_type (i, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + CORBA::TypeCode_ptr param; + CORBA::Long size, alignment; - size = param->size (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + // first encode the RepositoryID which we can grab from the + // typecode pointer + continue_encoding = stream->write_string (tc->id (env)); - alignment = param->alignment (ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); + data = (char *) data + sizeof (CORBA::Exception); + // @@ (ASG) The reason this is done is because we want to skip the size + // of the the base class and its private data members (type_ and + // refcount_). After skipping these data members, we will have the data + // members of the derived class which must be encoded. -#if defined (__BORLANDC__) - ptrdiff_t offset = (char *) data - base_ptr; - offset = (ptrdiff_t) ptr_align_binary (offset, alignment); - data = base_ptr + offset; -#else - data = ptr_align_binary (data, alignment); -#endif /* __BORLANDC__ */ + int member_count = tc->member_count (env); - switch (param->kind_) + for (int i = 0; + i < member_count && retval == CORBA::TypeCode::TRAVERSE_CONTINUE + && continue_encoding == 1; + i++) { - case CORBA::tk_null: - case CORBA::tk_void: - break; - case CORBA::tk_short: - case CORBA::tk_ushort: - continue_encoding = stream->write_short (*(CORBA::Short *) data); - break; - case CORBA::tk_long: - case CORBA::tk_ulong: - case CORBA::tk_float: - case CORBA::tk_enum: - continue_encoding = stream->write_long (*(CORBA::Long *) data); - break; - case CORBA::tk_double: - case CORBA::tk_longlong: - case CORBA::tk_ulonglong: - continue_encoding = stream->write_longlong (*(CORBA::LongLong *) data); - break; - case CORBA::tk_boolean: - continue_encoding = stream->write_boolean (*(CORBA::Boolean *) data); - break; - case CORBA::tk_char: - case CORBA::tk_octet: - continue_encoding = stream->write_char (*(CORBA::Char *) data); - break; - case CORBA::tk_longdouble: - continue_encoding = stream->write_longdouble (*(CORBA::LongDouble *) data); - break; - case CORBA::tk_wchar: - continue_encoding = stream->write_wchar (*(CORBA::WChar *) data); - break; - case CORBA::tk_any: - case CORBA::tk_TypeCode: - case CORBA::tk_Principal: - case CORBA::tk_objref: - case CORBA::tk_struct: - case CORBA::tk_union: - case CORBA::tk_string: - case CORBA::tk_sequence: - case CORBA::tk_array: - case CORBA::tk_alias: - case CORBA::tk_except: - case CORBA::tk_wstring: - retval = stream->encode (param, data, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::TypeCode::TRAVERSE_STOP); - break; - default: - break; + param = tc->member_type (i, env); + if (env.exception () == 0) + { + size = param->size (env); + if (env.exception () == 0) + { + alignment = param->alignment (env); + if (env.exception () == 0) + { + data = ptr_align_binary (data, alignment); + switch (param->kind_){ + case CORBA::tk_null: + case CORBA::tk_void: + break; + case CORBA::tk_short: + case CORBA::tk_ushort: + continue_encoding = stream->write_short (*(CORBA::Short *) data); + break; + case CORBA::tk_long: + case CORBA::tk_ulong: + case CORBA::tk_float: + case CORBA::tk_enum: + continue_encoding = stream->write_long (*(CORBA::Long *) data); + break; + case CORBA::tk_double: + case CORBA::tk_longlong: + case CORBA::tk_ulonglong: + continue_encoding = stream->write_longlong (*(CORBA::LongLong *) data); + break; + case CORBA::tk_boolean: + continue_encoding = stream->write_boolean (*(CORBA::Boolean *) data); + break; + case CORBA::tk_char: + case CORBA::tk_octet: + continue_encoding = stream->write_char (*(CORBA::Char *) data); + break; + case CORBA::tk_longdouble: + continue_encoding = stream->write_longdouble (*(CORBA::LongDouble *) data); + break; + case CORBA::tk_wchar: + continue_encoding = stream->write_wchar (*(CORBA::WChar *) data); + break; + case CORBA::tk_any: + case CORBA::tk_TypeCode: + case CORBA::tk_Principal: + case CORBA::tk_objref: + case CORBA::tk_struct: + case CORBA::tk_union: + case CORBA::tk_string: + case CORBA::tk_sequence: + case CORBA::tk_array: + case CORBA::tk_alias: + case CORBA::tk_except: + case CORBA::tk_wstring: + retval = stream->encode (param, data, 0, env); + break; + default: + break; + } + data = (char *) data + size; + } + else + return CORBA::TypeCode::TRAVERSE_STOP; + } + else + return CORBA::TypeCode::TRAVERSE_STOP; + } + else + return CORBA::TypeCode::TRAVERSE_STOP; } - data = (char *) data + size; } + else + return CORBA::TypeCode::TRAVERSE_STOP; if (retval == CORBA::TypeCode::TRAVERSE_CONTINUE && continue_encoding == 1) return CORBA::TypeCode::TRAVERSE_CONTINUE; - - if (TAO_debug_level > 0) - ACE_DEBUG ((LM_DEBUG, - "TAO_Marshal_Except::encode detected error\n")); - - ACE_THROW_RETURN (CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, - CORBA::COMPLETED_MAYBE), - CORBA::TypeCode::TRAVERSE_STOP); + else + { + if (TAO_debug_level > 0) + ACE_DEBUG ((LM_DEBUG, + "TAO_Marshal_Except::encode detected error\n")); + env.exception (new CORBA::MARSHAL (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); + return CORBA::TypeCode::TRAVERSE_STOP; + } } @@ -1219,7 +1216,7 @@ TAO_Marshal_WString::encode (CORBA::TypeCode_ptr tc, const void *data, const void *, void *context, - CORBA::Environment &ACE_TRY_ENV) + CORBA::Environment &env) { CORBA::WChar *str = *(CORBA::WChar **) data; TAO_OutputCDR *stream = (TAO_OutputCDR *) context; @@ -1227,7 +1224,7 @@ TAO_Marshal_WString::encode (CORBA::TypeCode_ptr tc, // Verify string satisfies bounds requirements. We're not so // permissive as to send messages violating the interface spec // by having excessively long strings! - CORBA::ULong bounds = tc->length (ACE_TRY_ENV); + CORBA::ULong bounds = tc->length (env); if (str != 0) { |