summaryrefslogtreecommitdiff
path: root/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.h')
-rw-r--r--TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.h263
1 files changed, 263 insertions, 0 deletions
diff --git a/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.h b/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.h
new file mode 100644
index 00000000000..8f6af4aa735
--- /dev/null
+++ b/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.h
@@ -0,0 +1,263 @@
+// -*- C++ -*-
+
+//=====================================================================
+/**
+ * @file AMH_DSI_Response_Handler.h
+ *
+ * $Id$
+ *
+ * @brief Handle the Repsonse appropriately.
+ */
+//=====================================================================
+
+#ifndef TAO_AMH_DSI_RESPONSE_HANDLER_H
+#define TAO_AMH_DSI_RESPONSE_HANDLER_H
+#include /**/ "ace/pre.h"
+
+#include "tao/orbconf.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/Messaging/AMH_Response_Handler.h"
+#include "tao/Valuetype/ValueBase.h"
+#include "dynamicinterface_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_AMH_DSI_Response_Handler;
+typedef TAO_AMH_DSI_Response_Handler *TAO_AMH_DSI_Response_Handler_ptr;
+
+/**
+ * @class TAO_AMH_DSI_Response_Handler_var
+ *
+ * @brief The T_var class for response handler
+ *
+ * As any other pseudo object, this class has a T_var class too.
+ *
+ */
+class TAO_DynamicInterface_Export TAO_AMH_DSI_Response_Handler_var
+{
+public:
+ TAO_AMH_DSI_Response_Handler_var (void);
+ TAO_AMH_DSI_Response_Handler_var (TAO_AMH_DSI_Response_Handler_ptr);
+ TAO_AMH_DSI_Response_Handler_var (
+ const TAO_AMH_DSI_Response_Handler_var &);
+ ~TAO_AMH_DSI_Response_Handler_var (void);
+
+ TAO_AMH_DSI_Response_Handler_var &operator= (
+ TAO_AMH_DSI_Response_Handler_ptr);
+ TAO_AMH_DSI_Response_Handler_var &operator= (
+ const TAO_AMH_DSI_Response_Handler_var &);
+ TAO_AMH_DSI_Response_Handler_ptr operator-> (void) const;
+
+ operator const TAO_AMH_DSI_Response_Handler_ptr &() const;
+ operator TAO_AMH_DSI_Response_Handler_ptr &();
+
+ TAO_AMH_DSI_Response_Handler_ptr in (void) const;
+ TAO_AMH_DSI_Response_Handler_ptr &inout (void);
+ TAO_AMH_DSI_Response_Handler_ptr &out (void);
+ TAO_AMH_DSI_Response_Handler_ptr _retn (void);
+ TAO_AMH_DSI_Response_Handler_ptr ptr (void) const;
+
+private:
+ TAO_AMH_DSI_Response_Handler_ptr ptr_;
+};
+
+class TAO_AMH_DSI_Exception_Holder;
+typedef TAO_AMH_DSI_Exception_Holder *TAO_AMH_DSI_Exception_Holder_ptr;
+
+/**
+ * @class TAO_AMH_DSI_Exception_Holder_var
+ *
+ * @brief The T_var class for exception holder
+ *
+ * As any other pseudo object, this class has a T_var class too.
+ *
+ */
+class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder_var
+{
+public:
+ TAO_AMH_DSI_Exception_Holder_var (void);
+ TAO_AMH_DSI_Exception_Holder_var (TAO_AMH_DSI_Exception_Holder*);
+ TAO_AMH_DSI_Exception_Holder_var (
+ const TAO_AMH_DSI_Exception_Holder*);
+ TAO_AMH_DSI_Exception_Holder_var (
+ const TAO_AMH_DSI_Exception_Holder_var &);
+ ~TAO_AMH_DSI_Exception_Holder_var (void);
+
+ TAO_AMH_DSI_Exception_Holder_var &operator= (
+ TAO_AMH_DSI_Exception_Holder*);
+ TAO_AMH_DSI_Exception_Holder_var &operator= (
+ const TAO_AMH_DSI_Exception_Holder_var &);
+ TAO_AMH_DSI_Exception_Holder* operator-> (void) const;
+
+ operator const TAO_AMH_DSI_Exception_Holder* () const;
+ operator TAO_AMH_DSI_Exception_Holder*& ();
+
+ TAO_AMH_DSI_Exception_Holder* in (void) const;
+ TAO_AMH_DSI_Exception_Holder*& inout (void);
+ TAO_AMH_DSI_Exception_Holder*& out (void);
+ TAO_AMH_DSI_Exception_Holder* _retn (void);
+ TAO_AMH_DSI_Exception_Holder* ptr (void) const;
+
+ // Hooks used by template sequence and valuetype manager classes
+ // for non-defined forward declared valuetypes.
+ static void tao_add_ref (TAO_AMH_DSI_Exception_Holder *);
+ static void tao_remove_ref (TAO_AMH_DSI_Exception_Holder *);
+
+private:
+ TAO_AMH_DSI_Exception_Holder* ptr_;
+};
+
+/**
+ * @class TAO_AMH_DSI_Exception_Holder_out
+ *
+ * @brief The T_out class for exception holder
+ *
+ */
+class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder_out
+{
+public:
+ TAO_AMH_DSI_Exception_Holder_out (TAO_AMH_DSI_Exception_Holder* &);
+ TAO_AMH_DSI_Exception_Holder_out (TAO_AMH_DSI_Exception_Holder_var &);
+ TAO_AMH_DSI_Exception_Holder_out (
+ const TAO_AMH_DSI_Exception_Holder_out &);
+ TAO_AMH_DSI_Exception_Holder_out &operator= (
+ const TAO_AMH_DSI_Exception_Holder_out &);
+ TAO_AMH_DSI_Exception_Holder_out &operator= (
+ const TAO_AMH_DSI_Exception_Holder_var &);
+ TAO_AMH_DSI_Exception_Holder_out &operator= (
+ TAO_AMH_DSI_Exception_Holder*);
+ operator TAO_AMH_DSI_Exception_Holder*& ();
+ TAO_AMH_DSI_Exception_Holder*& ptr (void);
+ TAO_AMH_DSI_Exception_Holder* operator-> (void);
+
+private:
+ TAO_AMH_DSI_Exception_Holder* &ptr_;
+};
+
+/**
+ * @class TAO_AMH_DSI_Exception_Holder
+ *
+ * @brief This is the class for holding exception.
+ *
+ */
+class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder
+ : public virtual CORBA::DefaultValueRefCountBase,
+ public virtual CORBA::ValueBase
+{
+public:
+ typedef TAO_AMH_DSI_Exception_Holder_var _var_type;
+ TAO_AMH_DSI_Exception_Holder (CORBA::Exception *ex);
+
+ virtual ~TAO_AMH_DSI_Exception_Holder (void);
+
+ static TAO_AMH_DSI_Exception_Holder* _downcast ( CORBA::ValueBase* );
+
+ static CORBA::Boolean _tao_unmarshal ( TAO_InputCDR &,
+ TAO_AMH_DSI_Exception_Holder *& );
+ virtual const char* _tao_obv_repository_id (void) const;
+ static const char* _tao_obv_static_repository_id (void);
+
+ static void _tao_any_destructor (void *);
+
+ virtual void raise_invoke ( );
+
+ CORBA::TypeCode_ptr _tao_type (void) const;
+ void _tao_obv_truncatable_repo_ids (Repository_Id_List &) const;
+ CORBA::Boolean _tao_match_formal_type (ptrdiff_t ) const;
+
+protected:
+ TAO_AMH_DSI_Exception_Holder (void);
+ /// *** Terrible Hack ? ***
+ virtual CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &) const;
+ virtual CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &);
+
+private:
+ TAO_AMH_DSI_Exception_Holder (const TAO_AMH_DSI_Exception_Holder &);
+ void operator= (const TAO_AMH_DSI_Exception_Holder &);
+ CORBA::Exception *exception_;
+
+protected:
+ virtual CORBA::Boolean _tao_marshal__Test_TAO_AMH_DSI_Exception_Holder (
+ TAO_OutputCDR &);
+ virtual CORBA::Boolean _tao_unmarshal__Test_TAO_AMH_DSI_Exception_Holder (
+ TAO_InputCDR &);
+};
+
+/**
+ * @class TAO_AMH_DSI_Response_Handler
+ *
+ * @brief This is the main class for DSI using AMH.
+ *
+ * With ordinary DSI, the POA calls _dispatch, which in turn calls invoke
+ * on the DSI handler. Invoke completely handles the request, and packages
+ * the result in the request object so that it can be marshalled and sent
+ * back to the caller.
+ *
+ * With the AMH variation, the DSI handler's invoke method starts the
+ * processing, but delegates the result packaging to a response handler.
+ * This way, if the invocation takes a long time, or involves blocking
+ * calls, then the result handling can be managed by another thread.
+ * This is particularly useful for gateway implementations, where the
+ * middle tier should not have to block waiting for replies.
+ *
+ * As this is built on the CORBA object model, there are separate classes
+ * representing the interface and the implementation.
+ *
+ */
+class TAO_DynamicInterface_Export TAO_AMH_DSI_Response_Handler
+ : public virtual TAO_AMH_Response_Handler
+{
+public:
+ typedef TAO_AMH_DSI_Response_Handler_ptr _ptr_type;
+ typedef TAO_AMH_DSI_Response_Handler_var _var_type;
+
+ TAO_AMH_DSI_Response_Handler (TAO_ServerRequest &sr);
+ ~TAO_AMH_DSI_Response_Handler (void);
+
+ virtual void invoke_reply (CORBA::NVList_ptr args,
+ CORBA::NamedValue_ptr result);
+
+ virtual void invoke_excep ( TAO_AMH_DSI_Exception_Holder * h);
+
+ virtual void gateway_exception_reply (CORBA::ULong reply_status,
+ TAO_OutputCDR &encap);
+
+ virtual void gateway_exception_reply (CORBA::ULong reply_status,
+ TAO_InputCDR &encap);
+
+ /// Returns a CORBA::Object_ptr for the target object.
+ CORBA::Object_ptr _this ();
+
+ /// CORBA Object related methods
+ static TAO_AMH_DSI_Response_Handler* _duplicate (
+ TAO_AMH_DSI_Response_Handler_ptr);
+ static TAO_AMH_DSI_Response_Handler* _nil (void);
+ static TAO_AMH_DSI_Response_Handler* _narrow (CORBA::Object_ptr);
+ static TAO_AMH_DSI_Response_Handler* _unchecked_narrow (CORBA::Object_ptr);
+
+protected:
+
+ /// Return 0. Should never be used.
+ virtual const char *_interface_repository_id (void) const;
+
+ /// Simply returns "this"
+ virtual void *_downcast (const char *repository_id);
+
+private:
+ TAO_ORB_Core *orb_core_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "AMH_DSI_Response_Handler.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AMH_DSI_RESPONSE_HANDLER_H */