diff options
Diffstat (limited to 'TAO/tao/PI/ClientRequestInfo.h')
-rw-r--r-- | TAO/tao/PI/ClientRequestInfo.h | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/TAO/tao/PI/ClientRequestInfo.h b/TAO/tao/PI/ClientRequestInfo.h new file mode 100644 index 00000000000..43fc1d095c3 --- /dev/null +++ b/TAO/tao/PI/ClientRequestInfo.h @@ -0,0 +1,271 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file ClientRequestInfo.h + * + * $Id$ + * + * This is the implementation of the + * PortableInterceptor::ClientRequestInfo interface. + * + * @author Ossama Othman <ossama@uci.edu> + */ +//============================================================================= + +#ifndef TAO_CLIENT_REQUEST_INFO_H +#define TAO_CLIENT_REQUEST_INFO_H + +#include /**/ "ace/pre.h" + +#include "tao/LocalObject.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#if (TAO_HAS_INTERCEPTORS == 1) + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4250) +#endif /* _MSC_VER */ + +#include "ClientRequestInfoC.h" +#include "PIForwardRequestC.h" +#include "tao/ORB_Constants.h" +#include "tao/Invocation_Utils.h" +#include "tao/PICurrent_Impl.h" +#include "tao/PICurrent_Copy_Callback.h" + +class TAO_Service_Context; + +namespace TAO +{ + class Invocation_Base; +} + +namespace Dynamic +{ + class ParameterList; + class ExceptionList; + typedef CORBA::StringSeq RequestContext; + typedef CORBA::StringSeq ContextList; +} + +namespace Messaging +{ + typedef CORBA::Short SyncScope; +} + +/** + * @class TAO_ClientRequestInfo + * + * @brief Implementation of the PortableInterceptor::ClientRequestInfo + * interface. + */ +/// @todo TAO_Export is temporarily +class TAO_Export TAO_ClientRequestInfo + : public virtual PortableInterceptor::ClientRequestInfo, + public virtual TAO_Local_RefCounted_Object +{ +public: + TAO_ClientRequestInfo (TAO::Invocation_Base *invocation); + + /// Return an ID unique to the current request. This request ID may + /// or may not be the same as the GIOP request ID. + virtual CORBA::ULong request_id ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the operation name for the current request. + virtual char * operation ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the list of arguments passed to the current operation. + virtual Dynamic::ParameterList * arguments ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the list of exceptions the current operation is capable + /// of throwing. + virtual Dynamic::ExceptionList * exceptions ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual Dynamic::ContextList * contexts ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual Dynamic::RequestContext * operation_context ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the result of the current request. If there is no return + /// value then an Any with tk_void TypeCode is returned. This is + /// method is not valid for oneway operations. + virtual CORBA::Any * result ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Returns true for a two-way operation, and false otherwise. + virtual CORBA::Boolean response_expected ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)) ; + + /// Return the sync_scope policy value for the current one-way + /// operation. If the operation is not a one-way, a + /// CORBA::BAD_INV_ORDER exception is thrown. + virtual Messaging::SyncScope sync_scope ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the reply status for the current request. + /** + * Statuses can be PortableInterceptor::SUCCESSFUL, + * SYSTEM_EXCEPTION, USER_EXCEPTION, LOCATION_FORWARD, + * TRANSPORT_RETRY, UNKNOWN. + */ + virtual PortableInterceptor::ReplyStatus reply_status ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// If the reply status is PortableInterceptor::LOCATION_FORWARD or + /// return the object reference to which the request was forwarded. + virtual CORBA::Object_ptr forward_reference ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)) ; + + virtual CORBA::Any * get_slot ( + PortableInterceptor::SlotId id + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::InvalidSlot)); + + /// Return the IOP::ServiceContext with the given IOP::ServiceId + /// from the request service context list. + virtual IOP::ServiceContext * get_request_service_context ( + IOP::ServiceId id + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the IOP::ServiceContext with the given IOP::ServiceId + /// from the reply service context list. + virtual IOP::ServiceContext * get_reply_service_context ( + IOP::ServiceId id + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the (initial, non-forwarded, or permanently forwarded) + /// object reference of the target. + virtual CORBA::Object_ptr target ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the object reference for the current target. The target + /// may change in the even of a location forward. + virtual CORBA::Object_ptr effective_target ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual IOP::TaggedProfile * effective_profile ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return an Any containing the received exception, if any. + /// Otherwise, throw a CORBA::BAD_INV_ORDER exception. + /** + * @note There is no trivial way to extract the exception from an Any. + */ + virtual CORBA::Any * received_exception ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the repository ID for the received exception. + virtual char * received_exception_id ( + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the first IOP::TaggedComponent that matches the given + /// IOP::ComponentId in the object reference for the current + /// target. + virtual IOP::TaggedComponent * get_effective_component ( + IOP::ComponentId id + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return all IOP::TaggedComponent(s) that match the given + /// IOP::ComponentId in the object reference for the current + /// target. + virtual IOP::TaggedComponentSeq * get_effective_components ( + IOP::ComponentId id + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the policy of the given type in effect for the current + /// request. + virtual CORBA::Policy_ptr get_request_policy ( + CORBA::PolicyType type + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Add the IOP::ServiceContext to the request (outgoing) + /// IOP::ServiceContextList. + virtual void add_request_service_context ( + const IOP::ServiceContext & service_context, + CORBA::Boolean replace + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + +private: + + /// Check if this ClientRequestInfo object is called within the + /// context of a request. + void check_validity (ACE_ENV_SINGLE_ARG_DECL); + + /// Setup thread scope and request scope + /// PortableInterceptor::Current objects. + void setup_picurrent (void); + + /// Helper method to get the request and response service contexts. + IOP::ServiceContext *get_service_context_i ( + TAO_Service_Context &service_context_list, + IOP::ServiceId id + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + +private: + /// Pointer to the invocation object. + TAO::Invocation_Base *invocation_; + + /// The "Request Scope Current" (RSC) object, as required by + /// Portable Interceptors. + TAO::PICurrent_Impl rs_pi_current_; + + /// Callback object to be executed when shallow copied slot table + /// must be deep copied. + /** + * This callback object deep copies the slot table from the TSC to + * the RSC. + * @par + * As an optimization, the TSC's slot table is initially only + * shallowed copied to the RSC. If the TSC's slot table will be + * modified, e.g. via PICurrent::set_slot(), it's slot table must be + * deep copied to the RSC before actually modifying that slot + * table. This is necessary since the RSC is read-only on the + * client side, meaning that changes in the TSC that occur after + * instantiation of the RSC must not be reflected in the RSC. + */ + TAO::PICurrent_Copy_Callback copy_callback_; +}; + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif /* _MSC_VER */ + +#endif /* TAO_HAS_INTERCEPTORS == 1 */ + +#include /**/ "ace/post.h" + +#endif /* TAO_CLIENT_REQUEST_INFO_H */ |