summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_interface/ami_handler_fwd_ci.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_interface/ami_handler_fwd_ci.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/ami_handler_fwd_ci.cpp130
1 files changed, 116 insertions, 14 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_interface/ami_handler_fwd_ci.cpp b/TAO/TAO_IDL/be/be_visitor_interface/ami_handler_fwd_ci.cpp
index 731d502538f..02e8904d29f 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface/ami_handler_fwd_ci.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface/ami_handler_fwd_ci.cpp
@@ -11,10 +11,12 @@
// ami_handler_fwd_ci.cpp
//
// = DESCRIPTION
-// Visitor generating code for Ami_Handler_Fwd node in the client inline.
+// Visitor generating code for Ami_<Interface>_Handler node in the
+// client inline.
//
// = AUTHOR
-// Aniruddha Gokhale
+// Aniruddha Gokhale and Alexander Babu Arulanthu
+// <alex@cs.wustl.edu>
//
// ============================================================================
@@ -22,7 +24,7 @@
#include "idl_extern.h"
#include "be.h"
-#include "be_visitor_ami_handler_fwd.h"
+#include "be_visitor_interface_fwd.h"
ACE_RCSID(be_visitor_ami_handler_fwd, ami_handler_fwd_ci, "$Id$")
@@ -45,20 +47,120 @@ be_visitor_ami_handler_fwd_ci::~be_visitor_ami_handler_fwd_ci (void)
int
be_visitor_ami_handler_fwd_ci::visit_interface (be_interface *node)
{
- if (!node->cli_inline_gen () && !node->imported ())
- {
-#if 0
- // We don't generate any code here.....
+ if (node->cli_inline_gen () || node->imported ())
+ return 0;
+
+ // Generate code.
+
+ // Get the out stream.
+ TAO_OutStream *os;
+ os = this->ctx_->stream ();
+
+ // Start from the current indentation level.
+ os->indent ();
+
+ // Create the full name and local name for the AMI_<Interface
+ // name>_Handler interface.
+ char *full_name = 0;
+ char *local_name = 0;
+
+ // Full name.
+ // If there exists a scope name for this, then generate
+ // "Scope::AMI_<Local Name>_Handler".
+
+ size_t scope_len = 0;
+
+ be_decl *parent = be_scope::narrow_from_scope (node->defined_in ())->decl ();
+
+ if (parent != 0 &&
+ parent->fullname () != 0 &&
+ ACE_OS::strlen (parent->fullname ()))
+ scope_len = ACE_OS::strlen (parent->fullname ()) + ACE_OS::strlen ("::");
+
+ ACE_NEW_RETURN (full_name,
+ char [scope_len +
+ ACE_OS::strlen ("AMI_") +
+ ACE_OS::strlen (node->local_name ()->get_string ()) +
+ ACE_OS::strlen ("_Handler") +
+ 1],
+ -1);
+
+ if (parent != 0 &&
+ parent->fullname () != 0 &&
+ ACE_OS::strlen (parent->fullname ()))
+ ACE_OS::sprintf (full_name,
+ "%s::AMI_%s_Handler",
+ parent->fullname (),
+ node->local_name ()->get_string ());
+ else
+ ACE_OS::sprintf (full_name,
+ "AMI_%s_Handler",
+ node->local_name ()->get_string ());
+
+ // Local name.
+
+ ACE_NEW_RETURN (local_name,
+ char [ACE_OS::strlen ("AMI_") +
+ ACE_OS::strlen (node->local_name ()->get_string ()) +
+ ACE_OS::strlen ("_Handler") +
+ 1],
+ -1);
+
+ ACE_OS::sprintf (local_name,
+ "AMI_%s_Handler",
+ node->local_name ()->get_string ());
- // It is possible to generate the definitions for the _var and
- // _out types, but if we do that then the _duplicate() and
- // _nil() methods cannot be inlined.
+ // Generate the constructors and destructor.
- // Since these classes will be generated once the forward
- // declaration is resolved there is really no problem here
-#endif /* 0 */
+ *os << "ACE_INLINE" << be_nl;
+ *os << full_name << "::" << local_name
+ << " (void) // default constructor" << be_nl;
+ *os << "{}" << be_nl << be_nl;
- node->cli_inline_gen (I_TRUE);
+ *os << "ACE_INLINE" << be_nl;
+ *os << full_name << "::" << local_name
+ << " (TAO_Stub *objref, TAO_ServantBase *_tao_servant, "
+ << "CORBA::Boolean _tao_collocated) // constructor"
+ << be_nl
+ << " : CORBA_Object (objref, _tao_servant, _tao_collocated)"
+ << be_nl
+ << "{}" << be_nl << be_nl;
+
+ *os << "ACE_INLINE" << be_nl;
+ *os << full_name << "::~" << local_name
+ << " (void) // destructor" << be_nl
+ << "{}\n\n";
+
+ // _nil method.
+ *os << "ACE_INLINE "
+ << full_name << "_ptr" << be_nl
+ << full_name << "::_nil (void)" << be_nl
+ << "{" << be_idt_nl
+ << "return (" << full_name << "_ptr)0;" << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ // Generate the ifdefined macro for the _var type.
+ os->gen_ifdef_macro (full_name, "_var");
+ if (node->gen_var_impl (full_name, local_name) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_interface_ci::"
+ "visit_interface - "
+ "codegen for _var failed\n"), -1);
}
+ os->gen_endif ();
+
+ // Generate the ifdefined macro for the _out type.
+ os->gen_ifdef_macro (full_name, "_out");
+ if (node->gen_out_impl (full_name,
+ local_name) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_interface_ci::"
+ "visit_interface - "
+ "codegen for _out failed\n"), -1);
+ }
+ os->gen_endif ();
+
return 0;
}