diff options
Diffstat (limited to 'TAO/tao/operation_details.cpp')
-rw-r--r-- | TAO/tao/operation_details.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/TAO/tao/operation_details.cpp b/TAO/tao/operation_details.cpp new file mode 100644 index 00000000000..96c38a1014a --- /dev/null +++ b/TAO/tao/operation_details.cpp @@ -0,0 +1,86 @@ +//$Id$ + +#include "tao/operation_details.h" +#include "tao/Stub.h" +#include "tao/ORB_Constants.h" +#include "tao/Exception_Data.h" +#include "tao/SystemException.h" +#include "tao/Argument.h" +#include "tao/CDR.h" + +#include "ace/OS_NS_string.h" + +#if !defined (__ACE_INLINE__) +# include "tao/operation_details.inl" +#endif /* ! __ACE_INLINE__ */ + +ACE_RCSID (tao, + operation_details, + "$Id$") + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +CORBA::Exception * +TAO_Operation_Details::corba_exception (const char *id + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + for (CORBA::ULong i = 0; i != this->ex_count_; ++i) + { + if (ACE_OS::strcmp (id, + this->ex_data_[i].id) != 0) + { + continue; + } + + // Create an exception object + CORBA::Exception *exception = + this->ex_data_[i].alloc (); + + if (exception == 0) + { + ACE_THROW_RETURN (CORBA::NO_MEMORY (0, + CORBA::COMPLETED_YES), + 0); + } + + // Return the exception object that we just created. + return exception; + } + + // If there are no matches return an unknown exception. + ACE_THROW_RETURN (CORBA::UNKNOWN (0, + CORBA::COMPLETED_YES), + 0); +} + +bool +TAO_Operation_Details::marshal_args (TAO_OutputCDR &cdr) +{ + for (CORBA::ULong i = 0; i != this->num_args_; ++i) + { + if (!((*this->args_[i]).marshal (cdr))) + return false; + } + + // Nothing else to fragment. We're also guaranteed to have + // data in the CDR stream since the operation was a marshaling + // operation, not a fragmentation operation. + cdr.more_fragments (false); + + return true; +} + +bool +TAO_Operation_Details::demarshal_args (TAO_InputCDR &cdr) +{ + for (CORBA::ULong i = 0; i != this->num_args_; ++i) + { + if (!((*this->args_[i]).demarshal (cdr))) + return false; + } + + return true; +} + +TAO_END_VERSIONED_NAMESPACE_DECL |