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 77501 2007-03-02 20:46:54Z zhangw $
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 (
00087       const TAO_AMH_DSI_Exception_Holder*);
00088   TAO_AMH_DSI_Exception_Holder_var (
00089       const TAO_AMH_DSI_Exception_Holder_var &);
00090   ~TAO_AMH_DSI_Exception_Holder_var (void);
00091 
00092   TAO_AMH_DSI_Exception_Holder_var &operator= (
00093       TAO_AMH_DSI_Exception_Holder*);
00094   TAO_AMH_DSI_Exception_Holder_var &operator= (
00095       const TAO_AMH_DSI_Exception_Holder_var &);
00096   TAO_AMH_DSI_Exception_Holder* operator-> (void) const;
00097 
00098   operator const TAO_AMH_DSI_Exception_Holder* () const;
00099   operator TAO_AMH_DSI_Exception_Holder*& ();
00100 
00101   TAO_AMH_DSI_Exception_Holder* in (void) const;
00102   TAO_AMH_DSI_Exception_Holder*& inout (void);
00103   TAO_AMH_DSI_Exception_Holder*& out (void);
00104   TAO_AMH_DSI_Exception_Holder* _retn (void);
00105   TAO_AMH_DSI_Exception_Holder* ptr (void) const;
00106 
00107   // Hooks used by template sequence and valuetype manager classes
00108   // for non-defined forward declared valuetypes.
00109   static void tao_add_ref (TAO_AMH_DSI_Exception_Holder *);
00110   static void tao_remove_ref (TAO_AMH_DSI_Exception_Holder *);
00111 
00112 private:
00113   TAO_AMH_DSI_Exception_Holder* ptr_;
00114 };
00115 
00116 /**
00117  * @class TAO_AMH_DSI_Exception_Holder_out
00118  *
00119  * @brief The T_out class for exception holder
00120  *
00121  */
00122 class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder_out
00123 {
00124 public:
00125   TAO_AMH_DSI_Exception_Holder_out (TAO_AMH_DSI_Exception_Holder* &);
00126   TAO_AMH_DSI_Exception_Holder_out (TAO_AMH_DSI_Exception_Holder_var &);
00127   TAO_AMH_DSI_Exception_Holder_out (
00128       const TAO_AMH_DSI_Exception_Holder_out &);
00129   TAO_AMH_DSI_Exception_Holder_out &operator= (
00130       const TAO_AMH_DSI_Exception_Holder_out &);
00131   TAO_AMH_DSI_Exception_Holder_out &operator= (
00132       const TAO_AMH_DSI_Exception_Holder_var &);
00133   TAO_AMH_DSI_Exception_Holder_out &operator= (
00134       TAO_AMH_DSI_Exception_Holder*);
00135   operator TAO_AMH_DSI_Exception_Holder*& ();
00136   TAO_AMH_DSI_Exception_Holder*& ptr (void);
00137   TAO_AMH_DSI_Exception_Holder* operator-> (void);
00138 
00139 private:
00140   TAO_AMH_DSI_Exception_Holder* &ptr_;
00141 };
00142 
00143 /**
00144  * @class TAO_AMH_DSI_Exception_Holder
00145  *
00146  * @brief This is the class for holding exception.
00147  *
00148  */
00149 class TAO_DynamicInterface_Export TAO_AMH_DSI_Exception_Holder
00150   : public virtual CORBA::DefaultValueRefCountBase,
00151     public virtual CORBA::ValueBase
00152 {
00153 public:
00154   typedef TAO_AMH_DSI_Exception_Holder_var _var_type;
00155   TAO_AMH_DSI_Exception_Holder (CORBA::Exception *ex);
00156 
00157   virtual ~TAO_AMH_DSI_Exception_Holder (void);
00158 
00159   static TAO_AMH_DSI_Exception_Holder* _downcast ( CORBA::ValueBase* );
00160 
00161   static CORBA::Boolean _tao_unmarshal ( TAO_InputCDR &,
00162                                          TAO_AMH_DSI_Exception_Holder *& );
00163   virtual const char* _tao_obv_repository_id (void) const;
00164   static const char* _tao_obv_static_repository_id (void);
00165 
00166   static void _tao_any_destructor (void *);
00167 
00168   virtual void raise_invoke ( );
00169 
00170   CORBA::TypeCode_ptr _tao_type (void) const;
00171   void _tao_obv_truncatable_repo_ids (Repository_Id_List &) const;
00172   CORBA::Boolean _tao_match_formal_type (ptrdiff_t ) const;
00173 
00174 protected:
00175   TAO_AMH_DSI_Exception_Holder (void);
00176   ///  *** Terrible Hack ? ***
00177   virtual CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &) const;
00178   virtual CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &);
00179 
00180 private:
00181   TAO_AMH_DSI_Exception_Holder (const TAO_AMH_DSI_Exception_Holder &);
00182   void operator= (const TAO_AMH_DSI_Exception_Holder &);
00183   CORBA::Exception *exception_;
00184 
00185 protected:
00186   virtual CORBA::Boolean _tao_marshal__Test_TAO_AMH_DSI_Exception_Holder (
00187               TAO_OutputCDR &);
00188   virtual CORBA::Boolean _tao_unmarshal__Test_TAO_AMH_DSI_Exception_Holder (
00189               TAO_InputCDR &);
00190 };
00191 
00192 /**
00193  * @class TAO_AMH_DSI_Response_Handler
00194  *
00195  * @brief This is the main class for DSI using AMH.
00196  *
00197  * With ordinary DSI, the POA calls _dispatch, which in turn calls invoke
00198  * on the DSI handler. Invoke completely handles the request, and packages
00199  * the result in the request object so that it can be marshalled and sent
00200  * back to the caller.
00201  *
00202  * With the AMH variation, the DSI handler's invoke method starts the
00203  * processing, but delegates the result packaging to a response handler.
00204  * This way, if the invocation takes a long time, or involves blocking
00205  * calls, then the result handling can be managed by another thread.
00206  * This is particularly useful for gateway implementations, where the
00207  * middle tier should not have to block waiting for replies.
00208  *
00209  * As this is built on the CORBA object model, there are separate classes
00210  * representing the interface and the implementation.
00211  *
00212  */
00213 class TAO_DynamicInterface_Export TAO_AMH_DSI_Response_Handler
00214   : public virtual TAO_AMH_Response_Handler
00215 {
00216 public:
00217   typedef TAO_AMH_DSI_Response_Handler_ptr _ptr_type;
00218   typedef TAO_AMH_DSI_Response_Handler_var _var_type;
00219 
00220   TAO_AMH_DSI_Response_Handler (TAO_ServerRequest &sr);
00221   ~TAO_AMH_DSI_Response_Handler (void);
00222 
00223   virtual void invoke_reply (CORBA::NVList_ptr args,
00224                              CORBA::NamedValue_ptr result);
00225 
00226   virtual void invoke_excep ( TAO_AMH_DSI_Exception_Holder * h);
00227 
00228   virtual void gateway_exception_reply (CORBA::ULong reply_status,
00229                                         TAO_OutputCDR &encap);
00230 
00231   virtual void gateway_exception_reply (CORBA::ULong reply_status,
00232                                         TAO_InputCDR &encap);
00233 
00234   /// Returns a CORBA::Object_ptr for the target object.
00235   CORBA::Object_ptr _this ();
00236 
00237   /// CORBA Object related methods
00238   static TAO_AMH_DSI_Response_Handler* _duplicate (
00239              TAO_AMH_DSI_Response_Handler_ptr);
00240   static TAO_AMH_DSI_Response_Handler* _nil (void);
00241   static TAO_AMH_DSI_Response_Handler* _narrow (CORBA::Object_ptr);
00242   static TAO_AMH_DSI_Response_Handler* _unchecked_narrow (CORBA::Object_ptr);
00243 
00244 protected:
00245 
00246   /// Return 0.  Should never be used.
00247   virtual const char *_interface_repository_id (void) const;
00248 
00249   /// Simply returns "this"
00250   virtual void *_downcast (const char *repository_id);
00251 
00252 private:
00253   TAO_ORB_Core *orb_core_;
00254 };
00255 
00256 TAO_END_VERSIONED_NAMESPACE_DECL
00257 
00258 #if defined (__ACE_INLINE__)
00259 # include "AMH_DSI_Response_Handler.inl"
00260 #endif /* __ACE_INLINE__ */
00261 
00262 #include /**/ "ace/post.h"
00263 #endif /* TAO_AMH_DSI_RESPONSE_HANDLER_H */

Generated on Sun Jan 27 13:37:31 2008 for TAO_DynamicInterface by doxygen 1.3.6