summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/EndpointPolicy/Endpoint_Acceptor_Filter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/EndpointPolicy/Endpoint_Acceptor_Filter.cpp')
-rw-r--r--trunk/TAO/tao/EndpointPolicy/Endpoint_Acceptor_Filter.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/trunk/TAO/tao/EndpointPolicy/Endpoint_Acceptor_Filter.cpp b/trunk/TAO/tao/EndpointPolicy/Endpoint_Acceptor_Filter.cpp
new file mode 100644
index 00000000000..127d196c937
--- /dev/null
+++ b/trunk/TAO/tao/EndpointPolicy/Endpoint_Acceptor_Filter.cpp
@@ -0,0 +1,156 @@
+// @(#) $Id$
+
+#include "tao/EndpointPolicy/Endpoint_Acceptor_Filter.h"
+#include "tao/EndpointPolicy/EndpointPolicyC.h"
+#include "tao/EndpointPolicy/Endpoint_Value_Impl.h"
+
+#include "tao/Transport_Acceptor.h"
+#include "tao/MProfile.h"
+#include "tao/Profile.h"
+#include "tao/Endpoint.h"
+
+ACE_RCSID(EndpointPolicy,
+ Endpoint_Acceptor_Filter,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Endpoint_Acceptor_Filter::TAO_Endpoint_Acceptor_Filter (const EndpointPolicy::EndpointList & eps)
+: endpoints_(eps)
+{
+}
+
+int
+TAO_Endpoint_Acceptor_Filter::fill_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ TAO_Acceptor **acceptors_begin,
+ TAO_Acceptor **acceptors_end,
+ CORBA::Short priority)
+{
+ CORBA::ULong const num_endpoints = endpoints_.length ();
+
+ for (TAO_Acceptor** acceptor = acceptors_begin;
+ acceptor != acceptors_end;
+ ++acceptor)
+ {
+ bool tagfound = false;
+ for (CORBA::ULong epx = 0; !tagfound && epx < num_endpoints; epx++)
+ {
+ tagfound = (*acceptor)->tag () == endpoints_[epx]->protocol_tag();
+ }
+ if (!tagfound)
+ continue;
+
+ if ((*acceptor)->create_profile (object_key,
+ mprofile,
+ priority) == -1)
+ return -1;
+ }
+
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) EndpointPolicy filtering acceptors")
+ ACE_TEXT(" - mprofile has %d profiles,")
+ ACE_TEXT(" endpoint list has %d entries\n"),
+ mprofile.profile_count(), num_endpoints));
+
+ for (TAO_PHandle pfile_ndx = 0;
+ pfile_ndx < mprofile.profile_count ();
+ ++pfile_ndx)
+ {
+ TAO_Profile * const pfile = mprofile.get_profile (pfile_ndx);
+ TAO_Endpoint * ep_in_pfile = pfile->endpoint ();
+
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) Testing profile %d - ")
+ ACE_TEXT("it contains %d endpoints\n"),
+ pfile_ndx, pfile->endpoint_count()));
+
+ bool first_endpoint = true;
+ // Iterate the endpoints in the profile.
+ while (ep_in_pfile != 0 && pfile->endpoint_count() > 0)
+ {
+ // Iterate the endpoints in the endpoint policy to see if the endpoint
+ // in the profile matches.
+ CORBA::ULong ep_ndx = 0;
+ bool epmatch = false;
+ for (ep_ndx = 0; !epmatch && ep_ndx < num_endpoints; ++ep_ndx)
+ {
+ if (endpoints_[ep_ndx]->protocol_tag() != pfile->tag())
+ continue;
+
+ const EndpointPolicy::EndpointValueBase_ptr evb =
+ endpoints_[ep_ndx];
+
+ const TAO_Endpoint_Value_Impl *evi =
+ dynamic_cast <const TAO_Endpoint_Value_Impl*>(evb);
+
+ epmatch = evi->is_equivalent(ep_in_pfile);
+ }
+
+ // The endpoint in profile does not match the endpoint specified in
+ // Endpoint policy, now remove the endpoint from the profile.
+ if (!epmatch)
+ {
+ //Get next endpoint before removing current one.
+ TAO_Endpoint * next = ep_in_pfile->next ();
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) EndpointPolicy filter ")
+ ACE_TEXT ("removing endpoint\n")));
+ pfile->remove_generic_endpoint (ep_in_pfile);
+ ep_in_pfile = first_endpoint ? pfile->endpoint() : next;
+ }
+ else
+ {
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) EndpointPolicy filter ")
+ ACE_TEXT ("Endpoint matched policy value\n")));
+ ep_in_pfile = ep_in_pfile->next();
+ first_endpoint = false;
+ }
+ }
+ // Remove the profiles that have no endpoints match the endpoints in
+ // endpoint policy.
+ if (pfile->endpoint_count () == 0)
+ {
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) EndpointPolicy filter ")
+ ACE_TEXT("removing profile\n")));
+ mprofile.remove_profile (pfile);
+ --pfile_ndx; // step back one, we've just shifted the profile list.
+ }
+ else
+ {
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) EndpointPolicy filter ")
+ ACE_TEXT("profile retained with %d endpoints\n"),
+ pfile->endpoint_count()));
+ }
+ }
+
+ if (mprofile.profile_count () == 0) {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) EndpointPolicy filter ")
+ ACE_TEXT("eliminated all profiles\n")));
+
+ return -1;
+ }
+
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) EndpointPolicy filter returning mprofile ")
+ ACE_TEXT("with %d profiles\n"),
+ mprofile.profile_count()));
+
+ return 0;
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL