00001
00002
00003
00004
00005
00006
00007 #include "tao/DynamicInterface/DII_CORBA_methods.h"
00008
00009 #include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
00010 #include "orbsvcs/CosEvent/CEC_Dispatching.h"
00011 #include "orbsvcs/CosEvent/CEC_EventChannel.h"
00012 #include "orbsvcs/CosEvent/CEC_ConsumerControl.h"
00013 #include "orbsvcs/ESF/ESF_RefCount_Guard.h"
00014 #include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h"
00015 #include "tao/debug.h"
00016 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00017 #include "orbsvcs/CosEvent/CEC_TypedEvent.h"
00018 #include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
00019 #include "tao/DynamicInterface/Request.h"
00020 #endif
00021
00022 #include "tao/debug.h"
00023 #include "ace/Reverse_Lock_T.h"
00024
00025 #if ! defined (__ACE_INLINE__)
00026 #include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.i"
00027 #endif
00028
00029 ACE_RCSID (CosEvent,
00030 CEC_ProxyPushSupplier,
00031 "CEC_ProxyPushSupplier.cpp,v 1.31 2006/04/19 12:36:57 jwillemsen Exp")
00032
00033 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00034
00035 typedef ACE_Reverse_Lock<ACE_Lock> TAO_CEC_Unlock;
00036
00037
00038 TAO_CEC_ProxyPushSupplier::TAO_CEC_ProxyPushSupplier (TAO_CEC_EventChannel* ec)
00039 : event_channel_ (ec),
00040 refcount_ (1)
00041 {
00042 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00043 typed_event_channel_ = 0;
00044 #endif
00045
00046 this->lock_ =
00047 this->event_channel_->create_supplier_lock ();
00048
00049 this->default_POA_ =
00050 this->event_channel_->supplier_poa ();
00051
00052 this->event_channel_->get_servant_retry_map ().bind (this, 0);
00053 }
00054
00055
00056 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00057 TAO_CEC_ProxyPushSupplier::TAO_CEC_ProxyPushSupplier (TAO_CEC_TypedEventChannel* ec)
00058 : typed_event_channel_ (ec),
00059 refcount_ (1)
00060 {
00061 event_channel_ = 0;
00062
00063 this->lock_ =
00064 this->typed_event_channel_->create_supplier_lock ();
00065
00066 this->default_POA_ =
00067 this->typed_event_channel_->typed_supplier_poa ();
00068
00069 this->typed_event_channel_->get_servant_retry_map ().bind (this, 0);
00070 }
00071 #endif
00072
00073 TAO_CEC_ProxyPushSupplier::~TAO_CEC_ProxyPushSupplier (void)
00074 {
00075 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00076 if (this->is_typed_ec () )
00077 {
00078 this->typed_event_channel_->get_servant_retry_map ().unbind (this);
00079 this->typed_event_channel_->destroy_supplier_lock (this->lock_);
00080 }
00081 else
00082 {
00083 this->event_channel_->get_servant_retry_map ().unbind (this);
00084 this->event_channel_->destroy_supplier_lock (this->lock_);
00085 }
00086 #else
00087 this->event_channel_->get_servant_retry_map ().unbind (this);
00088 this->event_channel_->destroy_supplier_lock (this->lock_);
00089 #endif
00090 }
00091
00092 void
00093 TAO_CEC_ProxyPushSupplier::activate (
00094 CosEventChannelAdmin::ProxyPushSupplier_ptr &activated_proxy
00095 ACE_ENV_ARG_DECL)
00096 ACE_THROW_SPEC ((CORBA::SystemException))
00097 {
00098 CosEventChannelAdmin::ProxyPushSupplier_var result;
00099 ACE_TRY
00100 {
00101 result = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00102 ACE_TRY_CHECK;
00103 }
00104 ACE_CATCHANY
00105 {
00106 result = CosEventChannelAdmin::ProxyPushSupplier::_nil ();
00107 }
00108 ACE_ENDTRY;
00109 activated_proxy = result._retn ();
00110 }
00111
00112 void
00113 TAO_CEC_ProxyPushSupplier::deactivate (ACE_ENV_SINGLE_ARG_DECL)
00114 ACE_THROW_SPEC ((CORBA::SystemException))
00115 {
00116 ACE_TRY
00117 {
00118 PortableServer::POA_var poa =
00119 this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
00120 ACE_TRY_CHECK;
00121 PortableServer::ObjectId_var id =
00122 poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
00123 ACE_TRY_CHECK;
00124 poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
00125 ACE_TRY_CHECK;
00126 }
00127 ACE_CATCHANY
00128 {
00129
00130
00131
00132
00133 }
00134 ACE_ENDTRY;
00135 }
00136
00137 void
00138 TAO_CEC_ProxyPushSupplier::shutdown (ACE_ENV_SINGLE_ARG_DECL)
00139 {
00140 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00141 if (this->is_typed_ec () )
00142 {
00143
00144
00145 CosTypedEventComm::TypedPushConsumer_var typed_consumer;
00146 {
00147 ACE_GUARD_THROW_EX (
00148 ACE_Lock, ace_mon, *this->lock_,
00149 CORBA::INTERNAL ());
00150
00151 ACE_CHECK;
00152
00153 typed_consumer = this->typed_consumer_._retn ();
00154 }
00155
00156 this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
00157 ACE_CHECK;
00158
00159 if (CORBA::is_nil (typed_consumer.in ()))
00160 return;
00161
00162 ACE_TRY_EX (typed)
00163 {
00164 typed_consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
00165 ACE_TRY_CHECK_EX (typed);
00166 }
00167 ACE_CATCHANY
00168 {
00169
00170
00171 }
00172 ACE_ENDTRY;
00173 }
00174 else
00175 {
00176 #endif
00177
00178
00179
00180 CosEventComm::PushConsumer_var consumer;
00181
00182 {
00183 ACE_GUARD_THROW_EX (
00184 ACE_Lock, ace_mon, *this->lock_,
00185 CORBA::INTERNAL ());
00186
00187 ACE_CHECK;
00188
00189 consumer = this->consumer_._retn ();
00190 }
00191
00192 this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
00193 ACE_CHECK;
00194
00195 if (CORBA::is_nil (consumer.in ()))
00196 return;
00197
00198 ACE_TRY
00199 {
00200 consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
00201 ACE_TRY_CHECK;
00202 }
00203 ACE_CATCHANY
00204 {
00205
00206
00207 }
00208 ACE_ENDTRY;
00209 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00210 }
00211 #endif
00212 }
00213
00214 typedef TAO_ESF_Proxy_RefCount_Guard<TAO_CEC_EventChannel,TAO_CEC_ProxyPushSupplier> Destroy_Guard;
00215
00216 void
00217 TAO_CEC_ProxyPushSupplier::push (const CORBA::Any &event
00218 ACE_ENV_ARG_DECL)
00219 {
00220 Destroy_Guard auto_destroy (this->refcount_,
00221 this->event_channel_,
00222 this);
00223
00224 {
00225 ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
00226
00227 if (this->is_connected_i () == 0)
00228 return;
00229
00230 TAO_ESF_RefCount_Guard<CORBA::ULong> cnt_mon (this->refcount_);
00231
00232 {
00233 TAO_CEC_Unlock reverse_lock (*this->lock_);
00234
00235 ACE_GUARD (TAO_CEC_Unlock, ace_mon, reverse_lock);
00236 this->event_channel_->dispatching ()->push (this,
00237 event
00238 ACE_ENV_ARG_PARAMETER);
00239 ACE_CHECK;
00240 }
00241 }
00242 }
00243
00244 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00245 typedef TAO_ESF_Proxy_RefCount_Guard<TAO_CEC_TypedEventChannel,TAO_CEC_ProxyPushSupplier> Destroy_Guard_Typed;
00246
00247 void
00248 TAO_CEC_ProxyPushSupplier::invoke (const TAO_CEC_TypedEvent& typed_event
00249 ACE_ENV_ARG_DECL)
00250 {
00251 Destroy_Guard_Typed auto_destroy (this->refcount_,
00252 this->typed_event_channel_,
00253 this);
00254 {
00255
00256 ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
00257
00258 if (this->is_connected_i () == 0)
00259 return;
00260
00261 TAO_ESF_RefCount_Guard<CORBA::ULong> cnt_mon (this->refcount_);
00262
00263 {
00264 TAO_CEC_Unlock reverse_lock (*this->lock_);
00265
00266 ACE_GUARD (TAO_CEC_Unlock, ace_mon, reverse_lock);
00267 this->typed_event_channel_->dispatching ()->invoke (this,
00268 typed_event
00269 ACE_ENV_ARG_PARAMETER);
00270 ACE_CHECK;
00271 }
00272 }
00273 }
00274 #endif
00275
00276 void
00277 TAO_CEC_ProxyPushSupplier::push_nocopy (CORBA::Any &event
00278 ACE_ENV_ARG_DECL)
00279 {
00280 Destroy_Guard auto_destroy (this->refcount_,
00281 this->event_channel_,
00282 this);
00283
00284 {
00285 ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
00286
00287 if (this->is_connected_i () == 0)
00288 return;
00289
00290 TAO_ESF_RefCount_Guard<CORBA::ULong> cnt_mon (this->refcount_);
00291
00292 {
00293 TAO_CEC_Unlock reverse_lock (*this->lock_);
00294
00295 ACE_GUARD (TAO_CEC_Unlock, ace_mon, reverse_lock);
00296 this->event_channel_->dispatching ()->push_nocopy (this,
00297 event
00298 ACE_ENV_ARG_PARAMETER);
00299 ACE_CHECK;
00300 }
00301 }
00302 }
00303
00304 void
00305 TAO_CEC_ProxyPushSupplier::cleanup_i (void)
00306 {
00307 this->consumer_ =
00308 CosEventComm::PushConsumer::_nil ();
00309 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00310 this->typed_consumer_ =
00311 CosTypedEventComm::TypedPushConsumer::_nil ();
00312 #endif
00313 }
00314
00315 CORBA::ULong
00316 TAO_CEC_ProxyPushSupplier::_incr_refcnt (void)
00317 {
00318 ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
00319 return this->refcount_++;
00320 }
00321
00322 CORBA::ULong
00323 TAO_CEC_ProxyPushSupplier::_decr_refcnt (void)
00324 {
00325 {
00326 ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
00327 --this->refcount_;
00328 if (this->refcount_ != 0)
00329 return this->refcount_;
00330 }
00331
00332
00333 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00334 if (this->is_typed_ec () )
00335 {
00336 this->typed_event_channel_->destroy_proxy (this);
00337 }
00338 else
00339 {
00340 this->event_channel_->destroy_proxy (this);
00341 }
00342 #else
00343 this->event_channel_->destroy_proxy (this);
00344 #endif
00345 return 0;
00346 }
00347
00348 void
00349 TAO_CEC_ProxyPushSupplier::connect_push_consumer (
00350 CosEventComm::PushConsumer_ptr push_consumer
00351 ACE_ENV_ARG_DECL)
00352 ACE_THROW_SPEC ((CORBA::SystemException,
00353 CosEventChannelAdmin::AlreadyConnected,
00354 CosEventChannelAdmin::TypeError))
00355 {
00356
00357 if (CORBA::is_nil (push_consumer))
00358 ACE_THROW (CORBA::BAD_PARAM ());
00359
00360 {
00361
00362 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00363
00364 if (this->is_typed_ec () )
00365 {
00366 if (TAO_debug_level >= 10)
00367 {
00368 ACE_DEBUG ((LM_DEBUG,
00369 ACE_TEXT ("***** connect_push_consumer, ")
00370 ACE_TEXT ("Event channel is typed *****\n")));
00371 }
00372
00373
00374
00375
00376
00377 CosTypedEventComm::TypedPushConsumer_var local_typed_consumer =
00378 CosTypedEventComm::TypedPushConsumer::_narrow (push_consumer
00379 ACE_ENV_ARG_PARAMETER);
00380 ACE_CHECK;
00381
00382
00383 CORBA::Object_var local_typed_consumer_obj =
00384 CORBA::Object::_duplicate (local_typed_consumer->get_typed_consumer (
00385 ACE_ENV_SINGLE_ARG_PARAMETER) );
00386 ACE_CHECK;
00387
00388 {
00389 ACE_GUARD_THROW_EX (
00390 ACE_Lock, ace_mon, *this->lock_,
00391 CORBA::INTERNAL ());
00392
00393 ACE_CHECK;
00394
00395 if (this->is_connected_i ())
00396 {
00397 if (this->typed_event_channel_->consumer_reconnect () == 0)
00398 ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
00399
00400
00401 this->cleanup_i ();
00402
00403 this->typed_consumer_ =
00404 CosTypedEventComm::TypedPushConsumer::_duplicate (local_typed_consumer.in () );
00405 ACE_CHECK;
00406
00407 TAO_CEC_Unlock reverse_lock (*this->lock_);
00408
00409 {
00410 ACE_GUARD_THROW_EX (
00411 TAO_CEC_Unlock, ace_mon, reverse_lock,
00412 CORBA::INTERNAL ());
00413
00414 ACE_CHECK;
00415
00416 this->typed_event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
00417 ACE_CHECK;
00418 }
00419 return;
00420
00421 }
00422
00423 this->typed_consumer_ =
00424 CosTypedEventComm::TypedPushConsumer::_duplicate (local_typed_consumer.in () );
00425 ACE_CHECK;
00426
00427
00428 this->typed_consumer_obj_ =
00429 CORBA::Object::_duplicate (local_typed_consumer_obj.in () );
00430 ACE_CHECK;
00431 }
00432
00433
00434 this->typed_event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
00435 ACE_CHECK;
00436
00437 }
00438 else
00439 {
00440 #endif
00441
00442 if (TAO_debug_level >= 10)
00443 {
00444 ACE_DEBUG ((LM_DEBUG,
00445 ACE_TEXT ("***** connect_push_consumer, ")
00446 ACE_TEXT ("Event channel is un-typed *****\n")));
00447 }
00448
00449 {
00450
00451 ACE_GUARD_THROW_EX (
00452 ACE_Lock, ace_mon, *this->lock_,
00453 CORBA::INTERNAL ());
00454
00455 ACE_CHECK;
00456
00457 if (this->is_connected_i ())
00458 {
00459 if (this->event_channel_->consumer_reconnect () == 0)
00460 ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
00461
00462
00463 this->cleanup_i ();
00464
00465 this->consumer_ =
00466 CosEventComm::PushConsumer::_duplicate (push_consumer);
00467
00468 TAO_CEC_Unlock reverse_lock (*this->lock_);
00469
00470 {
00471 ACE_GUARD_THROW_EX (
00472 TAO_CEC_Unlock, ace_mon, reverse_lock,
00473 CORBA::INTERNAL ());
00474
00475 ACE_CHECK;
00476
00477 this->event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
00478 ACE_CHECK;
00479 }
00480 return;
00481 }
00482
00483 this->consumer_ =
00484 CosEventComm::PushConsumer::_duplicate (push_consumer);
00485 }
00486
00487
00488 this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
00489 ACE_CHECK;
00490
00491 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00492 }
00493 #endif
00494 }
00495 }
00496
00497 void
00498 TAO_CEC_ProxyPushSupplier::disconnect_push_supplier (
00499 ACE_ENV_SINGLE_ARG_DECL)
00500 ACE_THROW_SPEC ((CORBA::SystemException))
00501 {
00502 CosEventComm::PushConsumer_var consumer;
00503 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00504 CosTypedEventComm::TypedPushConsumer_var typed_consumer;
00505 #endif
00506
00507 {
00508 ACE_GUARD_THROW_EX (
00509 ACE_Lock, ace_mon, *this->lock_,
00510 CORBA::INTERNAL ());
00511
00512 ACE_CHECK;
00513
00514 if (this->is_connected_i () == 0)
00515 ACE_THROW (CORBA::BAD_INV_ORDER ());
00516
00517 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00518 if (this->is_typed_ec () )
00519 {
00520 typed_consumer = this->typed_consumer_._retn ();
00521 }
00522 else
00523 {
00524 consumer = this->consumer_._retn ();
00525 }
00526 #else
00527 consumer = this->consumer_._retn ();
00528 #endif
00529
00530 this->cleanup_i ();
00531 }
00532
00533
00534 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00535 if (this->is_typed_ec () )
00536 {
00537 this->typed_event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
00538 ACE_CHECK;
00539 }
00540 else
00541 {
00542 this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
00543 ACE_CHECK;
00544 }
00545 #else
00546 this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
00547 ACE_CHECK;
00548 #endif
00549
00550
00551 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00552 if (this->is_typed_ec () )
00553 {
00554 if (this->typed_event_channel_->disconnect_callbacks ())
00555 {
00556 ACE_TRY_EX (typed)
00557 {
00558 typed_consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
00559 ACE_TRY_CHECK_EX (typed);
00560 }
00561 ACE_CATCHANY
00562 {
00563
00564
00565 ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00566 "ProxySupplier::disconnect_push_supplier");
00567 }
00568 ACE_ENDTRY;
00569 }
00570 }
00571 else
00572 {
00573 #endif
00574
00575 if (this->event_channel_->disconnect_callbacks ())
00576 {
00577 ACE_TRY
00578 {
00579 consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
00580 ACE_TRY_CHECK;
00581 }
00582 ACE_CATCHANY
00583 {
00584
00585
00586 ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00587 "ProxySupplier::disconnect_push_supplier");
00588 }
00589 ACE_ENDTRY;
00590 }
00591
00592 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00593 }
00594 #endif
00595 }
00596
00597 void
00598 TAO_CEC_ProxyPushSupplier::push_to_consumer (const CORBA::Any& event
00599 ACE_ENV_ARG_DECL)
00600 {
00601 CosEventComm::PushConsumer_var consumer;
00602 {
00603 ACE_GUARD_THROW_EX (
00604 ACE_Lock, ace_mon, *this->lock_,
00605 CORBA::INTERNAL ());
00606
00607 ACE_CHECK;
00608
00609 if (this->is_connected_i () == 0)
00610 return;
00611
00612 consumer =
00613 CosEventComm::PushConsumer::_duplicate (this->consumer_.in ());
00614 }
00615
00616 TAO_CEC_ConsumerControl *control =
00617 this->event_channel_->consumer_control ();
00618 ACE_TRY
00619 {
00620 consumer->push (event ACE_ENV_ARG_PARAMETER);
00621 ACE_TRY_CHECK;
00622
00623
00624 control->successful_transmission(this);
00625 }
00626 ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
00627 {
00628 control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
00629 ACE_TRY_CHECK;
00630 }
00631 ACE_CATCH (CORBA::SystemException, sysex)
00632 {
00633 control->system_exception (this,
00634 sysex
00635 ACE_ENV_ARG_PARAMETER);
00636 ACE_TRY_CHECK;
00637 }
00638 ACE_CATCHANY
00639 {
00640
00641 }
00642 ACE_ENDTRY;
00643 }
00644
00645 void
00646 TAO_CEC_ProxyPushSupplier::reactive_push_to_consumer (
00647 const CORBA::Any& event
00648 ACE_ENV_ARG_DECL)
00649 {
00650 CosEventComm::PushConsumer_var consumer;
00651 {
00652 ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
00653 if (this->is_connected_i () == 0)
00654 return;
00655
00656 consumer =
00657 CosEventComm::PushConsumer::_duplicate (this->consumer_.in ());
00658 }
00659
00660 TAO_CEC_ConsumerControl *control =
00661 this->event_channel_->consumer_control ();
00662
00663 ACE_TRY
00664 {
00665 consumer->push (event ACE_ENV_ARG_PARAMETER);
00666 ACE_TRY_CHECK;
00667
00668
00669 control->successful_transmission(this);
00670 }
00671 ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
00672 {
00673 if (TAO_debug_level >= 4)
00674 {
00675 ACE_PRINT_EXCEPTION (not_used, "during TAO_CEC_ProxyPushSupplier::reactive_push_to_consumer");
00676 }
00677 control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
00678 ACE_TRY_CHECK;
00679 }
00680 ACE_CATCH (CORBA::SystemException, sysex)
00681 {
00682 if (TAO_debug_level >= 4)
00683 {
00684 ACE_PRINT_EXCEPTION (sysex, "during TAO_CEC_ProxyPushSupplier::reactive_push_to_consumer");
00685 }
00686
00687 control->system_exception (this,
00688 sysex
00689 ACE_ENV_ARG_PARAMETER);
00690 ACE_TRY_CHECK;
00691 }
00692 ACE_CATCHANY
00693 {
00694
00695 }
00696 ACE_ENDTRY;
00697 }
00698
00699 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00700 void
00701 TAO_CEC_ProxyPushSupplier::invoke_to_consumer (const TAO_CEC_TypedEvent &typed_event
00702 ACE_ENV_ARG_DECL)
00703 {
00704 CORBA::Object_var typed_consumer_obj;
00705
00706
00707 CORBA::Request_var target_request;
00708
00709 {
00710 ACE_GUARD_THROW_EX (
00711 ACE_Lock, ace_mon, *this->lock_,
00712 CORBA::INTERNAL ());
00713
00714 ACE_CHECK;
00715
00716 if (this->is_connected_i () == 0)
00717 return;
00718
00719 typed_consumer_obj =
00720 CORBA::Object::_duplicate (this->typed_consumer_obj_.in ());
00721 }
00722
00723 TAO_CEC_ConsumerControl *control =
00724 this->typed_event_channel_->consumer_control ();
00725
00726
00727 ACE_TRY
00728 {
00729 typed_consumer_obj_->_create_request (0,
00730 typed_event.operation_,
00731 typed_event.list_,
00732 0,
00733 0,
00734 0,
00735 target_request.inout(),
00736 0
00737 ACE_ENV_ARG_PARAMETER);
00738 ACE_TRY_CHECK;
00739
00740
00741 target_request->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
00742 ACE_TRY_CHECK;
00743
00744
00745 control->successful_transmission(this);
00746 }
00747 ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
00748 {
00749 if (TAO_debug_level >= 4)
00750 {
00751 ACE_PRINT_EXCEPTION (not_used, "during TAO_CEC_ProxyPushSupplier::invoke_to_consumer");
00752 }
00753 control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
00754 ACE_TRY_CHECK;
00755 }
00756 ACE_CATCH (CORBA::SystemException, sysex)
00757 {
00758 if (TAO_debug_level >= 4)
00759 {
00760 ACE_PRINT_EXCEPTION (sysex, "during TAO_CEC_ProxyPushSupplier::invoke_to_consumer");
00761 }
00762 control->system_exception (this,
00763 sysex
00764 ACE_ENV_ARG_PARAMETER);
00765 ACE_TRY_CHECK;
00766 }
00767 ACE_CATCHANY
00768 {
00769
00770 if (TAO_debug_level >= 4)
00771 {
00772 ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00773 "ACE_ANY_EXCEPTION raised during TAO_CEC_ProxyPushSupplier::invoke_to_consumer");
00774 }
00775 }
00776 ACE_ENDTRY;
00777 }
00778
00779 void
00780 TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer (
00781 const TAO_CEC_TypedEvent& typed_event
00782 ACE_ENV_ARG_DECL)
00783 {
00784 CORBA::Object_var typed_consumer_obj;
00785
00786
00787 CORBA::Request_var target_request;
00788
00789 {
00790 ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
00791 if (this->is_connected_i () == 0)
00792 {
00793 return;
00794 }
00795 if (CORBA::is_nil(this->typed_consumer_obj_.in()))
00796 {
00797 return;
00798 }
00799
00800 typed_consumer_obj =
00801 CORBA::Object::_duplicate (this->typed_consumer_obj_.in ());
00802 }
00803
00804 TAO_CEC_ConsumerControl *control =
00805 this->typed_event_channel_->consumer_control ();
00806
00807
00808 ACE_TRY
00809 {
00810 typed_consumer_obj_->_create_request (0,
00811 typed_event.operation_,
00812 typed_event.list_,
00813 0,
00814 0,
00815 0,
00816 target_request.inout(),
00817 0
00818 ACE_ENV_ARG_PARAMETER);
00819 ACE_TRY_CHECK;
00820
00821
00822 target_request->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
00823 ACE_TRY_CHECK;
00824
00825
00826 control->successful_transmission(this);
00827 }
00828 ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
00829 {
00830 if (TAO_debug_level >= 4)
00831 {
00832 ACE_PRINT_EXCEPTION (not_used, "during TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer");
00833 }
00834 control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
00835 ACE_TRY_CHECK;
00836 }
00837 ACE_CATCH (CORBA::SystemException, sysex)
00838 {
00839 if (TAO_debug_level >= 4)
00840 {
00841 ACE_PRINT_EXCEPTION (sysex, "during TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer");
00842 }
00843 control->system_exception (this,
00844 sysex
00845 ACE_ENV_ARG_PARAMETER);
00846 ACE_TRY_CHECK;
00847 }
00848 ACE_CATCHANY
00849 {
00850 if (TAO_debug_level >= 4)
00851 {
00852 ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00853 "ACE_ANY_EXCEPTION raised during TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer");
00854 }
00855 }
00856 ACE_ENDTRY;
00857 }
00858 #endif
00859
00860 CORBA::Boolean
00861 TAO_CEC_ProxyPushSupplier::consumer_non_existent (
00862 CORBA::Boolean_out disconnected
00863 ACE_ENV_ARG_DECL)
00864 {
00865 CORBA::Object_var consumer;
00866 {
00867 ACE_GUARD_THROW_EX (
00868 ACE_Lock, ace_mon, *this->lock_,
00869 CORBA::INTERNAL ());
00870 ACE_CHECK_RETURN (0);
00871
00872 disconnected = 0;
00873 if (this->is_connected_i () == 0)
00874 {
00875 disconnected = 1;
00876 return 0;
00877 }
00878
00879 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00880 if (this->is_typed_ec () )
00881 {
00882 if (CORBA::is_nil (this->typed_consumer_.in ()))
00883 {
00884 return 0;
00885 }
00886 consumer = CORBA::Object::_duplicate (this->typed_consumer_.in ());
00887 }
00888 else
00889 {
00890 #endif
00891 if (CORBA::is_nil (this->consumer_.in ()))
00892 {
00893 return 0;
00894 }
00895 consumer = CORBA::Object::_duplicate (this->consumer_.in ());
00896 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00897 }
00898 #endif
00899 }
00900
00901 #if (TAO_HAS_MINIMUM_CORBA == 0)
00902 return consumer->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
00903 #else
00904 return 0;
00905 #endif
00906 }
00907
00908 PortableServer::POA_ptr
00909 TAO_CEC_ProxyPushSupplier::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00910 {
00911 return PortableServer::POA::_duplicate (this->default_POA_.in ());
00912 }
00913
00914 void
00915 TAO_CEC_ProxyPushSupplier::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00916 {
00917 this->_incr_refcnt ();
00918 }
00919
00920 void
00921 TAO_CEC_ProxyPushSupplier::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00922 {
00923 this->_decr_refcnt ();
00924 }
00925
00926 TAO_END_VERSIONED_NAMESPACE_DECL