diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_home/home_svs.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_home/home_svs.cpp | 384 |
1 files changed, 208 insertions, 176 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_home/home_svs.cpp b/TAO/TAO_IDL/be/be_visitor_home/home_svs.cpp index 3d36384758a..47109d0584e 100644 --- a/TAO/TAO_IDL/be/be_visitor_home/home_svs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_home/home_svs.cpp @@ -1,17 +1,26 @@ - -//============================================================================= -/** - * @file home_svs.cpp - * - * $Id$ - * - * Visitor generating code for Homes in the servant source. - * - * - * @author Jeff Parsons - */ -//============================================================================= - +// +// $Id$ +// + +// ============================================================================ +// +// = LIBRARY +// TAO IDL +// +// = FILENAME +// home_svs.cpp +// +// = DESCRIPTION +// Visitor generating code for Homes in the servant source. +// +// = AUTHOR +// Jeff Parsons +// +// ============================================================================ + +ACE_RCSID (be_visitor_home, + home_svs, + "$Id$") // ****************************************************** // Home visitor for server source @@ -23,7 +32,7 @@ be_visitor_home_svs::be_visitor_home_svs (be_visitor_context *ctx) comp_ (0), os_ (*ctx->stream ()), export_macro_ (be_global->svnt_export_macro ()), - for_finder_ (false) + swapping_ (be_global->gen_component_swapping ()) { /// All existing CIAO examples set the servant export values in the CIDL /// compiler to equal the IDL compiler's skel export values. Below is a @@ -103,95 +112,6 @@ be_visitor_home_svs::visit_argument (be_argument *node) } int -be_visitor_home_svs::visit_factory (be_factory *node) -{ - // An inherited factory/finder needs to return the managed - // component of the home where it is defined. - be_home *h = - be_home::narrow_from_scope (node->defined_in ()); - - AST_Component *c = h->managed_component (); - - os_ << be_nl << be_nl - << "::" << c->name () << "_ptr" << be_nl - << node_->original_local_name ()->get_string () - << "_Servant::" << node->local_name (); - - be_visitor_operation_arglist al_visitor (this->ctx_); - al_visitor.unused (this->for_finder_); - - if (al_visitor.visit_factory (node) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - "be_visitor_factory_svs::" - "visit_factory - " - "codegen for argument list failed\n"), - -1); - } - - os_ << be_nl - << "{" << be_idt_nl; - - if (this->for_finder_) - { - os_ << "throw ::CORBA::NO_IMPLEMENT (CORBA::OMGVMCID | 8," - << be_nl - << " CORBA::COMPLETED_NO);"; - } - else - { - ACE_CString comp_sname_str ( - ScopeAsDecl (comp_->defined_in ())->full_name ()); - const char *comp_sname = comp_sname_str.c_str (); - const char *comp_lname = comp_->local_name ()->get_string (); - const char *global = (comp_sname_str == "" ? "" : "::"); - - os_ << "::Components::EnterpriseComponent_var _ciao_ec =" - << be_idt_nl - << "this->executor_->" << node->local_name () << " ("; - - if (node->argument_count () > 0) - { - os_ << be_idt_nl; - - if (this->visit_scope (node) != 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - "be_visitor_factory_svs::" - "visit_factory - " - "codegen for scope failed\n"), - -1); - } - - os_ << be_uidt; - } - - os_ << ");" << be_uidt_nl << be_nl - << global << comp_sname << "::CCM_" << comp_lname - << "_var _ciao_comp =" << be_idt_nl - << global << comp_sname << "::CCM_" << comp_lname - << "::_narrow (_ciao_ec.in ());" << be_uidt_nl << be_nl - << "return this->_ciao_activate_component " - << "(_ciao_comp.in ());"; - } - - os_ << be_uidt_nl - << "}"; - - // In case it was set for the call above. - this->for_finder_ = false; - - return 0; -} - -int -be_visitor_home_svs::visit_finder (be_finder *node) -{ - this->for_finder_ = true; - return this->visit_factory (node); -} - -int be_visitor_home_svs::gen_servant_class (void) { AST_Decl *scope = ScopeAsDecl (node_->defined_in ()); @@ -212,7 +132,7 @@ be_visitor_home_svs::gen_servant_class (void) << "const char * ins_name," << be_nl << "::CIAO::Container_ptr c)" << be_uidt_nl << ": ::CIAO::Home_Servant_Impl_Base (c)," << be_idt_nl - << "::CIAO::" + << "::CIAO::" << (swapping_ ? "Swapping_" : "" ) << "Home_Servant_Impl<" << be_idt_nl << "::" << node_->full_skel_name () << "," << be_nl << global << sname << "::CCM_" << lname << "," << be_nl @@ -227,101 +147,213 @@ be_visitor_home_svs::gen_servant_class (void) << "{" << be_nl << "}"; - AST_Type *pk = node_->primary_key (); + this->gen_ops_attrs (); + + os_ << be_nl << be_nl + << "/// Factory operations."; + + this->gen_factories_r (node_); + + os_ << be_nl << be_nl + << "/// Finder operations."; + + this->gen_finders_r (node_); - if (pk != 0) + return 0; +} + +int +be_visitor_home_svs::gen_ops_attrs (void) +{ + os_ << be_nl << be_nl + << "/// All home operations and attributes."; + + node_->get_insert_queue ().reset (); + node_->get_del_queue ().reset (); + node_->get_insert_queue ().enqueue_tail (node_); + + Home_Op_Attr_Generator op_attr_gen (this); + + int status = + node_->traverse_inheritance_graph (op_attr_gen, + &os_, + false, + false); + + if (status == -1) { - os_ << be_nl << be_nl - << "::" << comp_->name () << "_ptr" << be_nl - << lname << "_Servant::create (" << be_idt_nl - << "::" << pk->name () << " * /* key */)" << be_uidt_nl - << "{" << be_idt_nl - << "throw ::CORBA::NO_IMPLEMENT (CORBA::OMGVMCID | 8," - << be_nl - << " CORBA::COMPLETED_NO);" - << be_uidt_nl - << "}"; + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("be_visitor_home_svs::") + ACE_TEXT ("gen_ops_attrs - ") + ACE_TEXT ("traverse_inheritance_graph() ") + ACE_TEXT ("failed\n")), + -1); + } - os_ << be_nl << be_nl - << "::" << comp_->name () << "_ptr" << be_nl - << lname << "_Servant::find_by_primary_key (" << be_idt_nl - << "::" << pk->name () << " * /* key */)" << be_uidt_nl - << "{" << be_idt_nl - << "throw ::CORBA::NO_IMPLEMENT (CORBA::OMGVMCID | 8," - << be_nl - << " CORBA::COMPLETED_NO);" - << be_uidt_nl - << "}"; + return 0; +} - os_ << be_nl << be_nl - << "void" << be_nl - << lname << "_Servant::remove (" << be_idt_nl - << "::" << pk->name () << " * /* key */)" << be_uidt_nl - << "{" << be_idt_nl - << "throw ::CORBA::NO_IMPLEMENT (CORBA::OMGVMCID | 8," - << be_nl - << " CORBA::COMPLETED_NO);" - << be_uidt_nl - << "}"; +int +be_visitor_home_svs::gen_factories (void) +{ + return this->gen_factories_r (node_); +} - os_ << be_nl << be_nl - << "::" << pk->name () << " *" << be_nl - << lname << "_Servant::get_primary_key (" << be_idt_nl - << "::" << comp_->name () << "_ptr /* comp */)" << be_uidt_nl - << "{" << be_idt_nl - << "throw ::CORBA::NO_IMPLEMENT (CORBA::OMGVMCID | 8," - << be_nl - << " CORBA::COMPLETED_NO);" - << be_uidt_nl - << "}"; +int +be_visitor_home_svs::gen_factories_r (AST_Home *node) +{ + if (node == 0) + { + return 0; } - be_home *h = node_; + if (this->gen_init_ops (node->factories (), false) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("be_visitor_home_svs::") + ACE_TEXT ("gen_factories_r - ") + ACE_TEXT ("gen_init_ops_i() failed\n")), + -1); + } + + AST_Home *base = node->base_home (); + + return this->gen_factories_r (base); +} + +int +be_visitor_home_svs::gen_finders (void) +{ + os_ << be_nl << be_nl + << "// Finder operations."; - while (h != 0) + return this->gen_finders_r (node_); +} + +int +be_visitor_home_svs::gen_finders_r (AST_Home *node) +{ + if (node == 0) { - if (this->visit_scope (h) != 0) + return 0; + } + + if (this->gen_init_ops (node->finders (), true) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("be_visitor_home_svs::") + ACE_TEXT ("gen_finders_r - ") + ACE_TEXT ("gen_init_ops_i() failed\n")), + -1); + } + + AST_Home *base = node->base_home (); + + return this->gen_finders_r (base); +} + +int +be_visitor_home_svs::gen_init_ops (AST_Home::INIT_LIST & list, + bool finder_list) +{ + AST_Operation **op = 0; + ACE_CString comp_sname_str ( + ScopeAsDecl (comp_->defined_in ())->full_name ()); + const char *comp_sname = comp_sname_str.c_str (); + const char *comp_lname = comp_->local_name ()->get_string (); + const char *global = (comp_sname_str == "" ? "" : "::"); + + for (AST_Home::INIT_LIST::ITERATOR i = list.begin (); + !i.done (); + i.advance ()) + { + i.next (op); + be_operation *bop = be_operation::narrow_from_decl (*op); + + // Retrieve the operation return type. + be_type *bt = be_type::narrow_from_decl (bop->return_type ()); + + if (bt == 0) { ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT ("be_visitor_home_svs::") - ACE_TEXT ("gen_servant_class - ") - ACE_TEXT ("codegen for scope failed\n")), + "be_visitor_home_svs::" + "gen_init_ops - " + "Bad return type\n"), -1); } - for (long i = 0; i < h->n_inherits (); ++i) + os_ << be_nl << be_nl; + + be_visitor_operation_rettype rt_visitor (this->ctx_); + + if (bt->accept (&rt_visitor) == -1) { - // A closure of all the supported interfaces is stored - // in the base class 'pd_inherits_flat' member. - be_interface *bi = - be_interface::narrow_from_decl (h->inherits ()[i]); + ACE_ERROR_RETURN ((LM_ERROR, + "be_visitor_home_svs::" + "gen_init_ops - " + "codegen for return type failed\n"), + -1); + } - bi->get_insert_queue ().reset (); - bi->get_del_queue ().reset (); - bi->get_insert_queue ().enqueue_tail (bi); + os_ << be_nl + << node_->original_local_name ()->get_string () + << "_Servant::" << bop->local_name (); - Home_Op_Attr_Generator op_attr_gen (this); + be_visitor_operation_arglist al_visitor (this->ctx_); - int status = - bi->traverse_inheritance_graph (op_attr_gen, - &os_, - false, - false); + // Finder operations are as yet unimplemented in CIAO, so + // any args will be unused and should be commented out. + al_visitor.unused (finder_list); - if (status == -1) + if (bop->accept (&al_visitor) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "be_visitor_home_svs::" + "gen_init_ops - " + "codegen for argument list failed\n"), + -1); + } + + os_ << be_nl + << "{" << be_idt_nl; + + if (finder_list) + { + os_ << "throw ::CORBA::NO_IMPLEMENT ();"; + } + else + { + os_ << "::Components::EnterpriseComponent_var _ciao_ec =" + << be_idt_nl + << "this->executor_->" << bop->local_name () << " ("; + + if (bop->argument_count () != 0) { - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT ("be_visitor_home_svs::") - ACE_TEXT ("gen_servant_class - ") - ACE_TEXT ("traverse_inheritance_graph() ") - ACE_TEXT ("failed for %s\n"), - bi->full_name ()), - -1); + os_ << be_idt_nl; + + if (this->visit_scope (bop) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("be_visitor_home_svs") + ACE_TEXT ("::gen_init_ops - ") + ACE_TEXT ("visit_scope() failed\n")), + -1); + } + + os_ << be_uidt; } + os_ << ");" << be_uidt_nl << be_nl + << global << comp_sname << "::CCM_" << comp_lname + << "_var _ciao_comp =" << be_idt_nl + << global << comp_sname << "::CCM_" << comp_lname + << "::_narrow (_ciao_ec.in ());" << be_uidt_nl << be_nl + << "return this->_ciao_activate_component " + << "(_ciao_comp.in ());"; } - h = be_home::narrow_from_decl (h->base_home ()); + os_ << be_uidt_nl + << "}"; } return 0; |