#include <Upcall_Wrapper.h>
Public Member Functions | |
void | upcall (TAO_ServerRequest &server_request, TAO::Argument *const args[], size_t nargs, TAO::Upcall_Command &command, void *servant_upcall, CORBA::TypeCode_ptr const *exceptions, CORBA::ULong nexceptions) |
Perform the upcall. | |
Private Member Functions | |
void | pre_upcall (TAO_InputCDR &cdr, TAO::Argument *const *args, size_t nargs) |
Perform pre-upcall operations. | |
void | post_upcall (TAO_OutputCDR &cdr, TAO::Argument *const *args, size_t nargs) |
Perform post-upcall operations. |
Definition at line 52 of file Upcall_Wrapper.h.
void TAO::Upcall_Wrapper::post_upcall | ( | TAO_OutputCDR & | cdr, | |
TAO::Argument *const * | args, | |||
size_t | nargs | |||
) | [private] |
Perform post-upcall operations.
Perform post-upcall operations, including operation INOUT
and OUT
argument marshaling.
Definition at line 244 of file Upcall_Wrapper.cpp.
References TAO_OutputCDR::more_fragments(), post_upcall(), and TAO_OutputCDR::throw_skel_exception().
Referenced by post_upcall().
00247 { 00248 // Marshal the operation "inout" and "out" arguments and return 00249 // value, if any. 00250 00251 TAO::Argument * const * const begin = args; 00252 TAO::Argument * const * const end = args + nargs; 00253 00254 for (TAO::Argument * const * i = begin; i != end; ++i) 00255 { 00256 if (!(*i)->marshal (cdr)) 00257 { 00258 TAO_OutputCDR::throw_skel_exception (errno); 00259 } 00260 } 00261 00262 // Reply body marshaling completed. No other fragments to send. 00263 cdr.more_fragments (false); 00264 }
void TAO::Upcall_Wrapper::pre_upcall | ( | TAO_InputCDR & | cdr, | |
TAO::Argument *const * | args, | |||
size_t | nargs | |||
) | [private] |
Perform pre-upcall operations.
Perform pre-upcall operations, including operation IN
and INOUT
argument demarshaling.
Definition at line 221 of file Upcall_Wrapper.cpp.
References pre_upcall(), and TAO_InputCDR::throw_skel_exception().
Referenced by pre_upcall().
00224 { 00225 // Demarshal the operation "in" and "inout" arguments, if any. 00226 00227 // NOTE: The TAO::Argument corresponding to the return value is 00228 // always the first element in the array, regardless of 00229 // whether or not the return type is void. 00230 00231 TAO::Argument * const * const begin = args + 1; // Skip the return value. 00232 TAO::Argument * const * const end = args + nargs; 00233 00234 for (TAO::Argument * const * i = begin; i != end; ++i) 00235 { 00236 if (!(*i)->demarshal (cdr)) 00237 { 00238 TAO_InputCDR::throw_skel_exception (errno); 00239 } 00240 } 00241 }
TAO_BEGIN_VERSIONED_NAMESPACE_DECL void TAO::Upcall_Wrapper::upcall | ( | TAO_ServerRequest & | server_request, | |
TAO::Argument *const | args[], | |||
size_t | nargs, | |||
TAO::Upcall_Command & | command, | |||
void * | servant_upcall, | |||
CORBA::TypeCode_ptr const * | exceptions, | |||
CORBA::ULong | nexceptions | |||
) |
Perform the upcall.
server_request | Object containing server side messaging operations (e.g. CDR reply construction, etc). | |
args | Operation argument list. | |
nargs | Number of arguments in the operation argument list. | |
command | Command object that performs the actual upcall into the servant. | |
servant_upcall | Object containing information for POA that dispatched the servant. | |
exceptions | Array of user exceptions the operation may raise. | |
nexceptions | The number of exceptions in the operation user exception array. |
Definition at line 29 of file Upcall_Wrapper.cpp.
References SYSTEM_EXCEPTION, and USER_EXCEPTION.
00039 { 00040 if (server_request.collocated () 00041 && server_request.operation_details ()->cac () != 0) 00042 { 00043 server_request.operation_details ()->cac ()->convert_request ( 00044 server_request, args, nargs); 00045 } 00046 00047 if (server_request.incoming ()) 00048 { 00049 this->pre_upcall (*server_request.incoming (), args, nargs); 00050 } 00051 00052 #if TAO_HAS_INTERCEPTORS == 1 00053 00054 // Make sure that, for the collocated case, we use the client-side 00055 // arguments. For the non-collocated case, we will use the server-side 00056 // arguments since they got set up in our pre_upcall() method. Note that 00057 // our pre_upcall() method doesn't get invoked in the collocated case, 00058 // and is the reason why we need to provide the client-side args instead 00059 // of the (never set or initialized) server-side args. 00060 // 00061 // Before the following logic was added, the 00062 // $TAO_ROOT/tests/Portable_Interceptors/Collocated/run_test.pl 00063 // showed that the server-side request interceptor was getting bogus 00064 // values when it took a look at the request arguments. Some 00065 // additional testing revealed that this only occurred in the 00066 // collocated request case. 00067 00068 // By default, we assume that we will use the server-side args. 00069 TAO::Argument * const * the_args = args; 00070 size_t the_nargs = nargs; 00071 00072 if (server_request.collocated()) 00073 { 00074 // It is a collocated request so we need to use the client-side 00075 // args instead. 00076 the_args = server_request.operation_details()->args(); 00077 the_nargs = server_request.operation_details()->args_num(); 00078 } 00079 00080 TAO::ServerRequestInterceptor_Adapter *interceptor_adapter = 00081 server_request.orb_core ()->serverrequestinterceptor_adapter (); 00082 #endif /* TAO_HAS_INTERCEPTORS */ 00083 00084 try 00085 { 00086 { 00087 #if TAO_HAS_INTERCEPTORS == 1 00088 if (interceptor_adapter != 0) 00089 { 00090 // Invoke intermediate server side interception points. 00091 interceptor_adapter->receive_request (server_request, 00092 the_args, 00093 the_nargs, 00094 servant_upcall, 00095 exceptions, 00096 nexceptions); 00097 } 00098 00099 // Don't bother performing the upcall if an interceptor caused a 00100 // location forward. 00101 CORBA::Object_var forward_to = server_request.forward_location (); 00102 if (!server_request.is_forwarded ()) 00103 { 00104 if (interceptor_adapter != 0) 00105 { 00106 interceptor_adapter->execute_command (server_request, command); 00107 } 00108 else 00109 #endif /* TAO_HAS_INTERCEPTORS */ 00110 { 00111 // The actual upcall. 00112 command.execute (); 00113 } 00114 #if TAO_HAS_INTERCEPTORS == 1 00115 } 00116 #endif /* TAO_HAS_INTERCEPTORS */ 00117 } 00118 #if TAO_HAS_INTERCEPTORS == 1 00119 if (interceptor_adapter == 0) 00120 { 00121 server_request.pi_reply_status (PortableInterceptor::SUCCESSFUL); 00122 } 00123 else 00124 { 00125 // Do not execute the send_reply() interception point if an 00126 // interceptor caused a location forward. The send_other() 00127 // interception point should already have been executed by the 00128 // ServerRequestInterceptor_Adapter object. 00129 // 00130 // It should actually be safe to call this interception point, 00131 // regardless, since the interceptor flow stack should have been 00132 // emptied by the send_other() interception point. Note that 00133 // we'd still need to avoid resetting the reply status to 00134 // SUCCESSFUL, however. 00135 CORBA::Object_var forward_to_after = server_request.forward_location (); 00136 if (!server_request.is_forwarded ()) 00137 { 00138 // No location forward by interceptors and successful upcall. 00139 server_request.pi_reply_status (PortableInterceptor::SUCCESSFUL); 00140 interceptor_adapter->send_reply (server_request, 00141 the_args, 00142 the_nargs, 00143 servant_upcall, 00144 exceptions, 00145 nexceptions); 00146 } 00147 } 00148 #endif /* TAO_HAS_INTERCEPTORS */ 00149 } 00150 catch ( ::CORBA::Exception& ex) 00151 { 00152 // Just assume the current exception is a system exception, the 00153 // status can only change when the interceptor changes this 00154 // and this is only done when the sri_adapter is available. If we 00155 // don't have an sri_adapter we just rethrow the exception 00156 PortableInterceptor::ReplyStatus status = 00157 PortableInterceptor::SYSTEM_EXCEPTION; 00158 00159 #if TAO_HAS_INTERCEPTORS == 1 00160 server_request.caught_exception (&ex); 00161 00162 if (interceptor_adapter != 0) 00163 { 00164 interceptor_adapter->send_exception (server_request, 00165 the_args, 00166 the_nargs, 00167 servant_upcall, 00168 exceptions, 00169 nexceptions); 00170 00171 status = server_request.pi_reply_status (); 00172 } 00173 #endif /* TAO_HAS_INTERCEPTORS */ 00174 00175 if (status == PortableInterceptor::SYSTEM_EXCEPTION 00176 || status == PortableInterceptor::USER_EXCEPTION) 00177 { 00178 if (server_request.collocated () 00179 && server_request.operation_details ()->cac () != 0) 00180 { 00181 // If we have a cac it will handle the exception and no 00182 // need to do any further processing 00183 server_request.operation_details ()->cac ()->handle_corba_exception ( 00184 server_request, &ex); 00185 return; 00186 } 00187 else 00188 { 00189 throw; 00190 } 00191 } 00192 } 00193 00194 if (server_request.response_expected () 00195 && !server_request.sync_with_server ()) 00196 { 00197 server_request.init_reply (); 00198 } 00199 00200 #if TAO_HAS_INTERCEPTORS == 1 00201 // Don't bother marshaling inout/out/return values if an interceptor 00202 // caused a location forward. 00203 if (!server_request.is_forwarded ()) 00204 #endif /* TAO_HAS_INTERCEPTORS == 1 */ 00205 { 00206 if (server_request.outgoing ()) 00207 { 00208 this->post_upcall (*server_request.outgoing (), args, nargs); 00209 } 00210 } 00211 00212 if (server_request.collocated () 00213 && server_request.operation_details ()->cac () != 0) 00214 { 00215 server_request.operation_details ()->cac ()->convert_reply ( 00216 server_request, args, nargs); 00217 } 00218 }