diff options
Diffstat (limited to 'TAO/tao/PI_Server/ServerRequestDetails.cpp')
-rw-r--r-- | TAO/tao/PI_Server/ServerRequestDetails.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/TAO/tao/PI_Server/ServerRequestDetails.cpp b/TAO/tao/PI_Server/ServerRequestDetails.cpp new file mode 100644 index 00000000000..c06a9429d1d --- /dev/null +++ b/TAO/tao/PI_Server/ServerRequestDetails.cpp @@ -0,0 +1,77 @@ +#include "tao/PI_Server/ServerRequestDetails.h" + +#if TAO_HAS_INTERCEPTORS == 1 + +#if !defined (__ACE_INLINE__) +#include "tao/PI_Server/ServerRequestDetails.inl" +#endif /* defined INLINE */ + +ACE_RCSID (PI_Server, + ServerRequestDetails, + "$Id$") + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +namespace TAO +{ + void + ServerRequestDetails::apply_policies ( + const CORBA::PolicyList &policies + ACE_ENV_ARG_DECL) + { + // Flag to check for duplicate ProcessingModePolicy objects in the list. + bool processing_mode_applied = false; + + const CORBA::ULong plen = policies.length (); + + for (CORBA::ULong i = 0; i < plen; ++i) + { + CORBA::Policy_var policy = CORBA::Policy::_duplicate (policies[i]); + + if (CORBA::is_nil (policy.in ())) + { + // Just ignore nil policies... + continue; + } + + // Obtain the PolicyType from the current Policy object. + const CORBA::PolicyType policy_type = + policy->policy_type (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + if (policy_type == PortableInterceptor::PROCESSING_MODE_POLICY_TYPE) + { + if (processing_mode_applied) + { + // This is the second time we have run into this policy type, + // and that is not allowed. + ACE_THROW (CORBA::INV_POLICY ()); + } + + // Flip the flag to true in order to trap any dupes. + processing_mode_applied = true; + + // Narrow the Policy to the ProcessingModePolicy interface. + PortableInterceptor::ProcessingModePolicy_var pm_policy = + PortableInterceptor::ProcessingModePolicy::_narrow ( + policy.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + // Save the value of the ProcessingModePolicy in our data member. + this->processing_mode_ = + pm_policy->processing_mode (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + } + else + { + // We don't support the current policy type. + ACE_THROW (CORBA::INV_POLICY ()); + } + } + } +} + +TAO_END_VERSIONED_NAMESPACE_DECL + +#endif /* TAO_HAS_INTERCEPTORS == 1 */ |