📄 client.cpp
字号:
// client.cpp,v 1.57 2002/01/29 20:20:56 okellogg Exp
// ============================================================================
//
// = LIBRARY
// TAO/orbsvcs/Naming_Service/
//
// = FILENAME
// client.cpp
//
// = DESCRIPTION
// This class implements a simple CORBA client for the CosNaming
// example using stubs generated by the TAO ORB IDL compiler.
//
// = AUTHORS
// Sergio Flores-Gaitan <sergio@cs.wustl.edu>,
// Marina Spivak <marina@cs.wustl.edu>, and
// Douglas C. Schmidt <schmidt@cs.wustl.edu>
// ============================================================================
#include "client.h"
#include "tao/debug.h"
#include "ace/Get_Opt.h"
ACE_RCSID(Simple_Naming, client, "client.cpp,v 1.57 2002/01/29 20:20:56 okellogg Exp")
#if defined (_MSC_VER)
# pragma warning (disable : 4250)
#endif /* _MSC_VER */
class My_Test_Object :
public virtual PortableServer::RefCountServantBase,
public virtual POA_Test_Object
{
public:
// = Initialization and termination methods.
My_Test_Object (CORBA::Short id = 0);
// Constructor.
~My_Test_Object (void);
// Destructor.
// = Interface implementation accessor methods.
void id (CORBA::Short id ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException));
// Sets id.
CORBA::Short id (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException));
// Gets id.
private:
short id_;
};
My_Test_Object::My_Test_Object (CORBA::Short id)
: id_ (id)
{
}
My_Test_Object::~My_Test_Object (void)
{
}
CORBA::Short
My_Test_Object::id (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
return id_;
}
void
My_Test_Object::id (CORBA::Short id ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
id_ = id;
}
// Constructor.
CosNaming_Client::CosNaming_Client (void)
: argc_ (0),
argv_ (0),
test_ (0)
{
}
// Parses the command line arguments and returns an error status.
int
CosNaming_Client::parse_args (void)
{
ACE_Get_Opt get_opts (argc_, argv_, "p:dstieym:c:");
int c;
while ((c = get_opts ()) != -1)
switch (c)
{
case 'd': // debug flag
TAO_debug_level++;
break;
case 's':
if (this->test_ == 0)
ACE_NEW_RETURN (this->test_,
Simple_Test,
-1);
break;
case 'm':
if (this->test_ == 0)
{
int size = ACE_OS::atoi (get_opts.opt_arg ());
if (size <= 0)
size = 10;
ACE_NEW_RETURN (this->test_,
MT_Test (this->orbmgr_.orb (), size),
-1);
}
break;
case 't':
if (this->test_ == 0)
ACE_NEW_RETURN (this->test_,
Tree_Test,
-1);
break;
case 'i':
if (this->test_ == 0)
ACE_NEW_RETURN (this->test_,
Iterator_Test,
-1);
break;
case 'e':
if (this->test_ == 0)
ACE_NEW_RETURN (this->test_,
Exceptions_Test,
-1);
break;
case 'y':
if (this->test_ == 0)
ACE_NEW_RETURN (this->test_,
Destroy_Test,
-1);
break;
case 'p':
if (this->test_ == 0)
{
FILE * ior_output_file =
ACE_OS::fopen (get_opts.opt_arg (), "w");
if (ior_output_file == 0)
ACE_ERROR_RETURN ((LM_ERROR,
"Unable to open %s for writing: %p\n",
get_opts.opt_arg ()), -1);
ACE_NEW_RETURN (this->test_,
Persistent_Test_Begin (this->orbmgr_.orb (),
ior_output_file),
-1);
}
break;
case 'c':
if (this->test_ == 0)
ACE_NEW_RETURN (this->test_,
Persistent_Test_End (this->orbmgr_.orb (),
get_opts.opt_arg ()),
-1);
break;
default:
ACE_ERROR_RETURN ((LM_ERROR,
"Argument %c \n usage: %s"
" [-d]"
" [-s or -e or -t or -i or -y or -p or -c<ior> or -m<size>]"
"\n",
c,
this->argv_ [0]),
-1);
}
if (this->test_ == 0)
ACE_NEW_RETURN (this->test_,
Simple_Test,
-1);
// Indicates successful parsing of command line.
return 0;
}
// Execute client example code.
int
CosNaming_Client::run (void)
{
return test_->execute (naming_client_);
}
CosNaming_Client::~CosNaming_Client (void)
{
delete test_;
}
int
CosNaming_Client::init (int argc, char **argv)
{
this->argc_ = argc;
this->argv_ = argv;
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
// Initialize ORB.
this->orbmgr_.init (this->argc_,
this->argv_
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
this->orbmgr_.activate_poa_manager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// Parse command line and verify parameters.
if (this->parse_args () == -1)
return -1;
CORBA::ORB_var orb = this->orbmgr_.orb ();
return this->naming_client_.init (orb.in ());
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "init");
// and return -1 below . . .
}
ACE_ENDTRY;
return -1;
}
MT_Test::MT_Test (CORBA::ORB_ptr orb,
int size)
:size_ (size),
orb_ (orb),
name_service_ior_ (0)
{
}
int
MT_Test::svc (void)
{
// Obtain object reference to the Naming Service (create new stub.)
CosNaming::NamingContext_var name_service;
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY_EX (SETUP)
{
CORBA::Object_var name_service_obj =
orb_->string_to_object (name_service_ior_ ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK_EX (SETUP);
name_service =
CosNaming::NamingContext::_narrow (name_service_obj.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK_EX (SETUP);
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Unexpected exception in MT test setup");
return -1;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
if (name_service.in () == 0)
return -1;
// Bind the object.
ACE_TRY_EX (BIND)
{
name_service->bind (test_name_,
test_ref_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK_EX (BIND);
ACE_DEBUG ((LM_DEBUG,
"Bound name OK in thread %t\n"));
}
ACE_CATCH (CosNaming::NamingContext::AlreadyBound, ex)
{
ACE_DEBUG ((LM_DEBUG,
"Unable to bind in thread %t\n"));
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Unexpected exception in MT test bind");
// This debug statement works around a IRIX/MIPSPro 7.3 bug (it
// fails with optimize=1 debug=0; but works with any other
// settings for those flags).
ACE_DEBUG ((LM_DEBUG, "MT_Test(%t) - bind[3] %d\n",
test_name_.length ()));
return -1;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
// Resolve the object from the Naming Context.
ACE_TRY_EX (RESOLVE)
{
CORBA::Object_var result_obj_ref =
name_service->resolve (test_name_
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK_EX (RESOLVE);
Test_Object_var result_object =
Test_Object::_narrow (result_obj_ref.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK_EX (RESOLVE);
if (!CORBA::is_nil (result_object.in ()))
{
CORBA::Short id = result_object->id (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK_EX (RESOLVE);
if (id == CosNaming_Client::OBJ1_ID)
ACE_DEBUG ((LM_DEBUG,
"Resolved name OK in thread %t\n"));
}
}
ACE_CATCH (CosNaming::NamingContext::NotFound, ex)
{
ACE_DEBUG ((LM_DEBUG,
"Unable to resolve in thread %t\n"));
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Unexpected exception in MT test resolve");
return -1;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
// Unbind the object from the Naming Context.
ACE_TRY_EX (UNBIND)
{
name_service->unbind (test_name_
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK_EX (UNBIND);
ACE_DEBUG ((LM_DEBUG,
"Unbound name OK in thread %t\n"));
}
ACE_CATCH (CosNaming::NamingContext::NotFound, ex)
{
ACE_DEBUG ((LM_DEBUG,
"Unable to unbind in thread %t\n"));
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Unexpected exception in MT test unbind");
return -1;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
return 0;
}
int
MT_Test::execute (TAO_Naming_Client &root_context)
{
if (CORBA::is_nil (this->orb_.in ()))
return -1;
// Create data which will be used by all threads.
// Dummy object instantiation.
My_Test_Object *test_obj_impl =
new My_Test_Object (CosNaming_Client::OBJ1_ID);
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
test_ref_ =
test_obj_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
test_obj_impl->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get the IOR for the Naming Service. Each thread can use it
// in <string_to_object> to create its own stub for the Naming
// Service. This 'trick' is necessary, because multiple threads
// cannot be using the same stub - bad things happen... This is
// just a way to give each thread its own stub.
CosNaming::NamingContext_var context =
root_context.get_context ();
name_service_ior_ =
orb_->object_to_string (context.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Unexpected exception while instantiating dummy");
return -1;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
// Create a name for dummy.
test_name_.length (1);
test_name_[0].id = CORBA::string_dup ("Foo");
// Spawn threads, each of which will be executing svc ().
int status = this->activate (THR_NEW_LWP | THR_JOINABLE,
size_);
if (status == -1)
return -1;
status = this->wait ();
return status;
}
int
Simple_Test::execute (TAO_Naming_Client &root_context)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -