UIOP-specific Connector bridge for pluggable protocols. More...
#include <UIOP_Connector.h>
Public Types | |
typedef TAO_Connect_Concurrency_Strategy < TAO_UIOP_Connection_Handler > | TAO_UIOP_CONNECT_CONCURRENCY_STRATEGY |
typedef TAO_Connect_Creation_Strategy < TAO_UIOP_Connection_Handler > | TAO_UIOP_CONNECT_CREATION_STRATEGY |
typedef ACE_Connect_Strategy < TAO_UIOP_Connection_Handler, ACE_LSOCK_CONNECTOR > | TAO_UIOP_CONNECT_STRATEGY |
typedef ACE_Strategy_Connector < TAO_UIOP_Connection_Handler, ACE_LSOCK_CONNECTOR > | TAO_UIOP_BASE_CONNECTOR |
Public Member Functions | |
TAO_UIOP_Connector (void) | |
~TAO_UIOP_Connector (void) | |
Destructor. | |
The TAO_Connector Methods | |
Please check the documentation in Transport_Connector.h for details. | |
int | open (TAO_ORB_Core *orb_core) |
Initialize object and register with reactor. | |
int | close (void) |
Shutdown Connector bridge and concrete Connector. | |
TAO_Profile * | create_profile (TAO_InputCDR &cdr) |
virtual int | check_prefix (const char *endpoint) |
virtual TAO_Profile * | corbaloc_scan (const char *str, size_t &len) |
virtual char | object_key_delimiter (void) const |
Return the object key delimiter to use or expect. | |
virtual int | cancel_svc_handler (TAO_Connection_Handler *svc_handler) |
Cancel the passed cvs handler from the connector. | |
Protected Member Functions | |
More TAO_Connector methods | |
Please check the documentation in Transport_Connector.h. | |
int | set_validate_endpoint (TAO_Endpoint *endpoint) |
TAO_Transport * | make_connection (TAO::Profile_Transport_Resolver *r, TAO_Transport_Descriptor_Interface &desc, ACE_Time_Value *timeout=0) |
Make a connection. | |
virtual TAO_Profile * | make_profile (void) |
Create a profile with a given endpoint. | |
Private Member Functions | |
TAO_UIOP_Endpoint * | remote_endpoint (TAO_Endpoint *ep) |
Return the remote endpoint, a helper function. | |
Private Attributes | |
TAO_UIOP_CONNECT_STRATEGY | connect_strategy_ |
Our connect strategy. | |
TAO_UIOP_BASE_CONNECTOR | base_connector_ |
The connector initiating connection requests for UIOP. |
UIOP-specific Connector bridge for pluggable protocols.
Definition at line 49 of file UIOP_Connector.h.
typedef ACE_Strategy_Connector<TAO_UIOP_Connection_Handler, ACE_LSOCK_CONNECTOR> TAO_UIOP_Connector::TAO_UIOP_BASE_CONNECTOR |
Definition at line 99 of file UIOP_Connector.h.
typedef TAO_Connect_Concurrency_Strategy<TAO_UIOP_Connection_Handler> TAO_UIOP_Connector::TAO_UIOP_CONNECT_CONCURRENCY_STRATEGY |
Definition at line 88 of file UIOP_Connector.h.
typedef TAO_Connect_Creation_Strategy<TAO_UIOP_Connection_Handler> TAO_UIOP_Connector::TAO_UIOP_CONNECT_CREATION_STRATEGY |
Definition at line 91 of file UIOP_Connector.h.
typedef ACE_Connect_Strategy<TAO_UIOP_Connection_Handler, ACE_LSOCK_CONNECTOR> TAO_UIOP_Connector::TAO_UIOP_CONNECT_STRATEGY |
Definition at line 95 of file UIOP_Connector.h.
TAO_UIOP_Connector::TAO_UIOP_Connector | ( | void | ) |
Constructor. @ Do we want to pass in the tag here or should it be statically defined?
Definition at line 26 of file UIOP_Connector.cpp.
: TAO_Connector (TAO_TAG_UIOP_PROFILE), connect_strategy_ (), base_connector_ () { }
TAO_UIOP_Connector::~TAO_UIOP_Connector | ( | void | ) |
int TAO_UIOP_Connector::cancel_svc_handler | ( | TAO_Connection_Handler * | svc_handler | ) | [virtual] |
Cancel the passed cvs handler from the connector.
Implements TAO_Connector.
Definition at line 379 of file UIOP_Connector.cpp.
{ TAO_UIOP_Connection_Handler* handler= dynamic_cast<TAO_UIOP_Connection_Handler*> (svc_handler); if (handler) // Cancel from the connector return this->base_connector_.cancel (handler); return -1; }
int TAO_UIOP_Connector::check_prefix | ( | const char * | endpoint | ) | [virtual] |
Check that the prefix of the provided endpoint is valid for use with a given pluggable protocol.
Our activation strategy
Implements TAO_Connector.
Definition at line 327 of file UIOP_Connector.cpp.
{ // Check for a valid string if (!endpoint || !*endpoint) return -1; // Failure static const char *protocol[] = { "uiop", "uioploc" }; const size_t slot = ACE_OS::strchr (endpoint, ':') - endpoint; const size_t len0 = ACE_OS::strlen (protocol[0]); const size_t len1 = ACE_OS::strlen (protocol[1]); // Check for the proper prefix in the IOR. If the proper prefix // isn't in the IOR then it is not an IOR we can use. if (slot == len0 && ACE_OS::strncasecmp (endpoint, protocol[0], len0) == 0) return 0; else if (slot == len1 && ACE_OS::strncasecmp (endpoint, protocol[1], len1) == 0) return 0; return -1; // Failure: not an UIOP IOR DO NOT throw an exception here. }
int TAO_UIOP_Connector::close | ( | void | ) | [virtual] |
Shutdown Connector bridge and concrete Connector.
Our activation strategy
Implements TAO_Connector.
Definition at line 69 of file UIOP_Connector.cpp.
{ // Zap the creation strategy that we created earlier. delete this->base_connector_.creation_strategy (); delete this->base_connector_.concurrency_strategy (); return this->base_connector_.close (); }
TAO_Profile * TAO_UIOP_Connector::corbaloc_scan | ( | const char * | ior, | |
size_t & | len | |||
) | [virtual] |
Helper function to assist corbaloc parsing. The default simply validates the protocol identifyier and scans up to the next comma or slash. Any protocol that has a specific need, such as uiop, can override this method to provide a custom scanner. The profile returned is either null if this the ior does not match or an empty profile of the correct type, obtained from make_profile().
Our activation strategy
Reimplemented from TAO_Connector.
Definition at line 79 of file UIOP_Connector.cpp.
{ if (this->check_prefix (str) != 0) return 0; const char *separator = ACE_OS::strchr (str,'|'); if (separator == 0) { if (TAO_debug_level) ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - TAO_UIOP_CONNECTOR::corbaloc_scan error: " "explicit terminating charactor '|' is missing from <%C>", str)); return 0; } len = (separator - str) + 1; return this->make_profile (); }
TAO_Profile * TAO_UIOP_Connector::create_profile | ( | TAO_InputCDR & | cdr | ) | [virtual] |
Create a profile for this protocol and initialize it based on the encapsulation in cdr
Our activation strategy
Implements TAO_Connector.
Definition at line 293 of file UIOP_Connector.cpp.
{ TAO_Profile *pfile; ACE_NEW_RETURN (pfile, TAO_UIOP_Profile (this->orb_core ()), 0); const int r = pfile->decode (cdr); if (r == -1) { pfile->_decr_refcnt (); pfile = 0; } return pfile; }
TAO_Transport * TAO_UIOP_Connector::make_connection | ( | TAO::Profile_Transport_Resolver * | r, | |
TAO_Transport_Descriptor_Interface & | desc, | |||
ACE_Time_Value * | timeout = 0 | |||
) | [protected, virtual] |
Make a connection.
Implements TAO_Connector.
Definition at line 131 of file UIOP_Connector.cpp.
{ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - UIUP_Connector::make_connection, ") ACE_TEXT ("looking for UIOP connection.\n"))); TAO_UIOP_Endpoint *uiop_endpoint = this->remote_endpoint (desc.endpoint ()); if (uiop_endpoint == 0) return 0; const ACE_UNIX_Addr &remote_address = uiop_endpoint->object_addr (); if (TAO_debug_level > 2) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - UIUP_Connector::make_connection, ") ACE_TEXT ("making a new connection\n"))); // Get the right synch options ACE_Synch_Options synch_options; this->active_connect_strategy_->synch_options (max_wait_time, synch_options); // The code used to set the timeout to zero, with the intent of // polling the reactor for connection completion. However, the side-effect // was to cause the connection to timeout immediately. TAO_UIOP_Connection_Handler *svc_handler = 0; // Connect. int result = this->base_connector_.connect (svc_handler, remote_address, synch_options); // Make sure that we always do a remove_reference ACE_Event_Handler_var svc_handler_auto_ptr (svc_handler); TAO_Transport *transport = svc_handler->transport (); if (result == -1) { // No immediate result, wait for completion if (errno == EWOULDBLOCK) { // Try to wait until connection completion. Incase we block, then we // get a connected transport or not. In case of non block we get // a connected or not connected transport if (!this->wait_for_connection_completion (r, desc, transport, max_wait_time)) { if (TAO_debug_level > 2) ACE_ERROR ((LM_ERROR, "TAO (%P|%t) - UIOP_Connector::" "make_connection, " "wait for completion failed\n")); } } else { // Transport is not usable transport = 0; } } // In case of errors transport is zero if (transport == 0) { // Give users a clue to the problem. if (TAO_debug_level > 3) ACE_ERROR ((LM_ERROR, "TAO (%P|%t) - UIOP_Connector::make_connection, " "connection to <%C> failed (%p)\n", uiop_endpoint->rendezvous_point (), ACE_TEXT("errno"))); return 0; } if (svc_handler->keep_waiting ()) { svc_handler->connection_pending (); } if (svc_handler->error_detected ()) { svc_handler->cancel_pending_connection (); } // At this point, the connection has be successfully created // connected or not connected, but we have a connection. if (TAO_debug_level > 2) ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - UIOP_Connector::make_connection, " "new %C connection to <%C> on Transport[%d]\n", transport->is_connected() ? "connected" : "not connected", uiop_endpoint->rendezvous_point (), svc_handler->peer ().get_handle ())); // Add the handler to Cache int retval = this->orb_core ()->lane_resources ().transport_cache ().cache_transport (&desc, transport); // Failure in adding to cache. if (retval == -1) { // Close the handler. svc_handler->close (); if (TAO_debug_level > 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("TAO (%P|%t) - UIOP_Connector::make_connection, ") ACE_TEXT ("could not add the new connection to Cache\n"))); } return 0; } if (svc_handler->error_detected ()) { svc_handler->cancel_pending_connection (); transport->purge_entry(); return 0; } if (transport->is_connected () && transport->wait_strategy ()->register_handler () != 0) { // Registration failures. // Purge from the connection cache, if we are not in the cache, this // just does nothing. (void) transport->purge_entry (); // Close the handler. (void) transport->close_connection (); if (TAO_debug_level > 0) ACE_ERROR ((LM_ERROR, "TAO (%P|%t) - UIOP_Connector [%d]::make_connection, " "could not register the transport " "in the reactor.\n", transport->id ())); return 0; } svc_handler_auto_ptr.release (); return transport; }
TAO_Profile * TAO_UIOP_Connector::make_profile | ( | void | ) | [protected, virtual] |
Create a profile with a given endpoint.
Implements TAO_Connector.
Definition at line 311 of file UIOP_Connector.cpp.
{ TAO_Profile *profile = 0; ACE_NEW_THROW_EX (profile, TAO_UIOP_Profile (this->orb_core ()), CORBA::NO_MEMORY ( CORBA::SystemException::_tao_minor_code ( TAO::VMCID, ENOMEM), CORBA::COMPLETED_NO)); return profile; }
char TAO_UIOP_Connector::object_key_delimiter | ( | void | ) | const [virtual] |
Return the object key delimiter to use or expect.
Our activation strategy
Implements TAO_Connector.
Definition at line 358 of file UIOP_Connector.cpp.
{ return TAO_UIOP_Profile::object_key_delimiter_; }
int TAO_UIOP_Connector::open | ( | TAO_ORB_Core * | orb_core | ) | [virtual] |
Initialize object and register with reactor.
Our activation strategy
Implements TAO_Connector.
Definition at line 38 of file UIOP_Connector.cpp.
{ this->orb_core (orb_core); // Create our connect strategy if (this->create_connect_strategy () == -1) return -1; // Our connect creation strategy TAO_UIOP_CONNECT_CREATION_STRATEGY *connect_creation_strategy = 0; ACE_NEW_RETURN (connect_creation_strategy, TAO_UIOP_CONNECT_CREATION_STRATEGY (orb_core->thr_mgr (), orb_core), -1); /// Our activation strategy TAO_UIOP_CONNECT_CONCURRENCY_STRATEGY *concurrency_strategy = 0; ACE_NEW_RETURN (concurrency_strategy, TAO_UIOP_CONNECT_CONCURRENCY_STRATEGY (orb_core), -1); return this->base_connector_.open (this->orb_core ()->reactor (), connect_creation_strategy, &this->connect_strategy_, concurrency_strategy); }
TAO_UIOP_Endpoint * TAO_UIOP_Connector::remote_endpoint | ( | TAO_Endpoint * | ep | ) | [private] |
Return the remote endpoint, a helper function.
Definition at line 364 of file UIOP_Connector.cpp.
{ if (endpoint->tag () != TAO_TAG_UIOP_PROFILE) return 0; TAO_UIOP_Endpoint *uiop_endpoint = dynamic_cast<TAO_UIOP_Endpoint *> (endpoint); if (uiop_endpoint == 0) return 0; return uiop_endpoint; }
int TAO_UIOP_Connector::set_validate_endpoint | ( | TAO_Endpoint * | endpoint | ) | [protected, virtual] |
Set and validate endpoint. We need to do this to initialize our remote *_Addr's which have not been done during IOR decode.
Implements TAO_Connector.
Definition at line 100 of file UIOP_Connector.cpp.
{ TAO_UIOP_Endpoint *uiop_endpoint = this->remote_endpoint (endpoint); if (uiop_endpoint == 0) return -1; const ACE_UNIX_Addr &remote_address = uiop_endpoint->object_addr (); // @@ Note, POSIX.1g renames AF_UNIX to AF_LOCAL. // Verify that the remote ACE_UNIX_Addr was initialized properly. // Failure can occur if hostname lookup failed when initializing the // remote ACE_INET_Addr. if (remote_address.get_type () != AF_UNIX) { if (TAO_debug_level > 0) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - UIOP failure.\n") ACE_TEXT ("TAO (%P|%t) - This is most likely ") ACE_TEXT ("due to a hostname lookup ") ACE_TEXT ("failure.\n"))); } return -1; } return 0; }
The connector initiating connection requests for UIOP.
Definition at line 130 of file UIOP_Connector.h.
Our connect strategy.
Definition at line 127 of file UIOP_Connector.h.