📄 interface_ss.cpp
字号:
//
// interface_ss.cpp,v 1.94 2003/12/17 17:11:21 bala Exp
//
// ============================================================================
//
// = LIBRARY
// TAO IDL
//
// = FILENAME
// interface_ss.cpp
//
// = DESCRIPTION
// Visitor generating code for Interfaces in the server skeletons file.
//
// = AUTHOR
// Aniruddha Gokhale
//
// ============================================================================
ACE_RCSID (be_visitor_interface,
interface_ss,
"interface_ss.cpp,v 1.94 2003/12/17 17:11:21 bala Exp")
// ************************************************************
// Interface visitor for server skeletons.
// ************************************************************
be_visitor_interface_ss::be_visitor_interface_ss (be_visitor_context *ctx)
: be_visitor_interface (ctx)
{
}
be_visitor_interface_ss::~be_visitor_interface_ss (void)
{
}
int
be_visitor_interface_ss::visit_interface (be_interface *node)
{
if (node->srv_skel_gen () || node->imported () || node->is_abstract ())
{
return 0;
}
if (node->is_local ())
{
if (this->is_amh_rh_node (node))
{
// Create amh_rh_visitors.
be_visitor_amh_rh_interface_ss amh_rh_ss_intf (this->ctx_);
amh_rh_ss_intf.visit_interface (node);
}
return 0;
}
if (this->generate_amh_classes (node) == -1)
{
return -1;
}
ACE_CString full_skel_name_holder =
this->generate_full_skel_name (node);
const char *full_skel_name = full_skel_name_holder.c_str ();
ACE_CString flat_name_holder =
this->generate_flat_name (node);
const char *flat_name = flat_name_holder.c_str ();
int status = node->gen_operation_table (flat_name,
full_skel_name);
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_interface_ss::"
"visit_interface - "
"codegen for operation table failed\n"),
-1);
}
if (this->generate_proxy_classes (node) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_interface_ss::"
"visit_interface - "
"codegen for proxy classes\n"),
-1);
}
TAO_OutStream *os = this->ctx_->stream ();
*os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
<< "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
// Find if we are at the top scope or inside some module,
// pre-compute the prefix that must be added to the local name in
// each case.
const char *local_name_prefix = "";
if (!node->is_nested ())
{
local_name_prefix = "POA_";
}
ACE_CString node_local_name_holder =
this->generate_local_name (node);
const char *node_local_name = node_local_name_holder.c_str ();
*os << full_skel_name << "::"
<< local_name_prefix << node_local_name
<< " (void)\n";
// Generate optable
*os << "{" << be_idt_nl
<< "this->optable_ = &tao_" << flat_name
<< "_optable;" << be_uidt_nl
<< "}" << be_nl << be_nl;
// find if we are at the top scope or inside some module
*os << full_skel_name << "::"
<< local_name_prefix << node_local_name << " ("
<< "const " << local_name_prefix << node_local_name << "& rhs)";
*os << be_idt_nl
<< ": TAO_Abstract_ServantBase (rhs)," << be_nl
<< " TAO_ServantBase (rhs)";
if (this->generate_copy_ctor (node, os) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_interface_ss::visit_interface - "
" copy ctor generation failed\n"),
-1);
}
*os << be_uidt_nl
<< "{" << be_nl
<< "}" << be_nl << be_nl;
*os << full_skel_name << "::~"
<< local_name_prefix << node_local_name
<< " (void)" << be_nl;
*os << "{" << be_nl;
*os << "}";
// Generate code for elements in the scope (e.g., operations).
if (this->visit_scope (node) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_interface_ss::"
"visit_interface - "
"codegen for scope failed\n"),
-1);
}
*os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
<< "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
// Generate code for the _is_a skeleton.
*os << "void " << full_skel_name
<< "::_is_a_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &_tao_server_request, " << be_nl
<< "void * _tao_servant," << be_nl
<< "void * /* Servant_Upcall */" << be_nl
<< "ACE_ENV_ARG_DECL" << be_uidt_nl
<< ")" << be_uidt_nl;
*os << "{" << be_idt_nl;
*os << "TAO_InputCDR &_tao_in = _tao_server_request.incoming ();"
<< be_nl << be_nl;
*os << full_skel_name << " *_tao_impl =" << be_idt_nl
<< "(" << full_skel_name << " *) _tao_servant;" << be_uidt_nl << be_nl;
*os << "CORBA::Boolean _tao_retval = 0;" << be_nl;
*os << "CORBA::String_var value;" << be_nl << be_nl;
*os << "if (!(_tao_in >> value.out ()))" << be_idt_nl
<< "{" << be_idt_nl;
if (be_global->use_raw_throw ())
{
*os << "throw CORBA::MARSHAL ();" ;
}
else
{
*os << "ACE_THROW (CORBA::MARSHAL ());";
}
*os << be_uidt_nl
<< "}" << be_uidt_nl << be_nl;
*os << "_tao_retval = _tao_impl->_is_a (value.in () ACE_ENV_ARG_PARAMETER);"
<< be_nl;
*os << "ACE_CHECK;" << be_nl << be_nl;
*os << "_tao_server_request.init_reply ();" << be_nl;
*os << "TAO_OutputCDR &_tao_out = _tao_server_request.outgoing ();"
<< be_nl << be_nl;
*os << "if (!(_tao_out << CORBA::Any::from_boolean (_tao_retval)))"
<< be_idt_nl
<< "{" << be_idt_nl;
if (be_global->use_raw_throw ())
{
*os << "throw CORBA::MARSHAL ();";
}
else
{
*os << "ACE_THROW (CORBA::MARSHAL ());";
}
*os << be_uidt_nl
<< "}" << be_uidt;
this->generate_send_reply (os);
*os << be_uidt_nl
<< "}" << be_nl << be_nl;
// Generate code for the _non_existent skeleton.
*os << "void " << full_skel_name
<< "::_non_existent_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &_tao_server_request, " << be_nl
<< "void * _tao_servant," << be_nl
<< "void * /* Servant_Upcall */" << be_nl
<< "ACE_ENV_ARG_DECL" << be_uidt_nl
<< ")" << be_uidt_nl;
*os << "{" << be_idt_nl;
*os << full_skel_name << " *_tao_impl =" << be_idt_nl
<< "(" << full_skel_name << " *) _tao_servant;" << be_uidt_nl << be_nl;
*os << "CORBA::Boolean _tao_retval =" << be_idt_nl
<< "_tao_impl->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);"
<< be_uidt_nl;
*os << "ACE_CHECK;" << be_nl << be_nl;
*os << "_tao_server_request.init_reply ();" << be_nl;
*os << "TAO_OutputCDR &_tao_out = _tao_server_request.outgoing ();"
<< be_nl << be_nl;
*os << "if (!(_tao_out << CORBA::Any::from_boolean (_tao_retval)))"
<< be_idt_nl
<< "{" << be_idt_nl;
if (be_global->use_raw_throw ())
{
*os << "throw CORBA::MARSHAL ();";
}
else
{
*os << "ACE_THROW (CORBA::MARSHAL ());";
}
*os << be_uidt_nl
<< "}" << be_uidt;
this->generate_send_reply (os);
*os << be_uidt_nl
<< "}" << be_nl << be_nl;
// Generate code for the _interface skeleton.
*os << "void " << full_skel_name
<< "::_interface_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &_tao_server_request, " << be_nl
<< "void * _tao_servant," << be_nl
<< "void * /* Servant_Upcall */" << be_nl
<< "ACE_ENV_ARG_DECL" << be_uidt_nl
<< ")" << be_uidt_nl;
*os << "{" << be_idt_nl;
*os << "TAO_IFR_Client_Adapter *_tao_adapter =" << be_idt_nl
<< "ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance ("
<< be_idt << be_idt_nl
<< "TAO_ORB_Core::ifr_client_adapter_name ()" << be_uidt_nl
<< ");" << be_uidt_nl << be_uidt_nl;
*os << "if (_tao_adapter == 0)" << be_idt_nl
<< "{" << be_idt_nl
<< "ACE_THROW (CORBA::INTF_REPOS ());" << be_uidt_nl
<< "}" << be_uidt_nl << be_nl;
*os << full_skel_name << " *_tao_impl =" << be_idt_nl
<< "(" << full_skel_name << " *) _tao_servant;" << be_uidt_nl << be_nl;
*os << "CORBA::InterfaceDef_ptr _tao_retval = " << be_idt_nl
<< "_tao_impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);"
<< be_uidt_nl
<< "ACE_CHECK;" << be_nl << be_nl
<< "_tao_server_request.init_reply ();" << be_nl
<< "TAO_OutputCDR &_tao_out = _tao_server_request.outgoing ();"
<< be_nl << be_nl
<< "CORBA::Boolean _tao_result =" << be_idt_nl
<< "_tao_adapter->interfacedef_cdr_insert (" << be_idt << be_idt_nl
<< "_tao_out," << be_nl
<< "_tao_retval" << be_uidt_nl
<< ");" << be_uidt << be_uidt_nl << be_nl
<< "_tao_adapter->dispose (_tao_retval);" << be_nl << be_nl;
*os << "if (_tao_result == 0)" << be_idt_nl
<< "{" << be_idt_nl
<< "ACE_THROW (CORBA::MARSHAL ());" << be_uidt_nl
<< "}" << be_uidt;
this->generate_send_reply (os);
*os << be_uidt_nl
<< "}" << be_nl << be_nl;
// Generate code for the _component skeleton.
*os << "void " << full_skel_name
<< "::_component_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &_tao_server_request, " << be_nl
<< "void * _tao_object_reference," << be_nl
<< "void * /* Servant_Upcall */" << be_nl
<< "ACE_ENV_ARG_DECL" << be_uidt_nl
<< ")" << be_uidt_nl;
*os << "{" << be_idt_nl;
*os << full_skel_name << " *_tao_impl =" << be_idt_nl
<< "(" << full_skel_name << " *) _tao_object_reference;"
<< be_uidt_nl << be_nl;
*os << "CORBA::Object_var _tao_retval =" << be_idt_nl
<< "_tao_impl->_get_component (ACE_ENV_SINGLE_ARG_PARAMETER);"
<< be_uidt_nl;
*os << "ACE_CHECK;" << be_nl << be_nl;
*os << "_tao_server_request.init_reply ();" << be_nl;
*os << "TAO_OutputCDR &_tao_out = _tao_server_request.outgoing ();"
<< be_nl << be_nl;
*os << "if (!(_tao_out << _tao_retval.in ()))" << be_idt_nl
<< "{" << be_idt_nl;
if (be_global->use_raw_throw ())
{
*os << "throw CORBA::MARSHAL ();";
}
else
{
*os << "ACE_THROW (CORBA::MARSHAL ());";
}
*os << be_uidt_nl
<< "}" << be_uidt;
this->generate_send_reply (os);
*os << be_uidt_nl
<< "}" << be_nl << be_nl;
// Generate code for the _is_a override.
*os << "CORBA::Boolean " << full_skel_name
<< "::_is_a (" << be_idt << be_idt_nl
<< "const char* value" << be_nl
<< "ACE_ENV_ARG_DECL_NOT_USED" << be_uidt_nl
<< ")" << be_uidt_nl
<< "{" << be_idt_nl
<< "if (" << be_idt << be_idt_nl;
if (node->traverse_inheritance_graph (be_interface::is_a_helper, os) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_interface_ss::"
"visit_interface - "
"traversal of inhertance graph failed\n"),
-1);
}
*os << "!ACE_OS::strcmp (" << be_idt << be_idt_nl
<< "(char *)value," << be_nl
<< "\"IDL:omg.org/CORBA/Object:1.0\"" << be_uidt_nl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -