Public Member Functions | Private Member Functions | Private Attributes

TAO_Connector_Registry Class Reference

Per-ORB TAO Connector Registry. More...

#include <Connector_Registry.h>

Collaboration diagram for TAO_Connector_Registry:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 TAO_Connector_Registry (void)
 Default constructor.
 ~TAO_Connector_Registry (void)
 Default destructor.
TAO_Connectorget_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_Profilecreate_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.

Detailed Description

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.


Constructor & Destructor Documentation

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]

Member Function Documentation

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]

Member Data Documentation

List of connectors that are currently open.

Definition at line 94 of file Connector_Registry.h.

Number of connectors that are currently open.

Definition at line 97 of file Connector_Registry.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines