00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "orbsvcs/CosEvent/CEC_Event_Loader.h"
00019 #include "ace/Dynamic_Service.h"
00020
00021 #include "orbsvcs/CosNamingC.h"
00022 #include "orbsvcs/CosEvent/CEC_EventChannel.h"
00023 #include "orbsvcs/CosEvent/CEC_Default_Factory.h"
00024
00025 #include "ace/Get_Opt.h"
00026 #include "ace/Argv_Type_Converter.h"
00027 #include "ace/OS_NS_stdio.h"
00028 #include "ace/OS_NS_unistd.h"
00029 #include "tao/debug.h"
00030
00031 ACE_RCSID (CosEvent,
00032 CEC_Event_Loader,
00033 "CEC_Event_Loader.cpp,v 1.33 2006/03/16 15:53:36 sjiang Exp")
00034
00035 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00036
00037 TAO_CEC_Event_Loader::TAO_CEC_Event_Loader (void) :
00038 attributes_ (0)
00039 , factory_ (0)
00040 , ec_impl_ (0)
00041 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00042 , typed_attributes_ (0)
00043 , typed_ec_impl_ (0)
00044 #endif
00045 {
00046
00047 }
00048
00049 TAO_CEC_Event_Loader::~TAO_CEC_Event_Loader (void)
00050 {
00051
00052 }
00053
00054 int
00055 TAO_CEC_Event_Loader::init (int argc, ACE_TCHAR *argv[])
00056 {
00057 ACE_DECLARE_NEW_CORBA_ENV;
00058 ACE_TRY
00059 {
00060
00061 ACE_Argv_Type_Converter command_line(argc, argv);
00062
00063
00064 this->orb_=
00065 CORBA::ORB_init (command_line.get_argc(), command_line.get_ASCII_argv(), 0 ACE_ENV_ARG_PARAMETER);
00066 ACE_TRY_CHECK;
00067
00068 CORBA::Object_var obj =
00069 this->create_object (this->orb_.in (), command_line.get_argc(), command_line.get_TCHAR_argv() ACE_ENV_ARG_PARAMETER);
00070 ACE_TRY_CHECK;
00071
00072 if (CORBA::is_nil (obj.in() ))
00073 return -1;
00074 }
00075 ACE_CATCHANY
00076 {
00077 ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, argv[0]);
00078 return -1;
00079 }
00080 ACE_ENDTRY;
00081 return 0;
00082 }
00083
00084
00085 CORBA::Object_ptr
00086 TAO_CEC_Event_Loader::create_object (CORBA::ORB_ptr orb,
00087 int argc,
00088 ACE_TCHAR *argv[]
00089 ACE_ENV_ARG_DECL)
00090 ACE_THROW_SPEC ((CORBA::SystemException))
00091 {
00092 ACE_TRY
00093 {
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 ACE_Get_Opt get_opt (argc, argv, ACE_TEXT("n:o:p:xrtd"));
00107 int opt;
00108 const ACE_TCHAR *service_name = ACE_TEXT("CosEventService");
00109 const ACE_TCHAR *ior_file = 0;
00110 const ACE_TCHAR *pid_file = 0;
00111 this->bind_to_naming_service_ = 1;
00112 int use_rebind = 0;
00113
00114 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00115
00116 int typed_ec = 0;
00117
00118 int destroy = 0;
00119 #endif
00120
00121 while ((opt = get_opt ()) != EOF)
00122 {
00123 switch (opt)
00124 {
00125 case 'n':
00126 service_name = get_opt.opt_arg ();
00127 break;
00128
00129 case 'o':
00130 ior_file = get_opt.opt_arg ();
00131 break;
00132
00133 case 'p':
00134 pid_file = get_opt.opt_arg ();
00135 break;
00136
00137 case 'x':
00138 this->bind_to_naming_service_ = 0;
00139 break;
00140
00141 case 'r':
00142 use_rebind = 1;
00143 break;
00144
00145 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00146 case 't':
00147 typed_ec = 1;
00148 break;
00149
00150 case 'd':
00151 destroy = 1;
00152 break;
00153 #endif
00154
00155 case '?':
00156 default:
00157 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00158 ACE_DEBUG ((LM_DEBUG,
00159 ACE_TEXT ("Usage: %s ")
00160 ACE_TEXT ("-n service_name ")
00161 ACE_TEXT ("-o ior_file_name ")
00162 ACE_TEXT ("-p pid_file_name ")
00163 ACE_TEXT ("-x [disable naming service bind]")
00164 ACE_TEXT ("-r [rebind, no AlreadyBound failures] ")
00165 ACE_TEXT ("-t [enable typed event channel]")
00166 ACE_TEXT ("-d [destroy typed event channelon shutdown] ")
00167 ACE_TEXT ("\n"),
00168 argv[0]));
00169 #else
00170 ACE_DEBUG ((LM_DEBUG,
00171 ACE_TEXT ("Usage: %s ")
00172 ACE_TEXT ("-n service_name ")
00173 ACE_TEXT ("-o ior_file_name ")
00174 ACE_TEXT ("-p pid_file_name ")
00175 ACE_TEXT ("-x [disable naming service bind] ")
00176 ACE_TEXT ("-r [rebind, no AlreadyBound failures] ")
00177 ACE_TEXT ("\n"),
00178 argv[0]));
00179 #endif
00180 return CORBA::Object::_nil ();
00181 }
00182 }
00183
00184
00185
00186
00187 CORBA::Object_var object =
00188 orb->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER);
00189 ACE_TRY_CHECK;
00190 PortableServer::POA_var poa =
00191 PortableServer::POA::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
00192 ACE_TRY_CHECK;
00193 PortableServer::POAManager_var poa_manager =
00194 poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
00195 ACE_TRY_CHECK;
00196 poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
00197 ACE_TRY_CHECK;
00198
00199
00200
00201
00202
00203 this->terminate_flag_ = 0;
00204
00205 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00206 if (!typed_ec)
00207 {
00208 #endif
00209
00210
00211 this->attributes_ = new TAO_CEC_EventChannel_Attributes(poa.in (),
00212 poa.in ());
00213 this->factory_ = 0;
00214
00215 this->ec_impl_ = new TAO_CEC_EventChannel (*this->attributes_,
00216 this->factory_,
00217 this->terminate_flag_);
00218
00219 this->ec_impl_->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
00220 ACE_TRY_CHECK;
00221
00222 CosEventChannelAdmin::EventChannel_var event_channel =
00223 this->ec_impl_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00224 ACE_TRY_CHECK;
00225
00226 if (ior_file != 0)
00227 {
00228 CORBA::String_var ior =
00229 orb->object_to_string (event_channel.in () ACE_ENV_ARG_PARAMETER);
00230 ACE_TRY_CHECK;
00231
00232 FILE *iorf = ACE_OS::fopen (ior_file, ACE_TEXT("w"));
00233 if (iorf != 0)
00234 {
00235 ACE_OS::fprintf (iorf, "%s\n", ior.in ());
00236 ACE_OS::fclose (iorf);
00237 }
00238 }
00239
00240 if (pid_file != 0)
00241 {
00242 FILE *pidf = ACE_OS::fopen (pid_file, ACE_TEXT("w"));
00243 if (pidf != 0)
00244 {
00245 ACE_OS::fprintf (pidf,
00246 "%ld\n",
00247 static_cast<long> (ACE_OS::getpid ()));
00248 ACE_OS::fclose (pidf);
00249 }
00250 }
00251
00252
00253
00254 this->channel_name_.length (1);
00255
00256 if (this->bind_to_naming_service_)
00257 {
00258 CORBA::Object_var obj =
00259 orb->resolve_initial_references ("NameService"
00260 ACE_ENV_ARG_PARAMETER);
00261 ACE_TRY_CHECK;
00262
00263 this->naming_context_ =
00264 CosNaming::NamingContext::_narrow (obj.in ()
00265 ACE_ENV_ARG_PARAMETER);
00266 ACE_TRY_CHECK;
00267
00268 this->channel_name_.length (1);
00269 this->channel_name_[0].id = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(service_name));
00270
00271 if (use_rebind)
00272 {
00273 this->naming_context_->rebind (this->channel_name_,
00274 event_channel.in ()
00275 ACE_ENV_ARG_PARAMETER);
00276 ACE_TRY_CHECK;
00277 }
00278 else
00279 {
00280 this->naming_context_->bind (this->channel_name_,
00281 event_channel.in ()
00282 ACE_ENV_ARG_PARAMETER);
00283 ACE_TRY_CHECK;
00284 }
00285 }
00286 return CosEventChannelAdmin::EventChannel::_duplicate (event_channel.in () );
00287
00288 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00289 }
00290 else
00291 {
00292
00293
00294
00295
00296 if (TAO_debug_level >= 10)
00297 {
00298 ACE_DEBUG ((LM_DEBUG,
00299 ACE_TEXT ("***** Initializing the IFR connection... *****\n")));
00300 }
00301
00302 CORBA::Repository_var interface_repository;
00303
00304 CORBA::Object_var ifr_obj_var =
00305 orb->resolve_initial_references ("InterfaceRepository" ACE_ENV_ARG_PARAMETER);
00306 ACE_TRY_CHECK;
00307
00308 if (CORBA::is_nil(ifr_obj_var.in () ))
00309 {
00310 if (TAO_debug_level >= 10)
00311 {
00312 ACE_DEBUG ((LM_DEBUG,
00313 ACE_TEXT ("***** resolve_initial_references for IFR failed\n *****")));
00314 }
00315 return CORBA::Object::_nil ();
00316 }
00317 else
00318 {
00319 interface_repository = CORBA::Repository::_narrow(ifr_obj_var.in ()
00320 ACE_ENV_ARG_PARAMETER);
00321 ACE_TRY_CHECK;
00322
00323 if (CORBA::is_nil(interface_repository.in () ))
00324 {
00325 if (TAO_debug_level >= 10)
00326 {
00327 ACE_DEBUG ((LM_DEBUG,
00328 ACE_TEXT ("***** CORBA::Repository::_narrow failed *****\n")));
00329 }
00330 return CORBA::Object::_nil ();
00331 }
00332 else
00333 {
00334 if (TAO_debug_level >= 10)
00335 {
00336 ACE_DEBUG ((LM_DEBUG,
00337 ACE_TEXT ("***** ...IFR connection completed *****\n")));
00338 }
00339 }
00340 }
00341
00342
00343 this->typed_attributes_ = new TAO_CEC_TypedEventChannel_Attributes(poa.in (),
00344 poa.in (),
00345 orb,
00346 interface_repository.in ());
00347 if (destroy == 1)
00348 {
00349 this->typed_attributes_->destroy_on_shutdown = 1;
00350 }
00351
00352 this->factory_ = 0;
00353
00354 this->typed_ec_impl_ = new TAO_CEC_TypedEventChannel (*this->typed_attributes_,
00355 this->factory_,
00356 this->terminate_flag_);
00357
00358 this->typed_ec_impl_->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
00359 ACE_TRY_CHECK;
00360
00361 CosTypedEventChannelAdmin::TypedEventChannel_var event_channel =
00362 this->typed_ec_impl_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00363 ACE_TRY_CHECK;
00364
00365 if (ior_file != 0)
00366 {
00367 CORBA::String_var ior =
00368 orb->object_to_string (event_channel.in () ACE_ENV_ARG_PARAMETER);
00369 ACE_TRY_CHECK;
00370
00371 FILE *iorf = ACE_OS::fopen (ior_file, ACE_TEXT("w"));
00372 if (iorf != 0)
00373 {
00374 ACE_OS::fprintf (iorf, "%s\n", ior.in ());
00375 ACE_OS::fclose (iorf);
00376 }
00377 }
00378
00379 if (pid_file != 0)
00380 {
00381 FILE *pidf = ACE_OS::fopen (pid_file, ACE_TEXT("w"));
00382 if (pidf != 0)
00383 {
00384 ACE_OS::fprintf (pidf,
00385 "%ld\n",
00386 static_cast<long> (ACE_OS::getpid ()));
00387 ACE_OS::fclose (pidf);
00388 }
00389 }
00390
00391
00392
00393 this->channel_name_.length (1);
00394
00395 if (this->bind_to_naming_service_)
00396 {
00397 CORBA::Object_var obj =
00398 orb->resolve_initial_references ("NameService"
00399 ACE_ENV_ARG_PARAMETER);
00400 ACE_TRY_CHECK;
00401
00402 this->naming_context_ =
00403 CosNaming::NamingContext::_narrow (obj.in ()
00404 ACE_ENV_ARG_PARAMETER);
00405 ACE_TRY_CHECK;
00406
00407 this->channel_name_.length (1);
00408 this->channel_name_[0].id = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(service_name));
00409
00410 if (use_rebind)
00411 {
00412 this->naming_context_->rebind (this->channel_name_,
00413 event_channel.in ()
00414 ACE_ENV_ARG_PARAMETER);
00415 ACE_TRY_CHECK;
00416 }
00417 else
00418 {
00419 this->naming_context_->bind (this->channel_name_,
00420 event_channel.in ()
00421 ACE_ENV_ARG_PARAMETER);
00422 ACE_TRY_CHECK;
00423 }
00424 }
00425 return CosTypedEventChannelAdmin::TypedEventChannel::_duplicate (event_channel.in () );
00426 }
00427 #endif
00428
00429
00430 }
00431 ACE_CATCHANY
00432 {
00433 ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, argv[0]);
00434 return CORBA::Object::_nil ();
00435 }
00436 ACE_ENDTRY;
00437 }
00438
00439 int
00440 TAO_CEC_Event_Loader::fini (void)
00441 {
00442
00443
00444
00445 ACE_DECLARE_NEW_CORBA_ENV;
00446 ACE_TRY
00447 {
00448 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00449 if(this->typed_ec_impl_)
00450 {
00451
00452 this->typed_ec_impl_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
00453 ACE_TRY_CHECK;
00454
00455
00456
00457 PortableServer::POA_var t_poa =
00458 this->typed_ec_impl_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
00459 ACE_TRY_CHECK;
00460
00461 PortableServer::ObjectId_var t_id =
00462 t_poa->servant_to_id (this->typed_ec_impl_ ACE_ENV_ARG_PARAMETER);
00463 ACE_TRY_CHECK;
00464
00465 t_poa->deactivate_object (t_id.in () ACE_ENV_ARG_PARAMETER);
00466 ACE_TRY_CHECK;
00467 }
00468 #else
00469
00470 this->ec_impl_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
00471 ACE_TRY_CHECK;
00472
00473
00474 PortableServer::POA_var poa =
00475 this->ec_impl_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
00476 ACE_TRY_CHECK;
00477
00478 PortableServer::ObjectId_var id =
00479 poa->servant_to_id (this->ec_impl_ ACE_ENV_ARG_PARAMETER);
00480 ACE_TRY_CHECK;
00481
00482 poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
00483 ACE_TRY_CHECK;
00484 #endif
00485 }
00486 ACE_CATCHANY
00487 {
00488
00489 }
00490 ACE_ENDTRY;
00491 ACE_CHECK_RETURN (-1);
00492
00493 ACE_TRY_EX (foo)
00494 {
00495
00496 if (this->bind_to_naming_service_)
00497 {
00498 this->naming_context_->unbind (this->channel_name_
00499 ACE_ENV_ARG_PARAMETER);
00500 ACE_TRY_CHECK_EX (foo);
00501 }
00502
00503 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00504
00505 delete this->typed_attributes_;
00506 delete this->typed_ec_impl_;
00507 #endif
00508 delete this->attributes_;
00509 delete this->ec_impl_;
00510 }
00511 ACE_CATCHANY
00512 {
00513
00514 return -1;
00515 }
00516 ACE_ENDTRY;
00517 ACE_CHECK_RETURN (-1);
00518
00519 return 0;
00520 }
00521
00522 TAO_END_VERSIONED_NAMESPACE_DECL
00523
00524 ACE_FACTORY_DEFINE (TAO_Event_Serv, TAO_CEC_Event_Loader)