Per-ORB TAO Connector Registry. More...
#include <Connector_Registry.h>
Public Member Functions | |
TAO_Connector_Registry (void) | |
Default constructor. | |
~TAO_Connector_Registry (void) | |
Default destructor. | |
TAO_Connector * | get_connector (CORBA::ULong tag) const |
Return the connector bridges. | |
int | open (TAO_ORB_Core *orb_core) |
Initialize all registered connectors. | |
int | close_all (void) |
Close all open connectors. | |
int | make_mprofile (const char *ior, TAO_MProfile &mprofile) |
TAO_Profile * | create_profile (TAO_InputCDR &cdr) |
Create a profile based on the contents of cdr. | |
char | object_key_delimiter (const char *ior) |
TAO_ConnectorSetIterator | begin (void) const |
TAO_ConnectorSetIterator | end (void) const |
Private Member Functions | |
TAO_Connector_Registry (const TAO_Connector_Registry &) | |
void | operator= (const TAO_Connector_Registry &) |
Private Attributes | |
TAO_Connector ** | connectors_ |
List of connectors that are currently open. | |
size_t | size_ |
Number of connectors that are currently open. |
Per-ORB TAO Connector Registry.
Connector Registry and Generic Connector interface definitions. All loaded ESIOP or GIOP connector bridges must register with this object. This class is able to dynamically load a set of concrete protocol connectors which have registered with the service configurator and added their Factory name to the Resource_Factory line of the svc.conf file.
Definition at line 52 of file Connector_Registry.h.
TAO_Connector_Registry::TAO_Connector_Registry | ( | void | ) |
Default constructor.
Definition at line 25 of file Connector_Registry.cpp.
: connectors_ (0), size_ (0) { }
TAO_Connector_Registry::~TAO_Connector_Registry | ( | void | ) |
Default destructor.
Definition at line 31 of file Connector_Registry.cpp.
{ this->close_all (); delete [] this->connectors_; }
TAO_Connector_Registry::TAO_Connector_Registry | ( | const TAO_Connector_Registry & | ) | [private] |
TAO_ConnectorSetIterator TAO_Connector_Registry::begin | ( | void | ) | const |
Definition at line 8 of file Connector_Registry.inl.
{ return this->connectors_; }
int TAO_Connector_Registry::close_all | ( | void | ) |
Close all open connectors.
Definition at line 100 of file Connector_Registry.cpp.
{ const TAO_ConnectorSetIterator end = this->end (); for (TAO_ConnectorSetIterator i = this->begin (); i != end; ++i) { if (*i == 0) continue; (*i)->close (); delete *i; } this->size_ = 0; return 0; }
TAO_Profile * TAO_Connector_Registry::create_profile | ( | TAO_InputCDR & | cdr | ) |
Create a profile based on the contents of cdr.
Definition at line 170 of file Connector_Registry.cpp.
{ CORBA::ULong tag = 0; // If there is an error we abort. if ((cdr >> tag) == 0) return 0; TAO_Connector *connector = this->get_connector (tag); if (connector == 0) { if (TAO_debug_level > 0) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - TAO_Connector_Registry::") ACE_TEXT ("create_profile: Unknown profile tag 0x%x\n"), tag)); } TAO_ORB_Core *orb_core = cdr.orb_core (); if (orb_core == 0) { orb_core = TAO_ORB_Core_instance (); if (TAO_debug_level > 0) { ACE_DEBUG ((LM_WARNING, ACE_TEXT ("TAO (%P|%t) - TAO_Connector_Registry") ACE_TEXT ("::create_profile: ") ACE_TEXT ("WARNING: extracting object from ") ACE_TEXT ("default ORB_Core\n"))); } } TAO_Profile *pfile = 0; ACE_NEW_RETURN (pfile, TAO_Unknown_Profile (tag, orb_core), 0); if (pfile->decode (cdr) == -1) { pfile->_decr_refcnt (); pfile = 0; } return pfile; } // OK, we've got a known profile. It's going to be encapsulated // ProfileData. Create a new decoding stream and context for it, // and skip the data in the parent stream // ProfileData is encoded as a sequence of octet. So first get the // length of the sequence. CORBA::ULong encap_len = 0; if ((cdr >> encap_len) == 0) return 0; // Create the decoding stream from the encapsulation in the buffer, // and skip the encapsulation. TAO_InputCDR str (cdr, encap_len); if (str.good_bit () == 0 || cdr.skip_bytes (encap_len) == 0) return 0; return connector->create_profile (str); }
TAO_ConnectorSetIterator TAO_Connector_Registry::end | ( | void | ) | const |
Definition at line 14 of file Connector_Registry.inl.
{ return this->connectors_ + this->size_; }
TAO_Connector * TAO_Connector_Registry::get_connector | ( | CORBA::ULong | tag | ) | const |
Return the connector bridges.
Definition at line 39 of file Connector_Registry.cpp.
{ const TAO_ConnectorSetIterator end = this->end (); for (TAO_ConnectorSetIterator connector = this->begin (); connector != end; ++connector) { if ((*connector)->tag () == tag) return *connector; } return 0; }
int TAO_Connector_Registry::make_mprofile | ( | const char * | ior, | |
TAO_MProfile & | mprofile | |||
) |
Parse a string containing a URL style IOR and return an MProfile.
Definition at line 122 of file Connector_Registry.cpp.
{ if (!ior) // Failure: Null IOR string pointer throw ::CORBA::INV_OBJREF ( CORBA::SystemException::_tao_minor_code ( 0, EINVAL), CORBA::COMPLETED_NO); const TAO_ConnectorSetIterator first_connector = this->begin (); const TAO_ConnectorSetIterator last_connector = this->end (); for (TAO_ConnectorSetIterator connector = first_connector; connector != last_connector; ++connector) { if (*connector) { const int mp_result = (*connector)->make_mprofile (ior, mprofile ); if (mp_result == 0) return 0; // Success } else // Failure: Null pointer to connector in connector registry. throw ::CORBA::INV_OBJREF ( CORBA::SystemException::_tao_minor_code ( 0, EINVAL), CORBA::COMPLETED_NO); } // Failure: None of the connectors were able to parse the URL style // IOR into an MProfile. throw ::CORBA::INV_OBJREF ( CORBA::SystemException::_tao_minor_code ( TAO_CONNECTOR_REGISTRY_NO_USABLE_PROTOCOL, 0), CORBA::COMPLETED_NO); }
char TAO_Connector_Registry::object_key_delimiter | ( | const char * | ior | ) |
Obtain the object key delimiter used by the protocol specified in the provided URL style IOR.
Definition at line 242 of file Connector_Registry.cpp.
{ if (!ior) { errno = EINVAL; return 0; // Failure: Null IOR string pointer } const TAO_ConnectorSetIterator first_connector = this->begin (); const TAO_ConnectorSetIterator last_connector = this->end (); for (TAO_ConnectorSetIterator connector = first_connector; connector != last_connector; ++connector) { if (*connector) { if ((*connector)->check_prefix (ior) == 0) return (*connector)->object_key_delimiter (); } } // Failure: None of the connectors were able to match their protocol // against the provided string. return 0; }
int TAO_Connector_Registry::open | ( | TAO_ORB_Core * | orb_core | ) |
Initialize all registered connectors.
Definition at line 55 of file Connector_Registry.cpp.
{ TAO_ProtocolFactorySet * const pfs = orb_core->protocol_factories (); // The array containing the TAO_Connectors will never contain more // than the number of loaded protocols in the ORB core. if (this->connectors_ == 0) ACE_NEW_RETURN (this->connectors_, TAO_Connector *[pfs->size ()], -1); // Open one connector for each loaded protocol! const TAO_ProtocolFactorySetItor end = pfs->end (); for (TAO_ProtocolFactorySetItor factory = pfs->begin (); factory != end; ++factory) { auto_ptr <TAO_Connector> connector ( (*factory)->factory ()->make_connector ()); if (connector.get ()) { if (connector->open (orb_core) != 0) { ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("TAO (%P|%t) - TAO_Connector_Registry") ACE_TEXT ("::open: unable to open connector for ") ACE_TEXT ("<%C>.\n"), (*factory)->protocol_name ().c_str ()), -1); } this->connectors_[this->size_++] = connector.release (); } else return -1; } return 0; }
void TAO_Connector_Registry::operator= | ( | const TAO_Connector_Registry & | ) | [private] |
TAO_Connector** TAO_Connector_Registry::connectors_ [private] |
List of connectors that are currently open.
Definition at line 94 of file Connector_Registry.h.
size_t TAO_Connector_Registry::size_ [private] |
Number of connectors that are currently open.
Definition at line 97 of file Connector_Registry.h.