Implements the <corbaname:> IOR format. More...
#include <CORBANAME_Parser.h>
Public Member Functions | |
virtual | ~TAO_CORBANAME_Parser (void) |
The destructor. | |
virtual bool | match_prefix (const char *ior_string) const |
virtual CORBA::Object_ptr | parse_string (const char *ior, CORBA::ORB_ptr orb) |
Private Member Functions | |
virtual CORBA::Object_ptr | parse_string_dynamic_request_helper (CORBA::Object_ptr naming_context, ACE_CString &key_string) |
Implements the <corbaname:> IOR format.
This class implements the <corbaname:> IOR format. It is dynamically loaded by the ORB and used to get reference to a naming service at the given address and port and then resolve an object in that context.
Definition at line 41 of file CORBANAME_Parser.h.
TAO_CORBANAME_Parser::~TAO_CORBANAME_Parser | ( | void | ) | [virtual] |
bool TAO_CORBANAME_Parser::match_prefix | ( | const char * | ior_string | ) | const [virtual] |
Return true if ior_string starts with a prefix known to this IOR parser
Implements TAO_IOR_Parser.
Definition at line 32 of file CORBANAME_Parser.cpp.
{ return (ACE_OS::strncmp (ior_string, corbaname_prefix, sizeof corbaname_prefix - 1) == 0); }
CORBA::Object_ptr TAO_CORBANAME_Parser::parse_string | ( | const char * | ior, | |
CORBA::ORB_ptr | orb | |||
) | [virtual] |
Parse the ior argument and return an object reference. The call may raise the standard system exceptions (NO_MEMORY, INV_OBJREF, etc.)
Implements TAO_IOR_Parser.
Definition at line 66 of file CORBANAME_Parser.cpp.
{ // Skip the prefix, we know it is there because this method in only // called if <match_prefix> returns 1. const char *corbaname = ior + sizeof corbaname_prefix - 1; CORBA::Object_ptr obj = CORBA::Object::_nil (); try { // The position of the seperator between the obj_addr and key // string ACE_CString::size_type pos_seperator = 0; ACE_CString corbaname_str (corbaname, 0, 1); pos_seperator = corbaname_str.find ("#", 0); // Get the Key String ACE_CString key_string; if (pos_seperator != ACE_CString::npos) { key_string = corbaname_str.substring (pos_seperator + 1, ACE_CString::npos); } // Prepare a suitable corbaloc string for the name service. // CORBALOC assumes "NameService" for the object key if none // is provided, so just pass everything between "corbaname:" // and "#" as the address ACE_CString corbaloc_addr ("corbaloc:", 0, 1); corbaloc_addr += corbaname_str.substring (0, pos_seperator); // Obtain a reference to the naming context CORBA::Object_var name_context = orb->string_to_object (corbaloc_addr.c_str () ); // Check if the Object reference is nil. if (CORBA::is_nil (name_context.in ())) ACE_ERROR_RETURN ((LM_ERROR, "Cannot resolve Naming Service: CORBANAME_Parser\n"), 0); CORBA::Boolean is_a = name_context->_is_a ("IDL:omg.org/CosNaming/NamingContextExt:1.0"); if (!is_a) { ACE_ERROR_RETURN ((LM_ERROR, "Cannot narrow Naming Service: " "CORBANAME_Parser\n"), 0); } if (key_string.length () != 0) { // Make a dynamic request for resolve_str in this naming context obj = this->parse_string_dynamic_request_helper (name_context.in (), key_string); } else { // There was no key string which implies that the caller wants // the object reference of the naming service. obj = name_context._retn (); } } catch (const ::CORBA::SystemException& ex) { if (TAO_debug_level >= 4) { ex._tao_print_exception ("CORBANAME_Parser"); } } return obj; }
CORBA::Object_ptr TAO_CORBANAME_Parser::parse_string_dynamic_request_helper | ( | CORBA::Object_ptr | naming_context, | |
ACE_CString & | key_string | |||
) | [private, virtual] |
Definition at line 41 of file CORBANAME_Parser.cpp.
{ TAO::Arg_Traits<CORBA::Object>::ret_val _tao_retval; TAO::Arg_Traits<CORBA::Char *>::in_arg_val _tao_id (key_string.c_str ()); TAO::Argument *_tao_signature [] = { &_tao_retval, &_tao_id }; TAO::Invocation_Adapter tao_call (naming_context, _tao_signature, 2, "resolve_str", 11, 0); tao_call.invoke (0, 0); return _tao_retval.retn (); }