diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_operation/operation_cs.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_operation/operation_cs.cpp | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_operation/operation_cs.cpp b/TAO/TAO_IDL/be/be_visitor_operation/operation_cs.cpp new file mode 100644 index 00000000000..f9304464aef --- /dev/null +++ b/TAO/TAO_IDL/be/be_visitor_operation/operation_cs.cpp @@ -0,0 +1,161 @@ +// +// $Id$ +// + +// ============================================================================ +// +// = LIBRARY +// TAO IDL +// +// = FILENAME +// operation_cs.cpp +// +// = DESCRIPTION +// Visitor generating code for Operation in the stubs file. +// +// = AUTHOR +// Aniruddha Gokhale & Angelo Corsaro +// +// ============================================================================ + +ACE_RCSID (be_visitor_operation, + operation_cs, + "$Id$") + +// ************************************************************ +// Operation visitor for client stubs +// ************************************************************ + +be_visitor_operation_cs::be_visitor_operation_cs (be_visitor_context *ctx) + : be_visitor_operation (ctx) +{ +} + +be_visitor_operation_cs::~be_visitor_operation_cs (void) +{ +} + +// Processing to be done after every element in the scope is processed. +int +be_visitor_operation_cs::post_process (be_decl *bd) +{ + // All we do here is to insert a comma and a newline. + TAO_OutStream *os = this->ctx_->stream (); + + if (!this->last_node (bd)) + { + *os << ",\n"; + } + + return 0; +} + +int +be_visitor_operation_cs::visit_operation (be_operation *node) +{ + be_interface *intf = this->ctx_->attribute () + ? be_interface::narrow_from_scope (this->ctx_->attribute ()->defined_in ()) + : be_interface::narrow_from_scope (node->defined_in ()); + + if (!intf) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_operation_cs::" + "visit_operation - " + "bad interface scope\n"), + -1); + } + + TAO_OutStream *os = this->ctx_->stream (); + this->ctx_->node (node); // save the node for future use + + if (node->is_local ()) + { + return 0; + } + + *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl + << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl; + + // Retrieve the operation return type. + be_type *bt = be_type::narrow_from_decl (node->return_type ()); + + if (!bt) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_operation_cs::" + "visit_operation - " + "Bad return type\n"), + -1); + } + + // Generate the return type mapping (same as in the header file) + be_visitor_context ctx = *this->ctx_; + be_visitor_operation_rettype rt_visitor = (&ctx); + + if (bt->accept (&rt_visitor) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_operation_cs::" + "visit_operation - " + "codegen for return type failed\n"), + -1); + } + + // Generate the operation name + *os << " " << node->name (); + + // Generate the argument list with the appropriate mapping (same as + // in the header file) + ctx = *this->ctx_; + be_visitor_operation_arglist al_visitor (&ctx); + + if (node->accept (&al_visitor) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_operation_cs::" + "visit_operation - " + "codegen for argument list failed\n"), + -1); + } + + return this->gen_stub_operation_body (node, + bt); +} + +int +be_visitor_operation_cs::visit_argument (be_argument *node) +{ + // This method is used to generate the ParamData table entry. + + TAO_OutStream *os = this->ctx_->stream (); + be_type *bt = be_type::narrow_from_decl (node->field_type ()); + + if (!bt) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_operation_cs::" + "visit_argument - " + "Bad argument type\n"), + -1); + } + + os->indent (); + *os << "{" << bt->tc_name () << ", "; + + switch (node->direction ()) + { + case AST_Argument::dir_IN: + *os << "PARAM_IN, "; + break; + case AST_Argument::dir_INOUT: + *os << "PARAM_INOUT, "; + break; + case AST_Argument::dir_OUT: + *os << "PARAM_OUT, "; + break; + } + + *os << "0}"; + return 0; +} |