#include <SHMIOP_Profile.h>
Inheritance diagram for TAO_SHMIOP_Profile:
Public Member Functions | |
virtual char | object_key_delimiter (void) const |
TAO_SHMIOP_Profile (const ACE_MEM_Addr &addr, const TAO::ObjectKey &object_key, const TAO_GIOP_Message_Version &version, TAO_ORB_Core *orb_core) | |
TAO_SHMIOP_Profile (const char *host, CORBA::UShort port, const TAO::ObjectKey &object_key, const ACE_INET_Addr &addr, const TAO_GIOP_Message_Version &version, TAO_ORB_Core *orb_core) | |
TAO_SHMIOP_Profile (TAO_ORB_Core *orb_core) | |
Profile constructor, default. | |
~TAO_SHMIOP_Profile (void) | |
Destructor is to be called only through <_decr_refcnt>. | |
virtual char * | to_string (void) |
Template methods, please see Profile.h for documentation. | |
virtual int | encode_endpoints (void) |
virtual TAO_Endpoint * | endpoint (void) |
virtual CORBA::ULong | endpoint_count (void) const |
virtual CORBA::ULong | hash (CORBA::ULong max) |
void | add_endpoint (TAO_SHMIOP_Endpoint *endp) |
Static Public Member Functions | |
static const char * | prefix (void) |
Return the char string prefix. | |
Static Public Attributes | |
static const char | object_key_delimiter_ = '/' |
The object key delimiter that SHMIOP uses or expects. | |
Protected Member Functions | |
virtual int | decode_profile (TAO_InputCDR &cdr) |
Template methods. Please see tao/Profile.h for documentation. | |
virtual void | parse_string_i (const char *string) |
virtual void | create_profile_body (TAO_OutputCDR &cdr) const |
virtual int | decode_endpoints (void) |
virtual CORBA::Boolean | do_is_equivalent (const TAO_Profile *other_profile) |
Private Attributes | |
TAO_SHMIOP_Endpoint | endpoint_ |
CORBA::ULong | count_ |
Number of endpoints in the list headed by <endpoint_>. |
This class defines the SHMIOP profile.
Definition at line 45 of file SHMIOP_Profile.h.
TAO_SHMIOP_Profile::TAO_SHMIOP_Profile | ( | const ACE_MEM_Addr & | addr, | |
const TAO::ObjectKey & | object_key, | |||
const TAO_GIOP_Message_Version & | version, | |||
TAO_ORB_Core * | orb_core | |||
) |
Profile constructor, same as above except the object_key has already been marshaled.
Definition at line 33 of file SHMIOP_Profile.cpp.
00037 : TAO_Profile (TAO_TAG_SHMEM_PROFILE, 00038 orb_core, 00039 object_key, 00040 version), 00041 endpoint_ (addr, 00042 orb_core->orb_params ()->use_dotted_decimal_addresses ()), 00043 count_ (1) 00044 { 00045 }
TAO_SHMIOP_Profile::TAO_SHMIOP_Profile | ( | const char * | host, | |
CORBA::UShort | port, | |||
const TAO::ObjectKey & | object_key, | |||
const ACE_INET_Addr & | addr, | |||
const TAO_GIOP_Message_Version & | version, | |||
TAO_ORB_Core * | orb_core | |||
) |
Profile constructor, this is the most efficient since it doesn't require any address resolution processing.
Definition at line 47 of file SHMIOP_Profile.cpp.
00053 : TAO_Profile (TAO_TAG_SHMEM_PROFILE, 00054 orb_core, 00055 object_key, 00056 version), 00057 endpoint_ (host, port, addr), 00058 count_ (1) 00059 { 00060 }
TAO_SHMIOP_Profile::TAO_SHMIOP_Profile | ( | TAO_ORB_Core * | orb_core | ) |
Profile constructor, default.
Definition at line 62 of file SHMIOP_Profile.cpp.
00063 : TAO_Profile (TAO_TAG_SHMEM_PROFILE, 00064 orb_core, 00065 TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)), 00066 endpoint_ (), 00067 count_ (1) 00068 { 00069 }
TAO_SHMIOP_Profile::~TAO_SHMIOP_Profile | ( | void | ) |
Destructor is to be called only through <_decr_refcnt>.
Definition at line 71 of file SHMIOP_Profile.cpp.
References TAO_Endpoint::next().
00072 { 00073 // Clean up the list of endpoints since we own it. 00074 // Skip the head, since it is not dynamically allocated. 00075 TAO_Endpoint *tmp = 0; 00076 00077 for (TAO_Endpoint *next = this->endpoint ()->next (); 00078 next != 0; 00079 next = tmp) 00080 { 00081 tmp = next->next (); 00082 delete next; 00083 } 00084 }
void TAO_SHMIOP_Profile::add_endpoint | ( | TAO_SHMIOP_Endpoint * | endp | ) |
Add <endp> to this profile's list of endpoints (it is inserted next to the head of the list). This profiles takes ownership of <endp>.
Definition at line 321 of file SHMIOP_Profile.cpp.
References count_, endpoint_, and TAO_SHMIOP_Endpoint::next_.
Referenced by TAO_SHMIOP_Acceptor::create_shared_profile(), and decode_endpoints().
00322 { 00323 endp->next_ = this->endpoint_.next_; 00324 this->endpoint_.next_ = endp; 00325 00326 this->count_++; 00327 }
void TAO_SHMIOP_Profile::create_profile_body | ( | TAO_OutputCDR & | cdr | ) | const [protected, virtual] |
Implements TAO_Profile.
Definition at line 373 of file SHMIOP_Profile.cpp.
References ACE_ERROR, TAO_Tagged_Components::encode(), LM_ERROR, TAO_Profile::ref_object_key_, TAO_Profile::tagged_components(), TAO_ENCAP_BYTE_ORDER, ACE_OutputCDR::write_octet(), ACE_OutputCDR::write_string(), and ACE_OutputCDR::write_ushort().
00374 { 00375 encap.write_octet (TAO_ENCAP_BYTE_ORDER); 00376 00377 // The GIOP version 00378 encap.write_octet (this->version_.major); 00379 encap.write_octet (this->version_.minor); 00380 00381 // STRING hostname from profile 00382 encap.write_string (this->endpoint_.host ()); 00383 00384 // UNSIGNED SHORT port number 00385 encap.write_ushort (this->endpoint_.port ()); 00386 00387 // OCTET SEQUENCE for object key 00388 if (this->ref_object_key_) 00389 encap << this->ref_object_key_->object_key (); 00390 else 00391 { 00392 ACE_ERROR ((LM_ERROR, 00393 "(%P|%t) TAO - UIOP_Profile::create_profile_body " 00394 "no object key marshalled \n")); 00395 } 00396 00397 if (this->version_.major > 1 00398 || this->version_.minor > 0) 00399 this->tagged_components ().encode (encap); 00400 }
int TAO_SHMIOP_Profile::decode_endpoints | ( | void | ) | [protected, virtual] |
Implements TAO_Profile.
Definition at line 458 of file SHMIOP_Profile.cpp.
References ACE_NEW_RETURN, add_endpoint(), endpoint(), endpoint_, TAO_Endpoint::priority(), and TAO_TAG_ENDPOINTS.
00459 { 00460 IOP::TaggedComponent tagged_component; 00461 tagged_component.tag = TAO_TAG_ENDPOINTS; 00462 00463 if (this->tagged_components_.get_component (tagged_component)) 00464 { 00465 const CORBA::Octet *buf = 00466 tagged_component.component_data.get_buffer (); 00467 00468 TAO_InputCDR in_cdr (reinterpret_cast <const char*> (buf), 00469 tagged_component.component_data.length ()); 00470 00471 // Extract the Byte Order. 00472 CORBA::Boolean byte_order; 00473 if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0) 00474 return -1; 00475 in_cdr.reset_byte_order (static_cast<int> (byte_order)); 00476 00477 // Extract endpoints sequence. 00478 TAO::IIOPEndpointSequence endpoints; 00479 00480 if ((in_cdr >> endpoints) == 0) 00481 return -1; 00482 00483 // Get the priority of the first endpoint (head of the list. 00484 // It's other data is extracted as part of the standard profile 00485 // decoding. 00486 this->endpoint_.priority (endpoints[0].priority); 00487 00488 // Use information extracted from the tagged component to 00489 // populate the profile. Skip the first endpoint, since it is 00490 // always extracted through standard profile body. Also, begin 00491 // from the end of the sequence to preserve endpoint order, 00492 // since <add_endpoint> method reverses the order of endpoints 00493 // in the list. 00494 for (CORBA::ULong i = endpoints.length () - 1; 00495 i > 0; 00496 --i) 00497 { 00498 TAO_SHMIOP_Endpoint *endpoint = 0; 00499 ACE_NEW_RETURN (endpoint, 00500 TAO_SHMIOP_Endpoint (endpoints[i].host, 00501 endpoints[i].port, 00502 endpoints[i].priority), 00503 -1); 00504 00505 this->add_endpoint (endpoint); 00506 } 00507 } 00508 00509 return 0; 00510 }
int TAO_SHMIOP_Profile::decode_profile | ( | TAO_InputCDR & | cdr | ) | [protected, virtual] |
Template methods. Please see tao/Profile.h for documentation.
Implements TAO_Profile.
Definition at line 103 of file SHMIOP_Profile.cpp.
References ACE_DEBUG, ACE_TEXT, ACE_InputCDR::good_bit(), LM_DEBUG, ACE_InputCDR::read_string(), ACE_InputCDR::read_ushort(), and TAO_debug_level.
00104 { 00105 // Decode host and port into the <endpoint_>. 00106 if (cdr.read_string (this->endpoint_.host_.out ()) == 0 00107 || cdr.read_ushort (this->endpoint_.port_) == 0) 00108 { 00109 if (TAO_debug_level > 0) 00110 { 00111 ACE_DEBUG ((LM_DEBUG, 00112 ACE_TEXT ("TAO (%P|%t) SHMIOP_Profile::decode - ") 00113 ACE_TEXT ("error while decoding host/port"))); 00114 } 00115 return -1; 00116 } 00117 00118 if (cdr.good_bit ()) 00119 { 00120 // Invalidate the object_addr_ until first access. 00121 this->endpoint_.object_addr_.set_type (-1); 00122 00123 return 1; 00124 } 00125 00126 return -1; 00127 }
CORBA::Boolean TAO_SHMIOP_Profile::do_is_equivalent | ( | const TAO_Profile * | other_profile | ) | [protected, virtual] |
Implements TAO_Profile.
Definition at line 267 of file SHMIOP_Profile.cpp.
References endpoint_, and TAO_SHMIOP_Endpoint::next_.
00268 { 00269 const TAO_SHMIOP_Profile *op = 00270 dynamic_cast <const TAO_SHMIOP_Profile *> (other_profile); 00271 00272 if (op == 0) 00273 return 0; 00274 00275 // Check endpoints equivalence. 00276 const TAO_SHMIOP_Endpoint *other_endp = &op->endpoint_; 00277 for (TAO_SHMIOP_Endpoint *endp = &this->endpoint_; 00278 endp != 0; 00279 endp = endp->next_) 00280 { 00281 if (endp->is_equivalent (other_endp)) 00282 other_endp = other_endp->next_; 00283 else 00284 return 0; 00285 } 00286 00287 return 1; 00288 }
int TAO_SHMIOP_Profile::encode_endpoints | ( | void | ) | [virtual] |
Implements TAO_Profile.
Definition at line 403 of file SHMIOP_Profile.cpp.
References ACE_OutputCDR::begin(), ACE_Message_Block::cont(), count_, endpoint(), endpoint_, ACE_OS::memcpy(), TAO_Endpoint::priority(), TAO_Tagged_Components::set_component(), TAO_Profile::tagged_components_, TAO_ENCAP_BYTE_ORDER, TAO_TAG_ENDPOINTS, and ACE_OutputCDR::total_length().
00404 { 00405 // Create a data structure and fill it with endpoint info for wire 00406 // transfer. 00407 // We include information for the head of the list 00408 // together with other endpoints because even though its addressing 00409 // info is transmitted using standard ProfileBody components, its 00410 // priority is not! 00411 TAO::IIOPEndpointSequence endpoints; 00412 endpoints.length (this->count_); 00413 00414 TAO_SHMIOP_Endpoint *endpoint = &this->endpoint_; 00415 for (CORBA::ULong i = 0; 00416 i < this->count_; 00417 ++i) 00418 { 00419 endpoints[i].host = endpoint->host (); 00420 endpoints[i].port = endpoint->port (); 00421 endpoints[i].priority = endpoint->priority (); 00422 00423 endpoint = endpoint->next_; 00424 } 00425 00426 // Encode the data structure. 00427 TAO_OutputCDR out_cdr; 00428 if ((out_cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER) 00429 == 0) 00430 || (out_cdr << endpoints) == 0) 00431 return -1; 00432 size_t length = out_cdr.total_length (); 00433 00434 IOP::TaggedComponent tagged_component; 00435 tagged_component.tag = TAO_TAG_ENDPOINTS; 00436 tagged_component.component_data.length (static_cast <CORBA::ULong>(length)); 00437 CORBA::Octet *buf = 00438 tagged_component.component_data.get_buffer (); 00439 00440 for (const ACE_Message_Block *iterator = out_cdr.begin (); 00441 iterator != 0; 00442 iterator = iterator->cont ()) 00443 { 00444 size_t i_length = iterator->length (); 00445 ACE_OS::memcpy (buf, iterator->rd_ptr (), i_length); 00446 00447 buf += i_length; 00448 } 00449 00450 // Add component with encoded endpoint data to this profile's 00451 // TaggedComponents. 00452 tagged_components_.set_component (tagged_component); 00453 00454 return 0; 00455 }
TAO_Endpoint * TAO_SHMIOP_Profile::endpoint | ( | void | ) | [virtual] |
Implements TAO_Profile.
Definition at line 87 of file SHMIOP_Profile.cpp.
References endpoint_.
Referenced by TAO_SHMIOP_Acceptor::create_new_profile(), decode_endpoints(), and encode_endpoints().
00088 { 00089 return &this->endpoint_; 00090 }
CORBA::ULong TAO_SHMIOP_Profile::endpoint_count | ( | void | ) | const [virtual] |
Implements TAO_Profile.
Definition at line 93 of file SHMIOP_Profile.cpp.
References count_.
00094 { 00095 return this->count_; 00096 }
CORBA::ULong TAO_SHMIOP_Profile::hash | ( | CORBA::ULong | max | ) | [virtual] |
Implements TAO_Profile.
Definition at line 291 of file SHMIOP_Profile.cpp.
References TAO_Profile::hash_service_i(), TAO_GIOP_Message_Version::minor, TAO_Profile::ref_object_key_, TAO_Profile::tag(), and TAO_Profile::version_.
00293 { 00294 // Get the hashvalue for all endpoints. 00295 CORBA::ULong hashval = 0; 00296 for (TAO_SHMIOP_Endpoint *endp = &this->endpoint_; 00297 endp != 0; 00298 endp = endp->next_) 00299 { 00300 hashval += endp->hash (); 00301 } 00302 00303 hashval += this->version_.minor; 00304 hashval += this->tag (); 00305 00306 const TAO::ObjectKey &ok = 00307 this->ref_object_key_->object_key (); 00308 00309 if (ok.length () >= 4) 00310 { 00311 hashval += ok[1]; 00312 hashval += ok[3]; 00313 } 00314 00315 hashval += this->hash_service_i (max); 00316 00317 return hashval % max; 00318 }
char TAO_SHMIOP_Profile::object_key_delimiter | ( | void | ) | const [virtual] |
Implements TAO_Profile.
Definition at line 28 of file SHMIOP_Profile.cpp.
00029 { 00030 return TAO_SHMIOP_Profile::object_key_delimiter_; 00031 }
void TAO_SHMIOP_Profile::parse_string_i | ( | const char * | string | ) | [protected, virtual] |
Implements TAO_Profile.
Definition at line 130 of file SHMIOP_Profile.cpp.
References CORBA::SystemException::_tao_minor_code(), ACE_DEBUG, ACE_TEXT, ACE_OS::atoi(), CORBA::COMPLETED_NO, endpoint_, ACE_INET_Addr::get_host_addr(), ACE_INET_Addr::get_host_name(), ACE_INET_Addr::get_port_number(), TAO_SHMIOP_Endpoint::host_, LM_DEBUG, MAXHOSTNAMELEN, TAO_SHMIOP_Endpoint::port_, ACE_OS::strchr(), ACE_OS::strcmp(), CORBA::string_alloc(), ACE_INET_Addr::string_to_addr(), ACE_OS::strncpy(), ACE_OS::strspn(), TAO_debug_level, and TAO::VMCID.
00132 { 00133 // Pull off the "hostname:port/" part of the objref 00134 // Copy the string because we are going to modify it... 00135 CORBA::String_var copy (string); 00136 00137 char *start = copy.inout (); 00138 char *cp = ACE_OS::strchr (start, ':'); // Look for a port 00139 00140 if (cp == 0) 00141 { 00142 // No host/port delimiter! 00143 throw ::CORBA::INV_OBJREF ( 00144 CORBA::SystemException::_tao_minor_code ( 00145 TAO::VMCID, 00146 EINVAL), 00147 CORBA::COMPLETED_NO); 00148 } 00149 00150 char *okd = ACE_OS::strchr (start, this->object_key_delimiter_); 00151 00152 if (okd == 0) 00153 { 00154 // No object key delimiter! 00155 throw ::CORBA::INV_OBJREF ( 00156 CORBA::SystemException::_tao_minor_code ( 00157 TAO::VMCID, 00158 EINVAL), 00159 CORBA::COMPLETED_NO); 00160 } 00161 00162 // Don't increment the pointer 'cp' directly since we still need 00163 // to use it immediately after this block. 00164 00165 CORBA::ULong length = okd - (cp + 1); 00166 // Don't allocate space for the colon ':'. 00167 00168 CORBA::String_var tmp = CORBA::string_alloc (length); 00169 00170 ACE_OS::strncpy (tmp.inout (), cp + 1, length); 00171 tmp[length] = '\0'; 00172 00173 if (ACE_OS::strspn (tmp.in (), "1234567890") == length) 00174 { 00175 this->endpoint_.port_ = 00176 static_cast <CORBA::UShort> (ACE_OS::atoi (tmp.in ())); 00177 } 00178 else 00179 { 00180 ACE_INET_Addr ia; 00181 if (ia.string_to_addr (tmp.in ()) == -1) 00182 { 00183 throw ::CORBA::INV_OBJREF ( 00184 CORBA::SystemException::_tao_minor_code ( 00185 TAO::VMCID, 00186 EINVAL), 00187 CORBA::COMPLETED_NO); 00188 } 00189 else 00190 { 00191 this->endpoint_.port_ = ia.get_port_number (); 00192 } 00193 } 00194 00195 length = cp - start; 00196 00197 tmp = CORBA::string_alloc (length); 00198 00199 ACE_OS::strncpy (tmp.inout (), start, length); 00200 tmp[length] = '\0'; 00201 00202 this->endpoint_.host_ = tmp._retn (); 00203 00204 ACE_INET_Addr host_addr; 00205 00206 if (ACE_OS::strcmp (this->endpoint_.host_.in (), "") == 0) 00207 { 00208 char tmp_host [MAXHOSTNAMELEN + 1]; 00209 00210 // If no host is specified: assign the default host : the local host. 00211 if (host_addr.get_host_name (tmp_host, 00212 sizeof (tmp_host)) != 0) 00213 { 00214 const char *tmp = host_addr.get_host_addr (); 00215 if (tmp == 0) 00216 { 00217 if (TAO_debug_level > 0) 00218 ACE_DEBUG ((LM_DEBUG, 00219 ACE_TEXT ("\n\nTAO (%P|%t) ") 00220 ACE_TEXT ("SHMIOP_Profile::parse_string ") 00221 ACE_TEXT ("- %p\n\n"), 00222 ACE_TEXT ("cannot determine hostname"))); 00223 00224 // @@ What's the right exception to throw here? 00225 throw ::CORBA::INV_OBJREF ( 00226 CORBA::SystemException::_tao_minor_code ( 00227 TAO::VMCID, 00228 EINVAL), 00229 CORBA::COMPLETED_NO); 00230 } 00231 else 00232 this->endpoint_.host_ = tmp; 00233 } 00234 else 00235 { 00236 this->endpoint_.host_ = (const char *) tmp_host; 00237 } 00238 } 00239 00240 if (this->endpoint_.object_addr_.set (this->endpoint_.port_, 00241 this->endpoint_.host_.in ()) == -1) 00242 { 00243 if (TAO_debug_level > 0) 00244 { 00245 ACE_DEBUG ((LM_DEBUG, 00246 ACE_TEXT ("TAO (%P|%t) SHMIOP_Profile::parse_string () - \n") 00247 ACE_TEXT ("TAO (%P|%t) ACE_INET_Addr::set () failed"))); 00248 } 00249 00250 // @@ What's the right exception to throw here? 00251 throw ::CORBA::INV_OBJREF ( 00252 CORBA::SystemException::_tao_minor_code ( 00253 TAO::VMCID, 00254 EINVAL), 00255 CORBA::COMPLETED_NO); 00256 } 00257 00258 TAO::ObjectKey ok; 00259 TAO::ObjectKey::decode_string_to_sequence (ok, 00260 okd + 1); // increment past the object key separator 00261 00262 (void) this->orb_core ()->object_key_table ().bind (ok, 00263 this->ref_object_key_); 00264 }
const char * TAO_SHMIOP_Profile::prefix | ( | void | ) | [static] |
Return the char string prefix.
Definition at line 367 of file SHMIOP_Profile.cpp.
References prefix_.
00368 { 00369 return ::prefix_; 00370 }
char * TAO_SHMIOP_Profile::to_string | ( | void | ) | [virtual] |
Template methods, please see Profile.h for documentation.
Implements TAO_Profile.
Definition at line 330 of file SHMIOP_Profile.cpp.
References endpoint_, object_key_delimiter_, TAO_SHMIOP_Endpoint::port(), TAO_Profile::ref_object_key_, ACE_OS::sprintf(), CORBA::string_alloc(), and ACE_OS::strlen().
00331 { 00332 CORBA::String_var key; 00333 TAO::ObjectKey::encode_sequence_to_string (key.inout(), 00334 this->ref_object_key_->object_key ()); 00335 00336 size_t buflen = (8 /* corbaloc */ + 00337 1 /* colon separator */ + 00338 ACE_OS::strlen (::prefix_) + 00339 1 /* colon separator */ + 00340 1 /* major version */ + 00341 1 /* decimal point */ + 00342 1 /* minor version */ + 00343 1 /* `@' character */ + 00344 ACE_OS::strlen (this->endpoint_.host ()) + 00345 1 /* colon separator */ + 00346 5 /* port number */ + 00347 1 /* object key separator */ + 00348 ACE_OS::strlen (key.in ())); 00349 00350 char * buf = CORBA::string_alloc (static_cast <CORBA::ULong> (buflen)); 00351 00352 static const char digits [] = "0123456789"; 00353 00354 ACE_OS::sprintf (buf, 00355 "corbaloc:%s:%c.%c@%s:%d%c%s", 00356 ::prefix_, 00357 digits [this->version_.major], 00358 digits [this->version_.minor], 00359 this->endpoint_.host (), 00360 this->endpoint_.port (), 00361 this->object_key_delimiter_, 00362 key.in ()); 00363 return buf; 00364 }
CORBA::ULong TAO_SHMIOP_Profile::count_ [private] |
Number of endpoints in the list headed by <endpoint_>.
Definition at line 122 of file SHMIOP_Profile.h.
Referenced by add_endpoint(), encode_endpoints(), and endpoint_count().
Head of this profile's list of endpoints. This endpoint is not dynamically allocated because a profile always contains at least one endpoint.
Currently, a profile contains more than one endpoint, i.e., list contains more than just the head, only when RTCORBA is enabled. However, in the near future, this will be used in nonRT mode as well, e.g., to support TAG_ALTERNATE_IIOP_ADDRESS-style feature. Addressing info of the default endpoint, i.e., head of the list, is transmitted using standard SHMIOP ProfileBody components. See <encode_endpoints> method documentation above for how the rest of the endpoint list is transmitted.
Definition at line 119 of file SHMIOP_Profile.h.
Referenced by add_endpoint(), decode_endpoints(), do_is_equivalent(), encode_endpoints(), endpoint(), parse_string_i(), and to_string().
TAO_BEGIN_VERSIONED_NAMESPACE_DECL const char TAO_SHMIOP_Profile::object_key_delimiter_ = '/' [static] |
The object key delimiter that SHMIOP uses or expects.
Definition at line 49 of file SHMIOP_Profile.h.
Referenced by TAO_SHMIOP_Connector::object_key_delimiter(), and to_string().