Go to the documentation of this file.00001
00002
00003 #include "tao/IFR_Client/IFR_Client_Adapter_Impl.h"
00004 #include "tao/IFR_Client/IFR_BasicC.h"
00005
00006 #include "tao/AnyTypeCode/NVList.h"
00007 #include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
00008
00009 #include "tao/ORB_Core.h"
00010 #include "tao/ORB.h"
00011 #include "tao/Invocation_Adapter.h"
00012 #include "tao/Stub.h"
00013
00014 ACE_RCSID (IFR_Client,
00015 IFR_Client_Adapter_Impl,
00016 "$Id: IFR_Client_Adapter_Impl.cpp 89975 2010-04-23 08:27:53Z johnnyw $")
00017
00018 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00019
00020 namespace TAO
00021 {
00022 template<>
00023 class TAO_IFR_Client_Export Arg_Traits<CORBA::InterfaceDef>
00024 : public
00025 Object_Arg_Traits_T<
00026 CORBA::InterfaceDef_ptr,
00027 CORBA::InterfaceDef_var,
00028 CORBA::InterfaceDef_out,
00029 TAO::Objref_Traits<CORBA::InterfaceDef>,
00030 TAO::Any_Insert_Policy_Stream
00031 >
00032 {
00033 };
00034 }
00035
00036 TAO_IFR_Client_Adapter_Impl::~TAO_IFR_Client_Adapter_Impl (void)
00037 {
00038 }
00039
00040 CORBA::Boolean
00041 TAO_IFR_Client_Adapter_Impl::interfacedef_cdr_insert (
00042 TAO_OutputCDR &cdr,
00043 CORBA::InterfaceDef_ptr object_type
00044 )
00045 {
00046 return cdr << object_type;
00047 }
00048
00049 void
00050 TAO_IFR_Client_Adapter_Impl::interfacedef_any_insert (
00051 CORBA::Any *any,
00052 CORBA::InterfaceDef_ptr object_type
00053 )
00054 {
00055 (*any) <<= object_type;
00056 }
00057
00058 void
00059 TAO_IFR_Client_Adapter_Impl::dispose (
00060 CORBA::InterfaceDef_ptr orphan
00061 )
00062 {
00063 ::CORBA::release (orphan);
00064 }
00065
00066 CORBA::InterfaceDef_ptr
00067 TAO_IFR_Client_Adapter_Impl::get_interface (
00068 CORBA::ORB_ptr orb,
00069 const char *repo_id
00070
00071 )
00072 {
00073 CORBA::Object_var obj =
00074 orb->resolve_initial_references ("InterfaceRepository"
00075 );
00076
00077 if (CORBA::is_nil (obj.in ()))
00078 {
00079 throw ::CORBA::INTF_REPOS ();
00080 }
00081
00082 CORBA::Repository_var repo =
00083 CORBA::Repository::_narrow (obj.in ()
00084 );
00085
00086 if (CORBA::is_nil (repo.in ()))
00087 {
00088 throw ::CORBA::INTF_REPOS ();
00089 }
00090
00091 CORBA::Contained_var result = repo->lookup_id (repo_id
00092 );
00093
00094 if (CORBA::is_nil (result.in ()))
00095 {
00096 return CORBA::InterfaceDef::_nil ();
00097 }
00098 else
00099 {
00100 return CORBA::InterfaceDef::_narrow (result.in ()
00101 );
00102 }
00103 }
00104
00105 CORBA::InterfaceDef_ptr
00106 TAO_IFR_Client_Adapter_Impl::get_interface_remote (
00107 CORBA::Object_ptr target
00108
00109 )
00110 {
00111 TAO::Arg_Traits<CORBA::InterfaceDef>::ret_val _tao_retval;
00112
00113 TAO::Argument *_tao_signature [] =
00114 {
00115 &_tao_retval
00116 };
00117
00118 TAO::Invocation_Adapter _tao_call (
00119 target,
00120 _tao_signature,
00121 1,
00122 "_interface",
00123 10,
00124 0
00125 );
00126
00127 try
00128 {
00129 _tao_call.invoke (0, 0);
00130 }
00131 catch (const ::CORBA::OBJECT_NOT_EXIST&)
00132 {
00133 return CORBA::InterfaceDef::_nil ();
00134 }
00135
00136 return _tao_retval.retn ();
00137 }
00138
00139 #if (TAO_HAS_MINIMUM_CORBA == 0) && !defined (CORBA_E_COMPACT) && !defined (CORBA_E_MICRO)
00140 void
00141 TAO_IFR_Client_Adapter_Impl::create_operation_list (
00142 CORBA::ORB_ptr orb,
00143 CORBA::OperationDef_ptr opDef,
00144 CORBA::NVList_ptr &result
00145
00146 )
00147 {
00148
00149 orb->create_list (0,
00150 result
00151 );
00152
00153
00154
00155 CORBA::ParDescriptionSeq_var params =
00156 opDef->params ();
00157
00158 CORBA::ULong paramCount = params->length ();
00159
00160 for (CORBA::ULong i = 0; i < paramCount; ++i)
00161 {
00162 CORBA::Any value;
00163 TAO::Unknown_IDL_Type *unk = 0;
00164 ACE_NEW (unk,
00165 TAO::Unknown_IDL_Type (params[i].type.in ()));
00166 value.replace (unk);
00167
00168
00169 CORBA::Flags flags = 0;
00170 switch(params[i].mode)
00171 {
00172 case CORBA::PARAM_IN:
00173 flags = CORBA::ARG_IN;
00174 break;
00175 case CORBA::PARAM_OUT:
00176 flags = CORBA::ARG_OUT;
00177 break;
00178 case CORBA::PARAM_INOUT:
00179 flags = CORBA::ARG_INOUT;
00180 break;
00181 default:
00182
00183 throw ::CORBA::INTERNAL();
00184 }
00185
00186
00187 result->add_value (params[i].name.in (),
00188 value,
00189 flags);
00190 }
00191 }
00192
00193 #endif
00194
00195
00196
00197
00198 int
00199 TAO_IFR_Client_Adapter_Impl::Initializer (void)
00200 {
00201 TAO_ORB_Core::ifr_client_adapter_name ("Concrete_IFR_Client_Adapter");
00202
00203 return ACE_Service_Config::process_directive (ace_svc_desc_TAO_IFR_Client_Adapter_Impl);
00204 }
00205
00206
00207 ACE_STATIC_SVC_DEFINE (
00208 TAO_IFR_Client_Adapter_Impl,
00209 ACE_TEXT ("Concrete_IFR_Client_Adapter"),
00210 ACE_SVC_OBJ_T,
00211 &ACE_SVC_NAME (TAO_IFR_Client_Adapter_Impl),
00212 ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
00213 0
00214 )
00215
00216 ACE_FACTORY_DEFINE (TAO_IFR_Client, TAO_IFR_Client_Adapter_Impl)
00217 TAO_END_VERSIONED_NAMESPACE_DECL