summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp
new file mode 100644
index 00000000000..5eb48d6ff1f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp
@@ -0,0 +1,169 @@
+#include "PG_Utils.h"
+#include "tao/MProfile.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/Tagged_Components.h"
+
+ACE_RCSID (PortableGroup,
+ PG_Utils,
+ "$Id$")
+namespace TAO
+{
+ /*static*/ CORBA::Boolean
+ PG_Utils::set_tagged_component (
+ PortableGroup::ObjectGroup *&ior,
+ PortableGroup::TagGroupTaggedComponent &tg)
+ {
+ if (ior->_stubobj () == 0)
+ return 0;
+
+ // We need to apply the property for every profile in the IOR
+ TAO_MProfile &tmp_pfiles =
+ ior->_stubobj ()->base_profiles ();
+
+ // Create the output CDR stream
+ TAO_OutputCDR cdr;
+
+ IOP::TaggedComponent tagged_components;
+ tagged_components.tag = IOP::TAG_FT_GROUP;
+
+ // Encode the property in to the tagged_components
+ CORBA::Boolean retval =
+ PG_Utils::encode_properties (cdr,
+ tg);
+
+ if (retval == 0)
+ return retval;
+
+ // Get the length of the CDR stream
+ CORBA::ULong length = ACE_static_cast (CORBA::ULong,
+ cdr.total_length ());
+
+ // Set the length
+ tagged_components.component_data.length (length);
+
+ // Get the pointer to the underlying buffer
+ CORBA::Octet *buf =
+ tagged_components.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *i = cdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+ const IOP::TaggedComponent &tmp_tc = tagged_components;
+
+ // Get the profile count.
+ CORBA::ULong count =
+ ior->_stubobj ()->base_profiles ().profile_count ();
+
+ // Go through every profile and set the TaggedComponent field
+ for (CORBA::ULong p_idx = 0; p_idx < count ; ++p_idx)
+ {
+ // Get the tagged components in the profile
+ TAO_Tagged_Components &tag_comp =
+ tmp_pfiles.get_profile (p_idx)->tagged_components ();
+
+ // Finally set the <tagged_component> in the
+ // <TAO_Tagged_Component>
+ tag_comp.set_component (tmp_tc);
+ }
+
+ // Success
+ return 1;
+ }
+
+ /*static*/ CORBA::Boolean
+ PG_Utils::get_tagged_component (
+ PortableGroup::ObjectGroup *&ior,
+ PortableGroup::TagGroupTaggedComponent &tg)
+ {
+ if (ior->_stubobj () == 0)
+ return 0;
+
+ TAO_MProfile &mprofile =
+ ior->_stubobj ()->base_profiles ();
+
+ // Looking for a tagged component with a TAG_FT_GROUP flag.
+ IOP::TaggedComponent tc;
+ tc.tag = IOP::TAG_FT_GROUP;
+
+ CORBA::ULong count =
+ mprofile.profile_count ();
+
+ for (CORBA::ULong i = 0;
+ i < count;
+ i++)
+ {
+
+ // Get the Tagged Components
+ const TAO_Tagged_Components &pfile_tagged =
+ mprofile.get_profile (i)->tagged_components ();
+
+ // Look for the primary
+ if (pfile_tagged.get_component (tc) == 1)
+ {
+ TAO_InputCDR cdr (ACE_reinterpret_cast (
+ const char*,
+ tc.component_data.get_buffer ()),
+ tc.component_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ cdr >> ACE_InputCDR::to_boolean (byte_order);
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ cdr.reset_byte_order (ACE_static_cast (int,byte_order));
+
+ cdr >> tg;
+
+ if (cdr.good_bit ())
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+ CORBA::Boolean
+ PG_Utils::encode_properties (
+ TAO_OutputCDR &cdr,
+ PortableGroup::TagGroupTaggedComponent &tg)
+ {
+ cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // the version info
+ cdr << tg.component_version;
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // the domain id
+ cdr << tg.group_domain_id.in ();
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // Object group id
+ cdr << tg.object_group_id;
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // Object group reference version
+ cdr << tg.object_group_ref_version;
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ return cdr.good_bit ();
+ }
+}