diff options
Diffstat (limited to 'TAO/tao/IIOP_Profile.cpp')
-rw-r--r-- | TAO/tao/IIOP_Profile.cpp | 474 |
1 files changed, 0 insertions, 474 deletions
diff --git a/TAO/tao/IIOP_Profile.cpp b/TAO/tao/IIOP_Profile.cpp deleted file mode 100644 index 9a721c2528e..00000000000 --- a/TAO/tao/IIOP_Profile.cpp +++ /dev/null @@ -1,474 +0,0 @@ -// This may look like C, but it's really -*- C++ -*- -// $Id$ - - - -#include "tao/IIOP_Profile.h" -#include "tao/IIOP_Connect.h" -#include "tao/GIOP.h" -#include "tao/CDR.h" -#include "tao/Environment.h" -#include "tao/ORB.h" -#include "tao/ORB_Core.h" -#include "tao/POA.h" -#include "tao/debug.h" - -ACE_RCSID(tao, IIOP_Profile, "$Id$") - -#if !defined (__ACE_INLINE__) -# include "tao/IIOP_Profile.i" -#endif /* __ACE_INLINE__ */ - -static const char *prefix_ = "iiop:"; - -const char TAO_IIOP_Profile::object_key_delimiter = '/'; - -TAO_IIOP_Profile::TAO_IIOP_Profile (const ACE_INET_Addr &addr, - const TAO_ObjectKey &object_key, - const TAO_GIOP_Version &version, - TAO_ORB_Core *orb_core) - : TAO_Profile (TAO_IOP_TAG_INTERNET_IOP), - host_ (), - port_ (0), - version_ (version), - object_key_ (object_key), - object_addr_ (addr), - hint_ (0), - orb_core_ (orb_core) -{ - this->set (addr); -} - -TAO_IIOP_Profile::TAO_IIOP_Profile (const char* host, - CORBA::UShort port, - const TAO_ObjectKey &object_key, - const ACE_INET_Addr &addr, - const TAO_GIOP_Version &version, - TAO_ORB_Core *orb_core) - : TAO_Profile (TAO_IOP_TAG_INTERNET_IOP), - host_ (), - port_ (port), - version_ (version), - object_key_ (object_key), - object_addr_ (addr), - hint_ (0), - orb_core_ (orb_core) -{ - if (host != 0) - this->host_ = host; -} - -TAO_IIOP_Profile::TAO_IIOP_Profile (const TAO_IIOP_Profile &pfile) - : TAO_Profile (pfile.tag ()), - host_ (pfile.host_), - port_ (pfile.port_), - version_ (pfile.version_), - object_key_ (pfile.object_key_), - object_addr_ (pfile.object_addr_), - hint_ (pfile.hint_), - orb_core_ (pfile.orb_core_) -{ - // @@ Do we need this copy constructor? Won't the default copy - // constructor work just as well? -Ossama -} - -TAO_IIOP_Profile::TAO_IIOP_Profile (const char *string, - TAO_ORB_Core *orb_core, - CORBA::Environment &ACE_TRY_ENV) - : TAO_Profile (TAO_IOP_TAG_INTERNET_IOP), - host_ (), - port_ (0), - version_ (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR), - object_key_ (), - object_addr_ (), - hint_ (0), - orb_core_ (orb_core) -{ - parse_string (string, ACE_TRY_ENV); - ACE_CHECK; -} - -TAO_IIOP_Profile::TAO_IIOP_Profile (TAO_ORB_Core *orb_core) - : TAO_Profile (TAO_IOP_TAG_INTERNET_IOP), - host_ (), - port_ (0), - version_ (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR), - object_key_ (), - object_addr_ (), - hint_ (0), - orb_core_ (orb_core) -{ -} - -int -TAO_IIOP_Profile::set (const ACE_INET_Addr &addr) -{ - this->port_ = addr.get_port_number(); - - if (this->orb_core_->orb_params ()->use_dotted_decimal_addresses ()) - { - const char *temp = addr.get_host_addr (); - if (temp == 0) - return -1; - else - this->host_ = temp; - } - else - { - char temphost[MAXHOSTNAMELEN + 1]; - - if (addr.get_host_name (temphost, - sizeof temphost) != 0) - return -1; - - this->host_ = CORBA::string_dup (temphost); - } - - return 0; -} - -TAO_IIOP_Profile::~TAO_IIOP_Profile (void) -{ -} - -// return codes: -// -1 -> error -// 0 -> can't understand this version -// 1 -> success. -int -TAO_IIOP_Profile::decode (TAO_InputCDR& cdr) -{ - CORBA::ULong encap_len = cdr.length (); - - // Read and verify major, minor versions, ignoring IIOP - // profiles whose versions we don't understand. - // - if (!(cdr.read_octet (this->version_.major) - && this->version_.major == TAO_DEF_GIOP_MAJOR - && cdr.read_octet (this->version_.minor) - && this->version_.minor <= TAO_DEF_GIOP_MINOR)) - { - if (TAO_debug_level > 0) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) IIOP_Profile::decode - v%d.%d\n", - this->version_.major, - this->version_.minor)); - } - } - - // Get host and port - if (cdr.read_string (this->host_.out ()) == 0 - || cdr.read_ushort (this->port_) == 0) - { - if (TAO_debug_level > 0) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) IIOP_Profile::decode - " - "error while decoding host/port")); - } - return -1; - } - - this->object_addr_.set (this->port_, this->host_.in ()); - - // ... and object key. - - if ((cdr >> this->object_key_) == 0) - return -1; - - // Tagged Components *only* exist after version 1.0! - // For GIOP 1.2, IIOP and GIOP have same version numbers! - if (this->version_.major > 1 - || this->version_.minor > 0) - if (this->tagged_components_.decode (cdr) == 0) - return -1; - - if (cdr.length () != 0 && TAO_debug_level) - { - // If there is extra data in the profile we are supposed to - // ignore it, but print a warning just in case... - ACE_DEBUG ((LM_DEBUG, - "%d bytes out of %d left after IIOP profile data\n", - cdr.length (), - encap_len)); - } - - if (cdr.good_bit ()) - return 1; - - return -1; -} - -int -TAO_IIOP_Profile::parse_string (const char *string, - CORBA::Environment &ACE_TRY_ENV) -{ - if (!string || !*string) - { - ACE_THROW_RETURN (CORBA::INV_OBJREF ( - CORBA_SystemException::_tao_minor_code ( - TAO_NULL_POINTER_MINOR_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - - // Remove the "N.n@" version prefix, if it exists, and verify the - // version is one that we accept. - - // Check for version - if (isdigit (string [0]) && - string[1] == '.' && - isdigit (string [2]) && - string[3] == '@') - { - // @@ This may fail for non-ascii character sets [but take that - // with a grain of salt] - this->version_.set_version ((char) (string [0] - '0'), - (char) (string [2] - '0')); - string += 4; - // Skip over the "N.n@" - } - - if (this->version_.major != TAO_DEF_GIOP_MAJOR || - this->version_.minor > TAO_DEF_GIOP_MINOR) - { - ACE_THROW_RETURN (CORBA::INV_OBJREF (), -1); - } - - // Pull off the "hostname:port/" part of the objref - // Copy the string because we are going to modify it... - CORBA::String_var copy (string); - - char *start = copy.inout (); - char *cp = ACE_OS::strchr (start, ':'); // Look for a port - - if (cp == 0) - { - // No host/port delimiter! - ACE_THROW_RETURN (CORBA::INV_OBJREF ( - CORBA_SystemException::_tao_minor_code ( - TAO_NULL_POINTER_MINOR_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - - char *okd = ACE_OS::strchr (start, this->object_key_delimiter); - - if (okd == 0) - { - // No object key delimiter! - ACE_THROW_RETURN (CORBA::INV_OBJREF ( - CORBA_SystemException::_tao_minor_code ( - TAO_NULL_POINTER_MINOR_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - - // Don't increment the pointer 'cp' directly since we still need - // to use it immediately after this block. - - CORBA::ULong length = okd - (cp + 1); - // Don't allocate space for the colon ':'. - - CORBA::String_var tmp = CORBA::string_alloc (length); - - ACE_OS::strncpy (tmp.inout (), cp + 1, length); - tmp[length] = '\0'; - - this->port_ = (CORBA::UShort) ACE_OS::atoi (tmp.in ()); - - length = cp - start; - - tmp = CORBA::string_alloc (length); - - ACE_OS::strncpy (tmp.inout (), start, length); - tmp[length] = '\0'; - - this->host_ = tmp._retn (); - - this->object_addr_.set (this->port_, this->host_.in ()); - - start = ++okd; // increment past the object key separator - - TAO_POA::decode_string_to_sequence (this->object_key_, start); - - return 1; -} - -CORBA::Boolean -TAO_IIOP_Profile::is_equivalent (const TAO_Profile *other_profile) -{ - - if (other_profile->tag () != TAO_IOP_TAG_INTERNET_IOP) - return 0; - - const TAO_IIOP_Profile *op = - ACE_dynamic_cast (const TAO_IIOP_Profile *, other_profile); - - ACE_ASSERT (op->object_key_.length () < UINT_MAX); - - return this->port_ == op->port_ - && this->object_key_ == op->object_key_ - && ACE_OS::strcmp (this->host_.in (), op->host_.in ()) == 0 - && this->version_ == op->version_; -} - -CORBA::ULong -TAO_IIOP_Profile::hash (CORBA::ULong max, - CORBA::Environment &) -{ - CORBA::ULong hashval; - - // Just grab a bunch of convenient bytes and hash them; could do - // more (hostname, full key, exponential hashing) but no real need - // to do so except if performance requires a more costly hash. - - hashval = this->object_key_.length () * this->port_; - hashval += this->version_.minor; - - if (this->object_key_.length () >= 4) - { - hashval += this->object_key_ [1]; - hashval += this->object_key_ [3]; - } - - return hashval % max; -} - -int -TAO_IIOP_Profile::addr_to_string (char *buffer, size_t length) -{ - size_t actual_len = - ACE_OS::strlen (this->host_.in ()) // chars in host name - + sizeof (':') // delimiter - + ACE_OS::strlen ("65536") // max port - + sizeof ('\0'); - - if (length < actual_len) - return -1; - - ACE_OS::sprintf (buffer, "%s:%d", - this->host_.in (), this->port_); - - return 0; -} - -const char * -TAO_IIOP_Profile::host (const char *h) -{ - this->host_ = h; - - return this->host_.in (); -} - -void -TAO_IIOP_Profile::reset_hint (void) -{ - if (this->hint_) - { - this->hint_->cleanup_hint (); - this->hint_ = 0; - } -} - -TAO_IIOP_Profile & -TAO_IIOP_Profile::operator= (const TAO_IIOP_Profile &src) -{ - this->version_ = src.version_; - - this->object_key_ = src.object_key_; - - this->object_addr_.set (src.object_addr_); - - this->port_ = src.port_; - - this->host_ = src.host_; - - return *this; -} - -CORBA::String -TAO_IIOP_Profile::to_string (CORBA::Environment &) -{ - CORBA::String_var key; - TAO_POA::encode_sequence_to_string (key.inout(), - this->object_key ()); - - u_int buflen = (ACE_OS::strlen (::prefix_) + - 2 /* double-slash separator */ + - 1 /* major version */ + - 1 /* decimal point */ + - 1 /* minor version */ + - 1 /* `@' character */ + - ACE_OS::strlen (this->host_.in ()) + - 1 /* colon separator */ + - 5 /* port number */ + - 1 /* object key separator */ + - ACE_OS::strlen (key)); - - CORBA::String buf = CORBA::string_alloc (buflen); - - static const char digits [] = "0123456789"; - - ACE_OS::sprintf (buf, - "%s//%c.%c@%s:%d%c%s", - ::prefix_, - digits [this->version_.major], - digits [this->version_.minor], - this->host_.in (), - this->port_, - this->object_key_delimiter, - key.in ()); - return buf; -} - -const char * -TAO_IIOP_Profile::prefix (void) -{ - return ::prefix_; -} - -int -TAO_IIOP_Profile::encode (TAO_OutputCDR &stream) const -{ - // UNSIGNED LONG, protocol tag - stream.write_ulong (this->tag ()); - - // Create the encapsulation.... - TAO_OutputCDR encap (ACE_CDR::DEFAULT_BUFSIZE, - TAO_ENCAP_BYTE_ORDER, - this->orb_core_->output_cdr_buffer_allocator (), - this->orb_core_->output_cdr_dblock_allocator (), - this->orb_core_->orb_params ()->cdr_memcpy_tradeoff (), - this->orb_core_->to_iso8859 (), - this->orb_core_->to_unicode ()); - - encap.write_octet (TAO_ENCAP_BYTE_ORDER); - - // The GIOP version - encap.write_octet (this->version_.major); - encap.write_octet (this->version_.minor); - - // STRING hostname from profile - encap.write_string (this->host_.in ()); - - // UNSIGNED SHORT port number - encap.write_ushort (this->port_); - - // OCTET SEQUENCE for object key - encap << this->object_key_; - - if (this->version_.major > 1 - || this->version_.minor > 0) - this->tagged_components_.encode (encap); - - // write the encapsulation as an octet sequence... - stream << CORBA::ULong (encap.total_length ()); - stream.write_octet_array_mb (encap.begin ()); - - return 1; -} |