Go to the documentation of this file.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 84728 2009-03-05 19:58:54Z dai_y $")
00010
00011 #include "orbsvcs/Notify/Topology_Saver.h"
00012 #include "orbsvcs/Notify/Properties.h"
00013 #include "orbsvcs/Notify/EventChannelFactory.h"
00014 #include "orbsvcs/Notify/FilterFactory.h"
00015 #include "ace/Bound_Ptr.h"
00016
00017 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00018
00019
00020 TAO_Notify_FilterAdmin::TAO_Notify_FilterAdmin (void)
00021 {
00022 }
00023
00024
00025
00026 TAO_Notify_FilterAdmin::~TAO_Notify_FilterAdmin (void)
00027 {
00028 }
00029
00030 CosNotifyFilter::FilterID
00031 TAO_Notify_FilterAdmin::add_filter (CosNotifyFilter::Filter_ptr new_filter)
00032 {
00033 if (CORBA::is_nil (new_filter))
00034 throw CORBA::BAD_PARAM ();
00035
00036 ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00037 CORBA::INTERNAL ());
00038
00039 CosNotifyFilter::FilterID new_id = this->filter_ids_.id ();
00040
00041 CosNotifyFilter::Filter_var new_filter_var =
00042 CosNotifyFilter::Filter::_duplicate (new_filter);
00043
00044 if (this->filter_list_.bind (new_id, new_filter_var) == -1)
00045 throw CORBA::INTERNAL ();
00046 else
00047 return new_id;
00048 }
00049
00050 void
00051 TAO_Notify_FilterAdmin::remove_filter (CosNotifyFilter::FilterID filter_id)
00052 {
00053 ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00054 CORBA::INTERNAL ());
00055
00056 if (this->filter_list_.unbind (filter_id) == -1)
00057 throw CosNotifyFilter::FilterNotFound ();
00058 }
00059
00060 CosNotifyFilter::Filter_ptr
00061 TAO_Notify_FilterAdmin::get_filter (CosNotifyFilter::FilterID filter_id)
00062 {
00063 ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00064 CORBA::INTERNAL ());
00065
00066 CosNotifyFilter::Filter_var filter_var;
00067
00068 if (this->filter_list_.find (filter_id,
00069 filter_var) == -1)
00070 throw CosNotifyFilter::FilterNotFound ();
00071
00072 return filter_var._retn ();
00073 }
00074
00075 CosNotifyFilter::FilterIDSeq*
00076 TAO_Notify_FilterAdmin::get_all_filters (void)
00077 {
00078 ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00079 CORBA::INTERNAL ());
00080
00081
00082 size_t len = this->filter_list_.current_size ();
00083
00084 CosNotifyFilter::FilterIDSeq* list_ptr = 0;
00085
00086
00087 ACE_NEW_THROW_EX (list_ptr,
00088 CosNotifyFilter::FilterIDSeq,
00089 CORBA::NO_MEMORY ());
00090
00091 CosNotifyFilter::FilterIDSeq_var list (list_ptr);
00092
00093 list->length (static_cast<CORBA::ULong> (len));
00094
00095 FILTER_LIST::ITERATOR iter (this->filter_list_);
00096 FILTER_LIST::ENTRY *entry;
00097
00098 u_int index;
00099
00100 for (index = 0; iter.next (entry) != 0; iter.advance (), ++index)
00101 {
00102 list[index] = entry->ext_id_;
00103 }
00104
00105 return list._retn ();
00106 }
00107
00108 void
00109 TAO_Notify_FilterAdmin::remove_all_filters (void)
00110 {
00111 ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00112 CORBA::INTERNAL ());
00113
00114 this->filter_list_.unbind_all ();
00115 }
00116
00117 void
00118 TAO_Notify_FilterAdmin::save_persistent (TAO_Notify::Topology_Saver& saver)
00119 {
00120 if (this->filter_list_.current_size() == 0)
00121 return;
00122
00123 bool changed = true;
00124
00125 TAO_Notify::NVPList attrs;
00126 bool want_children = saver.begin_object(0, "filter_admin", attrs, changed);
00127 if (want_children)
00128 {
00129 FILTER_LIST::ITERATOR iter (this->filter_list_);
00130 FILTER_LIST::ENTRY* entry;
00131
00132 TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
00133 CORBA::ORB_var orb = properties->orb();
00134 ACE_ASSERT(! CORBA::is_nil(orb.in()));
00135
00136 for (; iter.next(entry) != 0; iter.advance())
00137 {
00138 TAO_Notify::NVPList fattrs;
00139 CORBA::Long id = entry->ext_id_;
00140
00141
00142
00143
00144 TAO_Notify_FilterFactory* factory = ec_->default_filter_factory_servant ();
00145 TAO_Notify_Object::ID mapid = factory->get_filter_id (entry->int_id_.in ());
00146
00147 fattrs.push_back(TAO_Notify::NVP("MapId", mapid));
00148 saver.begin_object(id, "filter", fattrs, changed);
00149 saver.end_object(id, "filter");
00150 }
00151 }
00152
00153 saver.end_object(0, "filter_admin");
00154 }
00155
00156 TAO_Notify::Topology_Object*
00157 TAO_Notify_FilterAdmin::load_child (const ACE_CString &type, CORBA::Long id,
00158 const TAO_Notify::NVPList& attrs)
00159 {
00160 if (type == "filter")
00161 {
00162 TAO_Notify_Object::ID mapid = 0;
00163 attrs.load("MapId", mapid);
00164
00165 TAO_Notify_FilterFactory* factory = ec_->default_filter_factory_servant ();
00166 CosNotifyFilter::Filter_var filter = factory->get_filter (mapid);
00167
00168 if (! CORBA::is_nil(filter.in()))
00169 {
00170 this->filter_ids_.set_last_used(id);
00171 if (this->filter_list_.bind (id, filter) != 0)
00172 throw CORBA::INTERNAL ();
00173 }
00174 }
00175 return this;
00176 }
00177
00178 void
00179 TAO_Notify_FilterAdmin::release (void)
00180 {
00181 delete this;
00182 }
00183
00184 void
00185 TAO_Notify_FilterAdmin::event_channel (TAO_Notify_EventChannel* ec)
00186 {
00187 this->ec_.reset (ec);
00188 }
00189
00190
00191 TAO_END_VERSIONED_NAMESPACE_DECL