diff options
author | huangming <huangming@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-10-15 18:07:27 +0000 |
---|---|---|
committer | huangming <huangming@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-10-15 18:07:27 +0000 |
commit | 662c4caae556d3e18e5ae5005408cd0160bc3a63 (patch) | |
tree | 61542bcbc54047e055552f487ce0ba38f4212ebe /TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp | |
parent | 428f7766fbdf80c24552dabbd4b49f241a1d055b (diff) | |
download | ATCD-662c4caae556d3e18e5ae5005408cd0160bc3a63.tar.gz |
Wed Oct 15 13:00:24 2003 Huang-Ming Huang <hh1@cse.wustl.edu>
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp new file mode 100644 index 00000000000..6e7c4e28678 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp @@ -0,0 +1,127 @@ +// $Id$ + +#include "FTEC_ProxyConsumer.h" +#include "Request_Context_Repository.h" +#include "Replication_Service.h" +#include "../Utils/activate_with_id.h" +#include "../Utils/ScopeGuard.h" + +ACE_RCSID (EventChannel, + TAO_FTEC_ProxyPushConsumer, + "$Id$") + +const TAO_FTEC_ProxyPushConsumer::RollbackOperation + TAO_FTEC_ProxyPushConsumer::rollback_obtain = + &FtRtecEventChannelAdmin::EventChannelFacade::disconnect_push_consumer; + +TAO_FTEC_ProxyPushConsumer::TAO_FTEC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* event_channel) +: Inherited(event_channel) +{ +} + + +const PortableServer::ObjectId& +TAO_FTEC_ProxyPushConsumer::id() const +{ + return object_id_.in(); +} + + + /// Activate in the POA +void +TAO_FTEC_ProxyPushConsumer::activate ( + RtecEventChannelAdmin::ProxyPushConsumer_ptr &result + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + result = RtecEventChannelAdmin::ProxyPushConsumer::_nil(); + ACE_TRY { + object_id_ = Request_Context_Repository().get_object_id(); + PortableServer::POA_var poa = _default_POA(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + activate_object_with_id(result, poa.in(), this, object_id_ ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION, ""); + // ignore exceptions + } + ACE_ENDTRY; +} + + // = The RtecEventChannelAdmin::ProxyPushConsumer methods... +void TAO_FTEC_ProxyPushConsumer::connect_push_supplier ( + RtecEventComm::PushSupplier_ptr push_supplier, + const RtecEventChannelAdmin::SupplierQOS& qos + ACE_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecEventChannelAdmin::AlreadyConnected)) +{ + if (Request_Context_Repository().is_executed_request()) + return; + + FtRtecEventChannelAdmin::Operation update; + update.object_id = this->id(); + FtRtecEventChannelAdmin::Connect_push_supplier_param param; + param.push_supplier = RtecEventComm::PushSupplier::_duplicate(push_supplier); + param.qos = qos; + update.param.connect_supplier_param(param); + + Inherited::connect_push_supplier(push_supplier, qos ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + ScopeGuard guard = MakeObjGuard(*this, &Inherited::disconnect_push_consumer); + + FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance(); + { + ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc); + + svc->replicate_request(update, + &FtRtecEventChannelAdmin::EventChannelFacade::disconnect_push_consumer + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } + + guard.Dismiss(); +} + +void TAO_FTEC_ProxyPushConsumer::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (Request_Context_Repository().is_executed_request()) + return; + FtRtecEventChannelAdmin::Operation update; + update.object_id = id(); + update.param._d(FtRtecEventChannelAdmin::DISCONNECT_PUSH_CONSUMER); + + Inherited::disconnect_push_consumer(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance(); + ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc); + + svc->replicate_request(update, 0 ACE_ENV_ARG_PARAMETER); + ACE_CHECK; +} + +void TAO_FTEC_ProxyPushConsumer::get_state(FtRtecEventChannelAdmin::ProxyPushConsumerStat& state) +{ + state.object_id = this->object_id_; + if (this->is_connected()) { + FtRtecEventChannelAdmin::ProxyPushConsumerConnectionInfo info; + info.push_supplier = this->supplier(); + info.qos = this->publications(); + state.parameter.info(info); + } +} + +void TAO_FTEC_ProxyPushConsumer::set_state(const FtRtecEventChannelAdmin::ProxyPushConsumerStat& state) +{ + if (!CORBA::is_nil(state.parameter.info().push_supplier.in()) ) + { + Inherited::connect_push_supplier(state.parameter.info().push_supplier.in(), + state.parameter.info().qos + ACE_ENV_ARG_PARAMETER); + } +} |