summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp
new file mode 100644
index 00000000000..580c0e4d4d3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp
@@ -0,0 +1,157 @@
+// $Id$
+
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Event/EC_Prefix_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Type_Filter.h"
+#include "orbsvcs/Event/EC_Conjunction_Filter.h"
+#include "orbsvcs/Event/EC_Disjunction_Filter.h"
+#include "orbsvcs/Event/EC_And_Filter.h"
+#include "orbsvcs/Event/EC_Negation_Filter.h"
+#include "orbsvcs/Event/EC_Bitmask_Filter.h"
+#include "orbsvcs/Event/EC_Masked_Type_Filter.h"
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Prefix_Filter_Builder.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Prefix_Filter_Builder, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Prefix_Filter_Builder::~TAO_EC_Prefix_Filter_Builder (void)
+{
+}
+
+TAO_EC_Filter*
+TAO_EC_Prefix_Filter_Builder::build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos) const
+{
+ CORBA::ULong pos = 0;
+ return this->recursive_build (supplier, qos, pos);
+}
+
+TAO_EC_Filter*
+TAO_EC_Prefix_Filter_Builder:: recursive_build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos) const
+{
+ CORBA::ULong l = qos.dependencies.length ();
+ if (pos == l)
+ return 0;
+
+ const RtecEventComm::Event& e = qos.dependencies[pos].event;
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = e.header.source;
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_Conjunction_Filter (children, n);
+ }
+ else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = e.header.source;
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_Disjunction_Filter (children, n);
+ }
+
+ else if (e.header.type == ACE_ES_LOGICAL_AND_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = e.header.source;
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_And_Filter (children, n);
+ }
+
+ else if (e.header.type == ACE_ES_NEGATION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ TAO_EC_Filter *child =
+ this->recursive_build (supplier, qos, pos);
+ return new TAO_EC_Negation_Filter (child);
+ }
+ else if (e.header.type == ACE_ES_BITMASK_DESIGNATOR)
+ {
+ pos++; // COnsumer the designator
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_mask = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_mask = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ TAO_EC_Filter *child =
+ this->recursive_build (supplier, qos, pos);
+ return new TAO_EC_Bitmask_Filter (source_mask,
+ type_mask,
+ child);
+ }
+ else if (e.header.type == ACE_ES_MASKED_TYPE_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_mask = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_mask = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_value = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_value = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ return new TAO_EC_Masked_Type_Filter (source_mask,
+ type_mask,
+ source_value,
+ type_value);
+ }
+ else if (e.header.type == ACE_ES_NULL_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ return new TAO_EC_Null_Filter ();
+ }
+ else if (e.header.type == ACE_ES_EVENT_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ pos++; // Consume the designator
+ TAO_EC_QOS_Info qos_info;
+ return new TAO_EC_Timeout_Filter (this->event_channel_,
+ supplier,
+ qos_info,
+ e.header.type,
+ e.header.creation_time);
+ }
+ pos++; // Consume the event
+ return new TAO_EC_Type_Filter (e.header);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL