summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp335
1 files changed, 335 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp b/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp
new file mode 100644
index 00000000000..03c6a69d249
--- /dev/null
+++ b/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp
@@ -0,0 +1,335 @@
+//=============================================================================
+/**
+* @file amh_ss.cpp
+*
+* $Id$
+*
+* Specialized interface visitor for AMH.
+*
+* @author Darrell Brunsch <brunsch@cs.wustl.edu>
+*/
+//=============================================================================
+
+ACE_RCSID (be_visitor_interface,
+ amh_ss,
+ "$Id$")
+
+be_visitor_amh_interface_ss::be_visitor_amh_interface_ss (
+ be_visitor_context *ctx
+ )
+ : be_visitor_interface_ss (ctx)
+{
+}
+
+be_visitor_amh_interface_ss::~be_visitor_amh_interface_ss (void)
+{
+}
+
+int
+be_visitor_amh_interface_ss::visit_operation (be_operation *node)
+{
+ be_visitor_amh_operation_ss visitor (this->ctx_);
+ return visitor.visit_operation (node);
+}
+
+int
+be_visitor_amh_interface_ss::visit_attribute (be_attribute *node)
+{
+ be_visitor_amh_operation_ss visitor (this->ctx_);
+ return visitor.visit_attribute (node);
+}
+
+int
+be_visitor_amh_interface_ss::visit_interface (be_interface *node)
+{
+ // Do not generate AMH classes for any sort of implied IDL.
+ if (node->original_interface () != 0)
+ {
+ return 0;
+ }
+
+ return be_visitor_interface_ss::visit_interface (node);
+}
+
+void
+be_visitor_amh_interface_ss::this_method (be_interface *node)
+{
+ TAO_OutStream *os = this->ctx_->stream ();
+
+ // the _this () operation
+ //const char *non_amh_name = node->full_name () + 4;
+ ACE_CString non_amh_name = "";
+ non_amh_name += node->client_enclosing_scope ();
+ non_amh_name += node->local_name ();
+
+ ACE_CString full_skel_name_holder =
+ this->generate_full_skel_name (node);
+ const char *full_skel_name = full_skel_name_holder.c_str ();
+
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
+ << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+
+ *os << non_amh_name.c_str () << "*" << be_nl
+ << full_skel_name
+ << "::_this (void)" << be_nl
+ << "{" << be_idt_nl
+ << "TAO_Stub *stub = this->_create_stub ();" << be_nl << be_nl;
+
+ *os << "TAO_Stub_Auto_Ptr safe_stub (stub);" << be_nl
+ << "::CORBA::Object_ptr tmp = CORBA::Object_ptr ();" << be_nl
+ << be_nl
+ << "::CORBA::Boolean _tao_opt_colloc =" << be_idt_nl
+ << "stub->servant_orb_var ()->orb_core ()->"
+ << "optimize_collocation_objects ();" << be_uidt_nl << be_nl
+ << "ACE_NEW_RETURN (" << be_idt << be_idt_nl
+ << "tmp," << be_nl
+ << "::CORBA::Object (stub, _tao_opt_colloc, this)," << be_nl
+ << "0" << be_uidt_nl
+ << ");" << be_uidt_nl << be_nl;
+
+ *os << "::CORBA::Object_var obj = tmp;" << be_nl
+ << "(void) safe_stub.release ();" << be_nl << be_nl;
+
+ *os << "typedef ::" << node->name () << " STUB_SCOPED_NAME;" << be_nl
+ << "return" << be_idt_nl;
+
+ if (!node->is_abstract ())
+ {
+ *os << "TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (";
+ }
+ else
+ {
+ *os << "TAO::AbstractBase_Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (";
+ }
+ *os << be_idt << be_idt_nl
+ << "obj.in ()," << be_nl
+ << node->flat_client_enclosing_scope ()
+ << node->base_proxy_broker_name ()
+ << "_Factory_function_pointer" << be_uidt_nl
+ << ");" << be_uidt << be_uidt << be_uidt_nl
+ << "}";
+
+}
+
+void
+be_visitor_amh_interface_ss::dispatch_method (be_interface *node)
+{
+ TAO_OutStream *os = this->ctx_->stream ();
+
+ ACE_CString full_skel_name_holder =
+ this->generate_full_skel_name (node);
+ const char *full_skel_name = full_skel_name_holder.c_str ();
+
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
+ << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+
+ *os << "void" << be_nl
+ << full_skel_name << "::_dispatch (" << be_idt << be_idt_nl
+ << "TAO_ServerRequest & req," << be_nl
+ << "void * context" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl
+ << "this->asynchronous_upcall_dispatch (" << be_idt << be_idt_nl
+ << "req," << be_nl
+ << "context," << be_nl
+ << "this" << be_uidt_nl
+ << ");" << be_uidt << be_uidt_nl
+ << "}";
+}
+
+void
+be_visitor_amh_interface_ss::generate_send_reply (TAO_OutStream * os)
+{
+ *os << be_nl << be_nl
+ << "server_request.tao_send_reply ();";
+}
+
+int
+be_visitor_amh_interface_ss::generate_amh_classes (be_interface *)
+{
+ // No AMH classes for the AMH classes... :-)
+ return 0;
+}
+
+int
+be_visitor_amh_interface_ss::generate_proxy_classes (be_interface *)
+{
+ // No Proxy or ProxyBrokers for the AMH classes
+ return 0;
+}
+
+// ****************************************************************
+
+class TAO_IDL_Downcast_Implementation_Worker
+ : public TAO_IDL_Inheritance_Hierarchy_Worker
+{
+public:
+ TAO_IDL_Downcast_Implementation_Worker ();
+
+ virtual int emit (be_interface *base,
+ TAO_OutStream *os,
+ be_interface *derived);
+};
+
+TAO_IDL_Downcast_Implementation_Worker::
+TAO_IDL_Downcast_Implementation_Worker (void)
+{
+}
+
+int
+TAO_IDL_Downcast_Implementation_Worker::
+emit (be_interface * /* derived */,
+ TAO_OutStream *os,
+ be_interface *base)
+{
+ // @@ This whole thing would be more efficient if we could pass the
+ // ACE_CString to compute_full_name, after all it uses that
+ // internally.
+ ACE_CString amh_name ("POA_");
+
+ // @@ The following code is *NOT* exception-safe.
+ char *buf = 0;
+ base->compute_full_name ("AMH_", "", buf);
+ amh_name += buf;
+ // buf was allocated using ACE_OS::strdup, so we must use free instead
+ // of delete.
+ ACE_OS::free (buf);
+
+ *os << "if (ACE_OS::strcmp (logical_type_id, \""
+ << base->repoID () << "\") == 0)" << be_idt_nl
+ << "return static_cast<"
+ << amh_name.c_str () << "*> (this);" << be_uidt_nl;
+
+ return 0;
+}
+
+// ****************************************************************
+
+class TAO_IDL_Copy_Ctor_Worker
+ : public TAO_IDL_Inheritance_Hierarchy_Worker
+{
+public:
+ TAO_IDL_Copy_Ctor_Worker (void);
+
+ virtual int emit (be_interface *base,
+ TAO_OutStream *os,
+ be_interface *derived);
+};
+
+TAO_IDL_Copy_Ctor_Worker::
+TAO_IDL_Copy_Ctor_Worker (void)
+{
+}
+
+int
+TAO_IDL_Copy_Ctor_Worker::
+emit (be_interface *derived,
+ TAO_OutStream *os,
+ be_interface *base)
+{
+ if (derived == base)
+ {
+ return 0;
+ }
+
+ *os << "," << be_idt_nl;
+
+ if (base->is_nested ())
+ {
+ be_decl *scope;
+ scope = be_scope::narrow_from_scope (base->defined_in ())->decl ();
+
+ *os << "POA_" << scope->name () << "::AMH_"
+ << base->local_name () << " (rhs)";
+ }
+ else
+ {
+ // @@ This whole thing would be more efficient if we could pass the
+ // ACE_CString to compute_full_name, after all it uses that
+ // internally.
+ ACE_CString amh_name ("POA_");
+
+ // @@ The following code is *NOT* exception-safe.
+ char *buf = 0;
+ base->compute_full_name ("AMH_", "", buf);
+ amh_name += buf;
+ // buf was allocated by ACE_OS::strdup, so we need to use free
+ // instead of delete.
+ ACE_OS::free (buf);
+
+ *os << amh_name.c_str () << " (rhs)";
+ }
+
+ *os << be_uidt;
+
+ return 0;
+}
+
+int
+be_visitor_amh_interface_ss::generate_copy_ctor (be_interface *node,
+ TAO_OutStream *os)
+{
+ // Make sure the queues are empty.
+ node->get_insert_queue ().reset ();
+ node->get_del_queue ().reset ();
+
+
+ // Insert ourselves in the queue.
+ if (node->get_insert_queue ().enqueue_tail (node) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_interface::traverse_inheritance_graph - "
+ "error generating entries\n"),
+ -1);
+ }
+
+ TAO_IDL_Copy_Ctor_Worker worker;
+ return node->traverse_inheritance_graph (worker, os);
+}
+
+// ****************************************************************
+
+ACE_CString
+be_visitor_amh_interface_ss::generate_flat_name (be_interface *node)
+{
+ // @@ The following code is *NOT* exception-safe.
+ char *buf = 0;
+ node->compute_flat_name ("AMH_", "", buf);
+
+ // @@ This whole thing would be more efficient if we could pass the
+ // ACE_CString to compute_flat_name, after all it uses that
+ // internally.
+ ACE_CString result (buf);
+ // buf was allocated using ACE_OS::strdup, so we must use free instead
+ // of delete.
+ ACE_OS::free (buf);
+
+ return result;
+}
+
+ACE_CString
+be_visitor_amh_interface_ss::generate_local_name (be_interface *node)
+{
+ ACE_CString local_name = "AMH_";
+ local_name += node->local_name ();
+ return local_name;
+}
+
+ACE_CString
+be_visitor_amh_interface_ss::generate_full_skel_name (be_interface *node)
+{
+ // @@ This whole thing would be more efficient if we could pass the
+ // ACE_CString to compute_full_name, after all it uses that
+ // internally.
+ ACE_CString result ("POA_");
+
+ // @@ The following code is *NOT* exception-safe.
+ char *buf = 0;
+ node->compute_full_name ("AMH_", "", buf);
+ result += buf;
+ // buf was allocated using ACE_OS::strdup, so we must use free instead
+ // of delete.
+ ACE_OS::free (buf);
+
+ return result;
+}