valuetype_ch.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 543 行 · 第 1/2 页
CPP
543 行
//
// valuetype_ch.cpp,v 1.34 2003/10/28 18:30:38 bala Exp
//
// ============================================================================
//
// = LIBRARY
// TAO IDL
//
// = FILENAME
// valuetype_ch.cpp
//
// = DESCRIPTION
// Visitor generating code for Valuetypes in the client header
// (see C++ mapping OMG 20.17)
//
// = AUTHOR
// Torsten Kuepper <kuepper2@lfa.uni-wuppertal.de>,
// based on interface_ch.cpp from Aniruddha Gokhale
//
// ============================================================================
ACE_RCSID (be_visitor_valuetype,
valuetype_ch,
"valuetype_ch.cpp,v 1.34 2003/10/28 18:30:38 bala Exp")
// ******************************************************
// Valuetype visitor for client header
// ******************************************************
be_visitor_valuetype_ch::be_visitor_valuetype_ch (be_visitor_context *ctx)
: be_visitor_valuetype (ctx)
{
}
be_visitor_valuetype_ch::~be_visitor_valuetype_ch (void)
{
}
int
be_visitor_valuetype_ch::visit_valuetype (be_valuetype *node)
{
if (node->cli_hdr_gen () || node->imported ())
{
return 0;
}
// This will be a no-op if it has alread by done by a forward
// declaration.
node->gen_var_out_seq_decls ();
TAO_OutStream *os = this->ctx_->stream ();
int status = 0;
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__;
// Now the valuetype definition itself.
os->gen_ifdef_macro (node->flat_name ());
// Now generate the class definition.
*os << be_nl << be_nl << "class " << be_global->stub_export_macro ()
<< " " << node->local_name ();
// Node valuetype inherits from other valuetypes (OMG 20.17.9)
// (ordinary (not abstract) interfaces ignored).
*os << be_idt_nl <<": " << be_idt;
long i; // loop index
be_valuetype *inherited = 0;
long n_inherits = node->n_inherits ();
int inherits_eventtype = 0;
if (n_inherits > 0)
{
for (i = 0; i < n_inherits; ++i)
{
inherited =
be_valuetype::narrow_from_decl (node->inherits ()[i]);
if (inherited->node_type () == AST_Decl::NT_eventtype)
{
inherits_eventtype = 1;
}
if (i > 0)
{
*os << "," << be_nl;
}
be_decl *scope = 0;
if (inherited->is_nested ())
{
// Inherited node is used in the scope of "node" node.
scope =
be_scope::narrow_from_scope (node->defined_in ())->decl ();
}
// Dump the scoped name.
*os << "public virtual ";
*os << inherited->nested_type_name (scope);
} // end of for loop
}
/***********************************************************************
** This is where we diverge for an ExceptionHolder ValueType.
** This is how we proceed:
** 1) Identify it is an AMH_ExceptionHolder class.
** 2) Inherit from CORBA::DefaultValueBaseRef i.e. provide a CONCRETE
** implementation for this ValueType! This is because the alternative
** design of deriving a concrete-exception-holder class that the IDL
** compiler again has to generate is superflous, unnecessary, more
** coe bloat and unnecessary information for the app-programmer. The
** changes required for this (n the *C.h file) are:
** 2.1) Generate the raise_method as non-abstract and provide a
** definition in place
** 2.2) Generate a new constructor that takes in a
CORBA::Exception*
** 2.3) Make the destructor public (instead of protected)
** 2.4) Generate a private CORBA::Exception* field.
** 2.5) Generate the tao_marshal and tao_unmarshal methods as
** non-abstarct.
** 2.6) Generate the right throw spec for the AMH ExceptionHolders
************************************************************************/
/****************************************************************/
// 1) Find out if the ValueType is an AMH_*ExceptionHolder
idl_bool is_an_amh_exception_holder = this->is_amh_exception_holder (node);
if (is_an_amh_exception_holder)
{
if (n_inherits > 0)
{
*os << "," << be_nl;
}
*os << "public virtual CORBA::DefaultValueRefCountBase";
}
if (node->node_type () == AST_Decl::NT_eventtype)
{
if (inherits_eventtype == 0)
{
if (n_inherits > 0)
{
*os << "," << be_nl;
}
*os << "public virtual ::Components::EventBase";
}
}
else if (n_inherits == 0)
{
if (is_an_amh_exception_holder)
{
*os << "," << be_nl;
}
*os << "public virtual CORBA::ValueBase";
}
if (node->supports_abstract ())
{
status =
node->traverse_supports_list_graphs (
be_valuetype::abstract_supports_helper,
os,
I_TRUE,
I_FALSE
);
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype_ch::"
"visit_valuetype - "
"traversal of supported interfaces failed\n"),
-1);
}
}
// Generate the body.
*os << be_uidt << be_uidt_nl
<< "{" << be_nl
<< "public:" << be_idt_nl
<< "typedef " << node->local_name () << "_var _var_type;"
<< be_nl << be_nl;
if (is_an_amh_exception_holder)
{
// Generate the constructor and destructor.
*os << node->local_name () << " (CORBA::Exception *ex)" << be_idt_nl
<< ": exception (ex)" << be_uidt_nl
<< "{}" << be_nl << be_nl
<< "virtual ~" << node->local_name () << " (void);"
<< be_nl << be_nl;
}
*os << "static " << node->local_name () << "* "
<< "_downcast (CORBA::ValueBase *);" << be_nl
<< be_nl
<< "// (TAO extensions or internals)" << be_nl
<< "static CORBA::Boolean _tao_unmarshal (" << be_idt << be_idt_nl
<< "TAO_InputCDR &," << be_nl
<< node->local_name () << " *&" << be_uidt_nl
<< ");" << be_uidt_nl << be_nl
<< "virtual const char* "
<< "_tao_obv_repository_id (void) const;"
<< be_nl << be_nl
<< "static const char* "
<< "_tao_obv_static_repository_id (void);" << be_nl << be_nl;
if (be_global->any_support ())
{
*os << "static void _tao_any_destructor (void *);";
}
// Generate code for the valuetype definition.
if (this->visit_valuetype_scope (node) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype_ch::"
"visit_valuetype - "
"codegen for scope failed\n"),
-1);
}
// Generate pure virtual declarations of the operations in our
// supported interfaces.
status =
node->traverse_supports_list_graphs (
be_visitor_valuetype_ch::gen_supported_ops,
os,
I_FALSE,
I_TRUE
);
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype_ch::"
"visit_valuetype - "
"traversal of supported interfaces failed\n"),
-1);
}
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__;
// If we inherit from both CORBA::ValueBase and CORBA::AbstractBase,
// we have to add this to avoid ambiguity.
if (node->supports_abstract ())
{
*os << be_nl << be_nl << "virtual void _add_ref (void) = 0;" << be_nl;
*os << "virtual void _remove_ref (void) = 0;" << be_nl;
*os << "virtual CORBA::ValueBase *_tao_to_value (void);";
}
// Generate the "protected" constructor so that users cannot
// instantiate us.
*os << be_uidt_nl << be_nl << "protected:" << be_idt_nl
<< node->local_name ()
<< " (void);" << be_nl << be_nl;
if (!is_an_amh_exception_holder)
{
*os << "virtual ~" << node->local_name () << " (void);"
<< be_nl << be_nl;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?