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 */