Go to the documentation of this file.00001
00002 #include "tao/Messaging/AMI_Arguments_Converter_Impl.h"
00003 #include "tao/operation_details.h"
00004 #include "tao/SystemException.h"
00005 #include "tao/Pluggable_Messaging_Utils.h"
00006 #include "tao/Reply_Dispatcher.h"
00007 #include "tao/CDR.h"
00008
00009 ACE_RCSID (Messaging,
00010 AMI_Arguments_Converter_Impl,
00011 "$Id: AMI_Arguments_Converter_Impl.cpp 84281 2009-01-30 15:01:17Z wotte $")
00012
00013 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00014
00015 void
00016 TAO_AMI_Arguments_Converter_Impl::convert_request (
00017 TAO_ServerRequest & server_request,
00018 TAO::Argument * const args[],
00019 size_t nargs)
00020 {
00021
00022
00023
00024
00025
00026
00027 TAO_OutputCDR output;
00028 this->dsi_convert_request (server_request, output);
00029
00030 TAO_InputCDR input (output);
00031 for (CORBA::ULong j = 1; j < nargs; ++j)
00032 {
00033 if (!(args[j]->demarshal (input)))
00034 {
00035 TAO_InputCDR::throw_skel_exception (errno);
00036 }
00037 }
00038
00039 TAO_Operation_Details* details
00040 = const_cast <TAO_Operation_Details*> (server_request.operation_details ());
00041
00042 details->use_stub_args (false);
00043 }
00044
00045 void
00046 TAO_AMI_Arguments_Converter_Impl::dsi_convert_request (
00047 TAO_ServerRequest & server_request,
00048 TAO_OutputCDR & output)
00049 {
00050
00051 CORBA::ULong const nrarg = server_request.operation_details ()->args_num ();
00052
00053 for (CORBA::ULong i = 1; i < nrarg; ++i)
00054 {
00055 if (!(server_request.operation_details ()->args()[i])->marshal (output))
00056 {
00057 throw ::CORBA::BAD_PARAM ();
00058 }
00059 }
00060 }
00061
00062 void
00063 TAO_AMI_Arguments_Converter_Impl::convert_reply (
00064 TAO_ServerRequest & server_request,
00065 TAO::Argument * const args[],
00066 size_t nargs)
00067 {
00068 if (server_request.operation_details ()->reply_dispatcher ())
00069 {
00070 TAO_OutputCDR output;
00071 for (CORBA::ULong j = 0; j < nargs; ++j)
00072 {
00073 if (!(args[j]->marshal (output)))
00074 {
00075 TAO_OutputCDR::throw_skel_exception (errno);
00076 }
00077 }
00078 TAO_InputCDR input (output);
00079 this->dsi_convert_reply (server_request, input);
00080 }
00081 }
00082
00083 void
00084 TAO_AMI_Arguments_Converter_Impl::dsi_convert_reply (
00085 TAO_ServerRequest & server_request,
00086 TAO_InputCDR & input)
00087 {
00088 if (server_request.operation_details ()->reply_dispatcher ())
00089 {
00090 TAO_Pluggable_Reply_Params params (0);
00091 params.reply_status (GIOP::NO_EXCEPTION);
00092 params.input_cdr_ = &input;
00093 server_request.operation_details ()->
00094 reply_dispatcher ()->dispatch_reply (params);
00095 }
00096 }
00097
00098 void
00099 TAO_AMI_Arguments_Converter_Impl::handle_corba_exception (
00100 TAO_ServerRequest & server_request,
00101 CORBA::Exception *exception)
00102 {
00103 TAO_OutputCDR output;
00104 TAO_Pluggable_Reply_Params params (0);
00105 exception->_tao_encode (output);
00106 if (CORBA::SystemException::_downcast (exception) != 0)
00107 {
00108 params.reply_status (GIOP::SYSTEM_EXCEPTION);
00109 }
00110 else
00111 {
00112 params.reply_status (GIOP::USER_EXCEPTION);
00113 }
00114 TAO_InputCDR input (output);
00115 params.input_cdr_ = &input;
00116 server_request.operation_details ()->
00117 reply_dispatcher ()->dispatch_reply (params);
00118 }
00119
00120
00121
00122
00123
00124 int
00125 TAO_AMI_Arguments_Converter_Impl::Initializer (void)
00126 {
00127 return ACE_Service_Config::process_directive (
00128 ace_svc_desc_TAO_AMI_Arguments_Converter_Impl);
00129 }
00130
00131
00132
00133 ACE_STATIC_SVC_DEFINE (
00134 TAO_AMI_Arguments_Converter_Impl,
00135 ACE_TEXT ("AMI_Arguments_Converter"),
00136 ACE_SVC_OBJ_T,
00137 &ACE_SVC_NAME (TAO_AMI_Arguments_Converter_Impl),
00138 ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
00139 0
00140 )
00141
00142 ACE_FACTORY_DEFINE (TAO_Messaging, TAO_AMI_Arguments_Converter_Impl)
00143
00144 TAO_END_VERSIONED_NAMESPACE_DECL