#ifndef OMG_DDS_SUB_TCOHERENT_ACCESS_HPP_ #define OMG_DDS_SUB_TCOHERENT_ACCESS_HPP_ // Copyright 2010, Object Management Group, Inc. // Copyright 2010, PrismTech, Corp. // Copyright 2010, Real-Time Innovations, Inc. // All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include namespace dds { namespace sub { template class TCoherentAccess; } } /// @brief /// Class for RAII way of beginning/ending coherent access. /// /// Coherent access indicates that the application is about to access /// the data samples in any of the DataReader objects attached to the /// Subscriber. /// /// The application is required to use this operation /// only if Presentation QosPolicy of the Subscriber to which the /// DataReader belongs has the access_scope set to "GROUP". In the /// aforementioned case, the operation must be called /// prior to calling any of the sample-accessing operations, i.e. /// read and take on DataReader. Otherwise the sample-accessing /// operations will throw a PreconditionNotMetError exception. /// /// Once the application has finished accessing the data samples /// it must end the coherent access. It is not required for the /// application to begin or end access if the Presentation QosPolicy /// has the access_scope set to something other than GROUP. Beginning /// or ending access in this case is not considered an error and has /// no effect. Beginning and ending access may be nested. In that /// case, the application end access as many times as it began /// access. /// /// @code{.cpp} /// dds::domain::DomainParticipant participant(org::eclipse::cyclonedds::domain::default_id()); /// dds::topic::Topic topic(participant, "TopicName"); /// /// dds::sub::qos::SubscriberQos sQos sQos = participant.default_subscriber_qos() /// << dds::core::policy::Presentation::TopicAccessScope(false, true); /// dds::sub::Subscriber subscriber(participant, sQos); /// /// { /// std::vector< dds::sub::DataReader > readers; /// // Start coherent access. /// dds::sub::TCoherentAccess coherentAccess(subscriber); /// // Find (previously created with the subscriber) datareaders that now got data. /// dds::sub::find< dds::sub::DataReader >(subscriber, /// dds::sub::status::DataState::any(), /// back_inserter(readers)); /// // Get data from the readers /// for (size_type i = 0; i < rv.size(); i++) { /// dds::sub::LoanedSamples samples = readers[i].read() /// dds::sub::LoanedSamples::const_iterator it; /// for (it = samples.begin(); it != samples.end(); iterator++) { /// const dds::sub::Sample& sample = *it; /// const Foo::Bar& data = sample.data(); /// const dds::sub::SampleInfo& info = sample.info(); /// // Use sample data and meta information. /// } /// } /// } /// // CoherentAccess went out of scope: it is ended implicitly /// @endcode /// /// @see for more information: @ref DCPS_Modules_Subscription "Subscription" /// @see dds::sub::Subscriber template class dds::sub::TCoherentAccess : public dds::core::Value { public: /** * Creating a CoherentAccess object, which will begin ‘coherent access’ of * received samples using DataReader objects attached to this Subscriber. * * @param sub The Subscriber to begin the coherent access on. * @throws dds::core::Error * An internal error has occurred. * @throws dds::core::AlreadyClosedError * The Subscriber has already been closed. * @throws dds::core::NotEnabledError * The Subscriber has not yet been enabled. * @throws dds::core::OutOfResourcesError * The Data Distribution Service ran out of resources to * complete this operation. * @throws dds::core::NullReferenceError * The Subscriber was not properly created and references to dds::core::null. */ explicit TCoherentAccess(const dds::sub::Subscriber& sub); public: /** * This operation will explicitly end the coherent access. * * If the Subscriber already ended its coherent access (by a call to this very * operation), then a call to this operation will have no effect. * * @throws dds::core::Error * An internal error has occurred. * @throws dds::core::AlreadyClosedError * The Subscriber has already been closed. * @throws dds::core::NotEnabledError * The Subscriber has not yet been enabled. * @throws dds::core::NullReferenceError * The Subscriber was not properly created and references to dds::core::null. */ void end(); public: /** * The destruction of the CoherentAccess will implicitly end the coherent * access if not already ended by a call to end(). * * When there is a problem with which end() would normally throw an exception, * then that exception is swallowed. Errors can be found in the logs. */ ~TCoherentAccess(); private: TCoherentAccess(const TCoherentAccess&); TCoherentAccess& operator=(const TCoherentAccess&); }; #endif /* OMG_TDDS_SUB_TCOHERENT_ACCESS_HPP_ */