CEC_ProxyPushSupplier.cpp

Go to the documentation of this file.
00001 // CEC_ProxyPushSupplier.cpp,v 1.31 2006/04/19 12:36:57 jwillemsen Exp
00002 
00003 // Force CORBA::release(CORBA::Request...) prototype to be parsed
00004 // before TAO_Pseudo_{Var,Out}_T templates.  All required
00005 // non-dependent names must be parsed prior to the template in
00006 // question when using compilers like g++ 3.4.x.
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 /* __ACE_INLINE__ */
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 // TAO_CEC_ProxyPushSupplier Constructure (Un-typed EC)
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 // TAO_CEC_ProxyPushSupplier Constructure (Typed EC)
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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       // Exceptions here should not be propagated.  They usually
00130       // indicate that an object is beign disconnected twice, or some
00131       // race condition, but not a fault that the user needs to know
00132       // about.
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       // Save the consumer we where connected to, we need to send a
00144       // disconnect message to it.
00145       CosTypedEventComm::TypedPushConsumer_var typed_consumer;
00146       {
00147         ACE_GUARD_THROW_EX (
00148             ACE_Lock, ace_mon, *this->lock_,
00149             CORBA::INTERNAL ());
00150         // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
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           // Ignore exceptions, we must isolate other clients from
00170           // problems on this one.
00171         }
00172       ACE_ENDTRY;
00173     } /* this->is_typed_ec */
00174   else
00175     {
00176 #endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
00177 
00178   // Save the consumer we where connected to, we need to send a
00179   // disconnect message to it.
00180   CosEventComm::PushConsumer_var consumer;
00181 
00182   {
00183     ACE_GUARD_THROW_EX (
00184         ACE_Lock, ace_mon, *this->lock_,
00185         CORBA::INTERNAL ());
00186     // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
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       // Ignore exceptions, we must isolate other clients from
00206       // problems on this one.
00207     }
00208   ACE_ENDTRY;
00209 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00210     } /* ! this->is_typed_ec */
00211 #endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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   // Notify the event channel
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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   // Nil PushConsumers are illegal
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     // Check if we have a typed event channel
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         // Temporary for the TypedPushConsumer and it's Typed interface,
00374         // declared and obtained before the Guard to avoid deadlock during the
00375         // _is_a (during _narrow) and get_typed_consumer invocations.
00376         // They are eventually assigned onto this object inside the Guard.
00377         CosTypedEventComm::TypedPushConsumer_var local_typed_consumer =
00378           CosTypedEventComm::TypedPushConsumer::_narrow (push_consumer
00379                                                          ACE_ENV_ARG_PARAMETER);
00380         ACE_CHECK;
00381 
00382         // Obtain the typed object interface from the consumer
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           // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
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               // Re-connections are allowed....
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                 // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
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           // Store the typed object interface from the consumer
00428           this->typed_consumer_obj_ =
00429             CORBA::Object::_duplicate (local_typed_consumer_obj.in () );
00430           ACE_CHECK;
00431         }
00432 
00433         // Notify the event channel...
00434         this->typed_event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
00435         ACE_CHECK;
00436 
00437       } /* this->is_typed_ec */
00438     else
00439       {
00440 #endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
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     // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
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         // Re-connections are allowed....
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           // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
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   // Notify the event channel...
00488   this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
00489   ACE_CHECK;
00490 
00491 #if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
00492       } /* ! this->is_typed_ec */
00493 #endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
00506 
00507   {
00508     ACE_GUARD_THROW_EX (
00509         ACE_Lock, ace_mon, *this->lock_,
00510         CORBA::INTERNAL ());
00511     // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
00529 
00530     this->cleanup_i ();
00531   }
00532 
00533   // Notify the event channel....
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
00549 
00550   // Disconnect callbacks
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               // Ignore exceptions, we must isolate other clients from
00564               // problems on this one.
00565               ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00566                                    "ProxySupplier::disconnect_push_supplier");
00567             }
00568           ACE_ENDTRY;
00569         }
00570     } /* this->is_typed_ec */
00571   else
00572     {
00573 #endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
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           // Ignore exceptions, we must isolate other clients from
00585           // problems on this one.
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     } /* ! this->is_typed_ec */
00594 #endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
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     // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
00607     ACE_CHECK;
00608 
00609     if (this->is_connected_i () == 0)
00610       return; // ACE_THROW (CosEventComm::Disconnected ());????
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       // Inform the control that we were able to push something
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       // Shouldn't happen, but does not hurt
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; // TAO_THROW (CosEventComm::Disconnected ());????
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       // Inform the control that we were able to push something
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       // Shouldn't happen, but does not hurt
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   // The DII target request object
00707   CORBA::Request_var target_request;
00708 
00709   {
00710     ACE_GUARD_THROW_EX (
00711             ACE_Lock, ace_mon, *this->lock_,
00712             CORBA::INTERNAL ());
00713     // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
00714     ACE_CHECK;
00715 
00716     if (this->is_connected_i () == 0)
00717       return; // ACE_THROW (CosEventComm::Disconnected ());????
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   // Create the DII request
00727   ACE_TRY
00728     {
00729       typed_consumer_obj_->_create_request (0, // ctx
00730                                             typed_event.operation_,
00731                                             typed_event.list_,
00732                                             0, // result
00733                                             0, // exception_list,
00734                                             0, // context_list,
00735                                             target_request.inout(),
00736                                             0
00737                                             ACE_ENV_ARG_PARAMETER);
00738       ACE_TRY_CHECK;
00739 
00740       // Call the DII invoke for the operation on the target object
00741       target_request->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
00742       ACE_TRY_CHECK;
00743 
00744       // Inform the control that we were able to invoke something
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       // Shouldn't happen, but does not hurt
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   // The DII target request object
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; // TAO_THROW (CosEventComm::Disconnected ());????
00794     }
00795     if (CORBA::is_nil(this->typed_consumer_obj_.in()))
00796     {
00797       return; // TAO_THROW ...
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   // Create the DII request
00808   ACE_TRY
00809     {
00810       typed_consumer_obj_->_create_request (0, // ctx
00811                                             typed_event.operation_,
00812                                             typed_event.list_,
00813                                             0, // result
00814                                             0, // exception_list,
00815                                             0, // context_list,
00816                                             target_request.inout(),
00817                                             0
00818                                             ACE_ENV_ARG_PARAMETER);
00819       ACE_TRY_CHECK;
00820 
00821       // Call the DII invoke for the operation on the target object
00822       target_request->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
00823       ACE_TRY_CHECK;
00824 
00825       // Inform the control that we were able to invoke something
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 /* TAO_HAS_TYPED_EVENT_CHANNEL */
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       } /* ! this->is_typed_ec */
00898 #endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
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 /* TAO_HAS_MINIMUM_CORBA */
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

Generated on Thu Nov 9 13:18:17 2006 for TAO_CosEvent by doxygen 1.3.6