summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_interface/tie_ss.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_interface/tie_ss.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/tie_ss.cpp248
1 files changed, 248 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_interface/tie_ss.cpp b/TAO/TAO_IDL/be/be_visitor_interface/tie_ss.cpp
new file mode 100644
index 00000000000..eb876a5a13c
--- /dev/null
+++ b/TAO/TAO_IDL/be/be_visitor_interface/tie_ss.cpp
@@ -0,0 +1,248 @@
+//
+// $Id$
+//
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// tie_ss.cpp
+//
+// = DESCRIPTION
+// Visitor generating code for TIE classes for the Interface node in the
+// inline file.
+//
+// = AUTHOR
+// Aniruddha Gokhale
+//
+// ============================================================================
+
+ACE_RCSID (be_visitor_interface,
+ tie_ss,
+ "$Id$")
+
+
+// ************************************************************************
+// Interface visitor for server inline
+// ************************************************************************
+
+be_visitor_interface_tie_ss::be_visitor_interface_tie_ss (
+ be_visitor_context *ctx
+ )
+ : be_visitor_interface (ctx)
+{
+}
+
+be_visitor_interface_tie_ss::~be_visitor_interface_tie_ss (void)
+{
+}
+
+int
+be_visitor_interface_tie_ss::visit_interface (be_interface *node)
+{
+ if (node->srv_inline_gen ()
+ || node->imported ()
+ || node->is_abstract ())
+ {
+ return 0;
+ }
+
+ static char fulltiename [NAMEBUFSIZE];
+ static char localtiename [NAMEBUFSIZE];
+ static char localskelname [NAMEBUFSIZE];
+
+ ACE_OS::memset (fulltiename,
+ '\0',
+ NAMEBUFSIZE);
+ ACE_OS::memset (localtiename,
+ '\0',
+ NAMEBUFSIZE);
+ ACE_OS::memset (localskelname,
+ '\0',
+ NAMEBUFSIZE);
+
+ // Generate the skeleton class name which will be used to determine the TIE
+ // class name.
+
+ // We are outermost.
+ ACE_OS::sprintf (fulltiename,
+ "%s_tie",
+ node->full_skel_name ());
+
+ if (!node->is_nested ())
+ {
+ ACE_OS::sprintf (localskelname,
+ "POA_%s",
+ node->local_name ());
+ ACE_OS::sprintf (localtiename,
+ "POA_%s_tie",
+ node->local_name ());
+ }
+ else
+ {
+ ACE_OS::sprintf (localskelname,
+ "%s",
+ node->local_name ());
+ ACE_OS::sprintf (localtiename,
+ "%s_tie",
+ node->local_name ());
+ }
+
+ TAO_OutStream *os = this->ctx_->stream ();
+
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
+ << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+
+ *os << "template <class T>" << be_nl
+ << fulltiename << "<T>::" << localtiename << " (T &t)" << be_nl
+ << "\t: ptr_ (&t)," << be_nl
+ << "\t poa_ (PortableServer::POA::_nil ())," << be_nl
+ << "\t rel_ (0)" << be_nl
+ << "{}" << be_nl << be_nl;
+
+ *os << "template <class T> " << be_nl
+ << fulltiename << "<T>::" << localtiename
+ << " (T &t, PortableServer::POA_ptr poa)" << be_nl
+ << "\t: ptr_ (&t)," << be_nl
+ << "\t poa_ (PortableServer::POA::_duplicate (poa))," << be_nl
+ << "\t rel_ (0)" << be_nl
+ << "{}" << be_nl << be_nl;
+
+ *os << "template <class T>" << be_nl
+ << fulltiename << "<T>::" << localtiename
+ << " (T *tp, ::CORBA::Boolean release)" << be_nl
+ << "\t: ptr_ (tp)," << be_nl
+ << "\t poa_ (PortableServer::POA::_nil ())," << be_nl
+ << "\t rel_ (release)" << be_nl
+ << "{}" << be_nl << be_nl;
+
+ *os << "template <class T>" << be_nl
+ << fulltiename << "<T>::" << localtiename
+ << " (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)"
+ << be_nl
+ << "\t: ptr_ (tp)," << be_nl
+ << "\t poa_ (PortableServer::POA::_duplicate (poa))," << be_nl
+ << "\t rel_ (release)" << be_nl
+ << "{}" << be_nl << be_nl;
+
+ *os << "template <class T>" << be_nl
+ << fulltiename << "<T>::~" << localtiename << " (void)" << be_nl
+ << "{" << be_idt_nl
+ << "if (this->rel_)" << be_idt_nl
+ << "{" << be_idt_nl
+ << "delete this->ptr_;" << be_uidt_nl
+ << "}" << be_uidt << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ *os << "template <class T> T *" << be_nl
+ << fulltiename << "<T>::_tied_object (void)" << be_nl
+ << "{" << be_idt_nl
+ << "return this->ptr_;" << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ *os << "template <class T> void" << be_nl
+ << fulltiename << "<T>::_tied_object (T &obj)" << be_nl
+ << "{" << be_idt_nl
+ << "if (this->rel_)" << be_idt_nl
+ << "{" << be_idt_nl
+ << "delete this->ptr_;" << be_uidt_nl
+ << "}" << be_uidt_nl << be_nl
+ << "this->ptr_ = &obj;" << be_nl
+ << "this->rel_ = 0;" << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ *os << "template <class T> void" << be_nl
+ << fulltiename << "<T>::_tied_object (T *obj, "
+ << "::CORBA::Boolean release)" << be_nl
+ << "{" << be_idt_nl
+ << "if (this->rel_)" << be_idt_nl
+ << "{" << be_idt_nl
+ << "delete this->ptr_;" << be_uidt_nl
+ << "}" << be_uidt_nl << be_nl
+ << "this->ptr_ = obj;" << be_nl
+ << "this->rel_ = release;" << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ *os << "template <class T> ::CORBA::Boolean" << be_nl
+ << fulltiename << "<T>::_is_owner (void)" << be_nl
+ << "{" << be_idt_nl
+ << "return this->rel_;" << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ *os << "template <class T> void" << be_nl
+ << fulltiename << "<T>::_is_owner ( ::CORBA::Boolean b)" << be_nl
+ << "{" << be_idt_nl
+ << "this->rel_ = b;" << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ *os << "template <class T> "
+ << "PortableServer::POA_ptr" << be_nl
+ << fulltiename
+ << "<T>::_default_POA ()" << be_nl
+ << "{" << be_idt_nl
+ << "if (! ::CORBA::is_nil (this->poa_.in ()))" << be_idt_nl
+ << "{" << be_idt_nl
+ << "return PortableServer::POA::_duplicate (this->poa_.in ());"
+ << be_uidt_nl
+ << "}" << be_uidt_nl << be_nl
+ << "return this->" << localskelname
+ << "::_default_POA ();" << be_uidt_nl
+ << "}";
+
+ int status =
+ node->traverse_inheritance_graph (
+ be_visitor_interface_tie_ss::method_helper,
+ os
+ );
+
+ if (status == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_visitor_interface_tie_sh_ss::"
+ "visit_interface - "
+ "traversal of inhertance graph failed\n"),
+ -1);
+ }
+
+ return 0;
+}
+
+int
+be_visitor_interface_tie_ss::visit_component (be_component *node)
+{
+ return this->visit_interface (node);
+}
+
+int
+be_visitor_interface_tie_ss::method_helper (be_interface *derived,
+ be_interface *node,
+ TAO_OutStream *os)
+{
+ // Any methods from abstract parents have already been
+ // "added" to the derived interface scope by the overridden
+ // visit_scope() method in be_visitor_interface, so we can skip
+ // this base interface, if it is abstract.
+ if (node->is_abstract ())
+ {
+ return 0;
+ }
+
+ be_visitor_context ctx;
+ ctx.interface (derived);
+ ctx.stream (os);
+ ctx.state (TAO_CodeGen::TAO_ROOT_TIE_SS);
+ be_visitor_interface_tie_ss visitor (&ctx);
+
+ if (visitor.visit_scope (node) == -1)
+
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_visitor_interface_tie_ss::"
+ "method_helper\n"),
+ -1);
+ }
+
+ return 0;
+}