summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/TAO_Server_Request.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/TAO_Server_Request.h')
-rw-r--r--trunk/TAO/tao/TAO_Server_Request.h393
1 files changed, 393 insertions, 0 deletions
diff --git a/trunk/TAO/tao/TAO_Server_Request.h b/trunk/TAO/tao/TAO_Server_Request.h
new file mode 100644
index 00000000000..8034d920b28
--- /dev/null
+++ b/trunk/TAO/tao/TAO_Server_Request.h
@@ -0,0 +1,393 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+* @file TAO_Server_Request.h
+*
+* $Id$
+*
+* Header file for CORBA's Server Skeleton Interface's
+* "Server Request" type.
+*
+*
+* @author Copyright 1994-1995 by Sun Microsystems Inc.
+* @author Chris Cleeland
+* @author Aniruddha Gokhale
+*/
+//=============================================================================
+
+#ifndef TAO_SERVER_REQUEST_H
+#define TAO_SERVER_REQUEST_H
+
+#include /**/ "ace/pre.h"
+#include "ace/SString.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Tagged_Profile.h"
+#include "tao/Service_Context.h"
+#include "tao/Object.h"
+#include "tao/Transport_Selection_Guard.h"
+
+#if TAO_HAS_INTERCEPTORS == 1
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ class PICurrent;
+ class PICurrent_Impl;
+}
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "tao/PortableInterceptorC.h"
+
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Pluggable_Messaging;
+class TAO_Transport;
+class TAO_AMH_Response_Handler;
+
+namespace CORBA
+{
+ class ORB;
+ typedef ORB *ORB_ptr;
+
+ class Exception;
+}
+
+namespace TAO
+{
+ namespace CSD
+ {
+ class FW_Server_Request_Wrapper;
+ }
+}
+
+class TAO_Operation_Details;
+
+/**
+ * @class TAO_ServerRequest
+ *
+ * @brief Class representing a ServerRequest object.
+ *
+ * Encapsulates CDR, transport and pluggable messaging
+ * components on the server side.
+*/
+class TAO_Export TAO_ServerRequest
+{
+public:
+
+ /// Declare FW_Server_Request_Wrapper a friend
+ /// This friendship makes the FW_Server_Request_Wrapper be able to
+ /// clone the TAO_ServerRequest.
+ friend class TAO::CSD::FW_Server_Request_Wrapper;
+
+ /// Declare TAO_AMH_Response_Handler a friend
+ /**
+ * The TAO_AMH_Response_Handler class needs to copy part of the
+ * state in a TAO_ServerRequest, however, we do not want to expose
+ * that state as public members of this class, neither do we want to
+ * add modifiers to the TAO_AMH_Response_Handler class that would
+ * allow us (the TAO_ServerRequest class) to set the state.
+ *
+ * Lucky for us, C++ is a language for adult developers, and allow
+ * us to use the evil "friend" declaration.
+ *
+ */
+ friend class TAO_AMH_Response_Handler;
+
+ // Constructors.
+
+ TAO_ServerRequest (TAO_Pluggable_Messaging *mesg_base,
+ TAO_InputCDR &input,
+ TAO_OutputCDR &output,
+ TAO_Transport *transport,
+ TAO_ORB_Core *orb_core);
+
+ TAO_ServerRequest (TAO_Pluggable_Messaging *mesg_base,
+ CORBA::ULong request_id,
+ CORBA::Boolean response_expected,
+ CORBA::Boolean deferred_flag,
+ TAO::ObjectKey &object_key,
+ const char *operation,
+ TAO_OutputCDR &output,
+ TAO_Transport *transport,
+ TAO_ORB_Core *orb_core,
+ int &parse_error);
+
+ /// Constructor used by thru-POA collocated invocation path.
+ TAO_ServerRequest (TAO_ORB_Core * orb_core,
+ TAO_Operation_Details const & details,
+ CORBA::Object_ptr target);
+
+ /// Destructor.
+ ~TAO_ServerRequest (void);
+
+ /**
+ * @name Request attributes.
+ */
+ //@{
+ /// Return the operation name.
+ const char *operation (void) const;
+
+ /// Set the operation name.
+ void operation (const char *operation,
+ size_t length,
+ int release);
+
+ /// Return the length of the operation.
+ size_t operation_length (void) const;
+ //@}
+
+ /// Return the underlying ORB.
+ CORBA::ORB_ptr orb (void);
+
+ /// Return the ORB core pointer member.
+ TAO_ORB_Core *orb_core (void) const;
+
+ /// Start a Reply message.
+ void init_reply (void);
+
+ /// Retrieve the incoming stream.
+ TAO_InputCDR * incoming (void) const;
+
+ /// Retrieve the outgoing stream.
+ TAO_OutputCDR * outgoing (void) const;
+
+ /// Is the response expected?
+ CORBA::Boolean response_expected (void) const;
+
+ /// Should the reply be deferred?
+ CORBA::Boolean deferred_reply (void) const;
+
+ /// Set the response expected flag.
+ void response_expected (CORBA::Boolean response);
+
+ /// Should we return before dispatching the servant?
+ CORBA::Boolean sync_with_server (void) const;
+
+ /// Set the sync_with_server flag.
+ void sync_with_server (CORBA::Boolean sync_flag);
+
+ /// Used with reliable oneway requests.
+ void send_no_exception_reply (void);
+
+ TAO::ObjectKey &object_key (void);
+
+ /// Return the request TAO_Service_Context
+ TAO_Service_Context &request_service_context (void);
+
+ /// Return the reply TAO_Service_Context
+ TAO_Service_Context &reply_service_context (void);
+
+ IOP::ServiceContextList &reply_service_info (void);
+
+ IOP::ServiceContextList &request_service_info (void);
+
+ /// Return the underlying transport
+ TAO_Transport *transport ();
+
+ /// To handle System Exceptions at the lowest level, a method
+ /// returning the request_id_ is needed.
+ //@{
+ CORBA::ULong request_id (void);
+ void request_id (CORBA::ULong req);
+ //@}
+
+ /**
+ * Set the reference to the object the request should be forwarded
+ * to. This reference will only be used if set prior to calling
+ * init_reply().
+ */
+ void forward_location (CORBA::Object_ptr forward_reference);
+
+ /// Get the forward_location.
+ CORBA::Object_ptr forward_location (void);
+
+ /// Get the exception type.
+ CORBA::ULong exception_type (void);
+
+ /// Set the exception type.
+ void exception_type (CORBA::ULong except_type);
+
+ /// Set the requesting principal
+ void requesting_principal (const CORBA::OctetSeq & principal);
+
+ /// Return the reference to the tagged profile
+ TAO_Tagged_Profile &profile (void);
+
+ void tao_send_reply (void);
+
+ void tao_send_reply_exception (CORBA::Exception&);
+
+ /// Set the boolean member to 1.
+ void is_dsi (void);
+
+ /// Set the member.
+ void dsi_nvlist_align (ptrdiff_t alignment);
+
+ // Get the operation details for the current request.
+ TAO_Operation_Details const * operation_details (void) const;
+
+ /// Set the argument_flag
+ void argument_flag (CORBA::Boolean flag);
+
+ /// Get the argument_flag
+ CORBA::Boolean argument_flag (void);
+
+ /// Returns @c true if the current request is collocated.
+ bool collocated (void) const;
+
+#if TAO_HAS_INTERCEPTORS == 1
+ /// Send cached reply. Used in scenarios where the FTORB thinks that
+ /// this request is a duplicate
+ void send_cached_reply (CORBA::OctetSeq &ocs);
+
+ /// Return the octet sequence pointer through which the FTORB would
+ /// send the reply back.
+ void result_seq (CORBA::OctetSeq &ocs);
+
+ /// Check whether we got the result.
+ int got_result (void);
+
+ /// Return a reference to the number of interceptors pushed on to
+ /// the current interceptor flow stack.
+ /**
+ * @note It is a reference since the Portable Interceptor flow stack
+ * code must be able to modify this value and use that value
+ * at a later time without being forced to use TSS.
+ */
+ size_t & interceptor_count (void);
+
+ /// Return a reference to the "request scope" PICurrent object.
+ TAO::PICurrent_Impl *rs_pi_current (void);
+
+ CORBA::Exception *caught_exception (void);
+
+ void caught_exception (CORBA::Exception *exception);
+
+ /// Set the status of the received reply.
+ void reply_status (PortableInterceptor::ReplyStatus s);
+
+ /// Get the status of the received reply.
+ PortableInterceptor::ReplyStatus reply_status (void);
+
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+
+private:
+ /// Default ctor only used to create a TAO_ServerRequest that is about
+ /// to be the target of a clone operation.
+ TAO_ServerRequest (void);
+
+ TAO_Pluggable_Messaging *mesg_base_;
+
+ /// Operation name.
+ const char* operation_;
+
+ /// Operation length.
+ size_t operation_len_;
+
+ /// Do we own the memory associated with operation_?
+ bool release_operation_;
+
+ CORBA::Object_var forward_location_;
+
+ /// Incoming stream.
+ TAO_InputCDR *incoming_;
+
+ /// Outgoing stream.
+ TAO_OutputCDR *outgoing_;
+
+ /// Transport class.
+ TAO_Transport *transport_;
+
+ /// 0: oneway (SYNC_NONE or SYNC_WITH_TRANSPORT)
+ /// 1: twoway, or oneway (SYNC_WITH_SERVER or SYNC_WITH_TARGET)
+ CORBA::Boolean response_expected_;
+
+ /**
+ * 0: Reply would be sent by the object of this class which is the
+ * default.
+ * 1: Reply would not be prepared by this class and it would be
+ * deferred for somebody.
+ */
+ CORBA::Boolean deferred_reply_;
+
+ /// 1: oneway (SYNC_WITH_SERVER)
+ /// 0: anything else
+ CORBA::Boolean sync_with_server_;
+
+ /// Did we get passed to a CORBA::ServerRequest?
+ CORBA::Boolean is_dsi_;
+
+ /// Exception type (will be NO_EXCEPTION in the majority of the cases).
+ CORBA::ULong exception_type_;
+
+ /// A pointer to the ORB Core for the context where the request was
+ /// created.
+ TAO_ORB_Core *orb_core_;
+
+ /// Service Context info
+ TAO_Service_Context request_service_context_;
+ TAO_Service_Context reply_service_context_;
+
+ /// Unique identifier for a request.
+ CORBA::ULong request_id_;
+
+ /// The tagged profile that has the addressing information.
+ TAO_Tagged_Profile profile_;
+
+ /// Identifies the requester.
+ CORBA::OctetSeq_var requesting_principal_;
+
+ /// Used to pad CDR stream if we have used DSI.
+ ptrdiff_t dsi_nvlist_align_;
+
+ TAO_Operation_Details const * operation_details_;
+
+ /**
+ * An argument flag to indicate whether there is any data that is
+ * going to get marshaled along as a reply. The default will be 1
+ * which indicates that we have some data that needs to be sent back
+ * to the client.
+ */
+ CORBA::Boolean argument_flag_;
+
+#if TAO_HAS_INTERCEPTORS == 1
+ /// The number of interceptors pushed on to the current interceptor
+ /// flow stack.
+ size_t interceptor_count_;
+
+ /// The "Request Scope Current" (RSC) object, as required by
+ /// Portable Interceptors.
+ TAO::PICurrent_Impl *rs_pi_current_;
+
+ /// Used by the FTORB
+ CORBA::OctetSeq_var result_seq_;
+
+ /// Pointer to the caught exception.
+ CORBA::Exception * caught_exception_;
+
+ /// Reply status for the current request.
+ PortableInterceptor::ReplyStatus reply_status_;
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+
+ /// An RAII (resource acquisition is initialization) class instance
+ /// for interfacing with TSS storage for the "current" transport.
+ TAO::Transport_Selection_Guard transport_selection_guard_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "tao/TAO_Server_Request.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SERVER_REQUEST_H */