FilterAdmin.cpp

Go to the documentation of this file.
00001 /* -*- C++ -*- $Id: FilterAdmin.cpp 77406 2007-02-26 23:37:11Z ossama $ */
00002 
00003 #include "orbsvcs/Notify/FilterAdmin.h"
00004 
00005 #if ! defined (__ACE_INLINE__)
00006 #include "orbsvcs/Notify/FilterAdmin.inl"
00007 #endif /* __ACE_INLINE__ */
00008 
00009 ACE_RCSID(Notify, FilterAdmin, "$Id: FilterAdmin.cpp 77406 2007-02-26 23:37:11Z ossama $")
00010 
00011 #include "orbsvcs/Notify/Topology_Saver.h"
00012 #include "orbsvcs/Notify/Properties.h"
00013 #include "ace/Bound_Ptr.h"
00014 
00015 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00016 
00017 // Implementation skeleton constructor
00018 TAO_Notify_FilterAdmin::TAO_Notify_FilterAdmin (void)
00019 {
00020 }
00021 
00022 // Implementation skeleton destructor
00023 TAO_Notify_FilterAdmin::~TAO_Notify_FilterAdmin (void)
00024 {
00025 }
00026 
00027 CosNotifyFilter::FilterID
00028 TAO_Notify_FilterAdmin::add_filter (CosNotifyFilter::Filter_ptr new_filter)
00029 {
00030   if (CORBA::is_nil (new_filter))
00031     throw CORBA::BAD_PARAM ();
00032 
00033   ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00034                       CORBA::INTERNAL ());
00035 
00036   CosNotifyFilter::FilterID new_id = this->filter_ids_.id ();
00037 
00038   CosNotifyFilter::Filter_var new_filter_var =
00039     CosNotifyFilter::Filter::_duplicate (new_filter);
00040 
00041   if (this->filter_list_.bind (new_id, new_filter_var) == -1)
00042       throw CORBA::INTERNAL ();
00043   else
00044     return new_id;
00045 }
00046 
00047 void
00048 TAO_Notify_FilterAdmin::remove_filter (CosNotifyFilter::FilterID filter_id)
00049 {
00050   ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00051                       CORBA::INTERNAL ());
00052 
00053   if (this->filter_list_.unbind (filter_id) == -1)
00054     throw CosNotifyFilter::FilterNotFound ();
00055 }
00056 
00057 CosNotifyFilter::Filter_ptr
00058 TAO_Notify_FilterAdmin::get_filter (CosNotifyFilter::FilterID filter_id)
00059 {
00060   ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00061                       CORBA::INTERNAL ());
00062 
00063   CosNotifyFilter::Filter_var filter_var;
00064 
00065   if (this->filter_list_.find (filter_id,
00066                                filter_var) == -1)
00067     throw CosNotifyFilter::FilterNotFound ();
00068 
00069   return filter_var._retn ();
00070 }
00071 
00072 CosNotifyFilter::FilterIDSeq*
00073 TAO_Notify_FilterAdmin::get_all_filters (void)
00074 {
00075   ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00076                       CORBA::INTERNAL ());
00077 
00078   // Figure out the length of the list.
00079   size_t len = this->filter_list_.current_size ();
00080 
00081   CosNotifyFilter::FilterIDSeq* list_ptr = 0;
00082 
00083   // Allocate the list of <len> length.
00084   ACE_NEW_THROW_EX (list_ptr,
00085                     CosNotifyFilter::FilterIDSeq,
00086                     CORBA::NO_MEMORY ());
00087 
00088   CosNotifyFilter::FilterIDSeq_var list (list_ptr);
00089 
00090   list->length (static_cast<CORBA::ULong> (len));
00091 
00092   FILTER_LIST::ITERATOR iter (this->filter_list_);
00093   FILTER_LIST::ENTRY *entry;
00094 
00095   u_int index;
00096 
00097   for (index = 0; iter.next (entry) != 0; iter.advance (), ++index)
00098     {
00099       list[index] = entry->ext_id_;
00100     }
00101 
00102   return list._retn ();
00103 }
00104 
00105 void
00106 TAO_Notify_FilterAdmin::remove_all_filters (void)
00107 {
00108   ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00109                       CORBA::INTERNAL ());
00110 
00111   this->filter_list_.unbind_all ();
00112 }
00113 
00114 void
00115 TAO_Notify_FilterAdmin::save_persistent (TAO_Notify::Topology_Saver& saver)
00116 {
00117   if (this->filter_list_.current_size() == 0)
00118     return;
00119 
00120   bool changed = true;
00121 
00122   TAO_Notify::NVPList attrs;
00123   bool want_children = saver.begin_object(0, "filter_admin", attrs, changed);
00124   if (want_children)
00125   {
00126     FILTER_LIST::ITERATOR iter (this->filter_list_);
00127     FILTER_LIST::ENTRY* entry;
00128 
00129     TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
00130     CORBA::ORB_var orb = properties->orb();
00131     ACE_ASSERT(! CORBA::is_nil(orb.in()));
00132 
00133     for (; iter.next(entry) != 0; iter.advance())
00134     {
00135       TAO_Notify::NVPList fattrs;
00136       CORBA::Long id = entry->ext_id_;
00137       CORBA::String_var ior = orb->object_to_string(entry->int_id_.in());
00138       fattrs.push_back(TAO_Notify::NVP("IOR", ior.in()));
00139       saver.begin_object(id, "filter", fattrs, changed);
00140       saver.end_object(id, "filter");
00141     }
00142   }
00143 
00144   saver.end_object(0, "filter_admin");
00145 }
00146 
00147 TAO_Notify::Topology_Object*
00148 TAO_Notify_FilterAdmin::load_child (const ACE_CString &type, CORBA::Long id,
00149   const TAO_Notify::NVPList& attrs)
00150 {
00151   if (type == "filter")
00152   {
00153     TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
00154     CORBA::ORB_var orb = properties->orb();
00155     ACE_ASSERT(! CORBA::is_nil(orb.in()));
00156     ACE_CString ior;
00157 
00158     (void) attrs.load("IOR", ior);
00159     CORBA::Object_var obj = orb->string_to_object(ior.c_str());
00160     CosNotifyFilter::Filter_var filter = CosNotifyFilter::Filter::_unchecked_narrow(obj.in());
00161 
00162     if (! CORBA::is_nil(filter.in()))
00163     {
00164       this->filter_ids_.set_last_used(id);
00165       if (this->filter_list_.bind (id, filter) != 0)
00166         throw CORBA::INTERNAL ();
00167     }
00168   }
00169   return this;
00170 }
00171 
00172 void
00173 TAO_Notify_FilterAdmin::release (void)
00174 {
00175   delete this;
00176 }
00177 
00178 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:45:29 2010 for TAO_CosNotification by  doxygen 1.4.7