00001
00002
00003 #include "orbsvcs/Notify/FilterAdmin.h"
00004
00005 #if ! defined (__ACE_INLINE__)
00006 #include "orbsvcs/Notify/FilterAdmin.inl"
00007 #endif
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
00018 TAO_Notify_FilterAdmin::TAO_Notify_FilterAdmin (void)
00019 {
00020 }
00021
00022
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
00079 size_t len = this->filter_list_.current_size ();
00080
00081 CosNotifyFilter::FilterIDSeq* list_ptr = 0;
00082
00083
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