diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp index d6b64275843..2ed14807e59 100644 --- a/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp +++ b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp @@ -8,6 +8,8 @@ ACE_RCSID(Notify, FilterAdmin, "$Id$") +#include "Topology_Saver.h" +#include "Properties.h" #include "ace/Refcounted_Auto_Ptr.h" // Implementation skeleton constructor @@ -102,7 +104,7 @@ TAO_Notify_FilterAdmin::get_all_filters (ACE_ENV_SINGLE_ARG_DECL) CosNotifyFilter::FilterIDSeq_var list (list_ptr); - list->length (ACE_static_cast (CORBA::ULong, len)); + list->length (static_cast<CORBA::ULong> (len)); FILTER_LIST::ITERATOR iter (this->filter_list_); FILTER_LIST::ENTRY *entry; @@ -128,6 +130,76 @@ TAO_Notify_FilterAdmin::remove_all_filters (ACE_ENV_SINGLE_ARG_DECL) this->filter_list_.unbind_all (); } +void +TAO_Notify_FilterAdmin::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL) +{ + if (this->filter_list_.current_size() == 0) + return; + + bool changed = true; + + TAO_Notify::NVPList attrs; + bool want_children = saver.begin_object(0, "filter_admin", attrs, changed ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + if (want_children) + { + FILTER_LIST::ITERATOR iter (this->filter_list_); + FILTER_LIST::ENTRY* entry; + + TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance(); + CORBA::ORB_var orb = properties->orb(); + ACE_ASSERT(! CORBA::is_nil(orb.in())); + + for (; iter.next(entry) != 0; iter.advance()) + { + TAO_Notify::NVPList fattrs; + CORBA::Long id = entry->ext_id_; + CORBA::String_var ior = orb->object_to_string(entry->int_id_.in() ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + fattrs.push_back(TAO_Notify::NVP("IOR", ior.in())); + saver.begin_object(id, "filter", fattrs, changed ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + saver.end_object(id, "filter" ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } + } + + saver.end_object(0, "filter_admin" ACE_ENV_ARG_PARAMETER); +} + +TAO_Notify::Topology_Object* +TAO_Notify_FilterAdmin::load_child (const ACE_CString &type, CORBA::Long id, + const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL) +{ + if (type == "filter") + { + TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance(); + CORBA::ORB_var orb = properties->orb(); + ACE_ASSERT(! CORBA::is_nil(orb.in())); + ACE_CString ior; + attrs.load("IOR", ior); + + CORBA::Object_var obj = orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(0); + CosNotifyFilter::Filter_var filter = CosNotifyFilter::Filter::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(0); + if (! CORBA::is_nil(filter.in())) + { + this->filter_ids_.set_last_used(id); + if (this->filter_list_.bind (id, filter) != 0) + ACE_THROW_RETURN (CORBA::INTERNAL (), 0); + } + } + return this; +} + +void +TAO_Notify_FilterAdmin::release (void) +{ + delete this; +} + + #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) template class ACE_Hash_Map_Entry<CosNotifyFilter::FilterID,CosNotifyFilter::Filter_var>; template class ACE_Hash_Map_Manager<CosNotifyFilter::FilterID,CosNotifyFilter::Filter_var,ACE_Null_Mutex>; |