📄 trading_loader.cpp
字号:
// Trading_Loader.cpp,v 1.24 2003/11/08 02:12:55 bala Exp
//===========================================================================
// LIBRARY
// libTAO_CosTrading.so
//
// DESCRIPTION
// This class allows for dynamically loading
// the Trading Service.
//
// AUTHORS
// Priyanka Gontla <pgontla@ece.uci.edu>
//===========================================================================
#include "Trading_Loader.h"
#include "tao/ORB_Core.h"
#include "tao/default_ports.h"
#include "ace/Dynamic_Service.h"
#include "ace/Arg_Shifter.h"
#include "ace/Argv_Type_Converter.h"
#include "ace/os_include/os_netdb.h"
ACE_RCSID (Trader, Trading_Loader, "Trading_Loader.cpp,v 1.24 2003/11/08 02:12:55 bala Exp")
TAO_Trading_Loader::TAO_Trading_Loader (void)
: federate_ (0),
ior_output_file_ (0),
bootstrapper_ (0)
{
char *trader_name = CORBA::string_alloc (MAXHOSTNAMELEN + 10);
if (trader_name != 0)
{
// The trader name is the concatenation of the local host name
// and the server's process id.
char host_name[MAXHOSTNAMELEN + 1];
ACE_INET_Addr localhost ((u_short) 0);
if (localhost.get_host_name (host_name, sizeof (host_name)) != 0)
{
const char *tmp = localhost.get_host_addr ();
if (tmp == 0)
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("\n\nTAO Trading Service (%P|%t) ")
ACE_TEXT ("TAO_Trading_Loader ")
ACE_TEXT ("- %p\n\n"),
ACE_TEXT ("cannot determine hostname")));
else
ACE_OS::strcpy (host_name, tmp);
}
ACE_OS::sprintf (trader_name,
"%s_%ld",
host_name,
ACE_static_cast (long, ACE_OS::getpid ()));
for (char *dot = 0;
(dot = ACE_OS::strchr (trader_name, '.')) != 0;
*dot = '_')
continue;
ACE_DEBUG ((LM_DEBUG,
"*** Trading Service %s initializing.\n",
trader_name));
this->name_ = trader_name;
}
}
TAO_Trading_Loader::~TAO_Trading_Loader (void)
{
// Destructor
}
int
TAO_Trading_Loader::init (int argc, ACE_TCHAR *argv[])
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
// Copy command line parameter.
ACE_Argv_Type_Converter command_line(argc, argv);
// Initialize the ORB Manager
this->orb_manager_.init (command_line.get_argc(),
command_line.get_ASCII_argv()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::ORB_var orb =
this->orb_manager_.orb ();
// Initializes and sets up the Trading Service
CORBA::Object_var object =
this->create_object (orb.in (), command_line.get_argc(), command_line.get_TCHAR_argv() ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
// @@ Should we log this???
return -1;
}
ACE_ENDTRY;
return 0;
}
int
TAO_Trading_Loader::fini (void)
{
ACE_TRY_NEW_ENV
{
if (this->trader_.get () != 0)
{
TAO_Trading_Components_i& trd_comp
= this->trader_->trading_components ();
CosTrading::Link_ptr our_link =
trd_comp.link_if ();
CosTrading::LinkNameSeq_var link_name_seq =
our_link->list_links (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
ACE_DEBUG ((LM_DEBUG,
"*** Unlinking from federated traders.\n"));
for (CORBA::ULong j = 0;
j != link_name_seq->length ();
++j)
{
CORBA::ULong i =
link_name_seq->length () - j - 1;
ACE_DEBUG ((LM_DEBUG,
"*** Describing the next link.\n"));
CosTrading::Link::LinkInfo_var link_info =
our_link->describe_link (link_name_seq[i]
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
ACE_DEBUG ((LM_DEBUG,
"*** Removing link to %s.\n",
ACE_static_cast (const char *,
link_name_seq[i])));
our_link->remove_link (link_name_seq[i]
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CosTrading::Lookup_ptr remote_lookup;
remote_lookup =
link_info->target.in ();
ACE_DEBUG ((LM_DEBUG,
"*** Retrieving its link interface.\n"));
CosTrading::Link_var remote_link =
remote_lookup->link_if (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
ACE_DEBUG ((LM_DEBUG,
"*** Removing its link to us.\n"));
if (this->bootstrapper_)
remote_link->remove_link ("Bootstrap"
ACE_ENV_ARG_PARAMETER);
else
remote_link->remove_link (this->name_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Trading Service shutting down");
}
ACE_ENDTRY;
return 0;
}
int
TAO_Trading_Loader::run (ACE_ENV_SINGLE_ARG_DECL)
{
int return_value =
this->orb_manager_.run (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
return return_value;
}
CORBA::Object_ptr
TAO_Trading_Loader::create_object (CORBA::ORB_ptr orb_ptr,
int argc,
ACE_TCHAR *argv[]
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Duplicate the ORB
CORBA::ORB_var orb = CORBA::ORB::_duplicate (orb_ptr);
// Activating the poa manager
this->orb_manager_.activate_poa_manager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::Object::_nil ());
// Create a Trader Object and set its Service Type Repository.
auto_ptr<TAO_Trader_Factory::TAO_TRADER> auto_trader (TAO_Trader_Factory::create_trader (argc, argv));
this->trader_ = auto_trader;
TAO_Support_Attributes_i &sup_attr =
this->trader_->support_attributes ();
TAO_Trading_Components_i &trd_comp =
this->trader_->trading_components ();
sup_attr.type_repos (this->type_repos_._this (ACE_ENV_SINGLE_ARG_PARAMETER));
ACE_CHECK_RETURN (CORBA::Object::_nil ());
// The Spec says: return a reference to the Lookup interface from
// the resolve_initial_references method.
CosTrading::Lookup_ptr lookup =
trd_comp.lookup_if ();
this->ior_ =
orb->object_to_string (lookup
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::Object::_nil ());
// Parse the args
if (this->parse_args (argc, argv) == -1)
return CORBA::Object::_nil ();
// Dump the ior to a file.
if (this->ior_output_file_ != 0)
{
ACE_OS::fprintf (this->ior_output_file_,
"%s",
this->ior_.in ());
ACE_OS::fclose (this->ior_output_file_);
}
if (this->federate_)
{
// Only become a multicast server if we're the only trader
// on the multicast network.
// @@ Could do other things. For example, every timeout
// period try to federate again, but let's not hardcode that
// policy.
int rc = this->bootstrap_to_federation (ACE_ENV_SINGLE_ARG_PARAMETER);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -