summaryrefslogtreecommitdiff
path: root/ACE/TAO/TAO_IDL/be/be_visitor_operation/amh_sh.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/TAO_IDL/be/be_visitor_operation/amh_sh.cpp')
-rw-r--r--ACE/TAO/TAO_IDL/be/be_visitor_operation/amh_sh.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/ACE/TAO/TAO_IDL/be/be_visitor_operation/amh_sh.cpp b/ACE/TAO/TAO_IDL/be/be_visitor_operation/amh_sh.cpp
new file mode 100644
index 00000000000..a32733c740c
--- /dev/null
+++ b/ACE/TAO/TAO_IDL/be/be_visitor_operation/amh_sh.cpp
@@ -0,0 +1,191 @@
+//
+// $Id$
+//
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// amh_sh.cpp
+//
+// = DESCRIPTION
+// Visitor generating AMH skeleton code for Operation node in the
+// skeleton header.
+//
+// = AUTHOR
+// Mayur Deshpande <mayur@ics.uci.edu>
+//
+// ============================================================================
+
+ACE_RCSID (be_visitor_operation,
+ amh_sh,
+ "$Id$")
+
+// ******************************************************
+// Visitor for generating AMH skeleton for "operation" in skeleton header.
+// ******************************************************
+
+be_visitor_amh_operation_sh::be_visitor_amh_operation_sh (
+ be_visitor_context *ctx
+ )
+ : be_visitor_operation (ctx)
+{
+}
+
+be_visitor_amh_operation_sh::~be_visitor_amh_operation_sh (void)
+{
+}
+
+int
+be_visitor_amh_operation_sh::visit_operation (be_operation *node)
+{
+ // If there is an argument of type "native", return immediately.
+ if (node->has_native ())
+ {
+ return 0;
+ }
+
+ // Output stream.
+ TAO_OutStream *os = this->ctx_->stream ();
+ this->ctx_->node (node);
+
+ this->generate_shared_prologue (node, os, "");
+
+ be_visitor_context ctx (*this->ctx_);
+ be_visitor_args_arglist arglist_visitor (&ctx);
+ arglist_visitor.set_fixed_direction (AST_Argument::dir_IN);
+ ctx.scope (node);
+
+ for (UTL_ScopeActiveIterator i (node, UTL_Scope::IK_decls);
+ !i.is_done ();
+ i.next ())
+ {
+ be_argument *argument =
+ be_argument::narrow_from_decl (i.item ());
+
+ if (argument == 0
+ || argument->direction () == AST_Argument::dir_OUT)
+ {
+ continue;
+ }
+
+ *os << "," << be_nl;
+
+ if (arglist_visitor.visit_argument (argument) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_amh_operation_sh::"
+ "visit_operation - "
+ "codegen for upcall args failed\n"),
+ -1);
+ }
+ }
+
+ *os << be_uidt_nl
+ << ") = 0;" << be_uidt_nl;
+
+ return 0;
+}
+
+int
+be_visitor_amh_operation_sh::visit_attribute (be_attribute *node)
+{
+ TAO_OutStream *os = this->ctx_->stream ();
+ this->generate_shared_prologue (node, os, "_get_");
+
+ *os << be_uidt_nl
+ << ") = 0;" << be_uidt_nl;
+
+ if (node->readonly ())
+ {
+ return 0;
+ }
+
+ this->generate_shared_prologue (node, os, "_set_");
+
+ *os << "," << be_nl;
+
+ be_argument the_argument (AST_Argument::dir_IN,
+ node->field_type (),
+ node->name ());
+ be_visitor_context ctx (*this->ctx_);
+ be_visitor_args_arglist visitor (&ctx);
+
+ int status = visitor.visit_argument (&the_argument);
+
+ the_argument.destroy ();
+
+ if (-1 == status)
+ {
+ return -1;
+ }
+
+ *os << be_uidt_nl << ") = 0;" << be_uidt_nl;
+
+ return 0;
+}
+
+void
+be_visitor_amh_operation_sh::generate_shared_prologue (
+ be_decl *node,
+ TAO_OutStream *os,
+ const char *skel_prefix
+ )
+{
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
+ << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+
+ *os << "static void " << skel_prefix
+ << node->local_name ()
+ << "_skel (" << be_idt << be_idt_nl
+ << "TAO_ServerRequest &_tao_req," << be_nl
+ << "void *_tao_obj," << be_nl
+ << "void *_tao_servant_upcall" << be_uidt_nl
+ << ");" << be_uidt_nl << be_nl;
+
+ // We need the interface node in which this operation was defined. However,
+ // if this operation node was an attribute node in disguise, we get this
+ // information from the context
+ be_interface *intf =
+ be_interface::narrow_from_scope (node->defined_in ());
+
+ if (this->ctx_->attribute () != 0)
+ {
+ intf = be_interface::narrow_from_scope (
+ this->ctx_->attribute()->defined_in ()
+ );
+ }
+
+ if (intf == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "(%N:%l) be_visitor_amh_operation_sh::"
+ "visit_operation - "
+ "bad interface scope\n"));
+ return;
+ }
+
+ // Step 1 : Generate return type: always void
+ *os << "virtual void ";
+
+ // Step 2: Generate the method name
+ *os << node->local_name() << " (" << be_idt << be_idt_nl;
+
+ // STEP 3: Generate the argument list with the appropriate
+ // mapping. For these we grab a visitor that generates the
+ // parameter listing. We also generate the ResponseHandler
+ // argument 'on the fly' and add it to the argument list
+
+ char *buf;
+ // @@ TODO this must be kept consistent with the code in
+ // be_visitor_interface/amh_sh.cpp
+ intf->compute_full_name ("AMH_", "ResponseHandler_ptr", buf);
+
+ *os << buf << " _tao_rh";
+ // buf was allocated by ACE_OS::strdup, so we must use free instead
+ // of delete.
+ ACE_OS::free (buf);
+ buf = 0;
+}