diff options
Diffstat (limited to 'TAO/orbsvcs/examples/ORT/Gateway_i.cpp')
-rw-r--r-- | TAO/orbsvcs/examples/ORT/Gateway_i.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/TAO/orbsvcs/examples/ORT/Gateway_i.cpp b/TAO/orbsvcs/examples/ORT/Gateway_i.cpp new file mode 100644 index 00000000000..f4ce9754556 --- /dev/null +++ b/TAO/orbsvcs/examples/ORT/Gateway_i.cpp @@ -0,0 +1,181 @@ +//$Id$ + +#include "Gateway_i.h" + +#include "tao/AnyTypeCode/Any.h" +#include "tao/AnyTypeCode/NVList.h" +#include "tao/AnyTypeCode/ExceptionA.h" + +#include "tao/IFR_Client/IFR_BasicC.h" + +#include "tao/DynamicInterface/Server_Request.h" +#include "tao/DynamicInterface/Request.h" +#include "tao/DynamicInterface/Unknown_User_Exception.h" + +#include "tao/ORB.h" +#include "tao/LocalObject.h" + +ACE_RCSID (ORT, + Gateway_i, + "$Id$") + +Gateway_i:: +Gateway_i (CORBA::ORB_ptr orb, + PortableServer::Current_ptr poa_current) + : orb_ (orb), + poa_current_ (poa_current) +{ + /// Constructor +} + +void +Gateway_i::invoke (CORBA::ServerRequest_ptr request + ACE_ENV_ARG_DECL) +{ + PortableServer::ObjectId_var target_id = + this->poa_current_->get_object_id (); + + CORBA::String_var stringified_object_id = + PortableServer::ObjectId_to_string (target_id.in ()); + + CORBA::Object_var target_object = + this->orb_->string_to_object (stringified_object_id.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + // Use the IfR interfaces to query the NVList for this object... + CORBA::InterfaceDef_var target_interface = + target_object->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + if (CORBA::is_nil (target_interface.in ())) + { + /// + } + + // This is the target operation... + CORBA::String_var operation_name = + request->operation (); + + CORBA::Contained_var contained_operation = + target_interface->lookup (operation_name.in ()); + + CORBA::OperationDef_var operation = + CORBA::OperationDef::_narrow (contained_operation.in ()); + + // Save the result typecode... + CORBA::TypeCode_var result_typecode = + operation.in ()->result (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + CORBA::ParDescriptionSeq_var parameters = + operation.in ()->params (); + + // Build the NVList based on the info from the IfR + CORBA::NVList_ptr arguments; + this->orb_->create_list (parameters->length (), + arguments + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + CORBA::Flags flags = 0; + + CORBA::ULong length = parameters->length (); + + CORBA::ULong i = 0; + + for (i = 0; i < length; ++i) + { + switch (parameters[i].mode) + { + case CORBA::PARAM_IN: + flags = CORBA::ARG_IN; + break; + case CORBA::PARAM_OUT: + flags = CORBA::ARG_OUT; + break; + case CORBA::PARAM_INOUT: + flags = CORBA::ARG_INOUT; + break; + } + } + + for (i = 0; i != length; ++i) + { + CORBA::Any any; + any._tao_set_typecode (parameters[i].type.in ()); + + arguments->add_value (parameters[i].name, + any, + flags + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } + + // Extract the values of the arguments from the DSI ServerRequest + request->arguments (arguments ACE_ENV_ARG_PARAMETER); + + // Use the NVList (with values) to create a DII Request... + CORBA::Request_var dii_request; + + CORBA::NamedValue *named_value = 0; + + this->orb_->create_named_value (named_value + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + CORBA::ContextList *context_list = 0; + CORBA::ExceptionList *exceptions = 0; + + target_object->_create_request (CORBA::Context::_nil (), + operation_name.in (), + arguments, + named_value, /* Result */ + exceptions, + context_list, /* Context List */ + dii_request.inout (), + CORBA::Flags (0) + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + // Set the return type... + dii_request->set_return_type (result_typecode.in ()); + + ACE_TRY + { + // Make the DII request + dii_request->invoke (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + // At this point the NVList contains all the out and inout + // arguments, but we need to extract the return value... + } + ACE_CATCH (CORBA::UnknownUserException, user_ex) + { + // Pass the exception back to the server request... + request->set_exception (user_ex.exception ()); + return; + } + ACE_CATCH (CORBA::SystemException, sys_ex) + { + CORBA::Any any; + any <<= sys_ex; + // Pass the exception back to the server request... + request->set_exception (any); + return; + } + ACE_CATCHANY; + ACE_ENDTRY; + + request->set_result (dii_request->return_value ()); + // Using the same NVList for both the DSI Server Request and the DII + // Request takes care of the out and inout arguments (whew!) +} + +CORBA::RepositoryId +Gateway_i::_primary_interface (const PortableServer::ObjectId &, + PortableServer::POA_ptr + ACE_ENV_ARG_DECL_NOT_USED) +{ + return 0; +} |