📄 naming_utils.cpp
字号:
// Naming_Utils.cpp,v 1.94 2003/12/08 09:09:37 jwillemsen Exp
#include "Naming_Utils.h"
#include "Transient_Naming_Context.h"
#include "Persistent_Context_Index.h"
#include "Storable_Naming_Context.h"
#include "Storable_Naming_Context_Activator.h"
#include "Flat_File_Persistence.h"
#include "orbsvcs/CosNamingC.h"
#include "tao/debug.h"
#include "tao/default_ports.h"
#include "tao/ORB_Core.h"
#include "tao/IORTable/IORTable.h"
#include "tao/Messaging/Messaging.h"
#include "ace/Arg_Shifter.h"
#include "ace/Auto_Ptr.h"
#include "ace/Get_Opt.h"
ACE_RCSID (Naming,
Naming_Utils,
"Naming_Utils.cpp,v 1.94 2003/12/08 09:09:37 jwillemsen Exp")
TAO_Naming_Server::TAO_Naming_Server (void)
: naming_context_ (),
ior_multicast_ (0),
naming_service_ior_ (),
context_index_ (0),
ior_output_file_ (0),
pid_file_name_ (0),
context_size_ (ACE_DEFAULT_MAP_SIZE),
persistence_file_name_ (0),
base_address_ (TAO_NAMING_BASE_ADDR),
multicast_ (0),
use_storable_context_ (0),
use_servant_activator_ (0),
use_redundancy_(0),
round_trip_timeout_ (0),
use_round_trip_timeout_ (0)
{
}
TAO_Naming_Server::TAO_Naming_Server (CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa,
size_t context_size,
ACE_Time_Value *timeout,
int resolve_for_existing_naming_service,
const ACE_TCHAR *persistence_location,
void *base_addr,
int enable_multicast,
int use_storable_context,
int round_trip_timeout,
int use_round_trip_timeout)
: naming_context_ (),
ior_multicast_ (0),
naming_service_ior_ (),
context_index_ (0),
ior_output_file_ (0),
pid_file_name_ (0),
context_size_ (ACE_DEFAULT_MAP_SIZE),
persistence_file_name_ (0),
base_address_ (TAO_NAMING_BASE_ADDR),
multicast_ (0),
use_storable_context_ (use_storable_context),
use_servant_activator_ (0),
use_redundancy_(0),
round_trip_timeout_ (0),
use_round_trip_timeout_ (0)
{
if (this->init (orb,
poa,
context_size,
timeout,
resolve_for_existing_naming_service,
persistence_location,
base_addr,
enable_multicast,
use_storable_context,
round_trip_timeout,
use_round_trip_timeout) == -1)
ACE_ERROR ((LM_ERROR,
"(%P|%t) %p\n",
"TAO_Naming_Server::init"));
}
int
TAO_Naming_Server::init (CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa,
size_t context_size,
ACE_Time_Value *timeout,
int resolve_for_existing_naming_service,
const ACE_TCHAR *persistence_location,
void *base_addr,
int enable_multicast,
int use_storable_context,
int round_trip_timeout,
int use_round_trip_timeout)
{
if (resolve_for_existing_naming_service)
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
// Try to find an existing Naming Service.
CORBA::Object_var naming_obj =
orb->resolve_initial_references ("NameService",
timeout
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (!CORBA::is_nil (naming_obj.in ()))
{
//
// Success in finding a Naming Service.
//
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"\nNameService found!\n"));
this->naming_context_ =
CosNaming::NamingContext::_narrow (naming_obj.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
this->naming_service_ior_ =
orb->object_to_string (naming_obj.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
return 0;
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Naming_Server::init");
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
}
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"\nWe'll become a NameService\n"));
// Become a Naming Service.
return this->init_new_naming (orb,
poa,
persistence_location,
base_addr,
context_size,
enable_multicast,
use_storable_context,
round_trip_timeout,
use_round_trip_timeout);
}
int
TAO_Naming_Server::parse_args (int argc,
ACE_TCHAR *argv[])
{
ACE_Get_Opt get_opts (argc, argv, ACE_LIB_TEXT("b:do:p:s:f:m:u:r:z:"));
int c;
int size, result;
// This is declared this way to avoid warnings from
// some compilers that complain about mismatching types
// in the sscanf.
#if ACE_SIZEOF_VOID_P == ACE_SIZEOF_LONG_LONG
ptrdiff_t address;
#else
long int address;
#endif /* ACE_SIZEOF_VOID_P */
// Make sure only one persistence option is specified
int f_opt_used = 0;
int u_opt_used = 0;
int r_opt_used = 0;
while ((c = get_opts ()) != -1)
switch (c)
{
case 'd': // debug flag.
TAO_debug_level++;
break;
case 'o': // outputs the naming service ior to a file.
this->ior_output_file_ =
ACE_OS::fopen (get_opts.opt_arg (), ACE_LIB_TEXT("w"));
if (this->ior_output_file_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT("Unable to open %s for writing:(%u) %p\n"),
get_opts.opt_arg(), errno, ACE_LIB_TEXT("TAO_Naming_Server::parse_args()")), -1);
break;
case 'p':
this->pid_file_name_ = get_opts.opt_arg ();
break;
case 's':
size = ACE_OS::atoi (get_opts.opt_arg ());
if (size >= 0)
this->context_size_ = size;
break;
case 'b':
result = ::sscanf (ACE_TEXT_ALWAYS_CHAR(get_opts.opt_arg ()),
#if ACE_SIZEOF_VOID_P == ACE_SIZEOF_LONG_LONG
ACE_UINT64_FORMAT_SPECIFIER,
#else
"%ld",
#endif /* ACE_SIZEOF_VOID_P */
&address);
if (result == 0 || result == EOF)
ACE_ERROR_RETURN ((LM_ERROR,
"Unable to process <-b> option"),
-1);
this->base_address_ = (void *) address;
break;
case 'm':
this->multicast_ = ACE_OS::atoi(get_opts.opt_arg ());
break;
case 'f':
this->persistence_file_name_ = get_opts.opt_arg ();
f_opt_used = 1;
break;
case 'r':
this->use_redundancy_ = 1;
this->use_storable_context_ = 1;
this->persistence_file_name_ = get_opts.opt_arg ();
r_opt_used = 1;
break;
case 'u':
this->use_storable_context_ = 1;
this->persistence_file_name_ = get_opts.opt_arg ();
u_opt_used = 1;
break;
case 'z':
this->use_round_trip_timeout_ = 1;
this->round_trip_timeout_ = (int)1.0e7 * ACE_OS::atoi (get_opts.opt_arg ());
break;
case '?':
default:
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("usage: %s ")
ACE_LIB_TEXT ("-d ")
ACE_LIB_TEXT ("-o <ior_output_file> ")
ACE_LIB_TEXT ("-p <pid_file_name> ")
ACE_LIB_TEXT ("-s <context_size> ")
ACE_LIB_TEXT ("-b <base_address> ")
ACE_LIB_TEXT ("-m <1=enable multicast, 0=disable multicast(default) ")
ACE_LIB_TEXT ("-f <persistence_file_name> ")
ACE_LIB_TEXT ("-u <storable_persistence_directory (not used with -f)> ")
ACE_LIB_TEXT ("-r <redundant_persistence_directory> ")
ACE_LIB_TEXT ("-z <relative round trip timeout> ")
ACE_LIB_TEXT ("\n"),
argv [0]),
-1);
}
if (f_opt_used + u_opt_used + r_opt_used > 1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("Only one persistence option can be passed")
ACE_LIB_TEXT ("\n")),
-1);
return 0;
}
int
TAO_Naming_Server::init_with_orb (int argc,
ACE_TCHAR *argv [],
CORBA::ORB_ptr orb)
{
int result;
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
// Duplicate the ORB
this->orb_ = CORBA::ORB::_duplicate (orb);
// Get the POA from the ORB.
CORBA::Object_var poa_object =
orb->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (CORBA::is_nil (poa_object.in ()))
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT(" (%P|%t) Unable to initialize the POA.\n")),
-1);
}
// Check the non-ORB arguments. this needs to come before we
// initialize my_naming_server so that we can pass on some of
// the command-line arguments.
result = this->parse_args (argc, argv);
if (result < 0)
return result;
// Get the POA object.
this->root_poa_ = PortableServer::POA::_narrow (poa_object.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get the POA_Manager.
PortableServer::POAManager_var poa_manager =
this->root_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
int numPolicies = 2;
#if (TAO_HAS_MINIMUM_POA == 0)
if (this->use_storable_context_)
{
this->use_servant_activator_ = 1;
}
if (this->use_servant_activator_) {
numPolicies += 2;
}
#endif /* TAO_HAS_MINIMUM_POA */
CORBA::PolicyList policies (numPolicies);
policies.length (numPolicies);
// Id Assignment policy
policies[0] =
this->root_poa_->create_id_assignment_policy (PortableServer::USER_ID
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Lifespan policy
policies[1] =
this->root_poa_->create_lifespan_policy (PortableServer::PERSISTENT
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
#if (TAO_HAS_MINIMUM_POA == 0)
if (this->use_servant_activator_)
{
// Request Processing Policy
policies[2] =
this->root_poa_->create_request_processing_policy (PortableServer::USE_SERVANT_MANAGER
ACE_ENV_ARG_PARAMETER);
// Servant Retention Policy
policies[3] =
this->root_poa_->create_servant_retention_policy (PortableServer::RETAIN
ACE_ENV_ARG_PARAMETER);
}
#endif /* TAO_HAS_MINIMUM_POA */
// We use a different POA, otherwise the user would have to change
// the object key each time it invokes the server.
this->ns_poa_ = this->root_poa_->create_POA ("NameService",
poa_manager.in (),
policies
ACE_ENV_ARG_PARAMETER);
// Warning! If create_POA fails, then the policies won't be
// destroyed and there will be hell to pay in memory leaks!
ACE_TRY_CHECK;
// Creation of the new POAs over, so destroy the Policy_ptr's.
for (CORBA::ULong i = 0;
i < policies.length ();
++i)
{
CORBA::Policy_ptr policy = policies[i];
policy->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
result = this->init (orb,
this->ns_poa_.in (),
this->context_size_,
0,
0,
this->persistence_file_name_,
this->base_address_,
this->multicast_,
this->use_storable_context_,
this->round_trip_timeout_,
this->use_round_trip_timeout_);
if (result == -1)
return result;
}
ACE_CATCHANY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -