📄 uipmc_profile.cpp
字号:
return hashval % max;
}
TAO_Endpoint*
TAO_UIPMC_Profile::endpoint (void)
{
return &this->endpoint_;
}
int
TAO_UIPMC_Profile::encode_endpoints (void)
{
return 1;
}
CORBA::ULong
TAO_UIPMC_Profile::endpoint_count (void) const
{
return 1;
}
char *
TAO_UIPMC_Profile::to_string (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
{
// @@ Frank: Update to pull out GroupID information...
size_t buflen = (ACE_OS::strlen (::prefix_) +
3 /* "loc" */ +
1 /* colon separator */ +
2 /* double-slash separator */ +
1 /* major version */ +
1 /* decimal point */ +
1 /* minor version */ +
1 /* `@' character */ +
15 /* dotted decimal IPv4 address */ +
1 /* colon separator */ +
5 /* port number */);
char * buf = CORBA::string_alloc (ACE_static_cast (CORBA::ULong, buflen));
ACE_OS::sprintf (buf,
"corbaloc:%s://1.0@%s:%d",
::prefix_,
this->endpoint_.get_host_addr (),
this->endpoint_.port ());
return buf;
}
const char *
TAO_UIPMC_Profile::prefix (void)
{
return ::prefix_;
}
IOP::TaggedProfile &
TAO_UIPMC_Profile::create_tagged_profile (void)
{
// Check whether we have already created the TaggedProfile
if (this->tagged_profile_.profile_data.length () == 0)
{
// As we have not created we will now create the TaggedProfile
this->tagged_profile_.tag = TAO_TAG_UIPMC_PROFILE;
// Create the encapsulation....
TAO_OutputCDR encap;
// Create the profile body
this->create_profile_body (encap);
CORBA::ULong length =
ACE_static_cast(CORBA::ULong,encap.total_length ());
#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
// Place the message block in to the Sequence of Octets that we
// have
this->tagged_profile_.profile_data.replace (length,
encap.begin ());
#else
this->tagged_profile_.profile_data.length (length);
CORBA::Octet *buffer =
this->tagged_profile_.profile_data.get_buffer ();
for (const ACE_Message_Block *i = encap.begin ();
i != encap.end ();
i = i->next ())
{
ACE_OS::memcpy (buffer, i->rd_ptr (), i->length ());
buffer += i->length ();
}
#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
}
return this->tagged_profile_;
}
void
TAO_UIPMC_Profile::create_profile_body (TAO_OutputCDR &encap) const
{
encap.write_octet (TAO_ENCAP_BYTE_ORDER);
// The GIOP version
// Note: Only GIOP 1.2 and above are supported currently for MIOP.
encap.write_octet (this->version_.major);
encap.write_octet (this->version_.minor);
// Address.
encap.write_string (this->endpoint_.get_host_addr ());
// Port number.
encap.write_ushort (this->endpoint_.port ());
// UIPMC is only supported by versions of GIOP that have tagged components,
// so unconditionally encode the components.
this->tagged_components ().encode (encap);
}
/*
int
TAO_UIPMC_Profile::decode_endpoints (void)
{
IOP::TaggedComponent tagged_component;
tagged_component.tag = TAO_TAG_ENDPOINTS;
if (this->tagged_components_.get_component (tagged_component))
{
const CORBA::Octet *buf =
tagged_component.component_data.get_buffer ();
TAO_InputCDR in_cdr (ACE_reinterpret_cast (const char*, buf),
tagged_component.component_data.length ());
// Extract the Byte Order.
CORBA::Boolean byte_order;
if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
return -1;
in_cdr.reset_byte_order (ACE_static_cast(int, byte_order));
// Extract endpoints sequence.
TAO_UIPMCEndpointSequence endpoints;
if ((in_cdr >> endpoints) == 0)
return -1;
// Get the priority of the first endpoint (head of the list.
// It's other data is extracted as part of the standard profile
// decoding.
this->endpoint_.priority (endpoints[0].priority);
// Use information extracted from the tagged component to
// populate the profile. Skip the first endpoint, since it is
// always extracted through standard profile body. Also, begin
// from the end of the sequence to preserve endpoint order,
// since <add_endpoint> method reverses the order of endpoints
// in the list.
for (CORBA::ULong i = endpoints.length () - 1;
i > 0;
--i)
{
TAO_UIPMC_Endpoint *endpoint = 0;
ACE_NEW_RETURN (endpoint,
TAO_UIPMC_Endpoint (endpoints[i].host,
endpoints[i].port,
endpoints[i].priority),
-1);
this->add_endpoint (endpoint);
}
}
return 0;
}
*/
void
TAO_UIPMC_Profile::set_group_info (const char *domain_id,
PortableGroup::ObjectGroupId group_id,
PortableGroup::ObjectGroupRefVersion ref_version)
{
// First, record the group information.
this->group_domain_id_.set (domain_id);
this->group_id_ = group_id;
this->ref_version_ = ref_version;
// Update the cached version of the group component.
this->update_cached_group_component ();
}
void
TAO_UIPMC_Profile::update_cached_group_component (void)
{
PortableGroup::TagGroupTaggedComponent group;
// Encode the data structure.
group.component_version.major = TAO_DEF_MIOP_MAJOR;
group.component_version.minor = TAO_DEF_MIOP_MINOR;
group.group_domain_id = CORBA::string_dup (this->group_domain_id_.c_str ());
group.object_group_id = this->group_id_;
group.object_group_ref_version = this->ref_version_;
TAO_OutputCDR out_cdr;
// Write the byte order.
out_cdr << ACE_OutputCDR::from_boolean (ACE_CDR_BYTE_ORDER);
// Write the group information.
if ((out_cdr << group) == 0)
{
ACE_DEBUG ((LM_DEBUG,
"Error marshaling group component!"));
return;
}
size_t length = out_cdr.total_length ();
IOP::TaggedComponent tagged_component;
tagged_component.tag = IOP::TAG_GROUP;
tagged_component.component_data.length (ACE_static_cast (CORBA::ULong,
length));
CORBA::Octet *buf =
tagged_component.component_data.get_buffer ();
for (const ACE_Message_Block *iterator = out_cdr.begin ();
iterator != 0;
iterator = iterator->cont ())
{
size_t i_length = iterator->length ();
ACE_OS::memcpy (buf, iterator->rd_ptr (), i_length);
buf += i_length;
}
// Add component with encoded endpoint data to this profile's
// TaggedComponents.
this->tagged_components_.set_component (tagged_component);
}
void
TAO_UIPMC_Profile::request_target_specifier (
TAO_Target_Specification &target_spec,
TAO_Target_Specification::TAO_Target_Address required_type
ACE_ENV_ARG_DECL)
{
// Fill out the target specifier based on the required type.
switch (required_type)
{
case TAO_Target_Specification::Profile_Addr:
// Only using a profile as the target specifier is supported
// at this time. Object keys are strictly not supported since
// UIPMC profiles do not have object keys.
target_spec.target_specifier (
this->create_tagged_profile ());
break;
case TAO_Target_Specification::Key_Addr:
case TAO_Target_Specification::Reference_Addr:
default:
// Unsupported or unknown required type. Throw an exception.
ACE_THROW (CORBA::MARSHAL ());
}
}
int
TAO_UIPMC_Profile::supports_multicast (void) const
{
// Yes! We support multicast!
return 1;
}
void
TAO_UIPMC_Profile::addressing_mode (CORBA::Short addr_mode
ACE_ENV_ARG_DECL)
{
// ** See race condition note about addressing mode in Profile.h **
switch (addr_mode)
{
case TAO_Target_Specification::Profile_Addr:
case TAO_Target_Specification::Reference_Addr:
this->addressing_mode_ = addr_mode;
break;
case TAO_Target_Specification::Key_Addr:
// There is no object key, so it is not supported.
default:
ACE_THROW (CORBA::BAD_PARAM (
CORBA::SystemException::_tao_minor_code (
TAO_DEFAULT_MINOR_CODE,
EINVAL),
CORBA::COMPLETED_NO));
}
}
int
TAO_UIPMC_Profile::extract_group_component (const IOP::TaggedProfile &profile,
PortableGroup::TagGroupTaggedComponent &group)
{
// Create the decoding stream from the encapsulation in the buffer,
//#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
// TAO_InputCDR cdr (profile.profile_data.mb ());
//#else
TAO_InputCDR cdr (ACE_reinterpret_cast(const char*,
profile.profile_data.get_buffer ()),
profile.profile_data.length ());
//#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
// Extract the Byte Order.
CORBA::Boolean byte_order;
if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
return -1;
cdr.reset_byte_order (ACE_static_cast(int, byte_order));
// Read and verify major, minor versions, ignoring UIPMC profiles
// whose versions we don't understand.
CORBA::Octet major, minor;
// Read the version. We just read it here. We don't*do any*
// processing.
if (!(cdr.read_octet (major)
&& cdr.read_octet (minor)))
{
if (TAO_debug_level > 0)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::extract_group_component - v%d.%d\n"),
major,
minor));
}
return -1;
}
// Decode the endpoint.
ACE_CString address;
CORBA::UShort port;
if (!(cdr.read_string (address)
&& cdr.read_ushort (port)))
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::extract_group_component - Couldn't unmarshal address and port!\n")));
return -1;
}
TAO_Tagged_Components tagged_components;
if (tagged_components.decode (cdr) == 0)
return -1;
IOP::TaggedComponent tagged_component;
tagged_component.tag = IOP::TAG_GROUP;
// Try to find it.
if (tagged_components.get_component (tagged_component) == 0)
return -1;
// Found it.
const CORBA::Octet *buf =
tagged_component.component_data.get_buffer ();
TAO_InputCDR in_cdr (ACE_reinterpret_cast (const char*, buf),
tagged_component.component_data.length ());
// Extract the Byte Order.
if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
return -1;
in_cdr.reset_byte_order (ACE_static_cast(int, byte_order));
if ((in_cdr >> group) == 0)
return -1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -