summaryrefslogtreecommitdiff
path: root/TAO/tao/EndpointPolicy/EndpointPolicy_Factory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/EndpointPolicy/EndpointPolicy_Factory.cpp')
-rw-r--r--TAO/tao/EndpointPolicy/EndpointPolicy_Factory.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/TAO/tao/EndpointPolicy/EndpointPolicy_Factory.cpp b/TAO/tao/EndpointPolicy/EndpointPolicy_Factory.cpp
new file mode 100644
index 00000000000..73b50a6e192
--- /dev/null
+++ b/TAO/tao/EndpointPolicy/EndpointPolicy_Factory.cpp
@@ -0,0 +1,94 @@
+// @(#) $Id$
+#include "tao/EndpointPolicy/EndpointPolicy_Factory.h"
+
+ACE_RCSID (EndpointPolicy,
+ EndpointPolicy_Factory,
+ "$Id$")
+
+#include "tao/EndpointPolicy/EndpointPolicy_i.h"
+#include "tao/EndpointPolicy/EndpointPolicyA.h"
+#include "tao/EndpointPolicy/Endpoint_Value_Impl.h"
+
+#include "tao/PolicyC.h"
+#include "tao/ORB_Constants.h"
+#include "tao/ORB_Core.h"
+#include "tao/Acceptor_Registry.h"
+#include "tao/AnyTypeCode/TAOA.h"
+#include "tao/AnyTypeCode/Any.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Transport_Acceptor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+TAO_EndpointPolicy_Factory::TAO_EndpointPolicy_Factory (TAO_ORB_Core * orb_core)
+: orb_core_ (orb_core)
+{
+}
+
+
+CORBA::Policy_ptr
+TAO_EndpointPolicy_Factory::create_policy (
+ CORBA::PolicyType type,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError))
+{
+ if (type == EndpointPolicy::ENDPOINT_POLICY_TYPE)
+ {
+ const EndpointPolicy::EndpointList* endpoint_list;
+ if ((value >>= endpoint_list) == 0)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_VALUE),
+ CORBA::Policy::_nil ());
+
+ TAO_Acceptor_Registry & registry
+ = this->orb_core_->lane_resources ().acceptor_registry ();
+
+ TAO_Acceptor ** acceptors_begin = registry.begin ();
+ TAO_Acceptor ** acceptors_end = registry.end ();
+ CORBA::ULong num_eps = endpoint_list->length ();
+
+ // The endpoint list in the value is validated to ensure that
+ // at least one endpoint in the list matches an endpoint the
+ // ORB is listening on.
+
+ bool found_one = false;
+ for (CORBA::ULong idx = 0; !found_one && idx < num_eps; ++idx)
+ {
+ CORBA::ULong prot_tag = (*endpoint_list)[idx]->protocol_tag();
+
+ const TAO_Endpoint_Value_Impl *evi =
+ dynamic_cast <const TAO_Endpoint_Value_Impl*> ((*endpoint_list)[idx]);
+
+ for (TAO_Acceptor** acceptor = acceptors_begin;
+ !found_one && acceptor != acceptors_end;
+ ++acceptor)
+ {
+ if ((*acceptor)->tag() == prot_tag)
+ found_one = evi->validate_acceptor(*acceptor);
+ }
+ }
+ // There is no endpoint policy value matches an endpoint the ORB
+ // is listening on. A CORBA::PolicyError exception with a
+ // PolicyErrorCode of UNSUPPORTED_POLICY_VALUE is raised.
+ if (!found_one)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::UNSUPPORTED_POLICY_VALUE),
+ CORBA::Policy::_nil ());
+
+ TAO_EndpointPolicy_i *tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_EndpointPolicy_i (*endpoint_list),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+ }
+ else
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL