summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp
new file mode 100644
index 00000000000..fd447d57433
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp
@@ -0,0 +1,222 @@
+// $Id$
+
+#include "orbsvcs/Notify/Method_Request_Lookup.h"
+
+ACE_RCSID(Notify, TAO_Notify_Method_Request_Lookup, "$Id$")
+
+#include "orbsvcs/Notify/Consumer_Map.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/ProxyConsumer.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/Admin.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+#include "orbsvcs/Notify/Delivery_Request.h"
+#include "orbsvcs/Notify/EventChannelFactory.h"
+#include "orbsvcs/Notify/Event_Manager.h"
+#include "orbsvcs/Notify/Factory.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#include "tao/debug.h"
+#include "tao/CDR.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Method_Request_Lookup::TAO_Notify_Method_Request_Lookup (
+ const TAO_Notify_Event * event,
+ TAO_Notify_ProxyConsumer * proxy)
+ : TAO_Notify_Method_Request_Event (event)
+ , proxy_consumer_ (proxy)
+{
+}
+
+TAO_Notify_Method_Request_Lookup::~TAO_Notify_Method_Request_Lookup ()
+{
+}
+
+void
+TAO_Notify_Method_Request_Lookup::work (
+ TAO_Notify_ProxySupplier* proxy_supplier)
+{
+ if (delivery_request_.get () == 0)
+ {
+ TAO_Notify_Method_Request_Dispatch_No_Copy request (*this, proxy_supplier, true);
+ proxy_supplier->deliver (request);
+ }
+ else
+ {
+ delivery_request_->dispatch (proxy_supplier, true);
+ }
+}
+
+int TAO_Notify_Method_Request_Lookup::execute_i (void)
+{
+ if (this->proxy_consumer_->has_shutdown ())
+ return 0; // If we were shutdown while waiting in the queue, return with no action.
+
+ TAO_Notify_SupplierAdmin& parent = this->proxy_consumer_->supplier_admin ();
+
+ CORBA::Boolean val = this->proxy_consumer_->check_filters (this->event_,
+ parent.filter_admin (),
+ parent.filter_operator ());
+
+ if (TAO_debug_level > 1)
+ ACE_DEBUG ((LM_DEBUG, "Proxyconsumer %x filter eval result = %d",&this->proxy_consumer_ , val));
+
+ // Filter failed - do nothing.
+ if (val == 0)
+ return 0;
+
+ // The map of subscriptions.
+ TAO_Notify_Consumer_Map& map = this->proxy_consumer_->event_manager ().consumer_map ();
+
+ TAO_Notify_Consumer_Map::ENTRY* entry = map.find (this->event_->type ());
+
+ TAO_Notify_ProxySupplier_Collection* consumers = 0;
+
+ if (entry != 0)
+ {
+ consumers = entry->collection ();
+
+ if (consumers != 0)
+ {
+ consumers->for_each (this);
+ }
+
+ map.release (entry);
+ }
+
+ // Get the default consumers
+ consumers = map.broadcast_collection ();
+
+ if (consumers != 0)
+ {
+ consumers->for_each (this);
+ }
+ this->complete ();
+ return 0;
+}
+
+/// Static method used to reconstruct a Method Request Dispatch
+TAO_Notify_Method_Request_Lookup_Queueable *
+TAO_Notify_Method_Request_Lookup::unmarshal (
+ TAO_Notify::Delivery_Request_Ptr & delivery_request,
+ TAO_Notify_EventChannelFactory &ecf,
+ TAO_InputCDR & cdr)
+{
+ bool ok = true;
+ TAO_Notify_Method_Request_Lookup_Queueable * result = 0;
+ CORBA::ULong count;
+ if (cdr.read_ulong (count))
+ {
+ TAO_Notify::IdVec id_path (count);
+ for (size_t nid = 0; ok && nid < count; ++nid)
+ {
+ TAO_Notify_Object::ID id = 0;
+ if ( cdr.read_long (id))
+ {
+ id_path.push_back (id);
+ }
+ else
+ {
+ ok = false;
+ }
+ }
+
+ if (ok)
+ {
+ TAO_Notify_ProxyConsumer * proxy_consumer = ecf.find_proxy_consumer (
+ id_path,
+ 0);
+ if (proxy_consumer != 0)
+ {
+ ACE_NEW_NORETURN (result,
+ TAO_Notify_Method_Request_Lookup_Queueable (delivery_request, proxy_consumer));
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Lookup_No_Copy::unmarshal: unknown proxy id\n")
+ ));
+ }
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Lookup_No_Copy::unmarshal: Cant read proxy id path\n")
+ ));
+ }
+ }
+ return result;
+
+}
+
+
+/****************************************************************/
+
+TAO_Notify_Method_Request_Lookup_Queueable::TAO_Notify_Method_Request_Lookup_Queueable (
+ const TAO_Notify_Event::Ptr& event,
+ TAO_Notify_ProxyConsumer* proxy_consumer)
+ : TAO_Notify_Method_Request_Lookup (event.get (), proxy_consumer)
+ , TAO_Notify_Method_Request_Queueable (event.get ())
+ , event_var_ (event)
+ , proxy_guard_ (proxy_consumer)
+{
+}
+
+TAO_Notify_Method_Request_Lookup_Queueable::TAO_Notify_Method_Request_Lookup_Queueable (
+ TAO_Notify::Delivery_Request_Ptr & request,
+ TAO_Notify_ProxyConsumer * proxy_consumer)
+ : TAO_Notify_Method_Request_Lookup (request->event ().get (), proxy_consumer)
+ , TAO_Notify_Method_Request_Queueable (request->event ().get ())
+ , event_var_ (request->event ())
+ , proxy_guard_ (proxy_consumer)
+{
+}
+
+
+TAO_Notify_Method_Request_Lookup_Queueable::~TAO_Notify_Method_Request_Lookup_Queueable ()
+{
+}
+
+int
+TAO_Notify_Method_Request_Lookup_Queueable::execute (void)
+{
+ return this->execute_i ();
+}
+
+/******************************************************************************************************/
+
+TAO_Notify_Method_Request_Lookup_No_Copy::TAO_Notify_Method_Request_Lookup_No_Copy (
+ const TAO_Notify_Event* event,
+ TAO_Notify_ProxyConsumer* proxy_consumer)
+ : TAO_Notify_Method_Request_Lookup (event, proxy_consumer)
+{
+}
+
+TAO_Notify_Method_Request_Lookup_No_Copy::~TAO_Notify_Method_Request_Lookup_No_Copy ()
+{
+}
+
+int
+TAO_Notify_Method_Request_Lookup_No_Copy::execute (void)
+{
+ return this->execute_i ();
+}
+
+TAO_Notify_Method_Request_Queueable*
+TAO_Notify_Method_Request_Lookup_No_Copy::copy (void)
+{
+ TAO_Notify_Method_Request_Queueable* request;
+
+ TAO_Notify_Event::Ptr event(this->event_->queueable_copy());
+
+ ACE_NEW_THROW_EX (request,
+ TAO_Notify_Method_Request_Lookup_Queueable (event, this->proxy_consumer_),
+ CORBA::INTERNAL ());
+
+ return request;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL