#include <UIOP_Acceptor.h>
Inheritance diagram for TAO_UIOP_Acceptor:


Public Types | |
| typedef ACE_Strategy_Acceptor< TAO_UIOP_Connection_Handler, ACE_LSOCK_ACCEPTOR > | TAO_UIOP_BASE_ACCEPTOR |
| typedef TAO_Creation_Strategy< TAO_UIOP_Connection_Handler > | TAO_UIOP_CREATION_STRATEGY |
| typedef TAO_Concurrency_Strategy< TAO_UIOP_Connection_Handler > | TAO_UIOP_CONCURRENCY_STRATEGY |
| typedef TAO_Accept_Strategy< TAO_UIOP_Connection_Handler, ACE_LSOCK_ACCEPTOR > | TAO_UIOP_ACCEPT_STRATEGY |
Public Member Functions | |
| TAO_UIOP_Acceptor (CORBA::Boolean flag=false) | |
| Create Acceptor object using addr. | |
| virtual | ~TAO_UIOP_Acceptor (void) |
| Destructor. | |
The TAO_Acceptor Methods | |
| virtual int | open (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, int version_major, int version_minor, const char *address, const char *options=0) |
| virtual int | open_default (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, int version_major, int version_minor, const char *options=0) |
| virtual int | close (void) |
| virtual int | create_profile (const TAO::ObjectKey &object_key, TAO_MProfile &mprofile, CORBA::Short priority) |
| virtual int | is_collocated (const TAO_Endpoint *endpoint) |
| virtual CORBA::ULong | endpoint_count (void) |
| virtual int | object_key (IOP::TaggedProfile &profile, TAO::ObjectKey &key) |
Private Member Functions | |
| int | open_i (const char *rendezvous, ACE_Reactor *reactor) |
| Implement the common part of the open*() methods. | |
| void | rendezvous_point (ACE_UNIX_Addr &, const char *rendezvous) |
| int | parse_options (const char *options) |
| Parse protocol specific options. | |
| int | init_uiop_properties (void) |
| int | create_new_profile (const TAO::ObjectKey &object_key, TAO_MProfile &mprofile, CORBA::Short priority) |
| Create a UIOP profile representing this acceptor. | |
| int | create_shared_profile (const TAO::ObjectKey &object_key, TAO_MProfile &mprofile, CORBA::Short priority) |
| Add the endpoints on this acceptor to a shared profile. | |
Private Attributes | |
| TAO_UIOP_BASE_ACCEPTOR | base_acceptor_ |
| The concrete acceptor, as a pointer to its base class. | |
| TAO_UIOP_CREATION_STRATEGY * | creation_strategy_ |
| TAO_UIOP_CONCURRENCY_STRATEGY * | concurrency_strategy_ |
| TAO_UIOP_ACCEPT_STRATEGY * | accept_strategy_ |
| TAO_GIOP_Message_Version | version_ |
| The GIOP version for this endpoint. | |
| TAO_ORB_Core * | orb_core_ |
| ORB Core. | |
| bool | unlink_on_close_ |
| const bool | lite_flag_ |
| Should we use GIOP lite?? | |
Definition at line 44 of file UIOP_Acceptor.h.
|
|
Definition at line 59 of file UIOP_Acceptor.h. Referenced by open_i(). |
|
|
Definition at line 56 of file UIOP_Acceptor.h. |
|
|
Definition at line 58 of file UIOP_Acceptor.h. Referenced by open_i(). |
|
|
Definition at line 57 of file UIOP_Acceptor.h. Referenced by open_i(). |
|
|
Create Acceptor object using addr.
Definition at line 24 of file UIOP_Acceptor.cpp. References TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR, and TAO_TAG_UIOP_PROFILE.
00025 : TAO_Acceptor (TAO_TAG_UIOP_PROFILE), 00026 base_acceptor_ (), 00027 creation_strategy_ (0), 00028 concurrency_strategy_ (0), 00029 accept_strategy_ (0), 00030 version_ (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR), 00031 orb_core_ (0), 00032 unlink_on_close_ (true), 00033 lite_flag_ (flag) 00034 { 00035 } |
|
|
Destructor.
Definition at line 37 of file UIOP_Acceptor.cpp. References close().
00038 {
00039 // Make sure we are closed before we start destroying the
00040 // strategies.
00041 this->close ();
00042
00043 delete this->creation_strategy_;
00044 delete this->concurrency_strategy_;
00045 delete this->accept_strategy_;
00046 }
|
|
|
Implements TAO_Acceptor. Definition at line 177 of file UIOP_Acceptor.cpp. References ACE_Strategy_Acceptor< SVC_HANDLER, >::acceptor(), ACE_Acceptor< SVC_HANDLER, ACE_PEER_ACCEPTOR_2 >::close(), ACE_UNIX_Addr::get_path_name(), ACE_OS::unlink(), and unlink_on_close_. Referenced by ~TAO_UIOP_Acceptor().
00178 {
00179 if (this->unlink_on_close_)
00180 {
00181 ACE_UNIX_Addr addr;
00182
00183 if (this->base_acceptor_.acceptor ().get_local_addr (addr) == 0)
00184 (void) ACE_OS::unlink (addr.get_path_name ());
00185
00186 this->unlink_on_close_ = false;
00187 }
00188
00189 return this->base_acceptor_.close ();
00190 }
|
|
||||||||||||||||
|
Create a UIOP profile representing this acceptor.
Definition at line 67 of file UIOP_Acceptor.cpp. References TAO_Profile::_decr_refcnt(), ACE_Strategy_Acceptor< SVC_HANDLER, >::acceptor(), ACE_NEW_RETURN, TAO_ORB_Core::codeset_manager(), TAO_UIOP_Profile::endpoint(), TAO_MProfile::give_profile(), TAO_MProfile::grow(), TAO_GIOP_Message_Version::major, TAO_GIOP_Message_Version::minor, TAO_ORB_Core::orb_params(), TAO_Endpoint::priority(), TAO_MProfile::profile_count(), TAO_Codeset_Manager::set_codeset(), TAO_Tagged_Components::set_orb_type(), TAO_MProfile::size(), TAO_ORB_Parameters::std_profile_components(), TAO_Profile::tagged_components(), and TAO_ORB_TYPE. Referenced by create_profile(), and create_shared_profile().
00070 {
00071 ACE_UNIX_Addr addr;
00072
00073 if (this->base_acceptor_.acceptor ().get_local_addr (addr) == -1)
00074 return 0;
00075
00076 int count = mprofile.profile_count ();
00077 if ((mprofile.size () - count) < 1
00078 && mprofile.grow (count + 1) == -1)
00079 return -1;
00080
00081 TAO_UIOP_Profile *pfile = 0;
00082 ACE_NEW_RETURN (pfile,
00083 TAO_UIOP_Profile (addr,
00084 object_key,
00085 this->version_,
00086 this->orb_core_),
00087 -1);
00088 pfile->endpoint ()->priority (priority);
00089
00090 if (mprofile.give_profile (pfile) == -1)
00091 {
00092 pfile->_decr_refcnt ();
00093 pfile = 0;
00094 return -1;
00095 }
00096
00097 // Do not add any tagged components to the profile if configured
00098 // by the user not to do so, or if an UIOP 1.0 endpoint is being
00099 // created (IIOP 1.0 did not support tagged components, so we follow
00100 // the same convention for UIOP).
00101 if (this->orb_core_->orb_params ()->std_profile_components () == 0
00102 || (this->version_.major == 1 && this->version_.minor == 0))
00103 return 0;
00104
00105 pfile->tagged_components ().set_orb_type (TAO_ORB_TYPE);
00106 TAO_Codeset_Manager *csm = this->orb_core_->codeset_manager();
00107 if (csm)
00108 csm->set_codeset(pfile->tagged_components());
00109 return 0;
00110 }
|
|
||||||||||||||||
|
Implements TAO_Acceptor. Definition at line 49 of file UIOP_Acceptor.cpp. References create_new_profile(), create_shared_profile(), and TAO_INVALID_PRIORITY.
00052 {
00053 // Check if multiple endpoints should be put in one profile or
00054 // if they should be spread across multiple profiles.
00055 if (priority == TAO_INVALID_PRIORITY)
00056 return this->create_new_profile (object_key,
00057 mprofile,
00058 priority);
00059 else
00060 return this->create_shared_profile (object_key,
00061 mprofile,
00062 priority);
00063
00064 }
|
|
||||||||||||||||
|
Add the endpoints on this acceptor to a shared profile.
Definition at line 113 of file UIOP_Acceptor.cpp. References ACE_Strategy_Acceptor< SVC_HANDLER, >::acceptor(), ACE_NEW_RETURN, TAO_UIOP_Profile::add_endpoint(), create_new_profile(), TAO_MProfile::get_profile(), TAO_Endpoint::priority(), TAO_MProfile::profile_count(), TAO_Profile::tag(), TAO_PHandle, and TAO_TAG_UIOP_PROFILE. Referenced by create_profile().
00116 {
00117 TAO_Profile *pfile = 0;
00118 TAO_UIOP_Profile *uiop_profile = 0;
00119
00120 // First see if <mprofile> already contains a UIOP profile.
00121 for (TAO_PHandle i = 0; i != mprofile.profile_count (); ++i)
00122 {
00123 pfile = mprofile.get_profile (i);
00124 if (pfile->tag () == TAO_TAG_UIOP_PROFILE)
00125 {
00126 uiop_profile = dynamic_cast<TAO_UIOP_Profile *> (pfile);
00127 break;
00128 }
00129 }
00130
00131 if (uiop_profile == 0)
00132 {
00133 // If <mprofile> doesn't contain UIOP_Profile, we need to create
00134 // one.
00135 return create_new_profile (object_key,
00136 mprofile,
00137 priority);
00138 }
00139 else
00140 {
00141 // A UIOP_Profile already exists - just add our endpoint to it.
00142 ACE_UNIX_Addr addr;
00143
00144 if (this->base_acceptor_.acceptor ().get_local_addr (addr) == -1)
00145 return 0;
00146
00147 TAO_UIOP_Endpoint *endpoint = 0;
00148 ACE_NEW_RETURN (endpoint,
00149 TAO_UIOP_Endpoint (addr),
00150 -1);
00151 endpoint->priority (priority);
00152 uiop_profile->add_endpoint (endpoint);
00153
00154 return 0;
00155 }
00156 }
|
|
|
Implements TAO_Acceptor. Definition at line 336 of file UIOP_Acceptor.cpp.
00337 {
00338 return 1;
00339 }
|
|
|
Obtains uiop properties that must be used by this acceptor, i.e., initializes . |
|
|
Implements TAO_Acceptor. Definition at line 159 of file UIOP_Acceptor.cpp. References ACE_Strategy_Acceptor< SVC_HANDLER, >::acceptor(), and TAO_UIOP_Endpoint::object_addr().
00160 {
00161 const TAO_UIOP_Endpoint *endp =
00162 dynamic_cast<const TAO_UIOP_Endpoint *> (endpoint);
00163
00164 // Make sure the dynamically cast pointer is valid.
00165 if (endp == 0)
00166 return 0;
00167
00168 // For UNIX Files this is relatively cheap.
00169 ACE_UNIX_Addr address;
00170 if (this->base_acceptor_.acceptor ().get_local_addr (address) == -1)
00171 return 0;
00172
00173 return endp->object_addr () == address;
00174 }
|
|
||||||||||||
|
Implements TAO_Acceptor. Definition at line 342 of file UIOP_Acceptor.cpp. References ACE_DEBUG, ACE_ERROR, ACE_TEXT, TAO::unbounded_value_sequence< T >::get_buffer(), TAO::unbounded_value_sequence< T >::length(), LM_DEBUG, LM_ERROR, IOP::TaggedProfile::profile_data, ACE_InputCDR::read_octet(), ACE_InputCDR::read_string(), and TAO_debug_level.
00344 {
00345 // Create the decoding stream from the encapsulation in the buffer,
00346 #if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
00347 TAO_InputCDR cdr (profile.profile_data.mb ());
00348 #else
00349 TAO_InputCDR cdr (reinterpret_cast<char*> (profile.profile_data.get_buffer ()),
00350 profile.profile_data.length ());
00351 #endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
00352
00353 CORBA::Octet major, minor;
00354
00355 // Read the version. We just read it here. We don't *do any*
00356 // processing.
00357 if (!(cdr.read_octet (major) && cdr.read_octet (minor)))
00358 {
00359 if (TAO_debug_level > 0)
00360 {
00361 ACE_DEBUG ((LM_DEBUG,
00362 ACE_TEXT ("TAO (%P|%t) IIOP_Profile::decode - v%d.%d\n"),
00363 major,
00364 minor));
00365 }
00366
00367 return -1;
00368 }
00369
00370 char * rendezvous = 0;
00371
00372 // Get rendezvous_point
00373 if (cdr.read_string (rendezvous) == 0)
00374 {
00375 ACE_ERROR ((LM_ERROR, "error decoding UIOP rendezvous_point"));
00376
00377 return -1;
00378 }
00379
00380 // delete the rendezvous point. We don't do any processing.
00381 delete [] rendezvous;
00382
00383 // ... and object key.
00384 if ((cdr >> object_key) == 0)
00385 return -1;
00386
00387 return 1;
00388 }
|
|
||||||||||||||||||||||||||||
|
Implements TAO_Acceptor. Definition at line 193 of file UIOP_Acceptor.cpp. References open_i(), parse_options(), and TAO_GIOP_Message_Version::set_version().
00199 {
00200 this->orb_core_ = orb_core;
00201
00202 if (address == 0)
00203 return -1;
00204
00205 if (major >= 0 && minor >= 0)
00206 this->version_.set_version (static_cast<CORBA::Octet> (major),
00207 static_cast<CORBA::Octet> (minor));
00208 // Parse options
00209 if (this->parse_options (options) == -1)
00210 return -1;
00211 else
00212 return this->open_i (address,
00213 reactor);
00214 }
|
|
||||||||||||||||||||||||
|
Implements TAO_Acceptor. Definition at line 217 of file UIOP_Acceptor.cpp. References ACE_Auto_String_Free::get(), open_i(), parse_options(), and TAO_GIOP_Message_Version::set_version().
00222 {
00223 this->orb_core_ = orb_core;
00224
00225 if (major >= 0 && minor >= 0)
00226 this->version_.set_version (static_cast<CORBA::Octet> (major),
00227 static_cast<CORBA::Octet> (minor));
00228
00229 // Parse options
00230 if (this->parse_options (options) == -1)
00231 return -1;
00232
00233 ACE_Auto_String_Free tempname (ACE_OS::tempnam (0, "TAO"));
00234
00235 if (tempname.get () == 0)
00236 return -1;
00237
00238 return this->open_i (tempname.get (),
00239 reactor);
00240 }
|
|
||||||||||||
|
Implement the common part of the open*() methods.
Definition at line 243 of file UIOP_Acceptor.cpp. References ACE_Strategy_Acceptor< SVC_HANDLER, >::acceptor(), ACE_CLOEXEC, ACE_DEBUG, ACE_NEW_RETURN, EADDRINUSE, ACE_UNIX_Addr::get_path_name(), LM_DEBUG, ACE_Strategy_Acceptor< SVC_HANDLER, >::open(), rendezvous_point(), TAO_debug_level, TAO_UIOP_ACCEPT_STRATEGY, TAO_UIOP_CONCURRENCY_STRATEGY, TAO_UIOP_CREATION_STRATEGY, and unlink_on_close_. Referenced by open(), and open_default().
00245 {
00246 ACE_NEW_RETURN (this->creation_strategy_,
00247 TAO_UIOP_CREATION_STRATEGY (this->orb_core_,
00248 this->lite_flag_),
00249 -1);
00250
00251 ACE_NEW_RETURN (this->concurrency_strategy_,
00252 TAO_UIOP_CONCURRENCY_STRATEGY (this->orb_core_),
00253 -1);
00254
00255 ACE_NEW_RETURN (this->accept_strategy_,
00256 TAO_UIOP_ACCEPT_STRATEGY (this->orb_core_),
00257 -1);
00258
00259 ACE_UNIX_Addr addr;
00260
00261 this->rendezvous_point (addr, rendezvous);
00262
00263 if (this->base_acceptor_.open (addr,
00264 reactor,
00265 this->creation_strategy_,
00266 this->accept_strategy_,
00267 this->concurrency_strategy_) == -1)
00268 {
00269 // Don't unlink an existing rendezvous point since it may be in
00270 // use by another UIOP server/client.
00271 if (errno == EADDRINUSE)
00272 this->unlink_on_close_ = false;
00273
00274 return -1;
00275 }
00276
00277 (void) this->base_acceptor_.acceptor().enable (ACE_CLOEXEC);
00278 // This avoids having child processes acquire the listen socket thereby
00279 // denying the server the opportunity to restart on a well-known endpoint.
00280 // This does not affect the aberrent behavior on Win32 platforms.
00281
00282 // @@ If Profile creation is slow we may need to cache the
00283 // rendezvous point here
00284
00285 if (TAO_debug_level > 5)
00286 ACE_DEBUG ((LM_DEBUG,
00287 "\nTAO (%P|%t) UIOP_Acceptor::open_i - "
00288 "listening on: <%s>\n",
00289 addr.get_path_name ()));
00290 return 0;
00291 }
|
|
|
Parse protocol specific options.
Definition at line 391 of file UIOP_Acceptor.cpp. References ACE_CString, ACE_ERROR_RETURN, ACE_TEXT, and LM_ERROR. Referenced by open(), and open_default().
00392 {
00393 if (str == 0)
00394 return 0; // No options to parse. Not a problem.
00395
00396 // Use an option format similar to the one used for CGI scripts in
00397 // HTTP URLs.
00398 // e.g.: option1=foo&option2=bar
00399
00400 ACE_CString options (str);
00401
00402 const size_t len = options.length ();
00403
00404 static const char option_delimiter = '&';
00405
00406 // Count the number of options.
00407
00408 CORBA::ULong option_count = 1;
00409 // Number of endpoints in the string (initialized to 1).
00410
00411 // Only check for endpoints after the protocol specification and
00412 // before the object key.
00413 for (size_t i = 0; i < len; ++i)
00414 if (options[i] == option_delimiter)
00415 ++option_count;
00416
00417 // The idea behind the following loop is to split the options into
00418 // (option, name) pairs.
00419 // For example,
00420 // `option1=foo&option2=bar'
00421 // will be parsed into:
00422 // `option1=foo'
00423 // `option2=bar'
00424
00425 int begin = 0;
00426 int end = -1;
00427
00428 for (CORBA::ULong j = 0; j < option_count; ++j)
00429 {
00430 begin += end + 1;
00431
00432 if (j < option_count - 1)
00433 end = options.find (option_delimiter, begin);
00434 else
00435 end = len - begin; // Handle last endpoint differently
00436
00437 if (end == begin)
00438 ACE_ERROR_RETURN ((LM_ERROR,
00439 "TAO (%P|%t) Zero length UIOP option.\n"),
00440 -1);
00441 else if (end != ACE_CString::npos)
00442 {
00443 ACE_CString opt =
00444 options.substring (begin, end);
00445
00446 const int slot = opt.find ("=");
00447
00448 if (slot == static_cast<int> (len - 1)
00449 || slot == ACE_CString::npos)
00450 ACE_ERROR_RETURN ((LM_ERROR,
00451 "TAO (%P|%t) UIOP option <%s> is "
00452 "missing a value.\n",
00453 opt.c_str ()),
00454 -1);
00455
00456 const ACE_CString name (opt.substring (0, slot));
00457 ACE_CString value = opt.substring (slot + 1);
00458
00459 if (name.length () == 0)
00460 ACE_ERROR_RETURN ((LM_ERROR,
00461 "TAO (%P|%t) Zero length UIOP "
00462 "option name.\n"),
00463 -1);
00464
00465 if (name == "priority")
00466 {
00467 ACE_ERROR_RETURN ((LM_ERROR,
00468 ACE_TEXT ("TAO (%P|%t) Invalid IIOP endpoint format: ")
00469 ACE_TEXT ("endpoint priorities no longer supported. \n")),
00470 -1);
00471 }
00472 else
00473 ACE_ERROR_RETURN ((LM_ERROR,
00474 "TAO (%P|%t) Invalid UIOP option: <%s>\n",
00475 name.c_str ()),
00476 -1);
00477 }
00478 }
00479 return 0;
00480 }
|
|
||||||||||||
|
Set the rendezvous point and verify that it is valid (e.g. wasn't truncated because it was too long). Definition at line 294 of file UIOP_Acceptor.cpp. References ACE_DEBUG, ACE_UNIX_Addr::get_path_name(), LM_WARNING, ACE_UNIX_Addr::set(), and ACE_OS::strlen(). Referenced by open_i().
00296 {
00297 // To guarantee portability, local IPC rendezvous points (including
00298 // the path and filename) should not be longer than 99 characters
00299 // long. Some platforms may support longer rendezvous points,
00300 // usually 108 characters including the null terminator, but
00301 // Posix.1g only requires that local IPC rendezvous point arrays
00302 // contain a maximum of at least 100 characters, including the null
00303 // terminator. If an endpoint is longer than what the platform
00304 // supports then it will be truncated so that it fits, and a warning
00305 // will be issued.
00306
00307 // Avoid using relative paths in your UIOP endpoints. If possible,
00308 // use absolute paths instead. Imagine that the server is given an
00309 // endpoint to create using -ORBEndpoint uiop://foobar. A local IPC
00310 // rendezvous point called foobar will be created in the current
00311 // working directory. If the client is not started in the directory
00312 // where the foobar rendezvous point exists then the client will not
00313 // be able to communicate with the server since its point of
00314 // communication, the rendezvous point, was not found. On the other
00315 // hand, if an absolute path was used, the client would know exactly
00316 // where to find the rendezvous point. It is up to the user to make
00317 // sure that a given UIOP endpoint is accessible by both the server
00318 // and the client.
00319
00320 addr.set (rendezvous);
00321
00322 const size_t length = ACE_OS::strlen (addr.get_path_name ());
00323
00324 // Check if rendezvous point was truncated by ACE_UNIX_Addr since
00325 // most UNIX domain socket rendezvous points can only be less than
00326 // 108 characters long.
00327 if (length < ACE_OS::strlen (rendezvous))
00328 ACE_DEBUG ((LM_WARNING,
00329 "TAO (%P|%t) UIOP rendezvous point was truncated to <%s>\n"
00330 "since it was longer than %d characters long.\n",
00331 addr.get_path_name (),
00332 length));
00333 }
|
|
|
Definition at line 123 of file UIOP_Acceptor.h. |
|
|
The concrete acceptor, as a pointer to its base class.
Definition at line 118 of file UIOP_Acceptor.h. |
|
|
Definition at line 122 of file UIOP_Acceptor.h. |
|
|
Definition at line 121 of file UIOP_Acceptor.h. |
|
|
Should we use GIOP lite??
Definition at line 137 of file UIOP_Acceptor.h. |
|
|
ORB Core.
Definition at line 129 of file UIOP_Acceptor.h. |
|
|
Flag that determines whether or not the rendezvous point should be unlinked on close. This is really only used when an error occurs. Definition at line 134 of file UIOP_Acceptor.h. |
|
|
The GIOP version for this endpoint.
Definition at line 126 of file UIOP_Acceptor.h. |
1.3.6