diff options
Diffstat (limited to 'TAO/tao/ClientRequestInfo_i.h')
-rw-r--r-- | TAO/tao/ClientRequestInfo_i.h | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/TAO/tao/ClientRequestInfo_i.h b/TAO/tao/ClientRequestInfo_i.h new file mode 100644 index 00000000000..d2a0b5f50e5 --- /dev/null +++ b/TAO/tao/ClientRequestInfo_i.h @@ -0,0 +1,253 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file ClientRequestInfo_i.h + * + * $Id$ + * + * This is the implementation of the + * PortableInterceptor::ClientRequestInfo interface. + * + * @author Ossama Othman <ossama@uci.edu> + * @author Kirthika Parameswaran <kirthika@cs.wustl.edu> + */ +//============================================================================= + +#ifndef TAO_CLIENT_REQUEST_INFO_I_H +#define TAO_CLIENT_REQUEST_INFO_I_H + +#include "ace/pre.h" + +#include "corbafwd.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#if (TAO_HAS_INTERCEPTORS == 1) + +#include "PortableInterceptorC.h" +#include "StringSeqC.h" +#include "Service_Context.h" + +class TAO_GIOP_Invocation; + +/** + * @class TAO_ClientRequestInfo_i + * + * @brief Implementation of the PortableInterceptor::ClientRequestInfo + * interface. + */ +class TAO_Export TAO_ClientRequestInfo_i +{ +public: + + /// Constructor. + TAO_ClientRequestInfo_i (TAO_GIOP_Invocation *invocation, + CORBA::Object_ptr target); + + /// Return an ID unique to the current request. This request ID may + /// or may not be the same as the GIOP request ID. + CORBA::ULong request_id ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the operation name for the current request. + char * operation ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the list of arguments passed to the current operation. + virtual Dynamic::ParameterList * arguments (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the list of exceptions the current operation is capable + /// of throwing. + virtual Dynamic::ExceptionList * exceptions (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + Dynamic::ContextList * contexts ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + Dynamic::RequestContext * operation_context ( + TAO_ENV_SINGLE_ARG_DECL) + 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 (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Returns true for a two-way operation, and false otherwise. + CORBA::Boolean response_expected (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) ; + +#if TAO_HAS_CORBA_MESSAGING == 1 + /// 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. + CORBA::Short sync_scope (TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); +#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ + + /// Return the reply status for the current request. Statuses can + /// be PortableInterceptor::SUCCESSFUL, SYSTEM_EXCEPTION, + /// USER_EXCEPTION, LOCATION_FORWARD, LOCATION_FORWARD_PERMANENT, + /// TRANSPORT_RETRY. + PortableInterceptor::ReplyStatus reply_status ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// If the reply status is PortableInterceptor::LOCATION_FORWARD or + /// PortableInterceptor::LOCATION_FORWARD_PERMANENT, return the + /// object reference to which the request was forwarded. + CORBA::Object_ptr forward_reference ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) ; + + CORBA::Any * get_slot ( + PortableInterceptor::SlotId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::InvalidSlot)); + + /// Return the IOP::ServiceContext with the given IOP::ServiceId + /// from the request service context list. + IOP::ServiceContext * get_request_service_context ( + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the IOP::ServiceContext with the given IOP::ServiceId + /// from the reply service context list. + IOP::ServiceContext * get_reply_service_context ( + IOP::ServiceId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the (initial, non-forwarded, or permanently forwarded) + /// object reference of the target. + CORBA::Object_ptr target ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the object reference for the current target. The target + /// may change in the even of a location forward. + CORBA::Object_ptr effective_target ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + IOP::TaggedProfile * effective_profile ( + TAO_ENV_SINGLE_ARG_DECL) + 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. + */ + CORBA::Any * received_exception ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the repository ID for the received exception. + char * received_exception_id ( + TAO_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the first IOP::TaggedComponent that matches the given + /// IOP::ComponentId in the object reference for the current + /// target. + IOP::TaggedComponent * get_effective_component ( + IOP::ComponentId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return all IOP::TaggedComponent(s) that match the given + /// IOP::ComponentId in the object reference for the current + /// target. + IOP::TaggedComponentSeq * get_effective_components ( + IOP::ComponentId id + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the policy of the given type in effect for the current + /// request. + CORBA::Policy_ptr get_request_policy ( + CORBA::PolicyType type + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Add the IOP::ServiceContext to the request (outgoing) + /// IOP::ServiceContextList. + void add_request_service_context ( + const IOP::ServiceContext & service_context, + CORBA::Boolean replace + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /** + * @name Stub helper methods + * + * The following methods are used in the implementation of the + * Stubs, they are not part of the ClientRequestInfo interface, but + * an extension used internally by TAO. + */ + //@{ + + /// Change the exception status. + void exception (CORBA::Exception *exception); + + /// Set the flag that states whether or not a response is expected. + /// For example, no response is expected in a one-way operation. + void response_expected (CORBA::Boolean flag); + + /// Set the status of the received reply. + void reply_status (int invoke_status); + + /// Extract the forward object reference from the + /// PortableInterceptor::ForwardRequest exception, and set the reply + /// status flag accordingly. + void forward_reference (PortableInterceptor::ForwardRequest &exc); + //@} + +protected: + + /// 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 + TAO_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + +protected: + + /// Pointer to the GIOP invocation object. + TAO_GIOP_Invocation *invocation_; + + /// Reference to the target object. + CORBA::Object_ptr target_; + + /// Pointer to the caught exception. + CORBA::Exception *caught_exception_; + + /// True if a two-way operation, false otherwise. + CORBA::Boolean response_expected_; + + /// Reply status for the current request. + PortableInterceptor::ReplyStatus reply_status_; + +}; + +# if defined (__ACE_INLINE__) +# include "ClientRequestInfo_i.inl" +# endif /* __ACE_INLINE__ */ + +#endif /* TAO_HAS_INTERCEPTORS == 1 */ + +#include "ace/post.h" + +#endif /* TAO_CLIENT_REQUEST_INFO_I_H */ |