355 lines
16 KiB
C++
355 lines
16 KiB
C++
#ifndef OMG_TDDS_PUB_ANY_DATA_WRITER_HPP_
|
||
#define OMG_TDDS_PUB_ANY_DATA_WRITER_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 <dds/core/TEntity.hpp>
|
||
#include <dds/pub/Publisher.hpp>
|
||
#include <dds/pub/qos/DataWriterQos.hpp>
|
||
#include <dds/topic/TopicDescription.hpp>
|
||
|
||
namespace dds
|
||
{
|
||
namespace pub
|
||
{
|
||
template <typename DELEGATE>
|
||
class TAnyDataWriter;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief
|
||
* Typeless base class for the typed DataWriter.
|
||
*
|
||
* DataWriters are created type specific (fi DataWriter<Foo::Bar> writer). However, there
|
||
* are many places in the API (and possibly application) where the type can not be known
|
||
* while still some DataWriter has to be passed around, stored or even typeless functionality
|
||
* called.<br>
|
||
* Main examples in the API that need typeless DataWriter are: Publisher, PublisherListener
|
||
* and DomainParticipantListener.
|
||
*
|
||
*/
|
||
template <typename DELEGATE>
|
||
class dds::pub::TAnyDataWriter : public dds::core::TEntity<DELEGATE>
|
||
{
|
||
public:
|
||
OMG_DDS_REF_TYPE_PROTECTED_DC(TAnyDataWriter, dds::core::TEntity, DELEGATE)
|
||
OMG_DDS_IMPLICIT_REF_BASE(TAnyDataWriter)
|
||
OMG_DDS_COMPLETE_RULE_OF_FIVE_VIRTUAL_DEFAULT(TAnyDataWriter)
|
||
|
||
//==========================================================================
|
||
//== Entity Navigation
|
||
|
||
/**
|
||
* Get the Publisher that owns this DataWriter.
|
||
*
|
||
* @return the Publisher
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
*/
|
||
const dds::pub::Publisher& publisher() const;
|
||
|
||
/**
|
||
* Get the TopicDescription associated with this DataWriter.
|
||
*
|
||
* @return the TopicDescription
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
*/
|
||
const dds::topic::TopicDescription& topic_description() const;
|
||
|
||
|
||
|
||
//==========================================================================
|
||
//== QoS Management
|
||
|
||
/**
|
||
* Gets the DataWriterQos setting for this instance.
|
||
*
|
||
* @return the qos
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
*/
|
||
dds::pub::qos::DataWriterQos
|
||
qos() const;
|
||
|
||
/**
|
||
* This operation replaces the existing set of QosPolicy settings for a DataWriter.
|
||
*
|
||
* The parameter qos contains the object with the QosPolicy settings which is
|
||
* checked for self-consistency and mutability.
|
||
*
|
||
* When the application tries to change a
|
||
* QosPolicy setting for an enabled DataWriter, which can only be set before the
|
||
* DataWriter is enabled, the operation will fail and a
|
||
* ImmutablePolicyError is thrown. In other words, the application must
|
||
* provide the presently set QosPolicy settings in case of the immutable QosPolicy
|
||
* settings. Only the mutable QosPolicy settings can be changed.
|
||
*
|
||
* When the qos contains conflicting QosPolicy settings (not self-consistent),
|
||
* the operation will fail and an InconsistentPolicyError is thrown.
|
||
*
|
||
* @param qos the qos
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
* @throws dds::core::ImmutablePolicyError
|
||
* The parameter qos contains an immutable QosPolicy setting with a
|
||
* different value than set during enabling of the DataWriter.
|
||
* @throws dds::core::InconsistentPolicyError
|
||
* The parameter qos contains conflicting QosPolicy settings,
|
||
*/
|
||
void qos(const dds::pub::qos::DataWriterQos& qos);
|
||
|
||
/** @copydoc dds::pub::TAnyDataWriter::qos(const dds::pub::qos::DataWriterQos& qos) */
|
||
TAnyDataWriter& operator << (const dds::pub::qos::DataWriterQos& qos);
|
||
|
||
/** @copydoc dds::pub::TAnyDataWriter::qos() */
|
||
const TAnyDataWriter& operator >> (dds::pub::qos::DataWriterQos& qos) const;
|
||
|
||
|
||
//==========================================================================
|
||
//== ACKs
|
||
|
||
/**
|
||
* This operation blocks the calling thread until either all data written
|
||
* by the DataWriter is acknowledged by the local infrastructure, or until
|
||
* the duration specified by the timeout parameter elapses,
|
||
* whichever happens first.
|
||
*
|
||
* Data is acknowledged by the local infrastructure when it does not need to be stored
|
||
* in its DataWriter’s local history. When a locally-connected subscription (including
|
||
* the networking service) has no more resources to store incoming samples it will start
|
||
* to reject these samples, resulting in their source DataWriters to store them
|
||
* temporarily in their own local history to be retransmitted at a later moment in time.<br>
|
||
* In such scenarios, the wait_for_acknowledgments operation will block until the
|
||
* DataWriter has retransmitted its entire history, which is therefore effectively
|
||
* empty, or until the timeout expires, whichever happens first. In the latter
|
||
* case, this operation will throw a TimeoutError.
|
||
*
|
||
* <i>
|
||
* Be aware that in case the operation returns normally, the data has only been
|
||
* acknowledged by the local infrastructure: it does not mean all remote subscriptions
|
||
* have already received the data. However, delivering the data to remote nodes is then
|
||
* the sole responsibility of the networking service: even when the publishing
|
||
* application would terminate, all data that has not yet been received may be
|
||
* considered ‘on-route’ and will therefore eventually arrive (unless the networking
|
||
* service itself will crash). In contrast, if a DataWriter would still have data in it’s
|
||
* local history buffer when it terminates, this data is considered ‘lost’.
|
||
* </i>
|
||
*
|
||
* This operation is intended to be used only if one or more of the contained
|
||
* DataWriters has its ReliabilityQosPolicyKind set to RELIABLE.
|
||
* Otherwise the operation will return immediately, since best-effort DataWriters will
|
||
* never store rejected samples in their local history:
|
||
* they will just drop them and continue business as usual.
|
||
*
|
||
* @param timeout the time out duration
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::TimeoutError
|
||
* Not all data is acknowledged before timeout elapsed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
*/
|
||
void wait_for_acknowledgments(const dds::core::Duration& timeout);
|
||
|
||
//==========================================================================
|
||
//== Status Management
|
||
|
||
/**
|
||
* This operation obtains the LivelinessLostStatus object of the DataWriter.
|
||
*
|
||
* The LivelinessLostStatus contains the information whether the liveliness (that the
|
||
* DataWriter has committed through its Liveliness QosPolicy) was respected.
|
||
* This means that the status represents whether the DataWriter failed to actively
|
||
* signal its liveliness within the offered liveliness period. If the liveliness is lost, the
|
||
* DataReader objects will consider the DataWriter as no longer “alive”.
|
||
*
|
||
* The LivelinessLostStatus can also be monitored using a
|
||
* DataWriterListener or by using the associated StatusCondition.
|
||
*
|
||
* @return the LivelinessLostStatus
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
*/
|
||
const dds::core::status::LivelinessLostStatus liveliness_lost_status();
|
||
|
||
/**
|
||
* This operation obtains the OfferedDeadlineMissedStatus object of the DataWriter.
|
||
*
|
||
* The OfferedDeadlineMissedStatus contains the information whether the deadline (that the
|
||
* DataWriter has committed through its Deadline QosPolicy) was respected for
|
||
* each instance.
|
||
*
|
||
* The OfferedDeadlineMissedStatus can also be monitored using a
|
||
* DataWriterListener or by using the associated StatusCondition.
|
||
*
|
||
* @return the OfferedDeadlineMissedStatus
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
*/
|
||
const dds::core::status::OfferedDeadlineMissedStatus offered_deadline_missed_status();
|
||
|
||
/**
|
||
* This operation obtains the OfferedIncompatibleQosStatus object of the DataWriter.
|
||
*
|
||
* The OfferedIncompatibleQosStatus contains the information whether a QosPolicy setting
|
||
* was incompatible with the requested QosPolicy setting.
|
||
*
|
||
* This means that the status represents whether a DataReader object has been
|
||
* discovered by the DataWriter with the same Topic and a requested
|
||
* DataReaderQos that was incompatible with the one offered by the DataWriter.
|
||
*
|
||
* The OfferedIncompatibleQosStatus can also be monitored using a
|
||
* DataWriterListener or by using the associated StatusCondition.
|
||
*
|
||
* @return the OfferedIncompatibleQosStatus
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
*/
|
||
const dds::core::status::OfferedIncompatibleQosStatus offered_incompatible_qos_status();
|
||
|
||
/**
|
||
* This operation obtains the PublicationMatchedStatus object of the DataWriter.
|
||
*
|
||
* The PublicationMatchedStatus contains the information whether a new match has been
|
||
* discovered for the current publication, or whether an existing match has ceased to
|
||
* exist.
|
||
*
|
||
* This means that the status represents that either a DataReader object has been
|
||
* discovered by the DataWriter with the same Topic and a compatible Qos, or that a
|
||
* previously discovered DataReader has ceased to be matched to the current
|
||
* DataWriter. A DataReader may cease to match when it gets deleted, when it
|
||
* changes its Qos to a value that is incompatible with the current DataWriter or
|
||
* when either the DataWriter or the DataReader has chosen to put its matching
|
||
* counterpart on its ignore-list using the dds::sub::ignore or
|
||
* dds::pub::ignore operations.
|
||
*
|
||
* The operation may fail if the infrastructure does not hold the information necessary
|
||
* to fill in the PublicationMatchedStatus. This is the case when OpenSplice is
|
||
* configured not to maintain discovery information in the Networking Service. (See
|
||
* the description for the NetworkingService/Discovery/enabled property in
|
||
* the Deployment Manual for more information about this subject.) In this case the
|
||
* operation will throw UnsupportedError.
|
||
*
|
||
* The PublicationMatchedStatus can also be monitored using a
|
||
* DataWriterListener or by using the associated StatusCondition.
|
||
*
|
||
* @return the PublicationMatchedStatus
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::UnsupportedError
|
||
* OpenSplice is configured not to maintain the information
|
||
* about “associated” subscriptions.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
*/
|
||
const dds::core::status::PublicationMatchedStatus publication_matched_status();
|
||
|
||
|
||
//==========================================================================
|
||
//== Liveliness Management
|
||
|
||
/**
|
||
* This operation asserts the liveliness for the DataWriter.
|
||
*
|
||
* This operation will manually assert the liveliness for the DataWriter. This way,
|
||
* the Data Distribution Service is informed that the corresponding DataWriter is
|
||
* still alive. This operation is used in combination with the Liveliness QosPolicy
|
||
* set to Liveliness::ManualByParticipant or Liveliness::ManualByTopic.
|
||
*
|
||
* Writing data via the write operation of a DataWriter will assert the liveliness on
|
||
* the DataWriter itself and its containing DomainParticipant. Therefore,
|
||
* assert_liveliness is only needed when not writing regularly.
|
||
*
|
||
* The liveliness should be asserted by the application, depending on the
|
||
* LivelinessQosPolicy. Asserting the liveliness for this DataWriter can also
|
||
* be achieved by asserting the liveliness to the DomainParticipant.
|
||
*
|
||
* @throws dds::core::Error
|
||
* An internal error has occurred.
|
||
* @throws dds::core::NullReferenceError
|
||
* The entity was not properly created and references to dds::core::null.
|
||
* @throws dds::core::AlreadyClosedError
|
||
* The entity has already been closed.
|
||
* @throws dds::core::OutOfResourcesError
|
||
* The Data Distribution Service ran out of resources to
|
||
* complete this operation.
|
||
* @throws dds::core::NotEnabledError
|
||
* The entity has not yet been enabled.
|
||
*/
|
||
void assert_liveliness();
|
||
|
||
};
|
||
|
||
|
||
#endif /* OMG_TDDS_PUB_ANY_DATA_WRITER_HPP_ */
|