diff options
Diffstat (limited to 'ACE/TAO/TAO_IDL/be/be_visitor_component/context_svs.cpp')
-rw-r--r-- | ACE/TAO/TAO_IDL/be/be_visitor_component/context_svs.cpp | 829 |
1 files changed, 829 insertions, 0 deletions
diff --git a/ACE/TAO/TAO_IDL/be/be_visitor_component/context_svs.cpp b/ACE/TAO/TAO_IDL/be/be_visitor_component/context_svs.cpp new file mode 100644 index 00000000000..d5f44fcb9ab --- /dev/null +++ b/ACE/TAO/TAO_IDL/be/be_visitor_component/context_svs.cpp @@ -0,0 +1,829 @@ +// +// $Id$ +// + +// ============================================================================ +// +// = LIBRARY +// TAO IDL +// +// = FILENAME +// context_svs.cpp +// +// = DESCRIPTION +// Visitor generating code for a context class in the +// servant sourece. +// +// = AUTHOR +// Jeff Parsons +// +// ============================================================================ + +be_visitor_context_svs::be_visitor_context_svs (be_visitor_context *ctx) + : be_visitor_component_scope (ctx) +{ +} + +be_visitor_context_svs::~be_visitor_context_svs (void) +{ +} + +int +be_visitor_context_svs::visit_component (be_component *node) +{ + node_ = node; + + AST_Decl *scope = ScopeAsDecl (node->defined_in ()); + ACE_CString sname_str (scope->full_name ()); + const char *sname = sname_str.c_str (); + const char *lname = node_->local_name (); + const char *global = (sname_str == "" ? "" : "::"); + + os_ << be_nl + << lname <<"_Context::" << lname << "_Context (" + << be_idt << be_idt_nl + << "::Components::CCMHome_ptr h," << be_nl + << "::CIAO::Container_ptr c," << be_nl + << "PortableServer::Servant sv," << be_uidt_nl + << "const char *id)" << be_uidt_nl + << ": ::CIAO::Context_Impl_Base (h, c, id)," << be_idt_nl + << "::CIAO::Context_Impl<" << be_idt_nl + << global << sname << "::CCM_" + << lname << "_Context," << be_nl + << "::" << node->full_name () << "> (h, c, sv, id)"; + + if (swapping_) + { + os_ << "," << be_uidt_nl + << "::CIAO::Upgradeable_Context_Impl<" << be_idt_nl + << global << sname << "::CCM_" << lname + << "_Context," << be_nl + << lname << "_Servant," << be_nl + << "::" << node_->full_name () + << "> (h, c, sv)"; + } + + os_ << be_uidt << be_uidt << be_uidt_nl + << "{" << be_nl + << "}"; + + os_ << be_nl << be_nl + << lname << "_Context::~" + << lname << "_Context (void)" << be_nl + << "{" << be_nl + << "}"; + + os_ << be_nl << be_nl + << "/// CIAO-specific." << be_nl + << lname << "_Context *" << be_nl + << lname + << "_Context::_narrow ( ::Components::SessionContext_ptr p)" + << be_nl + << "{" << be_idt_nl + << "return dynamic_cast<" << lname + << "_Context *> (p);" << be_uidt_nl + << "}"; + + if (this->visit_component_scope (node) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("be_visitor_context_svs") + ACE_TEXT ("::visit_component - ") + ACE_TEXT ("visit_component_scope() ") + ACE_TEXT ("failed\n")), + -1); + } + + if (swapping_) + { + os_ << be_nl << be_nl + << "/// Operations defined in " << sname + << "::CCM_" << lname << "_Context" << be_nl + << "/// that enable component swapping in the container" + << be_nl << be_nl + << "::Components::ConsumerDescriptions *" << be_nl + << lname << "_Context::get_registered_consumers (" + << be_idt_nl + << "const char * publisher_name)" << be_uidt_nl + << "{" << be_idt_nl + << "if (publisher_name == 0)" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidName ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "::Components::ConsumerDescriptions * tmp = 0;" + << be_nl + << "::Components::ConsumerDescriptions_var retval;" + << be_nl + << "::CORBA::ULong _ciao_index = 0UL;" << be_nl + << "::CORBA::ULong _ciao_size = 0UL;" << be_nl + << "ACE_UNUSED_ARG (tmp);" << be_nl + << "ACE_UNUSED_ARG (retval);" << be_nl + << "ACE_UNUSED_ARG (_ciao_index);" << be_nl + << "ACE_UNUSED_ARG (_ciao_size);"; + + be_visitor_swapping_get_consumer v (this->ctx_); + + if (v.visit_component_scope (node) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("be_visitor_context_svs") + ACE_TEXT ("::visit_component - ") + ACE_TEXT ("swapping_get_consumer ") + ACE_TEXT ("visitor failed\n")), + -1); + } + + os_ << be_nl << be_nl + << "throw ::Components::InvalidName ();" << be_uidt_nl + << "}"; + } + + return 0; +} + +int +be_visitor_context_svs::visit_uses (be_uses *node) +{ + ACE_CString prefix (this->port_prefix_); + prefix += node->local_name ()->get_string (); + const char *port_name = prefix.c_str (); + + AST_Type *obj = node->uses_type (); + bool const is_multiple = node->is_multiple (); + + if (is_multiple) + { + this->gen_uses_multiplex (obj, port_name); + } + else + { + this->gen_uses_simplex (obj, port_name); + } + + return 0; +} + +int +be_visitor_context_svs::visit_publishes (be_publishes *node) +{ + AST_Type *obj = node->publishes_type (); + const char *port_name = + node->local_name ()->get_string (); + const char *fname = obj->full_name (); + const char *lname = obj->local_name ()->get_string (); + ACE_CString sname_str ( + ScopeAsDecl (obj->defined_in ())->full_name ()); + const char *sname = sname_str.c_str (); + const char *global = (sname_str == "" ? "" : "::"); + + os_ << be_nl << be_nl + << "void" << be_nl + << node_->local_name () << "_Context::push_" + << port_name << " (" << be_idt_nl + << "::" << fname << " * ev)" << be_uidt_nl + << "{" << be_idt_nl; + + if (! static_config_) + { + os_ << "ACE_READ_GUARD (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_);" << be_nl << be_nl; + } + + os_ << "for (" << tao_cg->upcase (port_name) + << "_TABLE::const_iterator iter =" << be_nl + << " this->ciao_publishes_" << port_name + << "_.begin ();" << be_nl + << " iter != this->ciao_publishes_" << port_name + << "_.end ();" << be_nl + << " ++iter)" << be_idt_nl + << "{" << be_idt_nl + << "iter->second->push_" << lname << " (ev);" + << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "ACE_CString source_id (this->_ciao_instance_id ());" + << be_nl + << "source_id += \"_" << port_name << "\";" + << be_nl << be_nl + << "for (" << tao_cg->upcase (port_name) + << "_GENERIC_TABLE::const_iterator giter =" << be_nl + << " this->ciao_publishes_" << port_name + << "_generic_.begin ();" << be_nl + << " giter != this->ciao_publishes_" + << port_name << "_generic_.end ();" << be_nl + << " ++giter)" << be_idt_nl + << "{" << be_idt_nl + << "giter->second->ciao_push_event (ev," << be_nl + << " source_id.c_str ()," + << be_nl + << " " << global + << sname << "::_tc_" << lname << ");" << be_uidt_nl + << "}" << be_uidt << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::Components::Cookie *" << be_nl + << node_->local_name () << "_Context::subscribe_" + << port_name << " (" << be_idt_nl + << "::" << fname << "Consumer_ptr c)" << be_uidt_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (c))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::CORBA::BAD_PARAM ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "std::pair<" << tao_cg->upcase (port_name) + << "_TABLE::iterator, bool> result;" << be_nl + << tao_cg->upcase (port_name) + << "_TABLE::value_type entry;" << be_nl + << "entry.first = reinterpret_cast<ptrdiff_t> (c);" + << be_nl + << "entry.second = ::" << fname + << "Consumer::_duplicate (c);" << be_nl << be_nl; + + if (! static_config_) + { + os_ << "{" << be_idt_nl + << "ACE_WRITE_GUARD_RETURN (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_," << be_nl + << " 0);" << be_nl << be_nl; + } + + os_ << "result = this->ciao_publishes_" << port_name + << "_.insert (entry);"; + + if (! static_config_) + { + os_ << be_uidt_nl + << "}"; + } + + os_ << be_nl << be_nl + << "if (! result.second)" << be_idt_nl + << "{" << be_idt_nl + << "ACE_ERROR_RETURN ((LM_ERROR," << be_nl + << " ACE_TEXT (\"subscribe on %s failed\\n\")," + << be_nl + << " ACE_TEXT (\"" << port_name + << "\"))," << be_nl + << " 0);" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "::Components::Cookie * retv = 0;" << be_nl + << "ACE_NEW_THROW_EX (retv," << be_nl + << " ::CIAO::Cookie_Impl (entry.first)," + << be_nl + << " ::CORBA::NO_MEMORY ());" + << be_nl << be_nl + << "return retv;" << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::Components::Cookie *" << be_nl + << node_->local_name () << "_Context::subscribe_" + << port_name << "_generic (" << be_idt_nl + << "::Components::EventConsumerBase_ptr c)" << be_uidt_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (c))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::CORBA::BAD_PARAM ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "std::pair<" << tao_cg->upcase (port_name) + << "_GENERIC_TABLE::iterator, bool> result;" << be_nl + << tao_cg->upcase (port_name) + << "_GENERIC_TABLE::value_type entry;" << be_nl + << "entry.first = reinterpret_cast<ptrdiff_t> (c);" + << be_nl + << "entry.second =" << be_idt_nl + << "::Components::EventConsumerBase::_duplicate (c);" + << be_uidt_nl << be_nl; + + if (! static_config_) + { + os_ << "{" << be_idt_nl + << "ACE_WRITE_GUARD_RETURN (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_," << be_nl + << " 0);" << be_nl << be_nl; + } + + os_ << "result =" << be_idt_nl + << "this->ciao_publishes_" << port_name + << "_generic_.insert (entry);" << be_uidt; + + if (! static_config_) + { + os_ << be_uidt_nl + << "}"; + } + + os_ << be_nl << be_nl + << "if (! result.second)" << be_idt_nl + << "{" << be_idt_nl + << "ACE_ERROR_RETURN ((LM_ERROR," << be_nl + << " ACE_TEXT (\"generic subscribe \")" + << be_nl + << " ACE_TEXT (\"on %s failed\\n\")," + << be_nl + << " ACE_TEXT (\"" << port_name + << "\"))," << be_nl + << " 0);" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "::Components::Cookie * retv = 0;" << be_nl + << "ACE_NEW_THROW_EX (retv," << be_nl + << " ::CIAO::Cookie_Impl (entry.first)," + << be_nl + << " ::CORBA::NO_MEMORY ());" + << be_nl << be_nl + << "return retv;" << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::" << fname << "Consumer_ptr" << be_nl + << node_->local_name () << "_Context::unsubscribe_" + << port_name << " (" << be_idt_nl + << "::Components::Cookie * ck)" << be_uidt_nl + << "{" << be_idt_nl + << "ptrdiff_t key = 0UL;" << be_nl + << tao_cg->upcase (port_name) + << "_TABLE::size_type n = 0UL;" << be_nl << be_nl + << "if (ck == 0 || ! ::CIAO::Cookie_Impl::extract (ck, key))" + << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl; + + if (! static_config_) + { + os_ << "{" << be_idt_nl + << "ACE_WRITE_GUARD_RETURN (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_," << be_nl + << " ::" << fname + << "Consumer::_nil ());" << be_nl << be_nl; + } + + os_ << tao_cg->upcase (port_name) << "_TABLE::iterator iter =" + << be_idt_nl + << "this->ciao_publishes_" << port_name << "_.find (key);" + << be_uidt_nl << be_nl + << "if (iter != this->ciao_publishes_" << port_name + << "_.end ())" << be_idt_nl + << "{" << be_idt_nl + << "::" << fname + << "Consumer_var retv = iter->second;" << be_nl + << "n = this->ciao_publishes_" << port_name + << "_.erase (key);" << be_nl << be_nl + << "if (n == 1UL)" << be_idt_nl + << "{" << be_idt_nl + << "return retv._retn ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << tao_cg->upcase (port_name) + << "_GENERIC_TABLE::iterator giter =" << be_idt_nl + << "this->ciao_publishes_" << port_name + << "_generic_.find (key);" << be_uidt_nl << be_nl + << "if (giter == this->ciao_publishes_" << port_name + << "_generic_.end ())" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "n = this->ciao_publishes_" << port_name + << "_generic_.erase (key);"; + + if (! static_config_) + { + os_ << be_uidt_nl + << "}"; + } + + os_ << be_nl << be_nl + << "if (n != 1UL)" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "return ::" << fname << "Consumer::_nil ();" + << be_uidt_nl + << "}"; + + return 0; +} + +int +be_visitor_context_svs::visit_emits (be_emits *node) +{ + AST_Type *obj = node->emits_type (); + const char *port_name = + node->local_name ()->get_string (); + + const char *fname = obj->full_name (); + const char *lname = obj->local_name ()->get_string (); + + os_ << be_nl << be_nl + << "void" << be_nl + << node_->local_name () << "_Context::push_" << port_name + << " (" << be_idt_nl + << "::" << fname << " * ev)" << be_uidt_nl + << "{" << be_idt_nl + << "if (! ::CORBA::is_nil (this->ciao_emits_" + << port_name << "_consumer_.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "this->ciao_emits_" << port_name << "_consumer_->push_" + << lname << " (ev);" << be_uidt_nl + << "}" << be_uidt << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "void" << be_nl + << node_->local_name () << "_Context::connect_" << port_name + << " (" << be_idt_nl + << "::" << fname << "Consumer_ptr c)" << be_uidt_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (c))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::CORBA::BAD_PARAM ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "if (! ::CORBA::is_nil (this->ciao_emits_" + << port_name << "_consumer_.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::AlreadyConnected ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "this->ciao_emits_" << port_name + << "_consumer_ =" << be_idt_nl + << "::" << fname << "Consumer::_duplicate (c);" + << be_uidt << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::" << fname << "Consumer_ptr" << be_nl + << node_->local_name () << "_Context::disconnect_" + << port_name << " (void)" << be_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (this->ciao_emits_" + << port_name << "_consumer_.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::NoConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "return this->ciao_emits_" << port_name + << "_consumer_._retn ();" << be_uidt_nl + << "}"; + + return 0; +} + +void +be_visitor_context_svs::gen_uses_simplex (AST_Type *obj, const char *port_name) +{ + const char *fname = obj->full_name (); + + os_ << be_nl << be_nl + << "::" << fname << "_ptr" << be_nl + << node_->local_name () << "_Context::get_connection_" + << port_name << " (void)" << be_nl + << "{" << be_idt_nl + << "return ::" << fname << "::_duplicate (" << be_idt_nl + << "this->ciao_uses_" << port_name << "_.in ());" + << be_uidt << be_uidt_nl + << "}"; + + if (be_global->ami4ccm_call_back ()) + { + ACE_CString original_op_name ( + obj->name ()->last_component ()->get_string ()); + ACE_CString new_op_name = ACE_CString ("AMI_") + original_op_name; + UTL_ScopedName *op_name = + static_cast<UTL_ScopedName *> (obj->name ()->copy ()); + op_name->last_component ()->replace_string (new_op_name.c_str ()); + os_ << be_nl << be_nl + << "::" << op_name << "_ptr" << be_nl + << node_->local_name () << "_Context::get_connection_sendc_" + << port_name << " (void)" << be_nl + << "{" << be_idt_nl + << "return ::" << op_name << "::_duplicate (" << be_idt_nl + << "this->ciao_uses_sendc_" << port_name << "_.in ());" + << be_uidt << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "void" << be_nl + << node_->local_name () << "_Context::connect_sendc_" + << port_name << " (" << be_idt_nl + << "::" << op_name << "_ptr c)" << be_uidt_nl + << "{" << be_idt_nl + << "if (! ::CORBA::is_nil (this->ciao_uses_sendc_" + << port_name << "_.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::AlreadyConnected ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "if ( ::CORBA::is_nil (c))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "this->ciao_uses_sendc_" << port_name << "_ =" << be_idt_nl + << "::" << op_name << "::_duplicate (c);" + << be_uidt << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::" << op_name << "_ptr" << be_nl + << node_->local_name () << "_Context::disconnect_sendc_" + << port_name << " (void)" << be_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (this->ciao_uses_sendc_" + << port_name << "_.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::NoConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "return this->ciao_uses_sendc_" << port_name + << "_._retn ();" << be_uidt_nl + << "}"; + } + + os_ << be_nl << be_nl + << "void" << be_nl + << node_->local_name () << "_Context::connect_" + << port_name << " (" << be_idt_nl + << "::" << fname << "_ptr c)" << be_uidt_nl + << "{" << be_idt_nl + << "if (! ::CORBA::is_nil (this->ciao_uses_" + << port_name << "_.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::AlreadyConnected ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "if ( ::CORBA::is_nil (c))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "this->ciao_uses_" << port_name << "_ =" << be_idt_nl + << "::" << fname << "::_duplicate (c);" + << be_uidt << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::" << fname << "_ptr" << be_nl + << node_->local_name () << "_Context::disconnect_" + << port_name << " (void)" << be_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (this->ciao_uses_" + << port_name << "_.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::NoConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "return this->ciao_uses_" << port_name + << "_._retn ();" << be_uidt_nl + << "}"; +} + +void +be_visitor_context_svs::gen_uses_multiplex ( + AST_Type *obj, + const char *port_name) +{ + const char *fname = obj->full_name (); + bool static_config = be_global->gen_ciao_static_config (); + + os_ << be_nl << be_nl + << "::" << node_->full_name () << "::" << port_name + << "Connections *" << be_nl + << node_->local_name () << "_Context::get_connections_" + << port_name << " (void)" << be_nl + << "{" << be_idt_nl; + + if (! static_config) + { + os_ << "ACE_READ_GUARD_RETURN (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_," << be_nl + << " 0);" << be_nl << be_nl; + } + + os_ << "::" << node_->full_name () << "::" << port_name + << "Connections * tmp_retv = 0;" << be_nl + << "ACE_NEW_THROW_EX (tmp_retv," << be_nl + << " ::" << node_->full_name () + << "::" << port_name << "Connections (" << be_nl + << " this->ciao_uses_" + << port_name << "_.size ())," << be_nl + << " ::CORBA::NO_MEMORY ());" + << be_nl << be_nl + << "::" << node_->full_name () << "::" << port_name + << "Connections_var retv = tmp_retv;" << be_nl + << "retv->length (this->ciao_uses_" << port_name + << "_.size ());" << be_nl + << "::CORBA::ULong i = 0UL;" << be_nl << be_nl + << "for (" << tao_cg->upcase (port_name) + << "_TABLE::const_iterator iter =" << be_nl + << " this->ciao_uses_" << port_name << "_.begin ();" + << be_nl + << " iter != this->ciao_uses_" + << port_name << "_.end ();" << be_nl + << " ++iter, ++i)" << be_idt_nl + << "{" << be_idt_nl + << "retv[i].objref = iter->second;" << be_nl << be_nl + << "ACE_NEW_THROW_EX (retv[i].ck.inout ()," << be_nl + << " ::CIAO::Cookie_Impl (iter->first)," + << be_nl + << " ::CORBA::NO_MEMORY ());" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "return retv._retn (); " << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::Components::Cookie *" << be_nl + << node_->local_name () << "_Context::connect_" + << port_name << " (" << be_idt_nl + << "::" << fname << "_ptr c)" << be_uidt_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (c))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "std::pair<" << tao_cg->upcase (port_name) + << "_TABLE::iterator, bool> result;" << be_nl + << tao_cg->upcase (port_name) + << "_TABLE::value_type entry;" << be_nl + << "entry.first = reinterpret_cast<ptrdiff_t> (c);" << be_nl + << "entry.second = ::" << fname + << "::_duplicate (c);"; + + if (! static_config) + { + os_ << be_nl << be_nl + << "{" << be_idt_nl + << "ACE_WRITE_GUARD_RETURN (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_," << be_nl + << " 0);"; + } + + os_ << be_nl << be_nl + << "result = this->ciao_uses_" << port_name + << "_.insert (entry);"; + + if (! static_config) + { + os_ << be_uidt_nl + << "}"; + } + + os_ << be_nl << be_nl + << "if (! result.second)" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" + << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "::Components::Cookie * ck = 0;" << be_nl + << "ACE_NEW_THROW_EX (ck," << be_nl + << " ::CIAO::Cookie_Impl (entry.first)," + << be_nl + << " ::CORBA::NO_MEMORY ());" + << be_nl << be_nl + << "return ck;" << be_uidt_nl + << "}"; + + os_ << be_nl << be_nl + << "::" << fname << "_ptr" << be_nl + << node_->local_name () << "_Context::disconnect_" + << port_name << " (" << be_idt_nl + << "::Components::Cookie * ck)" << be_uidt_nl + << "{" << be_idt_nl + << "::" << fname << "_var retv;" << be_nl + << "ptrdiff_t key = 0UL;" << be_nl + << tao_cg->upcase (port_name) + << "_TABLE::size_type n = 0UL;" << be_nl << be_nl + << "if (ck == 0 || ! ::CIAO::Cookie_Impl::extract (ck, key))" + << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt; + + if (! static_config) + { + os_ << be_nl << be_nl + << "{" << be_idt_nl + << "ACE_WRITE_GUARD_RETURN (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_," << be_nl + << " ::" << fname + << "::_nil ());"; + } + + os_ << be_nl << be_nl + << tao_cg->upcase (port_name) + << "_TABLE::iterator iter =" << be_idt_nl + << "this->ciao_uses_" << port_name + << "_.find (key);" << be_uidt_nl << be_nl + << "if (iter == this->ciao_uses_" << port_name + << "_.end ())" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "retv = iter->second;" << be_nl + << "n = this->ciao_uses_" << port_name + << "_.erase (key);"; + + if (! static_config) + { + os_ << be_uidt_nl + << "}"; + } + + os_ << be_nl << be_nl + << "if (n != 1UL)" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "return retv._retn ();" << be_uidt_nl + << "}"; +} + +// =============================================== + +be_visitor_swapping_get_consumer::be_visitor_swapping_get_consumer ( + be_visitor_context *ctx) + : be_visitor_component_scope (ctx) +{ +} + +be_visitor_swapping_get_consumer::~be_visitor_swapping_get_consumer ( + void) +{ +} + +int +be_visitor_swapping_get_consumer::visit_publishes ( + be_publishes *node) +{ + const char *port_name = + node->local_name ()->get_string (); + + os_ << be_nl << be_nl + << "if (ACE_OS::strcmp (publisher_name, \"" + << port_name << "\") == 0)" << be_idt_nl + << "{" << be_idt_nl + << "_ciao_size = this->_ciao_publishes_" + << port_name << "_.size ();" << be_nl << be_nl + << "ACE_NEW_THROW_EX (tmp," << be_nl + << " ::Components::" + << "ConsumerDescriptions (_ciao_size)," << be_nl + << " ::CORBA::NO_MEMORY ());"; + + if (! static_config_) + { + os_ << be_nl << be_nl + << "{" << be_idt_nl + << "ACE_READ_GUARD_RETURN (TAO_SYNCH_MUTEX," << be_nl + << " mon," << be_nl + << " this->" << port_name + << "_lock_," << be_nl + << " 0);"; + } + + os_ << be_nl << be_nl + << "for (" << tao_cg->upcase (port_name) + << "_TABLE::const_iterator iter =" << be_idt_nl + << " this->ciao_publishes_" << port_name + << "_.begin ();" << be_uidt_nl + << " iter != this->ciao_publishes_" << port_name + << ".end ();" << be_nl + << " ++iter, ++_ciao_index)" << be_idt_nl + << "{" << be_idt_nl + << "if ( ::CORBA::is_nil (iter->second.in ()))" << be_idt_nl + << "{" << be_idt_nl + << "throw ::Components::InvalidConnection ();" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "::Components::ConsumerDescription * cd = 0;" << be_nl + << "ACE_NEW_THROW_EX (cd," << be_nl + << " OBV_Components::ConsumerDescription," + << be_nl + << " ::CORBA::NO_MEMORY ());" + << be_nl << be_nl + << "::Components::ConsumerDescription_var safe = cd;" + << be_nl + << "safe->name (\"\");" << be_nl + << "safe->type_id (\"\");" << be_nl + << "safe->consumer (iter->second.in ());" + << be_nl << be_nl + << "retval[_ciao_index] = safe;" << be_uidt_nl + << "}" << be_uidt; + + if (! static_config_) + { + os_ << be_uidt_nl + << "}"; + } + + os_ << be_uidt_nl << be_nl + << "return retval._retn ();" << be_uidt_nl + << "}"; + + return 0; +} + |