summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_home/home_svs.cpp
diff options
context:
space:
mode:
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.cpp384
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;