#include <MultiTopicDataReaderBase.h>
Inheritance diagram for OpenDDS::DCPS::MultiTopicDataReaderBase:
Definition at line 25 of file MultiTopicDataReaderBase.h.
typedef MultiTopicImpl::SubjectFieldSpec OpenDDS::DCPS::MultiTopicDataReaderBase::SubjectFieldSpec [protected] |
Definition at line 165 of file MultiTopicDataReaderBase.h.
OpenDDS::DCPS::MultiTopicDataReaderBase::MultiTopicDataReaderBase | ( | ) | [inline] |
void OpenDDS::DCPS::MultiTopicDataReaderBase::cleanup | ( | ) |
Definition at line 256 of file MultiTopicDataReaderBase.cpp.
References OpenDDS::DCPS::DataReaderImpl::cleanup(), and resulting_reader_.
00257 { 00258 DDS::Subscriber_var sub = resulting_reader_->get_subscriber(); 00259 for (std::map<OPENDDS_STRING, QueryPlan>::iterator it = query_plans_.begin(); 00260 it != query_plans_.end(); ++it) { 00261 sub->delete_datareader(it->second.data_reader_); 00262 } 00263 DataReaderImpl* dri = dynamic_cast<DataReaderImpl*>(resulting_reader_.in()); 00264 SubscriberImpl* si = dynamic_cast<SubscriberImpl*>(sub.in()); 00265 si->remove_from_datareader_set(dri); 00266 dri->cleanup(); 00267 }
DDS::QueryCondition_ptr OpenDDS::DCPS::MultiTopicDataReaderBase::create_querycondition | ( | DDS::SampleStateMask | sample_states, | |
DDS::ViewStateMask | view_states, | |||
DDS::InstanceStateMask | instance_states, | |||
const char * | query_expression, | |||
const DDS::StringSeq & | query_parameters | |||
) |
Definition at line 298 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00302 { 00303 return resulting_reader_->create_querycondition(sample_states, view_states, 00304 instance_states, query_expression, query_parameters); 00305 }
DDS::ReadCondition_ptr OpenDDS::DCPS::MultiTopicDataReaderBase::create_readcondition | ( | DDS::SampleStateMask | sample_states, | |
DDS::ViewStateMask | view_states, | |||
DDS::InstanceStateMask | instance_states | |||
) |
Definition at line 289 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00292 { 00293 return resulting_reader_->create_readcondition(sample_states, view_states, 00294 instance_states); 00295 }
void OpenDDS::DCPS::MultiTopicDataReaderBase::data_available | ( | DDS::DataReader_ptr | reader | ) |
Definition at line 161 of file MultiTopicDataReaderBase.cpp.
References DDS::ALIVE_INSTANCE_STATE, DDS::ANY_INSTANCE_STATE, DDS::ANY_VIEW_STATE, incoming_sample(), OpenDDS::DCPS::MultiTopicDataReaderBase::QueryPlan::instances_, metaStructFor(), DDS::NOT_READ_SAMPLE_STATE, OPENDDS_STRING, OpenDDS::DCPS::DataReaderImpl::read_generic(), resulting_reader_, DDS::RETCODE_NO_DATA, DDS::RETCODE_OK, OpenDDS::DCPS::DataReaderImpl::set_instance_state(), OpenDDS::DCPS::to_dds_string(), and topicNameFor().
Referenced by OpenDDS::DCPS::MultiTopicDataReaderBase::Listener::on_data_available().
00162 { 00163 using namespace std; 00164 using namespace DDS; 00165 00166 const OPENDDS_STRING topic = topicNameFor(reader); 00167 DataReaderImpl* dri = dynamic_cast<DataReaderImpl*>(reader); 00168 DataReaderImpl::GenericBundle gen; 00169 ReturnCode_t rc = dri->read_generic(gen, NOT_READ_SAMPLE_STATE, 00170 ANY_VIEW_STATE, ANY_INSTANCE_STATE,false); 00171 if (rc == RETCODE_NO_DATA) { 00172 return; 00173 } else if (rc != RETCODE_OK) { 00174 throw runtime_error("Incoming DataReader for " + topic + 00175 " could not be read, error #" + to_dds_string(rc)); 00176 } 00177 00178 const MetaStruct& meta = metaStructFor(reader); 00179 const QueryPlan& qp = query_plans_[topic]; 00180 for (CORBA::ULong i = 0; i < gen.samples_.size(); ++i) { 00181 if (gen.info_[i].valid_data) { 00182 incoming_sample(gen.samples_[i], gen.info_[i], topic.c_str(), meta); 00183 } else if (gen.info_[i].instance_state != ALIVE_INSTANCE_STATE) { 00184 DataReaderImpl* resulting_impl = 00185 dynamic_cast<DataReaderImpl*>(resulting_reader_.in()); 00186 set<pair<InstanceHandle_t, InstanceHandle_t> >::const_iterator 00187 iter = qp.instances_.begin(); 00188 while (iter != qp.instances_.end() && 00189 iter->first != gen.info_[i].instance_handle) ++iter; 00190 for (; iter != qp.instances_.end() && 00191 iter->first == gen.info_[i].instance_handle; ++iter) { 00192 resulting_impl->set_instance_state(iter->second, 00193 gen.info_[i].instance_state); 00194 } 00195 } 00196 } 00197 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::delete_contained_entities | ( | ) |
Definition at line 314 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00315 { 00316 return resulting_reader_->delete_contained_entities(); 00317 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::delete_readcondition | ( | DDS::ReadCondition_ptr | a_condition | ) |
Definition at line 308 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00310 { 00311 return resulting_reader_->delete_readcondition(a_condition); 00312 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::enable | ( | ) |
Definition at line 274 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00275 { 00276 return resulting_reader_->enable(); 00277 }
DDS::InstanceHandle_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_instance_handle | ( | ) |
Definition at line 269 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00270 { 00271 return resulting_reader_->get_instance_handle(); 00272 }
void OpenDDS::DCPS::MultiTopicDataReaderBase::get_latency_stats | ( | LatencyStatisticsSeq & | stats | ) |
Definition at line 409 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00410 { 00411 resulting_reader_->get_latency_stats(stats); 00412 }
DDS::DataReaderListener_ptr OpenDDS::DCPS::MultiTopicDataReaderBase::get_listener | ( | ) |
Definition at line 336 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00337 { 00338 return resulting_reader_->get_listener(); 00339 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_liveliness_changed_status | ( | DDS::LivelinessChangedStatus & | status | ) |
Definition at line 357 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00359 { 00360 return resulting_reader_->get_liveliness_changed_status(status); 00361 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_matched_publication_data | ( | DDS::PublicationBuiltinTopicData & | publication_data, | |
DDS::InstanceHandle_t | publication_handle | |||
) |
Definition at line 400 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00403 { 00404 return resulting_reader_->get_matched_publication_data(publication_data, 00405 publication_handle); 00406 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_matched_publications | ( | DDS::InstanceHandleSeq & | publication_handles | ) |
Definition at line 393 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00395 { 00396 return resulting_reader_->get_matched_publications(publication_handles); 00397 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_qos | ( | DDS::DataReaderQos & | qos | ) |
Definition at line 325 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00326 { 00327 return resulting_reader_->get_qos(qos); 00328 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_requested_deadline_missed_status | ( | DDS::RequestedDeadlineMissedStatus & | status | ) |
Definition at line 363 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00365 { 00366 return resulting_reader_->get_requested_deadline_missed_status(status); 00367 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_requested_incompatible_qos_status | ( | DDS::RequestedIncompatibleQosStatus & | status | ) |
Definition at line 369 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00371 { 00372 return resulting_reader_->get_requested_incompatible_qos_status(status); 00373 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_sample_lost_status | ( | DDS::SampleLostStatus & | status | ) |
Definition at line 381 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00383 { 00384 return resulting_reader_->get_sample_lost_status(status); 00385 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_sample_rejected_status | ( | DDS::SampleRejectedStatus & | status | ) |
Definition at line 351 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00353 { 00354 return resulting_reader_->get_sample_rejected_status(status); 00355 }
DDS::StatusMask OpenDDS::DCPS::MultiTopicDataReaderBase::get_status_changes | ( | ) |
Definition at line 284 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00285 { 00286 return resulting_reader_->get_status_changes(); 00287 }
DDS::StatusCondition_ptr OpenDDS::DCPS::MultiTopicDataReaderBase::get_statuscondition | ( | ) |
Definition at line 279 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00280 { 00281 return resulting_reader_->get_statuscondition(); 00282 }
DDS::Subscriber_ptr OpenDDS::DCPS::MultiTopicDataReaderBase::get_subscriber | ( | ) |
Definition at line 346 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00347 { 00348 return resulting_reader_->get_subscriber(); 00349 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::get_subscription_matched_status | ( | DDS::SubscriptionMatchedStatus & | status | ) |
Definition at line 375 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00377 { 00378 return resulting_reader_->get_subscription_matched_status(status); 00379 }
DDS::TopicDescription_ptr OpenDDS::DCPS::MultiTopicDataReaderBase::get_topicdescription | ( | ) |
Definition at line 341 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00342 { 00343 return resulting_reader_->get_topicdescription(); 00344 }
virtual const MetaStruct& OpenDDS::DCPS::MultiTopicDataReaderBase::getResultingMeta | ( | ) | [private, pure virtual] |
Implemented in OpenDDS::DCPS::MultiTopicDataReader_T< Sample, TypedDataReader >.
Referenced by init().
bool OpenDDS::DCPS::MultiTopicDataReaderBase::have_sample_states | ( | DDS::SampleStateMask | sample_states | ) | const |
Definition at line 249 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00251 { 00252 return dynamic_cast<DataReaderImpl*>(resulting_reader_.in()) 00253 ->have_sample_states(sample_states); 00254 }
virtual void OpenDDS::DCPS::MultiTopicDataReaderBase::incoming_sample | ( | void * | sample, | |
const DDS::SampleInfo & | info, | |||
const char * | topic, | |||
const MetaStruct & | meta | |||
) | [private, pure virtual] |
Implemented in OpenDDS::DCPS::MultiTopicDataReader_T< Sample, TypedDataReader >.
Referenced by data_available().
void OpenDDS::DCPS::MultiTopicDataReaderBase::init | ( | const DDS::DataReaderQos & | dr_qos, | |
DDS::DataReaderListener_ptr | a_listener, | |||
DDS::StatusMask | mask, | |||
SubscriberImpl * | parent, | |||
MultiTopicImpl * | multitopic | |||
) |
Definition at line 33 of file MultiTopicDataReaderBase.cpp.
References OpenDDS::DCPS::MultiTopicDataReaderBase::QueryPlan::adjacent_joins_, OpenDDS::DCPS::ALL_STATUS_MASK, OpenDDS::DCPS::SubscriberImpl::create_datareader(), OpenDDS::DCPS::MultiTopicDataReaderBase::QueryPlan::data_reader_, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::MultiTopicImpl::get_aggregation(), OpenDDS::DCPS::SubscriberImpl::get_participant(), OpenDDS::DCPS::MultiTopicImpl::get_selection(), OpenDDS::DCPS::TopicDescriptionImpl::get_type_support(), OpenDDS::DCPS::MetaStruct::getFieldNames(), getResultingMeta(), OpenDDS::DCPS::DataReaderImpl::init(), init_typed(), OpenDDS::DCPS::MultiTopicDataReaderBase::QueryPlan::keys_projected_out_, listener_, metaStructFor(), OPENDDS_STRING, OpenDDS::DCPS::MultiTopicDataReaderBase::QueryPlan::projection_, OpenDDS::DCPS::SubscriberImpl::raw_latency_buffer_size(), OpenDDS::DCPS::DataReaderImpl::raw_latency_buffer_size(), OpenDDS::DCPS::SubscriberImpl::raw_latency_buffer_type(), OpenDDS::DCPS::DataReaderImpl::raw_latency_buffer_type(), and resulting_reader_.
Referenced by OpenDDS::DCPS::SubscriberImpl::create_datareader().
00036 { 00037 using namespace std; 00038 DDS::DataReader_var dr = multitopic->get_type_support()->create_datareader(); 00039 resulting_reader_ = DataReaderEx::_narrow(dr); 00040 DataReaderImpl* resulting_impl = 00041 dynamic_cast<DataReaderImpl*>(resulting_reader_.in()); 00042 00043 resulting_impl->raw_latency_buffer_size() = parent->raw_latency_buffer_size(); 00044 resulting_impl->raw_latency_buffer_type() = parent->raw_latency_buffer_type(); 00045 00046 DDS::DomainParticipant_var participant = parent->get_participant(); 00047 resulting_impl->init(multitopic, dr_qos, a_listener, mask, 00048 dynamic_cast<DomainParticipantImpl*>(participant.in()), parent, 00049 resulting_reader_); 00050 00051 init_typed(resulting_reader_); 00052 listener_ = new Listener(this); 00053 00054 std::map<OPENDDS_STRING, OPENDDS_STRING> fieldToTopic; 00055 00056 // key: name of field that's a key for the 'join' 00057 // mapped: set of topicNames that have this key in common 00058 std::map<OPENDDS_STRING, set<OPENDDS_STRING> > joinKeys; 00059 00060 const vector<OPENDDS_STRING>& selection = multitopic->get_selection(); 00061 for (size_t i = 0; i < selection.size(); ++i) { 00062 00063 const DDS::Duration_t no_wait = {0, 0}; 00064 DDS::Topic_var t = participant->find_topic(selection[i].c_str(), no_wait); 00065 if (!t.in()) { 00066 throw runtime_error("Topic: " + selection[i] + " not found."); 00067 } 00068 00069 DDS::DataReader_var incoming = 00070 parent->create_datareader(t, dr_qos, listener_, ALL_STATUS_MASK); 00071 if (!incoming.in()) { 00072 throw runtime_error("Could not create incoming DataReader " 00073 + selection[i]); 00074 } 00075 00076 QueryPlan& qp = query_plans_[selection[i]]; 00077 qp.data_reader_ = incoming; 00078 const MetaStruct& meta = metaStructFor(incoming); 00079 00080 for (const char** names = meta.getFieldNames(); *names; ++names) { 00081 if (fieldToTopic.count(*names)) { // already seen this field name 00082 set<OPENDDS_STRING>& topics = joinKeys[*names]; 00083 topics.insert(fieldToTopic[*names]); 00084 topics.insert(selection[i]); 00085 } else { 00086 fieldToTopic[*names] = selection[i]; 00087 } 00088 } 00089 } 00090 00091 const vector<SubjectFieldSpec>& aggregation = multitopic->get_aggregation(); 00092 if (aggregation.size() == 0) { // "SELECT * FROM ..." 00093 const MetaStruct& meta = getResultingMeta(); 00094 for (const char** names = meta.getFieldNames(); *names; ++names) { 00095 std::map<OPENDDS_STRING, OPENDDS_STRING>::const_iterator found = 00096 fieldToTopic.find(*names); 00097 if (found == fieldToTopic.end()) { 00098 if (DCPS_debug_level > 1) { 00099 ACE_DEBUG((LM_WARNING, 00100 ACE_TEXT("(%P|%t) WARNING: ") 00101 ACE_TEXT("MultiTopicDataReaderBase::init(), in SELECT * ") 00102 ACE_TEXT("resulting field %C has no corresponding ") 00103 ACE_TEXT("incoming field.\n"), *names)); 00104 } 00105 } else { 00106 query_plans_[found->second].projection_.push_back( 00107 SubjectFieldSpec(*names)); 00108 } 00109 } 00110 } else { // "SELECT A, B FROM ..." 00111 for (size_t i = 0; i < aggregation.size(); ++i) { 00112 std::map<OPENDDS_STRING, OPENDDS_STRING>::const_iterator found = 00113 fieldToTopic.find(aggregation[i].incoming_name_); 00114 if (found == fieldToTopic.end()) { 00115 throw std::runtime_error("Projected field " + 00116 aggregation[i].incoming_name_ + " has no incoming field."); 00117 } else { 00118 query_plans_[found->second].projection_.push_back(aggregation[i]); 00119 } 00120 } 00121 } 00122 00123 typedef std::map<OPENDDS_STRING, set<OPENDDS_STRING> >::const_iterator iter_t; 00124 for (iter_t iter = joinKeys.begin(); iter != joinKeys.end(); ++iter) { 00125 const OPENDDS_STRING& field = iter->first; 00126 const set<OPENDDS_STRING>& topics = iter->second; 00127 for (set<OPENDDS_STRING>::const_iterator iter2 = topics.begin(); 00128 iter2 != topics.end(); ++iter2) { 00129 const OPENDDS_STRING& topic = *iter2; 00130 QueryPlan& qp = query_plans_[topic]; 00131 if (find_if(qp.projection_.begin(), qp.projection_.end(), 00132 MatchesIncomingName(field)) == qp.projection_.end()) { 00133 qp.keys_projected_out_.push_back(field); 00134 } 00135 for (set<OPENDDS_STRING>::const_iterator iter3 = topics.begin(); 00136 iter3 != topics.end(); ++iter3) { 00137 if (topic != *iter3) { // other topics 00138 qp.adjacent_joins_.insert(pair<const OPENDDS_STRING, OPENDDS_STRING>(*iter3, field)); 00139 } 00140 } 00141 } 00142 } 00143 }
virtual void OpenDDS::DCPS::MultiTopicDataReaderBase::init_typed | ( | DataReaderEx * | dr | ) | [private, pure virtual] |
Implemented in OpenDDS::DCPS::MultiTopicDataReader_T< Sample, TypedDataReader >.
Referenced by init().
const MetaStruct & OpenDDS::DCPS::MultiTopicDataReaderBase::metaStructFor | ( | DDS::DataReader_ptr | dr | ) | [protected] |
Definition at line 153 of file MultiTopicDataReaderBase.cpp.
References OpenDDS::DCPS::TopicDescriptionImpl::get_type_support().
Referenced by data_available(), and init().
00154 { 00155 DDS::TopicDescription_var td = reader->get_topicdescription(); 00156 TopicDescriptionImpl* tdi = dynamic_cast<TopicDescriptionImpl*>(td.in()); 00157 TypeSupportImpl* ts = dynamic_cast<TypeSupportImpl*>(tdi->get_type_support()); 00158 return ts->getMetaStructForType(); 00159 }
OpenDDS::DCPS::MultiTopicDataReaderBase::OPENDDS_MAP | ( | OPENDDS_STRING | , | |
QueryPlan | ||||
) | [protected] |
void OpenDDS::DCPS::MultiTopicDataReaderBase::reset_latency_stats | ( | ) |
Definition at line 414 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00415 { 00416 resulting_reader_->reset_latency_stats(); 00417 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::set_listener | ( | DDS::DataReaderListener_ptr | a_listener, | |
DDS::StatusMask | mask | |||
) |
Definition at line 330 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00332 { 00333 return resulting_reader_->set_listener(a_listener, mask); 00334 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::set_qos | ( | const DDS::DataReaderQos & | qos | ) |
Definition at line 319 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00321 { 00322 return resulting_reader_->set_qos(qos); 00323 }
void OpenDDS::DCPS::MultiTopicDataReaderBase::set_status_changed_flag | ( | DDS::StatusKind | status, | |
bool | flag | |||
) |
Definition at line 242 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00244 { 00245 dynamic_cast<DataReaderImpl*>(resulting_reader_.in()) 00246 ->set_status_changed_flag(status, flag); 00247 }
void OpenDDS::DCPS::MultiTopicDataReaderBase::statistics_enabled | ( | CORBA::Boolean | statistics_enabled | ) |
Definition at line 424 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00426 { 00427 resulting_reader_->statistics_enabled(statistics_enabled); 00428 }
CORBA::Boolean OpenDDS::DCPS::MultiTopicDataReaderBase::statistics_enabled | ( | ) |
Definition at line 419 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00420 { 00421 return resulting_reader_->statistics_enabled(); 00422 }
OPENDDS_STRING OpenDDS::DCPS::MultiTopicDataReaderBase::topicNameFor | ( | DDS::DataReader_ptr | dr | ) | [protected] |
Definition at line 145 of file MultiTopicDataReaderBase.cpp.
Referenced by data_available().
00146 { 00147 DDS::TopicDescription_var td = reader->get_topicdescription(); 00148 CORBA::String_var topic = td->get_name(); 00149 return topic.in(); 00150 }
DDS::ReturnCode_t OpenDDS::DCPS::MultiTopicDataReaderBase::wait_for_historical_data | ( | const DDS::Duration_t & | max_wait | ) |
Definition at line 387 of file MultiTopicDataReaderBase.cpp.
References resulting_reader_.
00389 { 00390 return resulting_reader_->wait_for_historical_data(max_wait); 00391 }
DDS::DataReaderListener_var OpenDDS::DCPS::MultiTopicDataReaderBase::listener_ [private] |
DataReaderEx_var OpenDDS::DCPS::MultiTopicDataReaderBase::resulting_reader_ [private] |
Definition at line 158 of file MultiTopicDataReaderBase.h.
Referenced by cleanup(), create_querycondition(), create_readcondition(), data_available(), delete_contained_entities(), delete_readcondition(), enable(), get_instance_handle(), get_latency_stats(), get_listener(), get_liveliness_changed_status(), get_matched_publication_data(), get_matched_publications(), get_qos(), get_requested_deadline_missed_status(), get_requested_incompatible_qos_status(), get_sample_lost_status(), get_sample_rejected_status(), get_status_changes(), get_statuscondition(), get_subscriber(), get_subscription_matched_status(), get_topicdescription(), have_sample_states(), init(), reset_latency_stats(), set_listener(), set_qos(), set_status_changed_flag(), statistics_enabled(), and wait_for_historical_data().