AMH_DSI_Response_Handler.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=====================================================================
00004 /**
00005  *  @file AMH_DSI_Response_Handler.h
00006  *
00007  *  $Id: AMH_DSI_Response_Handler.h 81429 2008-04-24 18:49:54Z johnnyw $
00008  *
00009  *  @brief Handle the Repsonse appropriately.
00010  */
00011 //=====================================================================
00012 
00013 #ifndef TAO_AMH_DSI_RESPONSE_HANDLER_H
00014 #define TAO_AMH_DSI_RESPONSE_HANDLER_H
00015 #include /**/ "ace/pre.h"
00016 
00017 #include "tao/orbconf.h"
00018 
00019 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00020 # pragma once
00021 #endif /* ACE_LACKS_PRAGMA_ONCE */
00022 
00023 #include "tao/LocalObject.h"
00024 #include "tao/PortableServer/PortableServer.h"
00025 #include "tao/Messaging/AMH_Response_Handler.h"
00026 #include "tao/Valuetype/ValueBase.h"
00027 #include "dynamicinterface_export.h"
00028 
00029 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00030 
00031 class TAO_AMH_DSI_Response_Handler;
00032 typedef TAO_AMH_DSI_Response_Handler *TAO_AMH_DSI_Response_Handler_ptr;
00033 
00034 /**
00035  * @class TAO_AMH_DSI_Response_Handler_var
00036  *
00037  * @brief The T_var class for response handler
00038  *
00039  * As any other pseudo object, this class has a T_var class too.
00040  *
00041  */
00042 class TAO_DynamicInterface_Export TAO_AMH_DSI_Response_Handler_var
00043 {
00044 public:
00045   TAO_AMH_DSI_Response_Handler_var (void);
00046   TAO_AMH_DSI_Response_Handler_var (TAO_AMH_DSI_Response_Handler_ptr);
00047   TAO_AMH_DSI_Response_Handler_var (
00048       const TAO_AMH_DSI_Response_Handler_var &);
00049   ~TAO_AMH_DSI_Response_Handler_var (void);
00050 
00051   TAO_AMH_DSI_Response_Handler_var &operator= (
00052       TAO_AMH_DSI_Response_Handler_ptr);
00053   TAO_AMH_DSI_Response_Handler_var &operator= (
00054       const TAO_AMH_DSI_Response_Handler_var &);
00055   TAO_AMH_DSI_Response_Handler_ptr operator-> (void) const;
00056 
00057   operator const TAO_AMH_DSI_Response_Handler_ptr &() const;
00058   operator TAO_AMH_DSI_Response_Handler_ptr &();
00059 
00060   TAO_AMH_DSI_Response_Handler_ptr in (void) const;
00061   TAO_AMH_DSI_Response_Handler_ptr &inout (void);
00062   TAO_AMH_DSI_Response_Handler_ptr &out (void);
00063   TAO_AMH_DSI_Response_Handler_ptr _retn (void);
00064   TAO_AMH_DSI_Response_Handler_ptr ptr (void) const;
00065 
00066 private:
00067   TAO_AMH_DSI_Response_Handler_ptr ptr_;
00068 };
00069 
00070 class TAO_AMH_DSI_Exception_Holder;
00071 typedef TAO_AMH_DSI_Exception_Holder *TAO_AMH_DSI_Exception_Holder_ptr;
00072 
00073 /**
00074  * @class TAO_AMH_DSI_Exception_Holder_var
00075  *
00076  * @brief The T_var class for exception holder
00077  *
00078  * As any other pseudo object, this class has a T_var class too.
00079  *
00080  */
00081 class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder_var
00082 {
00083 public:
00084   TAO_AMH_DSI_Exception_Holder_var (void);
00085   TAO_AMH_DSI_Exception_Holder_var (TAO_AMH_DSI_Exception_Holder*);
00086   TAO_AMH_DSI_Exception_Holder_var (const TAO_AMH_DSI_Exception_Holder*);
00087   TAO_AMH_DSI_Exception_Holder_var (const TAO_AMH_DSI_Exception_Holder_var &);
00088   ~TAO_AMH_DSI_Exception_Holder_var (void);
00089 
00090   TAO_AMH_DSI_Exception_Holder_var &operator= (TAO_AMH_DSI_Exception_Holder*);
00091   TAO_AMH_DSI_Exception_Holder_var &operator= (
00092       const TAO_AMH_DSI_Exception_Holder_var &);
00093   TAO_AMH_DSI_Exception_Holder* operator-> (void) const;
00094 
00095   operator const TAO_AMH_DSI_Exception_Holder* () const;
00096   operator TAO_AMH_DSI_Exception_Holder*& ();
00097 
00098   TAO_AMH_DSI_Exception_Holder* in (void) const;
00099   TAO_AMH_DSI_Exception_Holder*& inout (void);
00100   TAO_AMH_DSI_Exception_Holder*& out (void);
00101   TAO_AMH_DSI_Exception_Holder* _retn (void);
00102   TAO_AMH_DSI_Exception_Holder* ptr (void) const;
00103 
00104   // Hooks used by template sequence and valuetype manager classes
00105   // for non-defined forward declared valuetypes.
00106   static void tao_add_ref (TAO_AMH_DSI_Exception_Holder *);
00107   static void tao_remove_ref (TAO_AMH_DSI_Exception_Holder *);
00108 
00109 private:
00110   TAO_AMH_DSI_Exception_Holder* ptr_;
00111 };
00112 
00113 /**
00114  * @class TAO_AMH_DSI_Exception_Holder_out
00115  *
00116  * @brief The T_out class for exception holder
00117  *
00118  */
00119 class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder_out
00120 {
00121 public:
00122   TAO_AMH_DSI_Exception_Holder_out (TAO_AMH_DSI_Exception_Holder* &);
00123   TAO_AMH_DSI_Exception_Holder_out (TAO_AMH_DSI_Exception_Holder_var &);
00124   TAO_AMH_DSI_Exception_Holder_out (const TAO_AMH_DSI_Exception_Holder_out &);
00125   TAO_AMH_DSI_Exception_Holder_out &operator= (
00126       const TAO_AMH_DSI_Exception_Holder_out &);
00127   TAO_AMH_DSI_Exception_Holder_out &operator= (
00128       const TAO_AMH_DSI_Exception_Holder_var &);
00129   TAO_AMH_DSI_Exception_Holder_out &operator= (
00130       TAO_AMH_DSI_Exception_Holder*);
00131   operator TAO_AMH_DSI_Exception_Holder*& ();
00132   TAO_AMH_DSI_Exception_Holder*& ptr (void);
00133   TAO_AMH_DSI_Exception_Holder* operator-> (void);
00134 
00135 private:
00136   TAO_AMH_DSI_Exception_Holder* &ptr_;
00137 };
00138 
00139 /**
00140  * @class TAO_AMH_DSI_Exception_Holder
00141  *
00142  * @brief This is the class for holding exception.
00143  *
00144  */
00145 class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder
00146   : public virtual CORBA::DefaultValueRefCountBase,
00147     public virtual CORBA::ValueBase
00148 {
00149 public:
00150   typedef TAO_AMH_DSI_Exception_Holder_var _var_type;
00151   TAO_AMH_DSI_Exception_Holder (CORBA::Exception *ex);
00152 
00153   virtual ~TAO_AMH_DSI_Exception_Holder (void);
00154 
00155   static TAO_AMH_DSI_Exception_Holder* _downcast ( CORBA::ValueBase* );
00156 
00157   static CORBA::Boolean _tao_unmarshal ( TAO_InputCDR &,
00158                                          TAO_AMH_DSI_Exception_Holder *& );
00159   virtual const char* _tao_obv_repository_id (void) const;
00160   static const char* _tao_obv_static_repository_id (void);
00161 
00162   static void _tao_any_destructor (void *);
00163 
00164   virtual void raise_invoke ( );
00165 
00166   CORBA::TypeCode_ptr _tao_type (void) const;
00167   void _tao_obv_truncatable_repo_ids (Repository_Id_List &) const;
00168   CORBA::Boolean _tao_match_formal_type (ptrdiff_t ) const;
00169 
00170 protected:
00171   TAO_AMH_DSI_Exception_Holder (void);
00172   ///  *** Terrible Hack ? ***
00173   virtual CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &) const;
00174   virtual CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &);
00175 
00176 private:
00177   TAO_AMH_DSI_Exception_Holder (const TAO_AMH_DSI_Exception_Holder &);
00178   void operator= (const TAO_AMH_DSI_Exception_Holder &);
00179   CORBA::Exception *exception_;
00180 
00181 protected:
00182   virtual CORBA::Boolean _tao_marshal__Test_TAO_AMH_DSI_Exception_Holder (
00183               TAO_OutputCDR &);
00184   virtual CORBA::Boolean _tao_unmarshal__Test_TAO_AMH_DSI_Exception_Holder (
00185               TAO_InputCDR &);
00186 };
00187 
00188 /**
00189  * @class TAO_AMH_DSI_Response_Handler
00190  *
00191  * @brief This is the main class for DSI using AMH.
00192  *
00193  * With ordinary DSI, the POA calls _dispatch, which in turn calls invoke
00194  * on the DSI handler. Invoke completely handles the request, and packages
00195  * the result in the request object so that it can be marshalled and sent
00196  * back to the caller.
00197  *
00198  * With the AMH variation, the DSI handler's invoke method starts the
00199  * processing, but delegates the result packaging to a response handler.
00200  * This way, if the invocation takes a long time, or involves blocking
00201  * calls, then the result handling can be managed by another thread.
00202  * This is particularly useful for gateway implementations, where the
00203  * middle tier should not have to block waiting for replies.
00204  *
00205  * As this is built on the CORBA object model, there are separate classes
00206  * representing the interface and the implementation.
00207  *
00208  */
00209 class TAO_DynamicInterface_Export TAO_AMH_DSI_Response_Handler
00210   : public virtual TAO_AMH_Response_Handler
00211 {
00212 public:
00213   typedef TAO_AMH_DSI_Response_Handler_ptr _ptr_type;
00214   typedef TAO_AMH_DSI_Response_Handler_var _var_type;
00215 
00216   TAO_AMH_DSI_Response_Handler (TAO_ServerRequest &sr);
00217   ~TAO_AMH_DSI_Response_Handler (void);
00218 
00219   virtual void invoke_reply (CORBA::NVList_ptr args,
00220                              CORBA::NamedValue_ptr result);
00221 
00222   virtual void invoke_excep ( TAO_AMH_DSI_Exception_Holder * h);
00223 
00224   virtual void invoke_location_forward (CORBA::Object_ptr fwd,
00225                                         CORBA::Boolean is_perm);
00226 
00227   virtual void gateway_exception_reply (CORBA::ULong reply_status,
00228                                         TAO_OutputCDR &encap);
00229 
00230   virtual void gateway_exception_reply (CORBA::ULong reply_status,
00231                                         TAO_InputCDR &encap);
00232 
00233   /// Returns a CORBA::Object_ptr for the target object.
00234   CORBA::Object_ptr _this ();
00235 
00236   /// CORBA Object related methods
00237   static TAO_AMH_DSI_Response_Handler* _duplicate (
00238              TAO_AMH_DSI_Response_Handler_ptr);
00239   static TAO_AMH_DSI_Response_Handler* _nil (void);
00240   static TAO_AMH_DSI_Response_Handler* _narrow (CORBA::Object_ptr);
00241   static TAO_AMH_DSI_Response_Handler* _unchecked_narrow (CORBA::Object_ptr);
00242 
00243 protected:
00244 
00245   /// Return 0.  Should never be used.
00246   virtual const char *_interface_repository_id (void) const;
00247 
00248   /// Simply returns "this"
00249   virtual void *_downcast (const char *repository_id);
00250 
00251 private:
00252   TAO_ORB_Core *orb_core_;
00253 };
00254 
00255 TAO_END_VERSIONED_NAMESPACE_DECL
00256 
00257 #if defined (__ACE_INLINE__)
00258 # include "AMH_DSI_Response_Handler.inl"
00259 #endif /* __ACE_INLINE__ */
00260 
00261 #include /**/ "ace/post.h"
00262 #endif /* TAO_AMH_DSI_RESPONSE_HANDLER_H */

Generated on Tue Feb 2 17:43:23 2010 for TAO_DynamicInterface by  doxygen 1.4.7