diff options
Diffstat (limited to 'TAO/tao/IORManipulation/IORManipulation.cpp')
-rw-r--r-- | TAO/tao/IORManipulation/IORManipulation.cpp | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/TAO/tao/IORManipulation/IORManipulation.cpp b/TAO/tao/IORManipulation/IORManipulation.cpp new file mode 100644 index 00000000000..dcc9217a1fb --- /dev/null +++ b/TAO/tao/IORManipulation/IORManipulation.cpp @@ -0,0 +1,382 @@ +#include "tao/IORManipulation/IORManipulation.h" + +#include "tao/MProfile.h" +#include "tao/Profile.h" +#include "tao/Stub.h" +#include "tao/ORB_Core.h" + +#include "ace/Auto_Ptr.h" +#include "ace/OS_NS_string.h" + + +ACE_RCSID (IORManipulation, + IORManipulation, + "$Id$") + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +TAO_IOR_Manipulation_impl::TAO_IOR_Manipulation_impl (void) +{ +} + +TAO_IOR_Manipulation_impl::~TAO_IOR_Manipulation_impl (void) +{ +} + +CORBA::Object_ptr +TAO_IOR_Manipulation_impl::merge_iors ( + const TAO_IOP::TAO_IOR_Manipulation::IORList & iors + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + TAO_IOP::EmptyProfileList, + TAO_IOP::Duplicate, + TAO_IOP::Invalid_IOR)) +{ + // we need to create a new CORBA::Object which has the union of the + // two profile lists. However, if any profiles are duplicates (i.e. in + // bott lisis) then an exception is raised. + + // Deterinine how many profiles we have + // Get an estimate of the size - pfile count could change since we + // neither lock nor get a copy in this loop. + CORBA::ULong i, count=0; + for (i = 0; i < iors.length (); i++) + { + count += iors[i]->_stubobj ()->base_profiles ().profile_count (); + } + + // make sure we have some profiles + if (count == 0) + ACE_THROW_RETURN (TAO_IOP::EmptyProfileList (), + CORBA::Object::_nil ()); + + // initialize with estimated pfile count. + TAO_MProfile Merged_Profiles (count); + + // get the profile lists, start by initialize the composite reference + // by using the first Object. Then for each subsequent Object verify + // they are the same type and they do not have duplicate profiles. + auto_ptr<TAO_MProfile> tmp_pfiles (iors[0]->_stubobj ()->make_profiles ()); + if (Merged_Profiles.add_profiles (tmp_pfiles.get ())< 0) + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + CORBA::Object::_nil ()); + CORBA::String_var id = + CORBA::string_dup (iors[0]->_stubobj ()->type_id.in ()); + + for (i = 1; i < iors.length () ; i++) + { + // this gets a copy of the MProfile, hense the auto_ptr; + + ACE_AUTO_PTR_RESET (tmp_pfiles, + iors[i]->_stubobj ()->make_profiles (), + TAO_MProfile); + + // check to see if any of the profile in tmp_pfiles are already + // in Merged_Profiles. If so raise exception. + if (Merged_Profiles.is_equivalent (tmp_pfiles.get ())) + ACE_THROW_RETURN (TAO_IOP::Duplicate (), + CORBA::Object::_nil ()); + + // If the object type_id's differ then raise an exception. + if (id.in () && iors[i]->_stubobj ()->type_id.in () && + ACE_OS::strcmp (id.in (), iors[i]->_stubobj ()->type_id.in ())) + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + CORBA::Object::_nil ()); + + // append profiles + if (Merged_Profiles.add_profiles (tmp_pfiles.get ()) < 0) + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + CORBA::Object::_nil ()); + + } + + // MS C++ knows nothing about reset! + // tmp_pfiles.reset (0); // get rid of last MProfile + + TAO_ORB_Core *orb_core = TAO_ORB_Core_instance (); + + TAO_Stub *stub = orb_core->create_stub (id.in (), // give the id string + Merged_Profiles + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA::Object::_nil ()); + + // Make the stub memory allocation exception safe for the duration + // of this method. + TAO_Stub_Auto_Ptr safe_stub (stub); + + // Create the CORBA level proxy + CORBA::Object_ptr temp_obj = CORBA::Object::_nil (); + ACE_NEW_THROW_EX (temp_obj, + CORBA::Object (safe_stub.get ()), + CORBA::NO_MEMORY ()); + + CORBA::Object_var new_obj = temp_obj; + + ACE_CHECK_RETURN (CORBA::Object::_nil ()); + + // Clean up in case of errors. + if (CORBA::is_nil (new_obj.in ())) + { + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + CORBA::Object::_nil ()); + } + + // Release ownership of the pointers protected by the auto_ptrs since they + // no longer need to be protected by this point. + stub = safe_stub.release (); + + return new_obj._retn (); +} + +CORBA::Object_ptr +TAO_IOR_Manipulation_impl::add_profiles ( + CORBA::Object_ptr ior1, + CORBA::Object_ptr ior2 + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + TAO_IOP::EmptyProfileList, + TAO_IOP::Duplicate, + TAO_IOP::Invalid_IOR)) +{ + + // Get an estimate of the number of profiles + CORBA::Object_ptr buffer [2]; + buffer [0] = ior1; + buffer [1] = ior2; + TAO_IOP::TAO_IOR_Manipulation::IORList iors (2, 2, buffer, 0); + return this->merge_iors (iors ACE_ENV_ARG_PARAMETER); +} + +CORBA::Object_ptr +TAO_IOR_Manipulation_impl::remove_profiles ( + CORBA::Object_ptr group, + CORBA::Object_ptr ior2 + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC (( + CORBA::SystemException, + TAO_IOP::Invalid_IOR, + TAO_IOP::EmptyProfileList, + TAO_IOP::NotFound + )) +{ + // First verify they are the same type! + CORBA::String_var id = + CORBA::string_dup (group->_stubobj ()->type_id.in ()); + if (id.in () && ior2->_stubobj ()->type_id.in () && + ACE_OS::strcmp (id.in (), ior2->_stubobj ()->type_id.in ())) + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + CORBA::Object::_nil ()); + + // Since we are removing from group ... + CORBA::ULong count = group->_stubobj ()->base_profiles ().profile_count (); + + // make sure we have some profiles + if (count == 0 || + ior2->_stubobj ()->base_profiles ().profile_count () == 0) + ACE_THROW_RETURN (TAO_IOP::EmptyProfileList (), + CORBA::Object::_nil ()); + + // initialize with estimated pfile count. + TAO_MProfile Diff_Profiles (count); + + auto_ptr<TAO_MProfile> tmp_pfiles (group->_stubobj ()->make_profiles ()); + if (Diff_Profiles.add_profiles (tmp_pfiles.get ()) < 0) + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + CORBA::Object::_nil ()); + + // We are done with add_profiles. + // At this point, we don't do remove_profiles() + // immediately like before, + // because it could result in an + // Object Reference with 0 profile. And it would not pass + // the ::CORBA::is_nil() evaluation. + // Instead, we create the Object Reference right here, which is + // earlier than before.(Actually, I just moved some code + // from below up to here). + TAO_ORB_Core *orb_core = TAO_ORB_Core_instance (); + + TAO_Stub *stub = orb_core->create_stub (id.in (), // give the id string + Diff_Profiles + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA::Object::_nil ()); + + // Make the stub memory allocation exception safe for the duration + // of this method. + TAO_Stub_Auto_Ptr safe_stub (stub); + + // Create the CORBA level proxy + CORBA::Object_ptr temp_obj = CORBA::Object::_nil (); + ACE_NEW_THROW_EX (temp_obj, + CORBA::Object (safe_stub.get ()), + CORBA::NO_MEMORY ()); + + CORBA::Object_var new_obj = temp_obj; + + // Exception safety is no longer an issue by this point so release + // the TAO_Stub from the TAO_Stub_Auto_Ptr. + stub = safe_stub.release (); + + // Clean up in case of errors. + if (CORBA::is_nil (new_obj.in ())) + { + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + CORBA::Object::_nil ()); + } + + // Now we can remove the profiles which we want to elimitate from + // the Object. + ACE_AUTO_PTR_RESET (tmp_pfiles, + ior2->_stubobj ()->make_profiles (), + TAO_MProfile); + + TAO_MProfile& mp = stub -> base_profiles(); + if (mp.remove_profiles (tmp_pfiles.get ()) < 0) + ACE_THROW_RETURN (TAO_IOP::NotFound (), + CORBA::Object::_nil ()); + + // MS C++ knows nothing about reset! + // tmp_pfiles.reset (0); // get rid of last MProfile + + return new_obj._retn (); +} + +CORBA::Boolean +TAO_IOR_Manipulation_impl::set_property ( + TAO_IOP::TAO_IOR_Property_ptr prop, + CORBA::Object_ptr group + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + TAO_IOP::Invalid_IOR, + TAO_IOP::Duplicate)) +{ + // make sure we have some profiles + if (group->_stubobj ()->base_profiles ().profile_count () == 0) + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + 0); + + // Call the implementation object to + return prop->set_property (group + ACE_ENV_ARG_PARAMETER); +} + +//@@ note awkward argument order +CORBA::Boolean +TAO_IOR_Manipulation_impl::set_primary ( + TAO_IOP::TAO_IOR_Property_ptr prop, + CORBA::Object_ptr new_primary, + CORBA::Object_ptr group + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + TAO_IOP::Invalid_IOR, + TAO_IOP::Duplicate, + TAO_IOP::MultiProfileList)) +{ + // make sure we have some profiles in GROUP + if (group->_stubobj ()->base_profiles ().profile_count () == 0) + ACE_THROW_RETURN (TAO_IOP::Invalid_IOR (), + 0); + + // Make sure we have only one profile in new_primary + // @@ Will fail if the object has been + /*if (new_primary->_stubobj ()->base_profiles ().profile_count () > 1) + ACE_THROW_RETURN (TAO_IOP::MultiProfileList (), + 0);*/ + + // Call the callback object to do the rest of the processing. + return prop->set_primary (new_primary, + group + ACE_ENV_ARG_PARAMETER); +} + +CORBA::Object_ptr +TAO_IOR_Manipulation_impl::get_primary ( + TAO_IOP::TAO_IOR_Property_ptr prop, + CORBA::Object_ptr group + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException, + TAO_IOP::NotFound + )) +{ + // make sure we have some profiles in IOR + if (group->_stubobj ()->base_profiles ().profile_count () == 0) + ACE_THROW_RETURN (TAO_IOP::NotFound (), 0); + // @@ Bala: this was throwing TAO_IOP::Invalid_IOR, but it was not + // in the throw spec, that will result in a CORBA::UNKNOWN at + // run-time (if it does not crash). Any idea about what is going on + // here? + + return prop->get_primary (group + ACE_ENV_ARG_PARAMETER); +} + +CORBA::Boolean +TAO_IOR_Manipulation_impl::is_primary_set ( + TAO_IOP::TAO_IOR_Property_ptr prop, + CORBA::Object_ptr group + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return prop->is_primary_set (group ACE_ENV_ARG_PARAMETER); +} + +CORBA::Boolean +TAO_IOR_Manipulation_impl:: remove_primary_tag ( + TAO_IOP::TAO_IOR_Property_ptr prop, + CORBA::Object_ptr group + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return prop->remove_primary_tag (group ACE_ENV_ARG_PARAMETER); +} + +CORBA::ULong +TAO_IOR_Manipulation_impl::is_in_ior ( + CORBA::Object_ptr ior1, + CORBA::Object_ptr ior2 + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + TAO_IOP::NotFound)) +{ + CORBA::ULong count = 0; + TAO_Profile *pfile1, *pfile2; + auto_ptr<TAO_MProfile> tmp_pfiles1 (ior1->_stubobj ()->make_profiles ()); + auto_ptr<TAO_MProfile> tmp_pfiles2 (ior2->_stubobj ()->make_profiles ()); + + tmp_pfiles1->rewind (); + while ((pfile1 = tmp_pfiles1->get_next ()) > 0) + { + tmp_pfiles2->rewind (); + while ((pfile2 = tmp_pfiles2->get_next ()) > 0) + { + if (pfile1->is_equivalent (pfile2)) + count++; + } + } + + if (count == 0) + ACE_THROW_RETURN (TAO_IOP::NotFound (), + 0); + + return count; +} + +CORBA::ULong +TAO_IOR_Manipulation_impl::get_profile_count ( + CORBA::Object_ptr group + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + TAO_IOP::EmptyProfileList)) +{ + CORBA::ULong count; + count = group->_stubobj ()->base_profiles ().profile_count (); + + if (count == 0) + ACE_THROW_RETURN (TAO_IOP::EmptyProfileList (), + 0); + + return count; +} + +TAO_END_VERSIONED_NAMESPACE_DECL |