/* * Copyright(c) 2006 to 2021 ZettaScale Technology and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License * v. 1.0 which is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause */ #ifndef DDS_H #define DDS_H /** * @file * @brief Eclipse Cyclone DDS C header * Main header of the Cyclone DDS C library, containing everything you need * for your DDS application. */ /** * @defgroup dds (DDS Functionality) */ /** * @defgroup deprecated (Deprecated functionality) */ #if defined (__cplusplus) #define restrict #endif #include "dds/export.h" #include "dds/features.h" #include "dds/ddsc/dds_basic_types.h" /* Sub components */ #include "dds/ddsrt/time.h" #include "dds/ddsrt/retcode.h" #include "dds/ddsrt/log.h" #include "dds/ddsc/dds_public_impl.h" #include "dds/ddsc/dds_public_alloc.h" #include "dds/ddsc/dds_public_qos.h" #include "dds/ddsc/dds_public_error.h" #include "dds/ddsc/dds_public_status.h" #include "dds/ddsc/dds_public_listener.h" #if defined (__cplusplus) extern "C" { #endif /** * @brief DDS Type Identifier (XTypes) * @ingroup dds * DOC_TODO */ typedef struct ddsi_typeid dds_typeid_t; /** * @brief DDS Type Information (XTypes) * @ingroup dds * DOC_TODO */ typedef struct ddsi_typeinfo dds_typeinfo_t; /** * @brief DDS Type Object (XTypes) * @ingroup dds * DOC_TODO */ typedef struct ddsi_typeobj dds_typeobj_t; /** * @brief Reader History Cache * @ingroup dds * DOC_TODO */ struct dds_rhc; /** * @brief DDSI parameter list * @ingroup dds * DOC_TODO */ struct ddsi_plist; /** * @anchor ddsi_sertype * @brief DDSI sertype * @ingroup dds * DOC_TODO */ struct ddsi_sertype; /** * @anchor ddsi_serdata * @brief DDSI Serdata * @ingroup dds * DOC_TODO */ struct ddsi_serdata; /** * @ingroup deprecated * @warning The DDSI sertopic functionality was moved to ddsi_sertype. * It has been retained as a symbol to ensure binary compatibility. */ struct ddsi_sertopic; /** * @brief DDSI Config * @ingroup dds * DOC_TODO */ struct ddsi_config; /** * @brief Indicates that the library uses ddsi_sertype instead of ddsi_sertopic * @ingroup dds * If sertype is used, the function dds_create_topic_sertype requires a topic name parameter, * as this field is not included in ddsi_sertype. */ #define DDS_HAS_DDSI_SERTYPE 1 /** * @defgroup builtintopic (Builtin Topic Support) * @ingroup dds */ /** * @defgroup builtintopic_constants (Constants) * @ingroup builtintopic * @brief Convenience constants for referring to builtin topics * These constants can be used in place of an actual dds_topic_t, when creating * readers or writers for builtin-topics. */ /** * @def DDS_BUILTIN_TOPIC_DCPSPARTICIPANT * @ingroup builtintopic_constants * Pseudo dds_topic_t for the builtin topic DcpsParticipant. Samples from this topic are * @ref dds_builtintopic_participant structs. */ /** * @def DDS_BUILTIN_TOPIC_DCPSTOPIC * @ingroup builtintopic_constants * Pseudo dds_topic_t for the builtin topic DcpsTopic. Samples from this topic are * @ref dds_builtintopic_topic structs. Note that this only works if you have specified * ENABLE_TOPIC_DISCOVERY in your cmake build. */ /** * @def DDS_BUILTIN_TOPIC_DCPSPUBLICATION * @ingroup builtintopic_constants * Pseudo dds_topic_t for the builtin topic DcpsPublication. Samples from this topic are * @ref dds_builtintopic_endpoint structs. */ /** * @def DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION * @ingroup builtintopic_constants * Pseudo dds_topic_t for the builtin topic DcpsSubscription. Samples from this topic are * @ref dds_builtintopic_endpoint structs. */ #define DDS_BUILTIN_TOPIC_DCPSPARTICIPANT ((dds_entity_t) (DDS_MIN_PSEUDO_HANDLE + 1)) #define DDS_BUILTIN_TOPIC_DCPSTOPIC ((dds_entity_t) (DDS_MIN_PSEUDO_HANDLE + 2)) #define DDS_BUILTIN_TOPIC_DCPSPUBLICATION ((dds_entity_t) (DDS_MIN_PSEUDO_HANDLE + 3)) #define DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION ((dds_entity_t) (DDS_MIN_PSEUDO_HANDLE + 4)) /** * @ingroup DOC_TODO * Special handle representing the entity which forces the dds_data_allocator to allocate on heap */ #define DDS_DATA_ALLOCATOR_ALLOC_ON_HEAP ((dds_entity_t) (DDS_MIN_PSEUDO_HANDLE + 257)) /** * @defgroup entity_status (Entity Status) * @ingroup entity * All entities have a set of "status conditions" * (following the DCPS spec), read peeks, take reads & resets (analogously to read & * take operations on reader). The "mask" allows operating only on a subset of the statuses. * Enabled status analogously to DCPS spec. * @{ */ /** * @brief These identifiers are used to generate the bitshifted identifiers. * By using bitflags instead of these IDs the process of building status masks is * simplified to using simple binary OR operations. * DOC_TODO fix the refs */ typedef enum dds_status_id { DDS_INCONSISTENT_TOPIC_STATUS_ID, /**< See @ref DDS_INCONSISTENT_TOPIC_STATUS */ DDS_OFFERED_DEADLINE_MISSED_STATUS_ID, /**< See @ref DDS_OFFERED_DEADLINE_MISSED_STATUS */ DDS_REQUESTED_DEADLINE_MISSED_STATUS_ID, /**< See @ref DDS_REQUESTED_DEADLINE_MISSED_STATUS */ DDS_OFFERED_INCOMPATIBLE_QOS_STATUS_ID, /**< See @ref DDS_OFFERED_INCOMPATIBLE_QOS_STATUS */ DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS_ID, /**< See @ref DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS */ DDS_SAMPLE_LOST_STATUS_ID, /**< See @ref DDS_SAMPLE_LOST_STATUS */ DDS_SAMPLE_REJECTED_STATUS_ID, /**< See @ref DDS_SAMPLE_REJECTED_STATUS */ DDS_DATA_ON_READERS_STATUS_ID, /**< See @ref DDS_DATA_ON_READERS_STATUS */ DDS_DATA_AVAILABLE_STATUS_ID, /**< See @ref DDS_DATA_AVAILABLE_STATUS */ DDS_LIVELINESS_LOST_STATUS_ID, /**< See @ref DDS_LIVELINESS_LOST_STATUS */ DDS_LIVELINESS_CHANGED_STATUS_ID, /**< See @ref DDS_LIVELINESS_CHANGED_STATUS */ DDS_PUBLICATION_MATCHED_STATUS_ID, /**< See @ref DDS_PUBLICATION_MATCHED_STATUS */ DDS_SUBSCRIPTION_MATCHED_STATUS_ID /**< See @ref DDS_SUBSCRIPTION_MATCHED_STATUS */ } dds_status_id_t; /** Helper value to indicate the highest bit that can be set in a status mask. */ #define DDS_STATUS_ID_MAX (DDS_SUBSCRIPTION_MATCHED_STATUS_ID) /** * @anchor DDS_INCONSISTENT_TOPIC_STATUS * Another topic exists with the same name but with different characteristics. */ #define DDS_INCONSISTENT_TOPIC_STATUS (1u << DDS_INCONSISTENT_TOPIC_STATUS_ID) /** * @anchor DDS_OFFERED_DEADLINE_MISSED_STATUS * The deadline that the writer has committed through its deadline QoS policy was not respected for a specific instance. */ #define DDS_OFFERED_DEADLINE_MISSED_STATUS (1u << DDS_OFFERED_DEADLINE_MISSED_STATUS_ID) /** * @anchor DDS_REQUESTED_DEADLINE_MISSED_STATUS * The deadline that the reader was expecting through its deadline QoS policy was not respected for a specific instance. */ #define DDS_REQUESTED_DEADLINE_MISSED_STATUS (1u << DDS_REQUESTED_DEADLINE_MISSED_STATUS_ID) /** * @anchor DDS_OFFERED_INCOMPATIBLE_QOS_STATUS * A QoS policy setting was incompatible with what was requested. */ #define DDS_OFFERED_INCOMPATIBLE_QOS_STATUS (1u << DDS_OFFERED_INCOMPATIBLE_QOS_STATUS_ID) /** * @anchor DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS * A QoS policy setting was incompatible with what is offered. */ #define DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS (1u << DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS_ID) /** * @anchor DDS_SAMPLE_LOST_STATUS * A sample has been lost (never received). */ #define DDS_SAMPLE_LOST_STATUS (1u << DDS_SAMPLE_LOST_STATUS_ID) /** * @anchor DDS_SAMPLE_REJECTED_STATUS * A (received) sample has been rejected. */ #define DDS_SAMPLE_REJECTED_STATUS (1u << DDS_SAMPLE_REJECTED_STATUS_ID) /** * @anchor DDS_DATA_ON_READERS_STATUS * New information is available in some of the data readers of a subscriber. */ #define DDS_DATA_ON_READERS_STATUS (1u << DDS_DATA_ON_READERS_STATUS_ID) /** * @anchor DDS_DATA_AVAILABLE_STATUS * New information is available in a data reader. */ #define DDS_DATA_AVAILABLE_STATUS (1u << DDS_DATA_AVAILABLE_STATUS_ID) /** * @anchor DDS_LIVELINESS_LOST_STATUS * The liveliness that the DDS_DataWriter has committed through its liveliness QoS policy was not respected; thus readers will consider the writer as no longer "alive". */ #define DDS_LIVELINESS_LOST_STATUS (1u << DDS_LIVELINESS_LOST_STATUS_ID) /** * @anchor DDS_LIVELINESS_CHANGED_STATUS * The liveliness of one or more writers, that were writing instances read through the readers has changed. Some writers have become "alive" or "not alive". */ #define DDS_LIVELINESS_CHANGED_STATUS (1u << DDS_LIVELINESS_CHANGED_STATUS_ID) /** * @anchor DDS_PUBLICATION_MATCHED_STATUS * The writer has found a reader that matches the topic and has a compatible QoS. */ #define DDS_PUBLICATION_MATCHED_STATUS (1u << DDS_PUBLICATION_MATCHED_STATUS_ID) /** * @anchor DDS_SUBSCRIPTION_MATCHED_STATUS * The reader has found a writer that matches the topic and has a compatible QoS. */ #define DDS_SUBSCRIPTION_MATCHED_STATUS (1u << DDS_SUBSCRIPTION_MATCHED_STATUS_ID) /** @}*/ // end group entity_status /** * @defgroup subscription (Subscription) * @ingroup dds * DOC_TODO This contains the definitions regarding subscribing to data. */ /** * @defgroup subdata (Data access) * @ingroup subscription * Every sample you read from DDS comes with some metadata, which you can inspect and filter on. * @{ */ /** Read state for a data value */ typedef enum dds_sample_state { DDS_SST_READ = DDS_READ_SAMPLE_STATE, /**0 * A valid publisher handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_entity_t dds_get_publisher(dds_entity_t writer); /** * @brief Get entity subscriber. * @ingroup entity * * This operation returns the subscriber to which the given entity belongs. * For instance, it will return the Subscriber that was used when * creating a DataReader (when that DataReader was provided here). * * @param[in] entity Entity from which to get its subscriber. * * @returns A valid subscriber handle or an error code. * * @retval >0 * A valid subscriber handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * DOC_TODO: Link to generic dds entity relations documentation. */ DDS_EXPORT dds_entity_t dds_get_subscriber(dds_entity_t entity); /** * @brief Get entity datareader. * @ingroup entity * * This operation returns the datareader to which the given entity belongs. * For instance, it will return the DataReader that was used when * creating a ReadCondition (when that ReadCondition was provided here). * * @param[in] entity Entity from which to get its datareader. * * @returns A valid reader handle or an error code. * * @retval >0 * A valid reader handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * DOC_TODO: Link to generic dds entity relations documentation. */ DDS_EXPORT dds_entity_t dds_get_datareader(dds_entity_t entity); /** * @defgroup condition (Conditions) * @ingroup dds * @brief Conditions allow you to express conditional interest in samples, * to be used in read/take operations or attach to Waitsets. */ /** * @brief Get the mask of a condition. * @ingroup condition * * This operation returns the mask that was used to create the given * condition. * * @param[in] condition Read or Query condition that has a mask. * @param[out] mask Where to store the mask of the condition. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success (given mask is set). * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The mask arg is NULL. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_get_mask(dds_entity_t condition, uint32_t *mask); /** * @brief Returns the instance handle that represents the entity. * @ingroup entity * * @param[in] entity Entity of which to get the instance handle. * @param[out] ihdl Pointer to dds_instance_handle_t. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * DOC_TODO: Check list of return codes is complete. * */ DDS_EXPORT dds_return_t dds_get_instance_handle(dds_entity_t entity, dds_instance_handle_t *ihdl); /** * @brief Returns the GUID that represents the entity in the network, * and therefore only supports participants, readers and writers. * @ingroup entity * * @param[in] entity Entity of which to get the instance handle. * @param[out] guid Where to store the GUID. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * * DOC_TODO: Check list of return codes is complete. */ DDS_EXPORT dds_return_t dds_get_guid (dds_entity_t entity, dds_guid_t *guid); /** * @brief Read the status set for the entity * @ingroup entity_status * * This operation reads the status(es) set for the entity based on * the enabled status and mask set. It does not clear the read status(es). * * @param[in] entity Entity on which the status has to be read. * @param[out] status Returns the status set on the entity, based on the enabled status. * @param[in] mask Filter the status condition to be read, 0 means all statuses * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter, status is a null pointer or * mask has bits set outside the status range. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object or mask has status * bits set that are undefined for the type of entity. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read_status(dds_entity_t entity, uint32_t *status, uint32_t mask); /** * @brief Read the status set for the entity * @ingroup entity_status * * This operation reads the status(es) set for the entity based on the enabled * status and mask set. It clears the status set after reading. * * @param[in] entity Entity on which the status has to be read. * @param[out] status Returns the status set on the entity, based on the enabled status. * @param[in] mask Filter the status condition to be read, 0 means all statuses * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter, status is a null pointer or * mask has bits set outside the status range. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object or mask has status * bits set that are undefined for the type of entity. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take_status(dds_entity_t entity, uint32_t *status, uint32_t mask); /** * @brief Get changed status(es) * @ingroup entity_status * * This operation returns the status changes since they were last read. * * @param[in] entity Entity on which the statuses are read. * @param[out] status Returns the current set of triggered statuses. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_get_status_changes(dds_entity_t entity, uint32_t *status); /** * @anchor dds_get_status_mask * @brief Get enabled status on entity * @ingroup entity_status * * This operation returns the status enabled on the entity * * @param[in] entity Entity to get the status. * @param[out] mask Mask of enabled statuses set on the entity. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_get_status_mask(dds_entity_t entity, uint32_t *mask); /** * @deprecated Get enabled status on entity. Use \ref dds_get_status_mask instead. * @ingroup deprecated * * @param[in] entity Entity to get the status. * @param[out] mask Mask of enabled statuses set on the entity. * @returns A dds_return_t indicating success of failure. */ DDS_DEPRECATED_EXPORT dds_return_t dds_get_enabled_status(dds_entity_t entity, uint32_t *mask); /** * @anchor dds_set_status_mask * @brief Set status enabled on entity * @ingroup entity_status * * This operation enables the status(es) based on the mask set * * @param[in] entity Entity to enable the status. * @param[in] mask Status value that indicates the status to be enabled. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Success. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_set_status_mask(dds_entity_t entity, uint32_t mask); /** * @deprecated Set enabled status on entity. Use \ref dds_set_status_mask instead. * @ingroup deprecated * * @param[in] entity Entity to enable the status. * @param[out] mask Status value that indicates the status to be enabled. * @returns A dds_return_t indicating success of failure. */ DDS_DEPRECATED_EXPORT dds_return_t dds_set_enabled_status(dds_entity_t entity, uint32_t mask); /** * @defgroup entity_qos (Entity QoS) * @ingroup entity * @brief Almost all entities have get/set qos operations defined on them, * again following the DCPS spec. But unlike the DCPS spec, the * "present" field in qos_t allows one to initialize just the one QoS * one wants to set & pass it to set_qos. */ /** * @brief Get entity QoS policies. * @ingroup entity_qos * * This operation allows access to the existing set of QoS policies * for the entity. * * @param[in] entity Entity on which to get qos. * @param[out] qos Pointer to the qos structure that returns the set policies. * * @returns A dds_return_t indicating success or failure. The QoS object will have * at least all QoS relevant for the entity present and the corresponding dds_qget_... * will return true. * * @retval DDS_RETCODE_OK * The existing set of QoS policy values applied to the entity * has successfully been copied into the specified qos parameter. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The qos parameter is NULL. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * * DOC_TODO: Link to generic QoS information documentation. */ DDS_EXPORT dds_return_t dds_get_qos(dds_entity_t entity, dds_qos_t *qos); /** * @brief Set entity QoS policies. * @ingroup entity_qos * * This operation replaces the existing set of Qos Policy settings for an * entity. The parameter qos must contain the struct with the QosPolicy * settings which is checked for self-consistency. * * The set of QosPolicy settings specified by the qos parameter are applied on * top of the existing QoS, replacing the values of any policies previously set * (provided, the operation returned DDS_RETCODE_OK). * * Not all policies are changeable when the entity is enabled. * * @note Currently only Latency Budget and Ownership Strength are changeable QoS * that can be set. * * @param[in] entity Entity from which to get qos. * @param[in] qos Pointer to the qos structure that provides the policies. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The new QoS policies are set. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The qos parameter is NULL. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_IMMUTABLE_POLICY * The entity is enabled and one or more of the policies of the QoS * are immutable. * @retval DDS_RETCODE_INCONSISTENT_POLICY * A few policies within the QoS are not consistent with each other. * * DOC_TODO: Link to generic QoS information documentation. */ DDS_EXPORT dds_return_t dds_set_qos(dds_entity_t entity, const dds_qos_t * qos); /** * @defgroup entity_listener (Entity Listener) * @ingroup entity * @brief Get or set listener associated with an entity, * type of listener provided much match type of entity. */ /** * @brief Get entity listeners. * @ingroup entity_listener * * This operation allows access to the existing listeners attached to * the entity. * * @param[in] entity Entity on which to get the listeners. * @param[out] listener Pointer to the listener structure that returns the * set of listener callbacks. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The listeners of to the entity have been successfully been * copied into the specified listener parameter. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The listener parameter is NULL. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * * DOC_TODO: Link to (generic) Listener and status information. */ DDS_EXPORT dds_return_t dds_get_listener(dds_entity_t entity, dds_listener_t * listener); /** * @brief Set entity listeners. * @ingroup entity_listener * * This operation attaches a dds_listener_t to the dds_entity_t. Only one * Listener can be attached to each Entity. If a Listener was already * attached, this operation will replace it with the new one. In other * words, all related callbacks are replaced (possibly with NULL). * * When listener parameter is NULL, all listener callbacks that were possibly * set on the Entity will be removed. * * @note Not all listener callbacks are related to all entities. * * ## Communication Status * For each communication status, the StatusChangedFlag flag is initially set to * FALSE. It becomes TRUE whenever that plain communication status changes. For * each plain communication status activated in the mask, the associated * Listener callback is invoked and the communication status is reset * to FALSE, as the listener implicitly accesses the status which is passed as a * parameter to that operation. * The status is reset prior to calling the listener, so if the application calls * the get_ from inside the listener it will see the * status already reset. * * ## Status Propagation * In case a related callback within the Listener is not set, the Listener of * the Parent entity is called recursively, until a Listener with the appropriate * callback set has been found and called. This allows the application to set * (for instance) a default behaviour in the Listener of the containing Publisher * and a DataWriter specific behaviour when needed. In case the callback is not * set in the Publishers' Listener either, the communication status will be * propagated to the Listener of the DomainParticipant of the containing * DomainParticipant. In case the callback is not set in the DomainParticipants' * Listener either, the Communication Status flag will be set, resulting in a * possible WaitSet trigger. * * @param[in] entity Entity on which to get the listeners. * @param[in] listener Pointer to the listener structure that contains the * set of listener callbacks (maybe NULL). * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The listeners of to the entity have been successfully been * copied into the specified listener parameter. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * DOC_TODO: Link to (generic) Listener and status information. */ DDS_EXPORT dds_return_t dds_set_listener(dds_entity_t entity, const dds_listener_t * listener); /* Creation functions for various entities. Creating a subscriber or publisher is optional: if one creates a reader as a descendant of a participant, it is as if a subscriber is created specially for that reader. QoS default values are those of the DDS specification, but the inheritance rules are different: * publishers and subscribers inherit from the participant QoS * readers and writers always inherit from the topic QoS * the QoS's present in the "qos" parameter override the inherited values */ /** * @defgroup domain (Domain) * @ingroup DDS */ /** * @defgroup domain_participant (DomainParticipant) * @ingroup domain */ /** * @brief Creates a new instance of a DDS participant in a domain * @ingroup domain_participant * * If domain is set (not DDS_DOMAIN_DEFAULT) then it must match if the domain has also * been configured or an error status will be returned. * Currently only a single domain can be configured by providing configuration file. * If no configuration file exists, the default domain is configured as 0. * * * @param[in] domain The domain in which to create the participant (can be DDS_DOMAIN_DEFAULT). DDS_DOMAIN_DEFAULT is for using the domain in the configuration. * @param[in] qos The QoS to set on the new participant (can be NULL). * @param[in] listener Any listener functions associated with the new participant (can be NULL). * @returns A valid participant handle or an error code. * * @retval >0 * A valid participant handle. * @retval DDS_RETCODE_NOT_ALLOWED_BY_SECURITY * An invalid DDS Security configuration was specified (whether * that be missing or incorrect entries, expired certificates, * or anything else related to the security settings and * implementation). * @retval DDS_RETCODE_PRECONDITION_NOT_MET * Some security properties specified in the QoS, but the Cyclone * build does not include support for DDS Security. * @retval DDS_RETCODE_OUT_OF_RESOURCES * Some resource limit (maximum participants, memory, handles, * &c.) prevented creation of the participant. * @retval DDS_RETCODE_ERROR * The "CYCLONEDDS_URI" environment variable lists non-existent * or invalid configuration files, or contains invalid embedded * configuration items; or an unspecified internal error has * occurred. */ DDS_EXPORT dds_entity_t dds_create_participant( const dds_domainid_t domain, const dds_qos_t *qos, const dds_listener_t *listener); /** * @brief Creates a domain with a given configuration * @ingroup domain * * To explicitly create a domain based on a configuration passed as a string. * * It will not be created if a domain with the given domain id already exists. * This could have been created implicitly by a dds_create_participant(). * * Please be aware that the given domain_id always takes precedence over the * configuration. * * | domain_id | domain id in config | result | * |:----------|:--------------------|:------------------------------| * | n | any (or absent) | n, config is used | * | n | m == n | n, config is used | * | n | m != n | n, config is ignored: default | * * Config models: * -# @code{xml} * * ... * * * @endcode * where ... is all that can today be set in children of CycloneDDS * with the exception of the id * -# @code{xml} * * X * * * @endcode * Legacy form, domain id must be the first element in the file with * a value (if nothing has been set previously, it a warning is good * enough) * * Using NULL or "" as config will create a domain with default settings. * * * @param[in] domain The domain to be created. DEFAULT_DOMAIN is not allowed. * @param[in] config A configuration string containing file names and/or XML fragments representing the configuration. * * @returns A valid entity handle or an error code. * * @retval DDS_RETCODE_BAD_PARAMETER * Illegal value for domain id or the configfile parameter is NULL. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The domain already existed and cannot be created again. * @retval DDS_RETCODE_ERROR * An internal error has occurred. */ DDS_EXPORT dds_entity_t dds_create_domain(const dds_domainid_t domain, const char *config); /** * @brief Creates a domain with a given configuration, specified as an * initializer (unstable interface) * @ingroup domain * * To explicitly create a domain based on a configuration passed as a raw * initializer rather than as an XML string. This allows bypassing the XML * parsing, but tightly couples the initializing to implementation. See * dds/ddsi/ddsi_config.h:ddsi_config_init_default for a way to initialize * the default configuration. * * It will not be created if a domain with the given domain id already exists. * This could have been created implicitly by a dds_create_participant(). * * Please be aware that the given domain_id always takes precedence over the * configuration. * * @param[in] domain The domain to be created. DEFAULT_DOMAIN is not allowed. * @param[in] config A configuration initializer. The lifetime of any pointers * in config must be at least that of the lifetime of the domain. * * @returns A valid entity handle or an error code. * * @retval DDS_RETCODE_BAD_PARAMETER * Illegal value for domain id or the config parameter is NULL. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The domain already existed and cannot be created again. * @retval DDS_RETCODE_ERROR * An internal error has occurred. */ DDS_EXPORT dds_entity_t dds_create_domain_with_rawconfig(const dds_domainid_t domain, const struct ddsi_config *config); /** * @brief Get entity parent. * @ingroup entity * * This operation returns the parent to which the given entity belongs. * For instance, it will return the Participant that was used when * creating a Publisher (when that Publisher was provided here). * * When a reader or a writer are created with a participant, then a * subscriber or publisher are created implicitly. * This function will return the implicit parent and not the used * participant. * * @param[in] entity Entity from which to get its parent. * * @returns A valid entity handle or an error code. * * @retval >0 * A valid entity handle. * @retval DDS_ENTITY_NIL * Called with a participant. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * DOC_TODO: Link to generic dds entity relations documentation. */ DDS_EXPORT dds_entity_t dds_get_parent(dds_entity_t entity); /** * @brief Get entity participant. * @ingroup entity * * This operation returns the participant to which the given entity belongs. * For instance, it will return the Participant that was used when * creating a Publisher that was used to create a DataWriter (when that * DataWriter was provided here). * * DOC_TODO: Link to generic dds entity relations documentation. * * @param[in] entity Entity from which to get its participant. * * @returns A valid entity or an error code. * * @retval >0 * A valid participant handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_entity_t dds_get_participant(dds_entity_t entity); /** * @brief Get entity children. * @ingroup entity * * This operation returns the children that the entity contains. * For instance, it will return all the Topics, Publishers and Subscribers * of the Participant that was used to create those entities (when that * Participant is provided here). * * This functions takes a pre-allocated list to put the children in and * will return the number of found children. It is possible that the given * size of the list is not the same as the number of found children. If * less children are found, then the last few entries in the list are * untouched. When more children are found, then only 'size' number of * entries are inserted into the list, but still complete count of the * found children is returned. Which children are returned in the latter * case is undefined. * * When supplying NULL as list and 0 as size, you can use this to acquire * the number of children without having to pre-allocate a list. * * When a reader or a writer are created with a participant, then a * subscriber or publisher are created implicitly. * When used on the participant, this function will return the implicit * subscriber and/or publisher and not the related reader/writer. * * @param[in] entity Entity from which to get its children. * @param[out] children Pre-allocated array to contain the found children. * @param[in] size Size of the pre-allocated children's list. * * @returns Number of children or an error code. * * @retval >=0 * Number of found children (can be larger than 'size'). * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The children parameter is NULL, while a size is provided. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ /* TODO: Link to generic dds entity relations documentation. */ DDS_EXPORT dds_return_t dds_get_children(dds_entity_t entity, dds_entity_t *children, size_t size); /** * @brief Get the domain id to which this entity is attached. * @ingroup entity * * When creating a participant entity, it is attached to a certain domain. * All the children (like Publishers) and childrens' children (like * DataReaders), etc are also attached to that domain. * * This function will return the original domain ID when called on * any of the entities within that hierarchy. For entities not associated * with a domain, the id is set to DDS_DOMAIN_DEFAULT. * * @param[in] entity Entity from which to get its children. * @param[out] id Pointer to put the domain ID in. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Domain ID was returned. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The id parameter is NULL. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_get_domainid(dds_entity_t entity, dds_domainid_t *id); /** * @brief Get participants of a domain. * @ingroup domain * * This operation acquires the participants created on a domain and returns * the number of found participants. * * This function takes a domain id with the size of pre-allocated participant's * list in and will return the number of found participants. It is possible that * the given size of the list is not the same as the number of found participants. * If less participants are found, then the last few entries in an array stay * untouched. If more participants are found and the array is too small, then the * participants returned are undefined. * * @param[in] domain_id The domain id. * @param[out] participants The participant for domain. * @param[in] size Size of the pre-allocated participant's list. * * @returns Number of participants found or and error code. * * @retval >0 * Number of participants found. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The participant parameter is NULL, while a size is provided. */ DDS_EXPORT dds_return_t dds_lookup_participant( dds_domainid_t domain_id, dds_entity_t *participants, size_t size); /** * @defgroup topic (Topic) * @ingroup dds */ /** * @brief Creates a new topic with default type handling. * @ingroup topic * * The type name for the topic is taken from the generated descriptor. Topic * matching is done on a combination of topic name and type name. Each successful * call to dds_create_topic creates a new topic entity sharing the same QoS * settings with all other topics of the same name. * * @param[in] participant Participant on which to create the topic. * @param[in] descriptor An IDL generated topic descriptor. * @param[in] name Name of the topic. * @param[in] qos QoS to set on the new topic (can be NULL). * @param[in] listener Any listener functions associated with the new topic (can be NULL). * * @returns A valid, unique topic handle or an error code. * * @retval >=0 * A valid unique topic handle. * @retval DDS_RETCODE_BAD_PARAMETER * Either participant, descriptor, name or qos is invalid. * @retval DDS_RETCODE_INCONSISTENT_POLICY * QoS mismatch between qos and an existing topic's QoS. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * Mismatch between type name in descriptor and pre-existing * topic's type name. */ DDS_EXPORT dds_entity_t dds_create_topic( dds_entity_t participant, const dds_topic_descriptor_t *descriptor, const char *name, const dds_qos_t *qos, const dds_listener_t *listener); /** * @brief Indicates that the library defines the dds_create_topic_sertype function * @ingroup topic * Introduced to help with the change from sertopic to sertype. If you are using * a modern CycloneDDS version you will not need this. */ #define DDS_HAS_CREATE_TOPIC_SERTYPE 1 /** * @brief Creates a new topic with provided type handling. * @ingroup topic * * The name for the type is taken from the provided "sertype" object. Type * matching is done on a combination of topic name and type name. Each successful * call to dds_create_topic creates a new topic entity sharing the same QoS * settings with all other topics of the same name. * * In case this function returns a valid handle, the ownership of the provided * sertype is handed over to Cyclone. On return, the caller gets in the sertype parameter a * pointer to the sertype that is actually used by the topic. This can be the provided sertype * (if this sertype was not yet known in the domain), or a sertype thas was * already known in the domain. * * @param[in] participant Participant on which to create the topic. * @param[in] name Topic name * @param[in,out] sertype Internal description of the type . On return, the sertype parameter is set to the actual sertype that is used by the topic. * @param[in] qos QoS to set on the new topic (can be NULL). * @param[in] listener Any listener functions associated with the new topic (can be NULL). * @param[in] sedp_plist Topic description to be published as part of discovery (if NULL, not published). * * @returns A valid, unique topic handle or an error code. Iff a valid handle, the domain takes ownership of provided serdata. * * @retval >=0 * A valid unique topic handle. * @retval DDS_RETCODE_BAD_PARAMETER * Either participant, descriptor, name or qos is invalid. * @retval DDS_RETCODE_INCONSISTENT_POLICY * QoS mismatch between qos and an existing topic's QoS. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * Mismatch between type name in sertype and pre-existing * topic's type name. */ DDS_EXPORT dds_entity_t dds_create_topic_sertype ( dds_entity_t participant, const char *name, struct ddsi_sertype **sertype, const dds_qos_t *qos, const dds_listener_t *listener, const struct ddsi_plist *sedp_plist); /** * @brief Indicates that the library defines the dds_create_topic_generic function * @ingroup topic * Introduced to help with the change from sertopic to sertype. You should probably * move to using sertype instead of sertopic and ignore this. */ #define DDS_HAS_CREATE_TOPIC_GENERIC 1 /** * @anchor dds_create_topic_generic * @brief Creates a new topic with provided type handling. * @ingroup topic * * DOC_TODO: this description does not make any sense, this is for the legacy sertopic? * deprecate? * * The name for the type is taken from the provided "sertype" object. Type * matching is done on a combination of topic name and type name. Each successful * call to dds_create_topic creates a new topic entity sharing the same QoS * settings with all other topics of the same name. * * In case this function returns a valid handle, the ownership of the provided * sertype is handed over to Cyclone. On return, the caller gets in the sertype parameter a * pointer to the sertype that is actually used by the topic. This can be the provided sertype * (if this sertype was not yet known in the domain), or a sertype thas was * already known in the domain. * * @param[in] participant Participant on which to create the topic. * @param[in,out] sertopic Legacy internal description of the type. On return, the sertype parameter is set to the actual sertype that is used by the topic. * @param[in] qos QoS to set on the new topic (can be NULL). * @param[in] listener Any listener functions associated with the new topic (can be NULL). * @param[in] sedp_plist Topic description to be published as part of discovery (if NULL, not published). * * @returns A valid, unique topic handle or an error code. Iff a valid handle, the domain takes ownership of provided serdata. * * @retval >=0 * A valid unique topic handle. * @retval DDS_RETCODE_BAD_PARAMETER * Either participant, descriptor, name or qos is invalid. * @retval DDS_RETCODE_INCONSISTENT_POLICY * QoS mismatch between qos and an existing topic's QoS. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * Mismatch between type name in sertype and pre-existing * topic's type name. */ DDS_EXPORT dds_entity_t dds_create_topic_generic ( dds_entity_t participant, struct ddsi_sertopic **sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const struct ddsi_plist *sedp_plist); /** * @deprecated Creates a new topic with provided type handling. * @ingroup deprecated * Use @ref dds_create_topic_sertype instead. * * @param[in] participant Participant on which to create the topic. * @param[in,out] sertopic Legacy internal description of the type. On return, the sertype parameter is set to the actual sertype that is used by the topic. * @param[in] qos QoS to set on the new topic (can be NULL). * @param[in] listener Any listener functions associated with the new topic (can be NULL). * @param[in] sedp_plist Topic description to be published as part of discovery (if NULL, not published). * * @returns A valid, unique topic handle or an error code. */ DDS_DEPRECATED_EXPORT dds_entity_t dds_create_topic_arbitrary ( dds_entity_t participant, struct ddsi_sertopic *sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const struct ddsi_plist *sedp_plist); /** * @brief Finds a locally created or discovered remote topic by topic name and type information * @ingroup topic * * Finds a locally created topic or a discovered remote topic based on the topic * name and type. In case the topic is not found, this function will wait for * the topic to become available until the provided time out. * * When using the scope DDS_FIND_SCOPE_LOCAL_DOMAIN, there will be no requests sent * over the network for resolving the type in case it is unresolved. This also applies * to dependent types: in case a dependency of the provided type is unresolved, no * requests will be sent for resolving the type when using LOCAL_DOMAIN scope. * * In case the scope is DDS_FIND_SCOPE_GLOBAL, for unresolved types (or dependencies) * a type lookup request will be sent. * * In case no type information is provided and multiple (discovered) topics exist * with the provided name, an arbitrary topic with that name will be returned. * In this scenario, it would be better to read DCPSTopic data and use that to * get the required topic meta-data. * * The returned topic should be released with dds_delete. * * @param[in] scope The scope used to find the topic. In case topic discovery is not enabled in the build, SCOPE_GLOBAL cannot be used. * @param[in] participant The handle of the participant the found topic will be created in * @param[in] name The name of the topic to find. * @param[in] type_info The type information of the topic to find. Optional, and should not be provided in case topic discovery is not enabled in the build. * @param[in] timeout The timeout for waiting for the topic to become available * * @returns A valid topic handle or an error code. * * @retval >0 * A valid topic handle. * @retval 0 * No topic of this name exists * @retval DDS_RETCODE_BAD_PARAMETER * Participant or type information was invalid. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The provided type could not be found. */ DDS_EXPORT dds_entity_t dds_find_topic (dds_find_scope_t scope, dds_entity_t participant, const char *name, const dds_typeinfo_t *type_info, dds_duration_t timeout); /** * @deprecated Finds a locally created or discovered remote topic by topic name * @ingroup deprecated * Use @ref dds_find_topic instead. * * Finds a locally created topic or a discovered remote topic based on the topic * name. In case the topic is not found, this function will wait for the topic * to become available until the provided time out. * * In case multiple (discovered) topics exist with the provided name, this function * will return randomly one of these topic. The caller can decide to read DCPSTopic * data and select one of the topic definitions to create the topic. * * The returned topic should be released with dds_delete. * * @param[in] scope The scope used to find the topic * @param[in] participant The handle of the participant the found topic will be created in * @param[in] name The name of the topic to find. * @param[in] timeout The timeout for waiting for the topic to become available * * @returns A valid topic handle or an error code. * * @retval >0 * A valid topic handle. * @retval 0 * No topic of this name existed yet * @retval DDS_RETCODE_BAD_PARAMETER * Participant handle or scope invalid */ DDS_DEPRECATED_EXPORT dds_entity_t dds_find_topic_scoped (dds_find_scope_t scope, dds_entity_t participant, const char *name, dds_duration_t timeout); /** * @ingroup topic * @brief Creates topic descriptor for the provided type_info * * @param[in] scope The scope used to find the type: DDS_FIND_SCOPE_LOCAL_DOMAIN or DDS_FIND_SCOPE_GLOBAL. In case DDS_FIND_SCOPE_GLOBAL is used, a type lookup request will be sent to other nodes. * @param[in] participant The handle of the participant. * @param[in] type_info The type (dds_typeinfo_t) of the topic to find. * @param[in] timeout The timeout for waiting for the type to become available * @param[out] descriptor - Pointer to a dds_topic_descriptor_t pointer that will be allocated and populated. To free allocated memory for this descriptor, use dds_delete_topic_descriptor. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The topic descriptor has been succesfully created. * @retval DDS_RETCODE_BAD_PARAMETER * Type_info or descriptor parameter not provided, invalid entity (not a participant) or scope invalid. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The participant or the type_id was not found. * @retval DDS_RETCODE_TIMEOUT * Type was not resolved within the provided timeout * @retval DDS_RETCODE_UNSUPPORTED * Cyclone DDS built without type discovery * (cf. DDS_HAS_TYPE_DISCOVERY) */ DDS_EXPORT dds_return_t dds_create_topic_descriptor (dds_find_scope_t scope, dds_entity_t participant, const dds_typeinfo_t *type_info, dds_duration_t timeout, dds_topic_descriptor_t **descriptor); /** * @ingroup topic * @brief Delete memory allocated to the provided topic descriptor * * @param[in] descriptor - Pointer to a dds_topic_descriptor_t * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The topic descriptor has been succesfully deleted. * @retval DDS_RETCODE_BAD_PARAMETER * No descriptor provided * @retval DDS_RETCODE_UNSUPPORTED * Cyclone DDS built without type discovery * (cf. DDS_HAS_TYPE_DISCOVERY) */ DDS_EXPORT dds_return_t dds_delete_topic_descriptor (dds_topic_descriptor_t *descriptor); /** * @brief Returns the name of a given topic. * @ingroup topic * * @param[in] topic The topic. * @param[out] name Buffer to write the topic name to. * @param[in] size Number of bytes available in the buffer. * * @returns A dds_return_t indicating success or failure. * * @return Actual length of topic name (name is truncated if return value >= size) or error */ DDS_EXPORT dds_return_t dds_get_name(dds_entity_t topic, char *name, size_t size); /** * @brief Returns the type name of a given topic. * @ingroup topic * * @param[in] topic The topic. * @param[out] name Buffer to write the topic type name to. * @param[in] size Number of bytes available in the buffer. * * @returns A dds_return_t indicating success or failure. * * @return Actual length of type name (name is truncated if return value >= size) or error */ DDS_EXPORT dds_return_t dds_get_type_name(dds_entity_t topic, char *name, size_t size); /** * @defgroup topic_filter (Topic filters) * @ingroup topic * Topic filter functions. * @warning part of the Unstable API: no guarantee that any * of this will be maintained for backwards compatibility. * * Sampleinfo is all zero when filtering in a write call (i.e., writer created * using a filtered topic, which one perhaps shouldn't be doing), otherwise it * has as much filled in correctly as is possible given the context and the rest * fixed: * - sample_state DDS_SST_NOT_READ; * - publication_handle set to writer's instance handle * - source_timestamp set to source timestamp of sample * - ranks 0 * - valid_data true * - instance_handle set to instance handle of existing instance if the * sample matches an existing instance, otherwise to what * the instance handle will be if it passes the filter * - view_state set to instance view state if sample being filtered * matches an existing instance, NEW if not * - instance_state set to instance state if sample being filtered * matches an existing instance, NEW if not * - generation counts set to instance's generation counts if the sample * matches an existing instance instance, 0 if not */ /** * @anchor dds_topic_filter_sample_fn * @brief Topic filter function that only needs to look at the sample. * @ingroup topic_filter * @warning Unstable API */ typedef bool (*dds_topic_filter_sample_fn) (const void * sample); /** * @anchor dds_topic_filter_sample_arg_fn * @brief Topic filter function that only needs to look at the sample and a custom argument. * @ingroup topic_filter * @warning Unstable API */ typedef bool (*dds_topic_filter_sample_arg_fn) (const void * sample, void * arg); /** * @anchor dds_topic_filter_sampleinfo_arg_fn * @brief Topic filter function that only needs to look at the sampleinfo and a custom argument. * @ingroup topic_filter * @warning Unstable API */ typedef bool (*dds_topic_filter_sampleinfo_arg_fn) (const dds_sample_info_t * sampleinfo, void * arg); /** * @anchor dds_topic_filter_sample_sampleinfo_arg_fn * @brief Topic filter function that needs to look at the sample, the sampleinfo and a custom argument. * @ingroup topic_filter * @warning Unstable API */ typedef bool (*dds_topic_filter_sample_sampleinfo_arg_fn) (const void * sample, const dds_sample_info_t * sampleinfo, void * arg); /** * @anchor dds_topic_filter_fn * @brief See \ref dds_topic_filter_sample_fn * @ingroup topic_filter * @warning Unstable API */ typedef dds_topic_filter_sample_fn dds_topic_filter_fn; /** * @anchor dds_topic_filter_arg_fn * @brief See \ref dds_topic_filter_sample_arg_fn * @ingroup topic_filter * @warning Unstable API */ typedef dds_topic_filter_sample_arg_fn dds_topic_filter_arg_fn; /** * @brief Topic filter mode; * @ingroup topic_filter * @warning Unstable API */ enum dds_topic_filter_mode { DDS_TOPIC_FILTER_NONE, /**< Can be used to reset topic filter */ DDS_TOPIC_FILTER_SAMPLE, /**< Use with \ref dds_topic_filter_sample_fn */ DDS_TOPIC_FILTER_SAMPLE_ARG, /**< Use with \ref dds_topic_filter_sample_arg_fn */ DDS_TOPIC_FILTER_SAMPLEINFO_ARG, /**< Use with \ref dds_topic_filter_sampleinfo_arg_fn */ DDS_TOPIC_FILTER_SAMPLE_SAMPLEINFO_ARG, /**< Use with \ref dds_topic_filter_sample_sampleinfo_arg_fn */ }; /** * @brief Union of all filter function types; * @ingroup topic_filter * @warning Unstable API */ union dds_topic_filter_function_union { dds_topic_filter_sample_fn sample; /**< Use with mode dds_topic_filter_mode::DDS_TOPIC_FILTER_SAMPLE */ dds_topic_filter_sample_arg_fn sample_arg; /**< Use with mode dds_topic_filter_mode::DDS_TOPIC_FILTER_SAMPLE_ARG */ dds_topic_filter_sampleinfo_arg_fn sampleinfo_arg; /**< Use with mode dds_topic_filter_mode::DDS_TOPIC_FILTER_SAMPLEINFO_ARG */ dds_topic_filter_sample_sampleinfo_arg_fn sample_sampleinfo_arg; /**< Use with mode dds_topic_filter_mode::DDS_TOPIC_FILTER_SAMPLE_SAMPLEINFO_ARG */ }; /** * @brief Full topic filter container; * @ingroup topic_filter * @warning Unstable API */ struct dds_topic_filter { enum dds_topic_filter_mode mode; /**< Provide a mode */ union dds_topic_filter_function_union f; /**< Provide a filter function */ void *arg; /**< Provide an argument, can be NULL */ }; /** * @brief Sets a filter on a topic. To be replaced by proper filtering on readers, * @ingroup topic_filter * @warning Unstable API * @deprecated use @ref dds_set_topic_filter_and_arg or @ref dds_set_topic_filter_extended instead * * Not thread-safe with respect to data being read/written using readers/writers * using this topic. Be sure to create a topic entity specific to the reader you * want to filter, then set the filter function, and only then create the reader. * And don't change it unless you know there are no concurrent writes. * * @param[in] topic The topic on which the content filter is set. * @param[in] filter The filter function used to filter topic samples. */ DDS_DEPRECATED_EXPORT void dds_set_topic_filter(dds_entity_t topic, dds_topic_filter_fn filter); /** * @brief Sets a filter on a topic. To be replaced by proper filtering on readers, * @ingroup topic_filter * @warning Unstable API * @deprecated use @ref dds_set_topic_filter_and_arg or @ref dds_set_topic_filter_extended instead * * Not thread-safe with respect to data being read/written using readers/writers * using this topic. Be sure to create a topic entity specific to the reader you * want to filter, then set the filter function, and only then create the reader. * And don't change it unless you know there are no concurrent writes. * * @param[in] topic The topic on which the content filter is set. * @param[in] filter The filter function used to filter topic samples. */ DDS_DEPRECATED_EXPORT void dds_topic_set_filter(dds_entity_t topic, dds_topic_filter_fn filter); /** * @anchor dds_set_topic_filter_and_arg * @brief Sets a filter and filter argument on a topic. * @ingroup topic_filter * @warning Unstable API * To be replaced by proper filtering on readers. * * Not thread-safe with respect to data being read/written using readers/writers * using this topic. Be sure to create a topic entity specific to the reader you * want to filter, then set the filter function, and only then create the reader. * And don't change it unless you know there are no concurrent writes. * * @param[in] topic The topic on which the content filter is set. * @param[in] filter The filter function used to filter topic samples. * @param[in] arg Argument for the filter function. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK Filter set successfully * @retval DDS_RETCODE_BAD_PARAMETER The topic handle is invalid */ DDS_EXPORT dds_return_t dds_set_topic_filter_and_arg( dds_entity_t topic, dds_topic_filter_arg_fn filter, void *arg); /** * @anchor dds_set_topic_filter_extended * @brief Sets a filter and filter argument on a topic. * @ingroup topic_filter * @warning Unstable API * To be replaced by proper filtering on readers. * * Not thread-safe with respect to data being read/written using readers/writers * using this topic. Be sure to create a topic entity specific to the reader you * want to filter, then set the filter function, and only then create the reader. * And don't change it unless you know there are no concurrent writes. * * @param[in] topic The topic on which the content filter is set. * @param[in] filter The filter specification. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK Filter set successfully * @retval DDS_RETCODE_BAD_PARAMETER The topic handle is invalid */ DDS_EXPORT dds_return_t dds_set_topic_filter_extended( dds_entity_t topic, const struct dds_topic_filter *filter); /** * @brief Gets the filter for a topic. * @ingroup topic_filter * @deprecated Use dds_get_topic_filter_and_arg() or dds_get_topic_filter_extended() instead. * @warning Unstable API * * To be replaced by proper filtering on readers. * * @param[in] topic The topic from which to get the filter. * * @returns The topic filter, or 0 when of type other than "sample". */ DDS_DEPRECATED_EXPORT dds_topic_filter_fn dds_get_topic_filter(dds_entity_t topic); /** * @brief Gets the filter for a topic. * @ingroup topic_filter * @deprecated Use dds_get_topic_filter_and_arg() or dds_get_topic_filter_extended() instead. * @warning Unstable API * * To be replaced by proper filtering on readers. * * @param[in] topic The topic from which to get the filter. * * @returns The topic filter, or 0 when of type other than "sample". */ DDS_DEPRECATED_EXPORT dds_topic_filter_fn dds_topic_get_filter(dds_entity_t topic); /** * @brief Gets the filter for a topic. * @ingroup topic_filter * @warning Unstable API * * To be replaced by proper filtering on readers * * @param[in] topic The topic from which to get the filter. * @param[out] fn The topic filter function (fn may be NULL). * @param[out] arg Filter function argument (arg may be NULL). * * @retval DDS_RETCODE_OK Filter set successfully * @retval DDS_RETCODE_PRECONDITION_NOT_MET Filter is not of "none" or "sample_arg" * @retval DDS_RETCODE_BAD_PARAMETER The topic handle is invalid */ DDS_EXPORT dds_return_t dds_get_topic_filter_and_arg ( dds_entity_t topic, dds_topic_filter_arg_fn *fn, void **arg); /** * @brief Gets the filter for a topic. * @ingroup topic_filter * @warning Unstable API * * To be replaced by proper filtering on readers * * @param[in] topic The topic from which to get the filter. * @param[out] filter The topic filter specification. * * @retval DDS_RETCODE_OK Filter set successfully * @retval DDS_RETCODE_BAD_PARAMETER The topic handle is invalid */ DDS_EXPORT dds_return_t dds_get_topic_filter_extended ( dds_entity_t topic, struct dds_topic_filter *filter); /** * @defgroup subscriber (Subscriber) * @ingroup subscription * DOC_TODO The Subscriber is a DDS Entity */ /** * @brief Creates a new instance of a DDS subscriber * @ingroup subscriber * * @param[in] participant The participant on which the subscriber is being created. * @param[in] qos The QoS to set on the new subscriber (can be NULL). * @param[in] listener Any listener functions associated with the new subscriber (can be NULL). * * @returns A valid subscriber handle or an error code. * * @retval >0 * A valid subscriber handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the parameters is invalid. */ DDS_EXPORT dds_entity_t dds_create_subscriber( dds_entity_t participant, const dds_qos_t *qos, const dds_listener_t *listener); /** * @defgroup publication (Publication) * @ingroup dds * DOC_TODO This contains the definitions regarding publication of data. */ /** * @defgroup publisher (Publisher) * @ingroup publication * DOC_TODO The Publisher is a DDS Entity */ /** * @brief Creates a new instance of a DDS publisher * @ingroup publisher * * @param[in] participant The participant to create a publisher for. * @param[in] qos The QoS to set on the new publisher (can be NULL). * @param[in] listener Any listener functions associated with the new publisher (can be NULL). * * @returns A valid publisher handle or an error code. * * @retval >0 * A valid publisher handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. */ /* TODO: Check list of error codes is complete. */ DDS_EXPORT dds_entity_t dds_create_publisher( dds_entity_t participant, const dds_qos_t *qos, const dds_listener_t *listener); /** * @brief Suspends the publications of the Publisher * @ingroup publisher * * This operation is a hint to the Service so it can optimize its performance by e.g., collecting * modifications to DDS writers and then batching them. The Service is not required to use the hint. * * Every invocation of this operation must be matched by a corresponding call to @see dds_resume * indicating that the set of modifications has completed. * * @param[in] publisher The publisher for which all publications will be suspended. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Publications suspended successfully. * @retval DDS_RETCODE_BAD_PARAMETER * The pub parameter is not a valid publisher. * @retval DDS_RETCODE_UNSUPPORTED * Operation is not supported. */ DDS_EXPORT dds_return_t dds_suspend(dds_entity_t publisher); /** * @brief Resumes the publications of the Publisher * @ingroup publisher * * This operation is a hint to the Service to indicate that the application has * completed changes initiated by a previous dds_suspend(). The Service is not * required to use the hint. * * The call to resume_publications must match a previous call to @see suspend_publications. * * @param[in] publisher The publisher for which all publications will be resumed. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Publications resumed successfully. * @retval DDS_RETCODE_BAD_PARAMETER * The pub parameter is not a valid publisher. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * No previous matching dds_suspend(). * @retval DDS_RETCODE_UNSUPPORTED * Operation is not supported. */ DDS_EXPORT dds_return_t dds_resume(dds_entity_t publisher); /** * @brief Waits at most for the duration timeout for acks for data in the publisher or writer. * @ingroup publication * * This operation blocks the calling thread until either all data written by the publisher * or writer is acknowledged by all matched reliable reader entities, or else the duration * specified by the timeout parameter elapses, whichever happens first. * * @param[in] publisher_or_writer Publisher or writer whose acknowledgments must be waited for * @param[in] timeout How long to wait for acknowledgments before time out * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * All acknowledgments successfully received with the timeout. * @retval DDS_RETCODE_BAD_PARAMETER * The publisher_or_writer is not a valid publisher or writer. * @retval DDS_RETCODE_TIMEOUT * Timeout expired before all acknowledgments from reliable reader entities were received. * @retval DDS_RETCODE_UNSUPPORTED * Operation is not supported. */ DDS_EXPORT dds_return_t dds_wait_for_acks(dds_entity_t publisher_or_writer, dds_duration_t timeout); /** * @defgroup reader (Reader) * @ingroup subscription * DOC_TODO The reader is a DDS Entity */ /** * @brief Creates a new instance of a DDS reader. * @ingroup reader * * When a participant is used to create a reader, an implicit subscriber is created. * This implicit subscriber will be deleted automatically when the created reader * is deleted. * * @param[in] participant_or_subscriber The participant or subscriber on which the reader is being created. * @param[in] topic The topic to read. * @param[in] qos The QoS to set on the new reader (can be NULL). * @param[in] listener Any listener functions associated with the new reader (can be NULL). * * @returns A valid reader handle or an error code. * * @retval >0 * A valid reader handle. * @retval DDS_RETCODE_ERROR * An internal error occurred. * * DOC_TODO: Complete list of error codes */ DDS_EXPORT dds_entity_t dds_create_reader( dds_entity_t participant_or_subscriber, dds_entity_t topic, const dds_qos_t *qos, const dds_listener_t *listener); /** * @brief Creates a new instance of a DDS reader with a custom history cache. * @ingroup reader * * When a participant is used to create a reader, an implicit subscriber is created. * This implicit subscriber will be deleted automatically when the created reader * is deleted. * * @param[in] participant_or_subscriber The participant or subscriber on which the reader is being created. * @param[in] topic The topic to read. * @param[in] qos The QoS to set on the new reader (can be NULL). * @param[in] listener Any listener functions associated with the new reader (can be NULL). * @param[in] rhc Reader history cache to use, reader becomes the owner * * @returns A valid reader handle or an error code. * * @retval >0 * A valid reader handle. * @retval DDS_RETCODE_ERROR * An internal error occurred. * * DOC_TODO: Complete list of error codes */ DDS_EXPORT dds_entity_t dds_create_reader_rhc( dds_entity_t participant_or_subscriber, dds_entity_t topic, const dds_qos_t *qos, const dds_listener_t *listener, struct dds_rhc *rhc); /** * @brief Wait until reader receives all historic data * @ingroup reader * * The operation blocks the calling thread until either all "historical" data is * received, or else the duration specified by the max_wait parameter elapses, whichever happens * first. A return value of 0 indicates that all the "historical" data was received; a return * value of TIMEOUT indicates that max_wait elapsed before all the data was received. * * @param[in] reader The reader on which to wait for historical data. * @param[in] max_wait How long to wait for historical data before time out. * * @returns a status, 0 on success, TIMEOUT on timeout or a negative value to indicate error. * * DOC_TODO: Complete list of error codes */ DDS_EXPORT dds_return_t dds_reader_wait_for_historical_data( dds_entity_t reader, dds_duration_t max_wait); /** * @defgroup writer (Writer) * @ingroup publication * DOC_TODO The writer is a DDS Entity */ /** * @brief Creates a new instance of a DDS writer. * @ingroup writer * * When a participant is used to create a writer, an implicit publisher is created. * This implicit publisher will be deleted automatically when the created writer * is deleted. * * @param[in] participant_or_publisher The participant or publisher on which the writer is being created. * @param[in] topic The topic to write. * @param[in] qos The QoS to set on the new writer (can be NULL). * @param[in] listener Any listener functions associated with the new writer (can be NULL). * * @returns A valid writer handle or an error code. * * @returns >0 * A valid writer handle. * @returns DDS_RETCODE_ERROR * An internal error occurred. * * DOC_TODO: Complete list of error codes */ DDS_EXPORT dds_entity_t dds_create_writer( dds_entity_t participant_or_publisher, dds_entity_t topic, const dds_qos_t *qos, const dds_listener_t *listener); /** * @defgroup writing (Writing data) * @ingroup writer * Writing data (and variants of it) is straightforward. The first set * is equivalent to the second set with -1 passed for "timestamp", * meaning, substitute the result of a call to time(). The dispose * and unregister operations take an object of the topic's type, but * only touch the key fields; the remained may be undefined. */ /** * @brief Registers an instance * @ingroup writing * * This operation registers an instance with a key value to the data writer and * returns an instance handle that could be used for successive write & dispose * operations. When the handle is not allocated, the function will return an * error and the handle will be un-touched. * * @param[in] writer The writer to which instance has be associated. * @param[out] handle The instance handle. * @param[in] data The instance with the key value. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_register_instance( dds_entity_t writer, dds_instance_handle_t *handle, const void *data); /** * @brief Unregisters an instance by instance * @ingroup writing * * This operation reverses the action of register instance, removes all information regarding * the instance and unregisters an instance with a key value from the data writer. * * @param[in] writer The writer to which instance is associated. * @param[in] data The instance with the key value. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_unregister_instance(dds_entity_t writer, const void *data); /** * @brief Unregisters an instance by instance handle * @ingroup writing * * This operation unregisters the instance which is identified by the key fields of the given * typed instance handle. * * @param[in] writer The writer to which instance is associated. * @param[in] handle The instance handle. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_unregister_instance_ih(dds_entity_t writer, dds_instance_handle_t handle); /** * @brief Unregisters an instance by instance with timestamp * @ingroup writing * * This operation reverses the action of register instance, removes all information regarding * the instance and unregisters an instance with a key value from the data writer. It also * provides a value for the timestamp explicitly. * * @param[in] writer The writer to which instance is associated. * @param[in] data The instance with the key value. * @param[in] timestamp The timestamp used at registration. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_unregister_instance_ts( dds_entity_t writer, const void *data, dds_time_t timestamp); /** * @brief Unregisters an instance by instance handle with timestamp * @ingroup writing * * This operation unregisters an instance with a key value from the handle. Instance can be identified * from instance handle. If an unregistered key ID is passed as an instance data, an error is logged and * not flagged as return value. * * @param[in] writer The writer to which instance is associated. * @param[in] handle The instance handle. * @param[in] timestamp The timestamp used at registration. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object */ DDS_EXPORT dds_return_t dds_unregister_instance_ih_ts( dds_entity_t writer, dds_instance_handle_t handle, dds_time_t timestamp); /** * @brief This operation modifies and disposes a data instance. * @ingroup writing * * This operation requests the Data Distribution Service to modify the instance and * mark it for deletion. Copies of the instance and its corresponding samples, which are * stored in every connected reader and, dependent on the QoS policy settings (also in * the Transient and Persistent stores) will be modified and marked for deletion by * setting their dds_instance_state_t to DDS_IST_NOT_ALIVE_DISPOSED. * * @par Blocking * If the history QoS policy is set to DDS_HISTORY_KEEP_ALL, the * dds_writedispose operation on the writer may block if the modification * would cause data to be lost because one of the limits, specified in the * resource_limits QoS policy, to be exceeded. In case the synchronous * attribute value of the reliability Qos policy is set to true for * communicating writers and readers then the writer will wait until * all synchronous readers have acknowledged the data. Under these * circumstances, the max_blocking_time attribute of the reliability * QoS policy configures the maximum time the dds_writedispose operation * may block. * If max_blocking_time elapses before the writer is able to store the * modification without exceeding the limits and all expected acknowledgements * are received, the dds_writedispose operation will fail and returns * DDS_RETCODE_TIMEOUT. * * @param[in] writer The writer to dispose the data instance from. * @param[in] data The data to be written and disposed. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The sample is written and the instance is marked for deletion. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * At least one of the arguments is invalid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_TIMEOUT * Either the current action overflowed the available resources as * specified by the combination of the reliability QoS policy, * history QoS policy and resource_limits QoS policy, or the * current action was waiting for data delivery acknowledgement * by synchronous readers. This caused blocking of this operation, * which could not be resolved before max_blocking_time of the * reliability QoS policy elapsed. */ DDS_EXPORT dds_return_t dds_writedispose(dds_entity_t writer, const void *data); /** * @brief This operation modifies and disposes a data instance with a specific * timestamp. * @ingroup writing * * This operation performs the same functions as dds_writedispose() except that * the application provides the value for the source_timestamp that is made * available to connected reader objects. This timestamp is important for the * interpretation of the destination_order QoS policy. * * @param[in] writer The writer to dispose the data instance from. * @param[in] data The data to be written and disposed. * @param[in] timestamp The timestamp used as source timestamp. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The sample is written and the instance is marked for deletion. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * At least one of the arguments is invalid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_TIMEOUT * Either the current action overflowed the available resources as * specified by the combination of the reliability QoS policy, * history QoS policy and resource_limits QoS policy, or the * current action was waiting for data delivery acknowledgement * by synchronous readers. This caused blocking of this operation, * which could not be resolved before max_blocking_time of the * reliability QoS policy elapsed. */ DDS_EXPORT dds_return_t dds_writedispose_ts( dds_entity_t writer, const void *data, dds_time_t timestamp); /** * @brief This operation disposes an instance, identified by the data sample. * @ingroup writing * * This operation requests the Data Distribution Service to modify the instance and * mark it for deletion. Copies of the instance and its corresponding samples, which are * stored in every connected reader and, dependent on the QoS policy settings (also in * the Transient and Persistent stores) will be modified and marked for deletion by * setting their dds_instance_state_t to DDS_IST_NOT_ALIVE_DISPOSED. * * @par Blocking * If the history QoS policy is set to DDS_HISTORY_KEEP_ALL, the * dds_writedispose operation on the writer may block if the modification * would cause data to be lost because one of the limits, specified in the * resource_limits QoS policy, to be exceeded. In case the synchronous * attribute value of the reliability Qos policy is set to true for * communicating writers and readers then the writer will wait until * all synchronous readers have acknowledged the data. Under these * circumstances, the max_blocking_time attribute of the reliability * QoS policy configures the maximum time the dds_writedispose operation * may block. * If max_blocking_time elapses before the writer is able to store the * modification without exceeding the limits and all expected acknowledgements * are received, the dds_writedispose operation will fail and returns * DDS_RETCODE_TIMEOUT. * * @param[in] writer The writer to dispose the data instance from. * @param[in] data The data sample that identifies the instance * to be disposed. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The sample is written and the instance is marked for deletion. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * At least one of the arguments is invalid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_TIMEOUT * Either the current action overflowed the available resources as * specified by the combination of the reliability QoS policy, * history QoS policy and resource_limits QoS policy, or the * current action was waiting for data delivery acknowledgement * by synchronous readers. This caused blocking of this operation, * which could not be resolved before max_blocking_time of the * reliability QoS policy elapsed. */ DDS_EXPORT dds_return_t dds_dispose(dds_entity_t writer, const void *data); /** * @brief This operation disposes an instance with a specific timestamp, identified by the data sample. * @ingroup writing * * This operation performs the same functions as dds_dispose() except that * the application provides the value for the source_timestamp that is made * available to connected reader objects. This timestamp is important for the * interpretation of the destination_order QoS policy. * * @param[in] writer The writer to dispose the data instance from. * @param[in] data The data sample that identifies the instance * to be disposed. * @param[in] timestamp The timestamp used as source timestamp. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The sample is written and the instance is marked for deletion * @retval DDS_RETCODE_ERROR * An internal error has occurred * @retval DDS_RETCODE_BAD_PARAMETER * At least one of the arguments is invalid * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted * @retval DDS_RETCODE_TIMEOUT * Either the current action overflowed the available resources as * specified by the combination of the reliability QoS policy, * history QoS policy and resource_limits QoS policy, or the * current action was waiting for data delivery acknowledgment * by synchronous readers. This caused blocking of this operation, * which could not be resolved before max_blocking_time of the * reliability QoS policy elapsed. */ DDS_EXPORT dds_return_t dds_dispose_ts( dds_entity_t writer, const void *data, dds_time_t timestamp); /** * @brief This operation disposes an instance, identified by the instance handle. * @ingroup writing * * This operation requests the Data Distribution Service to modify the instance and * mark it for deletion. Copies of the instance and its corresponding samples, which are * stored in every connected reader and, dependent on the QoS policy settings (also in * the Transient and Persistent stores) will be modified and marked for deletion by * setting their dds_instance_state_t to DDS_IST_NOT_ALIVE_DISPOSED. * * @par Instance Handle * The given instance handle must correspond to the value that was returned by either * the dds_register_instance operation, dds_register_instance_ts or dds_lookup_instance. * If there is no correspondence, then the result of the operation is unspecified. * * @param[in] writer The writer to dispose the data instance from. * @param[in] handle The handle to identify an instance. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The sample is written and the instance is marked for deletion. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * At least one of the arguments is invalid * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this writer */ DDS_EXPORT dds_return_t dds_dispose_ih(dds_entity_t writer, dds_instance_handle_t handle); /** * @brief This operation disposes an instance with a specific timestamp, identified by the instance handle. * @ingroup writing * * This operation performs the same functions as dds_dispose_ih() except that * the application provides the value for the source_timestamp that is made * available to connected reader objects. This timestamp is important for the * interpretation of the destination_order QoS policy. * * @param[in] writer The writer to dispose the data instance from. * @param[in] handle The handle to identify an instance. * @param[in] timestamp The timestamp used as source timestamp. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The sample is written and the instance is marked for deletion. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * At least one of the arguments is invalid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this writer. */ DDS_EXPORT dds_return_t dds_dispose_ih_ts( dds_entity_t writer, dds_instance_handle_t handle, dds_time_t timestamp); /** * @brief Write the value of a data instance * @ingroup writing * * With this API, the value of the source timestamp is automatically made * available to the data reader by the service. * * @param[in] writer The writer entity. * @param[in] data Value to be written. * * @returns dds_return_t indicating success or failure. */ DDS_EXPORT dds_return_t dds_write(dds_entity_t writer, const void *data); /** * @brief Flush a writers batched writes * @ingroup writing * * When using the WriteBatch mode you can manually batch small writes into larger * datapackets for network efficiency. The normal dds_write() calls will no longer * automatically decide when to send data, you will do that manually using this function. * * DOC_TODO check if my assumptions about how this function works are correct * * @param[in] writer The writer entity. */ DDS_EXPORT void dds_write_flush(dds_entity_t writer); /** * @brief Write a serialized value of a data instance * @ingroup writing * * This call causes the writer to write the serialized value that is provided * in the serdata argument. Timestamp and statusinfo fields are set to the * current time and 0 (indicating a regular write), respectively. * * @param[in] writer The writer entity. * @param[in] serdata Serialized value to be written. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The writer successfully wrote the serialized value. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_TIMEOUT * The writer failed to write the serialized value reliably within the specified max_blocking_time. */ DDS_EXPORT dds_return_t dds_writecdr(dds_entity_t writer, struct ddsi_serdata *serdata); /** * @brief Write a serialized value of a data instance * @ingroup writing * * This call causes the writer to write the serialized value that is provided * in the serdata argument. Timestamp and statusinfo are used as is. * * @param[in] writer The writer entity. * @param[in] serdata Serialized value to be written. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The writer successfully wrote the serialized value. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_TIMEOUT * The writer failed to write the serialized value reliably within the specified max_blocking_time. */ DDS_EXPORT dds_return_t dds_forwardcdr(dds_entity_t writer, struct ddsi_serdata *serdata); /** * @brief Write the value of a data instance along with the source timestamp passed. * @ingroup writing * * @param[in] writer The writer entity. * @param[in] data Value to be written. * @param[in] timestamp Source timestamp. * * @returns A dds_return_t indicating success or failure. */ DDS_EXPORT dds_return_t dds_write_ts( dds_entity_t writer, const void *data, dds_time_t timestamp); /** * @defgroup readcondition (ReadCondition) * @ingroup condition */ /** * @defgroup querycondition (QueryCondition) * @ingroup condition */ /** * @defgroup guardcondition (GuardCondition) * @ingroup condition */ /** * @brief Creates a readcondition associated to the given reader. * @ingroup readcondition * * The readcondition allows specifying which samples are of interest in * a data reader's history, by means of a mask. The mask is or'd with * the flags that are dds_sample_state_t, dds_view_state_t and * dds_instance_state_t. * * Based on the mask value set, the readcondition gets triggered when * data is available on the reader. * * Waitsets allow waiting for an event on some of any set of entities. * This means that the readcondition can be used to wake up a waitset when * data is in the reader history with states that matches the given mask. * * @note The parent reader and every of its associated conditions (whether * they are readconditions or queryconditions) share the same resources. * This means that one of these entities reads or takes data, the states * of the data will change for other entities automatically. For instance, * if one reads a sample, then the sample state will become 'read' for all * associated reader/conditions. Or if one takes a sample, then it's not * available to any other associated reader/condition. * * @param[in] reader Reader to associate the condition to. * @param[in] mask Interest (dds_sample_state_t|dds_view_state_t|dds_instance_state_t). * * @returns A valid condition handle or an error code. * * @retval >0 * A valid condition handle * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_entity_t dds_create_readcondition(dds_entity_t reader, uint32_t mask); /** * @brief Function signature for a querycondition filter * @ingroup querycondition */ typedef bool (*dds_querycondition_filter_fn) (const void * sample); /** * @brief Creates a queryondition associated to the given reader. * @ingroup querycondition * * The queryondition allows specifying which samples are of interest in * a data reader's history, by means of a mask and a filter. The mask is * or'd with the flags that are dds_sample_state_t, dds_view_state_t and * dds_instance_state_t. * * Based on the mask value set and data that matches the filter, the * querycondition gets triggered when data is available on the reader. * * Waitsets allow waiting for an event on some of any set of entities. * This means that the querycondition can be used to wake up a waitset when * data is in the reader history with states that matches the given mask * and filter. * * @note The parent reader and every of its associated conditions (whether * they are readconditions or queryconditions) share the same resources. * This means that one of these entities reads or takes data, the states * of the data will change for other entities automatically. For instance, * if one reads a sample, then the sample state will become 'read' for all * associated reader/conditions. Or if one takes a sample, then it's not * available to any other associated reader/condition. * * @param[in] reader Reader to associate the condition to. * @param[in] mask Interest (dds_sample_state_t|dds_view_state_t|dds_instance_state_t). * @param[in] filter Callback that the application can use to filter specific samples. * * @returns A valid condition handle or an error code * * @retval >=0 * A valid condition handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_entity_t dds_create_querycondition( dds_entity_t reader, uint32_t mask, dds_querycondition_filter_fn filter); /** * @brief Creates a guardcondition. * @ingroup guardcondition * * Waitsets allow waiting for an event on some of any set of entities. * This means that the guardcondition can be used to wake up a waitset when * data is in the reader history with states that matches the given mask. * * @param[in] participant Participant on which to create the guardcondition. * * @returns A valid condition handle or an error code. * * @retval >0 * A valid condition handle * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_entity_t dds_create_guardcondition(dds_entity_t participant); /** * @brief Sets the trigger status of a guardcondition. * @ingroup guardcondition * * @param[in] guardcond Guard condition to set the trigger status of. * @param[in] triggered The triggered status to set. * * @retval DDS_RETCODE_OK * Operation successful * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_set_guardcondition(dds_entity_t guardcond, bool triggered); /** * @brief Reads the trigger status of a guardcondition. * @ingroup guardcondition * * @param[in] guardcond Guard condition to read the trigger status of. * @param[out] triggered The triggered status read from the guard condition. * * @retval DDS_RETCODE_OK * Operation successful * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read_guardcondition(dds_entity_t guardcond, bool *triggered); /** * @brief Reads and resets the trigger status of a guardcondition. * @ingroup guardcondition * * @param[in] guardcond Guard condition to read and reset the trigger status of. * @param[out] triggered The triggered status read from the guard condition. * * @retval DDS_RETCODE_OK * Operation successful * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take_guardcondition(dds_entity_t guardcond, bool *triggered); /** * @defgroup waitset (WaitSet) * @ingroup dds */ /** * @brief Waitset attachment argument. * @ingroup waitset * * Every entity that is attached to the waitset can be accompanied by such * an attachment argument. When the waitset wait is unblocked because of an * entity that triggered, then the returning array will be populated with * these attachment arguments that are related to the triggered entity. */ typedef intptr_t dds_attach_t; /** * @brief Create a waitset and allocate the resources required * @ingroup waitset * * A WaitSet object allows an application to wait until one or more of the * conditions of the attached entities evaluates to TRUE or until the timeout * expires. * * @param[in] participant Domain participant which the WaitSet contains. * * @returns A valid waitset handle or an error code. * * @retval >=0 * A valid waitset handle. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_entity_t dds_create_waitset(dds_entity_t participant); /** * @brief Acquire previously attached entities. * @ingroup waitset * * This functions takes a pre-allocated list to put the entities in and * will return the number of found entities. It is possible that the given * size of the list is not the same as the number of found entities. If * less entities are found, then the last few entries in the list are * untouched. When more entities are found, then only 'size' number of * entries are inserted into the list, but still the complete count of the * found entities is returned. Which entities are returned in the latter * case is undefined. * * @param[in] waitset Waitset from which to get its attached entities. * @param[out] entities Pre-allocated array to contain the found entities. * @param[in] size Size of the pre-allocated entities' list. * * @returns A dds_return_t with the number of children or an error code. * * @retval >=0 * Number of children found (can be larger than 'size'). * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The entities parameter is NULL, while a size is provided. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The waitset has already been deleted. */ DDS_EXPORT dds_return_t dds_waitset_get_entities( dds_entity_t waitset, dds_entity_t *entities, size_t size); /** * @brief This operation attaches an Entity to the WaitSet. * @ingroup waitset * * This operation attaches an Entity to the WaitSet. The dds_waitset_wait() * will block when none of the attached entities are triggered. 'Triggered' * (dds_triggered()) doesn't mean the same for every entity: * - Reader/Writer/Publisher/Subscriber/Topic/Participant * - These are triggered when their status changed. * - WaitSet * - Triggered when trigger value was set to true by the application. * It stays triggered until application sets the trigger value to * false (dds_waitset_set_trigger()). This can be used to wake up an * waitset for different reasons (f.i. termination) than the 'normal' * status change (like new data). * - ReadCondition/QueryCondition * - Triggered when data is available on the related Reader that matches * the Condition. * * Multiple entities can be attached to a single waitset. A particular entity * can be attached to multiple waitsets. However, a particular entity can not * be attached to a particular waitset multiple times. * * @param[in] waitset The waitset to attach the given entity to. * @param[in] entity The entity to attach. * @param[in] x Blob that will be supplied when the waitset wait is * triggered by the given entity. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Entity attached. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The given waitset or entity are not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The waitset has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The entity was already attached. */ DDS_EXPORT dds_return_t dds_waitset_attach( dds_entity_t waitset, dds_entity_t entity, dds_attach_t x); /** * @brief This operation detaches an Entity from the WaitSet. * @ingroup waitset * * @param[in] waitset The waitset to detach the given entity from. * @param[in] entity The entity to detach. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Entity detached. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The given waitset or entity are not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The waitset has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The entity is not attached. */ DDS_EXPORT dds_return_t dds_waitset_detach( dds_entity_t waitset, dds_entity_t entity); /** * @brief Sets the trigger_value associated with a waitset. * @ingroup waitset * * When the waitset is attached to itself and the trigger value is * set to 'true', then the waitset will wake up just like with an * other status change of the attached entities. * * This can be used to forcefully wake up a waitset, for instance * when the application wants to shut down. So, when the trigger * value is true, the waitset will wake up or not wait at all. * * The trigger value will remain true until the application sets it * false again deliberately. * * @param[in] waitset The waitset to set the trigger value on. * @param[in] trigger The trigger value to set. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * Trigger value set. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The given waitset is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The waitset has already been deleted. */ DDS_EXPORT dds_return_t dds_waitset_set_trigger( dds_entity_t waitset, bool trigger); /** * @brief This operation allows an application thread to wait for the a status * change or other trigger on (one of) the entities that are attached to * the WaitSet. * @ingroup waitset * * The dds_waitset_wait() operation blocks until the some of the attached * entities have triggered or "reltimeout" has elapsed. * 'Triggered' (dds_triggered()) doesn't mean the same for every entity: * - Reader/Writer/Publisher/Subscriber/Topic/Participant * - These are triggered when their status changed. * - WaitSet * - Triggered when trigger value was set to true by the application. * It stays triggered until application sets the trigger value to * false (dds_waitset_set_trigger()). This can be used to wake up an * waitset for different reasons (f.i. termination) than the 'normal' * status change (like new data). * - ReadCondition/QueryCondition * - Triggered when data is available on the related Reader that matches * the Condition. * * This functions takes a pre-allocated list to put the "xs" blobs in (that * were provided during the attach of the related entities) and will return * the number of triggered entities. It is possible that the given size * of the list is not the same as the number of triggered entities. If less * entities were triggered, then the last few entries in the list are * untouched. When more entities are triggered, then only 'size' number of * entries are inserted into the list, but still the complete count of the * triggered entities is returned. Which "xs" blobs are returned in the * latter case is undefined. * * In case of a time out, the return value is 0. * * Deleting the waitset while the application is blocked results in an * error code (i.e. < 0) returned by "wait". * * Multiple threads may block on a single waitset at the same time; * the calls are entirely independent. * * An empty waitset never triggers (i.e., dds_waitset_wait on an empty * waitset is essentially equivalent to a sleep). * * The "dds_waitset_wait_until" operation is the same as the * "dds_waitset_wait" except that it takes an absolute timeout. * * @param[in] waitset The waitset to set the trigger value on. * @param[out] xs Pre-allocated list to store the 'blobs' that were * provided during the attach of the triggered entities. * @param[in] nxs The size of the pre-allocated blobs list. * @param[in] reltimeout Relative timeout * * @returns A dds_return_t with the number of entities triggered or an error code * * @retval >0 * Number of entities triggered. * @retval 0 * Time out (no entities were triggered). * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The given waitset is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The waitset has already been deleted. */ DDS_EXPORT dds_return_t dds_waitset_wait( dds_entity_t waitset, dds_attach_t *xs, size_t nxs, dds_duration_t reltimeout); /** * @brief This operation allows an application thread to wait for the a status * change or other trigger on (one of) the entities that are attached to * the WaitSet. * @ingroup waitset * * The dds_waitset_wait() operation blocks until the some of the attached * entities have triggered or "abstimeout" has been reached. * 'Triggered' (dds_triggered()) doesn't mean the same for every entity: * - Reader/Writer/Publisher/Subscriber/Topic/Participant * - These are triggered when their status changed. * - WaitSet * - Triggered when trigger value was set to true by the application. * It stays triggered until application sets the trigger value to * false (dds_waitset_set_trigger()). This can be used to wake up an * waitset for different reasons (f.i. termination) than the 'normal' * status change (like new data). * - ReadCondition/QueryCondition * - Triggered when data is available on the related Reader that matches * the Condition. * * This functions takes a pre-allocated list to put the "xs" blobs in (that * were provided during the attach of the related entities) and will return * the number of triggered entities. It is possible that the given size * of the list is not the same as the number of triggered entities. If less * entities were triggered, then the last few entries in the list are * untouched. When more entities are triggered, then only 'size' number of * entries are inserted into the list, but still the complete count of the * triggered entities is returned. Which "xs" blobs are returned in the * latter case is undefined. * * In case of a time out, the return value is 0. * * Deleting the waitset while the application is blocked results in an * error code (i.e. < 0) returned by "wait". * * Multiple threads may block on a single waitset at the same time; * the calls are entirely independent. * * An empty waitset never triggers (i.e., dds_waitset_wait on an empty * waitset is essentially equivalent to a sleep). * * The "dds_waitset_wait" operation is the same as the * "dds_waitset_wait_until" except that it takes an relative timeout. * * The "dds_waitset_wait" operation is the same as the "dds_wait" * except that it takes an absolute timeout. * * @param[in] waitset The waitset to set the trigger value on. * @param[out] xs Pre-allocated list to store the 'blobs' that were * provided during the attach of the triggered entities. * @param[in] nxs The size of the pre-allocated blobs list. * @param[in] abstimeout Absolute timeout * * @returns A dds_return_t with the number of entities triggered or an error code. * * @retval >0 * Number of entities triggered. * @retval 0 * Time out (no entities were triggered). * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The given waitset is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The waitset has already been deleted. */ DDS_EXPORT dds_return_t dds_waitset_wait_until( dds_entity_t waitset, dds_attach_t *xs, size_t nxs, dds_time_t abstimeout); /** * @defgroup reading (Reading Data) * @ingroup reader * There are a number of ways to aquire data, divided into variations of "read" and "take". * The return value of a read/take operation is the number of elements returned. "max_samples" * should have the same type, as one can't return more than MAX_INT * this way, anyway. X, Y, CX, CY return to the various filtering * options, see the DCPS spec. * * O ::= read | take * * X => CX * (empty) (empty) * _next_instance instance_handle_t prev * * Y => CY * (empty) uint32_t mask * _cond cond_t cond -- refers to a read condition (or query if implemented) */ /** * @brief Access and read the collection of data values (of same type) and sample info from the * data reader, readcondition or querycondition. * @ingroup reading * * Return value provides information about number of samples read, which will * be <= maxs. Based on the count, the buffer will contain data to be read only * when valid_data bit in sample info structure is set. * The buffer required for data values, could be allocated explicitly or can * use the memory from data reader to prevent copy. In the latter case, buffer and * sample_info should be returned back, once it is no longer using the Data. * Data values once read will remain in the buffer with the sample_state set to READ * and view_state set to NOT_NEW. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs); /** * @brief Access and read loaned samples of data reader, readcondition or querycondition. * @ingroup reading * * After dds_read_wl function is being called and the data has been handled, dds_return_loan() function must be called to possibly free memory. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL) * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value * @param[in] maxs Maximum number of samples to read * * @returns A dds_return_t with the number of samples read or an error code * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs); /** * @brief Read the collection of data values and sample info from the data reader, readcondition * or querycondition based on mask. * @ingroup reading * * When using a readcondition or querycondition, their masks are or'd with the given mask. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read_mask( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs, uint32_t mask); /** * @brief Access and read loaned samples of data reader, readcondition * or querycondition based on mask * @ingroup reading * * When using a readcondition or querycondition, their masks are or'd with the given mask. * * After dds_read_mask_wl function is being called and the data has been handled, dds_return_loan() function must be called to possibly free memory * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] maxs Maximum number of samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read_mask_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs, uint32_t mask); /** * @brief Access and read the collection of data values (of same type) and sample info from the * data reader, readcondition or querycondition, coped by the provided instance handle. * @ingroup reading * * This operation implements the same functionality as dds_read, except that only data scoped to * the provided instance handle is read. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_read_instance( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs, dds_instance_handle_t handle); /** * @brief Access and read loaned samples of data reader, readcondition or querycondition, * scoped by the provided instance handle. * @ingroup reading * * This operation implements the same functionality as dds_read_wl, except that only data * scoped to the provided instance handle is read. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_read_instance_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs, dds_instance_handle_t handle); /** * @brief Read the collection of data values and sample info from the data reader, readcondition * or querycondition based on mask and scoped by the provided instance handle. * @ingroup reading * * This operation implements the same functionality as dds_read_mask, except that only data * scoped to the provided instance handle is read. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_read_instance_mask( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs, dds_instance_handle_t handle, uint32_t mask); /** * @brief Access and read loaned samples of data reader, readcondition or * querycondition based on mask, scoped by the provided instance handle. * @ingroup reading * * This operation implements the same functionality as dds_read_mask_wl, except that * only data scoped to the provided instance handle is read. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_read_instance_mask_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs, dds_instance_handle_t handle, uint32_t mask); /** * @brief Access the collection of data values (of same type) and sample info from the * data reader, readcondition or querycondition. * @ingroup reading * * Data value once read is removed from the Data Reader cannot to * 'read' or 'taken' again. * Return value provides information about number of samples read, which will * be <= maxs. Based on the count, the buffer will contain data to be read only * when valid_data bit in sample info structure is set. * The buffer required for data values, could be allocated explicitly or can * use the memory from data reader to prevent copy. In the latter case, buffer and * sample_info should be returned back, once it is no longer using the Data. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs); /** * @brief Access loaned samples of data reader, readcondition or querycondition. * @ingroup reading * * After dds_take_wl function is being called and the data has been handled, dds_return_loan() function must be called to possibly free memory * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] maxs Maximum number of samples to read. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs); /** * @brief Take the collection of data values (of same type) and sample info from the * data reader, readcondition or querycondition based on mask * @ingroup reading * * When using a readcondition or querycondition, their masks are or'd with the given mask. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take_mask( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs, uint32_t mask); /** * @brief Access loaned samples of data reader, readcondition or querycondition based on mask. * @ingroup reading * * When using a readcondition or querycondition, their masks are or'd with the given mask. * * After dds_take_mask_wl function is being called and the data has been handled, dds_return_loan() function must be called to possibly free memory * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] maxs Maximum number of samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take_mask_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs, uint32_t mask); /** * @anchor DDS_HAS_READCDR * @ingroup reading * @brief Set when function dds_has_readcdr is defined. */ #define DDS_HAS_READCDR 1 /** * @brief Access the collection of serialized data values (of same type) and * sample info from the data reader, readcondition or querycondition. * @ingroup reading * * This call accesses the serialized data from the data reader, readcondition or * querycondition and makes it available to the application. The serialized data * is made available through @ref ddsi_serdata structures. Returned samples are * marked as READ. * * Return value provides information about the number of samples read, which will * be <= maxs. Based on the count, the buffer will contain serialized data to be * read only when valid_data bit in sample info structure is set. * The buffer required for data values, could be allocated explicitly or can * use the memory from data reader to prevent copy. In the latter case, buffer and * sample_info should be returned back, once it is no longer using the data. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to @ref ddsi_serdata structures that contain * the serialized data. The pointers can be NULL. * @param[in] maxs Maximum number of samples to read. * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The precondition for this operation is not met. */ DDS_EXPORT dds_return_t dds_readcdr( dds_entity_t reader_or_condition, struct ddsi_serdata **buf, uint32_t maxs, dds_sample_info_t *si, uint32_t mask); /** * @brief Access the collection of serialized data values (of same type) and * sample info from the data reader, readcondition or querycondition * scoped by the provided instance handle. * @ingroup reading * * This operation implements the same functionality as dds_read_instance_wl, except that * samples are now in their serialized form. The serialized data is made available through * @ref ddsi_serdata structures. Returned samples are marked as READ. * * Return value provides information about the number of samples read, which will * be <= maxs. Based on the count, the buffer will contain serialized data to be * read only when valid_data bit in sample info structure is set. * The buffer required for data values, could be allocated explicitly or can * use the memory from data reader to prevent copy. In the latter case, buffer and * sample_info should be returned back, once it is no longer using the data. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to @ref ddsi_serdata structures that contain * the serialized data. The pointers can be NULL. * @param[in] maxs Maximum number of samples to read. * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] handle Instance handle related to the samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_readcdr_instance ( dds_entity_t reader_or_condition, struct ddsi_serdata **buf, uint32_t maxs, dds_sample_info_t *si, dds_instance_handle_t handle, uint32_t mask); /** * @brief Access the collection of serialized data values (of same type) and * sample info from the data reader, readcondition or querycondition. * @ingroup reading * * This call accesses the serialized data from the data reader, readcondition or * querycondition and makes it available to the application. The serialized data * is made available through @ref ddsi_serdata structures. Once read the data is * removed from the reader and cannot be 'read' or 'taken' again. * * Return value provides information about the number of samples read, which will * be <= maxs. Based on the count, the buffer will contain serialized data to be * read only when valid_data bit in sample info structure is set. * The buffer required for data values, could be allocated explicitly or can * use the memory from data reader to prevent copy. In the latter case, buffer and * sample_info should be returned back, once it is no longer using the data. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to @ref ddsi_serdata structures that contain * the serialized data. The pointers can be NULL. * @param[in] maxs Maximum number of samples to read. * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The precondition for this operation is not met. */ DDS_EXPORT dds_return_t dds_takecdr( dds_entity_t reader_or_condition, struct ddsi_serdata **buf, uint32_t maxs, dds_sample_info_t *si, uint32_t mask); /** * @brief Access the collection of serialized data values (of same type) and * sample info from the data reader, readcondition or querycondition * scoped by the provided instance handle. * @ingroup reading * * This operation implements the same functionality as dds_take_instance_wl, except that * samples are now in their serialized form. The serialized data is made available through * @ref ddsi_serdata structures. Returned samples are marked as READ. * * Return value provides information about the number of samples read, which will * be <= maxs. Based on the count, the buffer will contain serialized data to be * read only when valid_data bit in sample info structure is set. * The buffer required for data values, could be allocated explicitly or can * use the memory from data reader to prevent copy. In the latter case, buffer and * sample_info should be returned back, once it is no longer using the data. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to @ref ddsi_serdata structures that contain * the serialized data. The pointers can be NULL. * @param[in] maxs Maximum number of samples to read. * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] handle Instance handle related to the samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_takecdr_instance ( dds_entity_t reader_or_condition, struct ddsi_serdata **buf, uint32_t maxs, dds_sample_info_t *si, dds_instance_handle_t handle, uint32_t mask); /** * @brief Access the collection of data values (of same type) and sample info from the * data reader, readcondition or querycondition but scoped by the given * instance handle. * @ingroup reading * * This operation mplements the same functionality as dds_take, except that only data * scoped to the provided instance handle is taken. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_take_instance( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs, dds_instance_handle_t handle); /** * @brief Access loaned samples of data reader, readcondition or querycondition, * scoped by the given instance handle. * @ingroup reading * * This operation implements the same functionality as dds_take_wl, except that * only data scoped to the provided instance handle is read. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_take_instance_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs, dds_instance_handle_t handle); /** * @brief Take the collection of data values (of same type) and sample info from the * data reader, readcondition or querycondition based on mask and scoped * by the given instance handle. * @ingroup reading * * This operation implements the same functionality as dds_take_mask, except that only * data scoped to the provided instance handle is read. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] bufsz The size of buffer provided. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples read or an error code. * * @retval >=0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_take_instance_mask( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs, dds_instance_handle_t handle, uint32_t mask); /** * @brief Access loaned samples of data reader, readcondition or querycondition based * on mask and scoped by the given intance handle. * @ingroup reading * * This operation implements the same functionality as dds_take_mask_wl, except that * only data scoped to the provided instance handle is read. * * @param[in] reader_or_condition Reader, readcondition or querycondition entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si Pointer to an array of @ref dds_sample_info_t returned for each data value. * @param[in] maxs Maximum number of samples to read. * @param[in] handle Instance handle related to the samples to read. * @param[in] mask Filter the data based on dds_sample_state_t|dds_view_state_t|dds_instance_state_t. * * @returns A dds_return_t with the number of samples or an error code. * * @retval >= 0 * Number of samples read. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * One of the given arguments is not valid. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. * @retval DDS_RETCODE_PRECONDITION_NOT_MET * The instance handle has not been registered with this reader. */ DDS_EXPORT dds_return_t dds_take_instance_mask_wl( dds_entity_t reader_or_condition, void **buf, dds_sample_info_t *si, uint32_t maxs, dds_instance_handle_t handle, uint32_t mask); /** * @brief Read, copy and remove the status set for the entity * @ingroup reading * * This operation copies the next, non-previously accessed * data value and corresponding sample info and removes from * the data reader. As an entity, only reader is accepted. * * The read/take next functions return a single sample. The returned sample * has a sample state of NOT_READ, a view state of ANY_VIEW_STATE and an * instance state of ANY_INSTANCE_STATE. * * @param[in] reader The reader entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si The pointer to @ref dds_sample_info_t returned for a data value. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take_next( dds_entity_t reader, void **buf, dds_sample_info_t *si); /** * @brief Read, copy and remove the status set for the entity * @ingroup reading * * This operation copies the next, non-previously accessed * data value and corresponding sample info and removes from * the data reader. As an entity, only reader is accepted. * * The read/take next functions return a single sample. The returned sample * has a sample state of NOT_READ, a view state of ANY_VIEW_STATE and an * instance state of ANY_INSTANCE_STATE. * * After dds_take_next_wl function is being called and the data has been handled, * dds_return_loan() function must be called to possibly free memory. * * @param[in] reader The reader entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si The pointer to @ref dds_sample_info_t returned for a data value. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_take_next_wl( dds_entity_t reader, void **buf, dds_sample_info_t *si); /** * @brief Read and copy the status set for the entity * @ingroup reading * * This operation copies the next, non-previously accessed * data value and corresponding sample info. As an entity, * only reader is accepted. * * The read/take next functions return a single sample. The returned sample * has a sample state of NOT_READ, a view state of ANY_VIEW_STATE and an * instance state of ANY_INSTANCE_STATE. * * @param[in] reader The reader entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si The pointer to @ref dds_sample_info_t returned for a data value. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read_next( dds_entity_t reader, void **buf, dds_sample_info_t *si); /** * @brief Read and copy the status set for the loaned sample * @ingroup reading * * This operation copies the next, non-previously accessed * data value and corresponding loaned sample info. As an entity, * only reader is accepted. * * The read/take next functions return a single sample. The returned sample * has a sample state of NOT_READ, a view state of ANY_VIEW_STATE and an * instance state of ANY_INSTANCE_STATE. * * After dds_read_next_wl function is being called and the data has been handled, * dds_return_loan() function must be called to possibly free memory. * * @param[in] reader The reader entity. * @param[out] buf An array of pointers to samples into which data is read (pointers can be NULL). * @param[out] si The pointer to @ref dds_sample_info_t returned for a data value. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_read_next_wl( dds_entity_t reader, void **buf, dds_sample_info_t *si); /** * @defgroup loan (Loans API) * @ingroup dds */ /** * @brief Return loaned samples to a reader or writer * @ingroup loan * * Used to release sample buffers returned by a read/take operation (a reader-loan) * or, in case shared memory is enabled, of the loan_sample operation (a writer-loan). * * When the application provides an empty buffer to a reader-loan, memory is allocated and * managed by DDS. By calling dds_return_loan(), the reader-loan is released so that the buffer * can be reused during a successive read/take operation. When a condition is provided, the * reader to which the condition belongs is looked up. * * Writer-loans are normally released implicitly when writing a loaned sample, but you can * cancel a writer-loan prematurely by invoking the return_loan() operation. For writer loans, buf is * overwritten with null pointers for all successfully returned entries. Any failure causes it to abort, * possibly midway through buf. * * @param[in] entity The entity that the loan belongs to. * @param[in,out] buf An array of (pointers to) samples, some or all of which will be set to null pointers. * @param[in] bufsz The number of (pointers to) samples stored in buf. * * @returns A dds_return_t indicating success or failure * @retval DDS_RETCODE_OK * - the operation was successful; for a writer loan, all entries in buf are set to null * - this specifically includes cases where bufsz <= 0 while entity is valid * @retval DDS_RETCODE_BAD_PARAMETER * - the entity parameter is not a valid parameter * - buf is null, or bufsz > 0 and buf[0] = null * - (for writer loans) buf[0 <= i < bufsz] is null; operation is aborted, all buf[j < i] = null on return * @retval DDS_RETCODE_PRECONDITION_NOT_MET * - (for reader loans) buf was already returned (not guaranteed to be detected) * - (for writer loans) buf[0 <= i < bufsz] does not correspond to an outstanding loan, all buf[j < i] = null on return * @retval DDS_RETCODE_UNSUPPORTED * - (for writer loans) invoked on a writer not supporting loans. * @retval DDS_RETCODE_ILLEGAL_OPERATION * - the operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_return_loan( dds_entity_t entity, void **buf, int32_t bufsz); /** * @defgroup instance_handle (Instance Handles) * @ingroup dds * Instance handle <=> key value mapping. * Functions exactly as read w.r.t. treatment of data * parameter. On output, only key values set. * @code{c} * T x = { ... }; * T y; * dds_instance_handle_t ih; * ih = dds_lookup_instance (e, &x); * dds_instance_get_key (e, ih, &y); * @endcode */ /** * @brief This operation takes a sample and returns an instance handle to be used for subsequent operations. * @ingroup instance_handle * * @param[in] entity Reader or Writer entity. * @param[in] data Sample with a key fields set. * * @returns instance handle or DDS_HANDLE_NIL if instance could not be found from key. */ DDS_EXPORT dds_instance_handle_t dds_lookup_instance(dds_entity_t entity, const void *data); /** * @deprecated Get enabled status on entity. Use \ref dds_lookup_instance instead. * @ingroup instance_handle * * @param[in] entity Reader or Writer entity. * @param[in] data Sample with a key fields set. * * @returns instance handle or DDS_HANDLE_NIL if instance could not be found from key. */ DDS_DEPRECATED_EXPORT dds_instance_handle_t dds_instance_lookup(dds_entity_t entity, const void *data); /** * @brief This operation takes an instance handle and return a key-value corresponding to it. * @ingroup instance_handle * * @param[in] entity Reader, writer, readcondition or querycondition entity. * @param[in] inst Instance handle. * @param[out] data pointer to an instance, to which the key ID corresponding to the instance handle will be * returned, the sample in the instance should be ignored. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * One of the parameters was invalid or the topic does not exist. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * * DOC_TODO: Check return codes for completeness */ DDS_EXPORT dds_return_t dds_instance_get_key( dds_entity_t entity, dds_instance_handle_t inst, void *data); /** * @brief Begin coherent publishing or begin accessing a coherent set in a subscriber * @ingroup publication * * Invoking on a Writer or Reader behaves as if dds_begin_coherent was invoked on its parent * Publisher or Subscriber respectively. * * @param[in] entity The entity that is prepared for coherent access. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_ERROR * An internal error has occurred. * @retval DDS_RETCODE_BAD_PARAMETER * The provided entity is invalid or not supported. */ DDS_EXPORT dds_return_t dds_begin_coherent(dds_entity_t entity); /** * @brief End coherent publishing or end accessing a coherent set in a subscriber * @ingroup publication * * Invoking on a Writer or Reader behaves as if dds_end_coherent was invoked on its parent * Publisher or Subscriber respectively. * * @param[in] entity The entity on which coherent access is finished. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The provided entity is invalid or not supported. */ DDS_EXPORT dds_return_t dds_end_coherent(dds_entity_t entity); /** * @brief Trigger DATA_AVAILABLE event on contained readers * @ingroup subscriber * * The DATA_AVAILABLE event is broadcast to all readers owned by this subscriber that currently * have new data available. Any on_data_available listener callbacks attached to respective * readers are invoked. * * @param[in] subscriber A valid subscriber handle. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The provided subscriber is invalid. */ DDS_EXPORT dds_return_t dds_notify_readers(dds_entity_t subscriber); /** * @brief Checks whether the entity has one of its enabled statuses triggered. * @ingroup entity * * @param[in] entity Entity for which to check for triggered status. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_return_t dds_triggered(dds_entity_t entity); /** * @brief Get the topic * @ingroup entity * * This operation returns a topic (handle) when the function call is done * with reader, writer, read condition or query condition. For instance, it * will return the topic when it is used for creating the reader or writer. * For the conditions, it returns the topic that is used for creating the reader * which was used to create the condition. * * @param[in] entity The entity. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_ALREADY_DELETED * The entity has already been deleted. */ DDS_EXPORT dds_entity_t dds_get_topic(dds_entity_t entity); /** * @brief Get instance handles of the data readers matching a writer * @ingroup builtintopic * * This operation fills the provided array with the instance handles * of the data readers that match the writer. On successful output, * the number of entries of "rds" set is the minimum of the return * value and the value of "nrds". * * @param[in] writer The writer. * @param[in] rds The array to be filled. * @param[in] nrds The size of the rds array, at most the first * nrds entries will be filled. rds = NULL and nrds = 0 * is a valid way of determining the number of matched * readers, but inefficient compared to relying on the * matched publication status. * * @returns A dds_return_t indicating the number of matched readers * or failure. The return value may be larger than nrds * if there are more matching readers than the array can * hold. * * @retval >=0 * The number of matching readers. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not valid or rds = NULL and * nrds > 0. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_get_matched_subscriptions ( dds_entity_t writer, dds_instance_handle_t *rds, size_t nrds); /** * @brief Get a description of a reader matched with the provided writer * @ingroup builtintopic * * This operation looks up the reader instance handle in the set of * readers matched with the specified writer, returning a freshly * allocated sample of the DCPSSubscription built-in topic if found, * and NULL if not. The caller is responsible for freeing the * memory allocated, e.g. using dds_builtintopic_free_endpoint. * * This operation is similar to performing a read of the given * instance handle on a reader of the DCPSSubscription built-in * topic, but this operation additionally filters on whether the * reader is matched by the provided writer. * * @param[in] writer The writer. * @param[in] ih The instance handle of a reader. * * @returns A newly allocated sample containing the information on the * reader, or a NULL pointer for any kind of failure. * * @retval != NULL * The requested data * @retval NULL * The writer is not valid or ih is not an instance handle * of a matched reader. */ DDS_EXPORT dds_builtintopic_endpoint_t * dds_get_matched_subscription_data ( dds_entity_t writer, dds_instance_handle_t ih); /** * @brief Get instance handles of the data writers matching a reader * @ingroup builtintopic * * This operation fills the provided array with the instance handles * of the data writers that match the reader. On successful output, * the number of entries of "wrs" set is the minimum of the return * value and the value of "nwrs". * * @param[in] reader The reader. * @param[in] wrs The array to be filled. * @param[in] nwrs The size of the wrs array, at most the first * nwrs entries will be filled. wrs = NULL and wrds = 0 * is a valid way of determining the number of matched * readers, but inefficient compared to relying on the * matched publication status. * * @returns A dds_return_t indicating the number of matched writers * or failure. The return value may be larger than nwrs * if there are more matching writers than the array can * hold. * * @retval >=0 * The number of matching writers. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not valid or wrs = NULL and * nwrs > 0. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_get_matched_publications ( dds_entity_t reader, dds_instance_handle_t *wrs, size_t nwrs); /** * @brief Get a description of a writer matched with the provided reader * @ingroup builtintopic * * This operation looks up the writer instance handle in the set of * writers matched with the specified reader, returning a freshly * allocated sample of the DCPSPublication built-in topic if found, * and NULL if not. The caller is responsible for freeing the * memory allocated, e.g. using dds_builtintopic_free_endpoint. * * This operation is similar to performing a read of the given * instance handle on a reader of the DCPSPublication built-in * topic, but this operation additionally filters on whether the * writer is matched by the provided reader. * * @param[in] reader The reader. * @param[in] ih The instance handle of a writer. * * @returns A newly allocated sample containing the information on the * writer, or a NULL pointer for any kind of failure. * * @retval != NULL * The requested data * @retval NULL * The reader is not valid or ih is not an instance handle * of a matched writer. */ DDS_EXPORT dds_builtintopic_endpoint_t * dds_get_matched_publication_data ( dds_entity_t reader, dds_instance_handle_t ih); #ifdef DDS_HAS_TYPE_DISCOVERY /** * @brief Gets the type information from endpoint information that was * retrieved by dds_get_matched_subscription_data or * dds_get_matched_publication_data * @ingroup builtintopic * * @param[in] builtintopic_endpoint The builtintopic endpoint struct * @param[out] type_info Type information that will be allocated by this function in case of success. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * One or more parameters are invalid */ DDS_EXPORT dds_return_t dds_builtintopic_get_endpoint_type_info ( dds_builtintopic_endpoint_t * builtintopic_endpoint, const dds_typeinfo_t ** type_info); #endif /** * @brief Free the endpoint information that was retrieved by * dds_get_matched_subscription_data or dds_get_matched_publication_data * @ingroup builtintopic * * This operation deallocates the memory of the fields in a * dds_builtintopic_endpoint_t struct and deallocates the * struct itself. * * @param[in] builtintopic_endpoint The builtintopic endpoint struct */ DDS_EXPORT void dds_builtintopic_free_endpoint ( dds_builtintopic_endpoint_t * builtintopic_endpoint); /** * @brief Free the provided topic information * @ingroup builtintopic * * This operation deallocates the memory of the fields in a * dds_builtintopic_topic_t struct and deallocates the * struct itself. * * @param[in] builtintopic_topic The builtintopic topic struct */ DDS_EXPORT void dds_builtintopic_free_topic ( dds_builtintopic_topic_t * builtintopic_topic); /** * @brief Free the provided participant information * @ingroup builtintopic * * This operation deallocates the memory of the fields in a * dds_builtintopic_participant_t struct and deallocates the * struct itself. * * @param[in] builtintopic_participant The builtintopic participant struct */ DDS_EXPORT void dds_builtintopic_free_participant ( dds_builtintopic_participant_t * builtintopic_participant); /** * @brief This operation manually asserts the liveliness of a writer * or domain participant. * @ingroup entity * * This operation manually asserts the liveliness of a writer * or domain participant. This is used in combination with the Liveliness * QoS policy to indicate that the entity remains active. This operation need * only be used if the liveliness kind in the QoS is either * DDS_LIVELINESS_MANUAL_BY_PARTICIPANT or DDS_LIVELINESS_MANUAL_BY_TOPIC. * * @param[in] entity A domain participant or writer * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_assert_liveliness ( dds_entity_t entity); /** * @defgroup internal (Internal) * @ingroup dds */ /** * @defgroup testing (Testing tools) * @ingroup internal */ /** * * @brief This operation allows making the domain's network stack temporarily deaf and/or mute. * @ingroup testing * @warning Unstable API, for testing * * This is a support function for testing and, other special uses and is subject to change. * * @param[in] entity A domain entity or an entity bound to a domain, such * as a participant, reader or writer. * @param[in] deaf Whether to network stack should pretend to be deaf and * ignore any incoming packets. * @param[in] mute Whether to network stack should pretend to be mute and * discard any outgoing packets where it normally would. * pass them to the operating system kernel for transmission. * @param[in] reset_after Any value less than INFINITY will cause it to * set deaf = mute = false after reset_after ns have passed. * This is done by an event scheduled for the appropriate * time and otherwise forgotten. These events are not * affected by subsequent calls to this function. * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter. * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. */ DDS_EXPORT dds_return_t dds_domain_set_deafmute ( dds_entity_t entity, bool deaf, bool mute, dds_duration_t reset_after); /** * @defgroup xtypes (XTypes) * @ingroup dds * * CycloneDDS supports XTypes, but most of that functionality outside the new IDL constructs * happens behind the scenes. However, some API functionality is added that allows inspecting * types at runtime. Using it in C is not very ergonomic, but dynamic languages like Python can * make good use of it. */ /** * @brief This function resolves the type for the provided type identifier, * which can e.g. be retrieved from endpoint or topic discovery data. * @ingroup xtypes * * @param[in] entity A domain entity or an entity bound to a domain, such * as a participant, reader or writer. * @param[in] type_id Type identifier * @param[in] timeout Timeout for waiting for requested type information to be available * @param[out] type_obj The type information, untouched if type is not resolved * * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The entity parameter is not a valid parameter, type_id or type name * is not provided, or the sertype out parameter is NULL * @retval DDS_RETCODE_NOT_FOUND * A type with the provided type_id and type_name was not found * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_UNSUPPORTED * Cyclone DDS built without type discovery * (cf. DDS_HAS_TYPE_DISCOVERY) */ DDS_EXPORT dds_return_t dds_get_typeobj ( dds_entity_t entity, const dds_typeid_t *type_id, dds_duration_t timeout, dds_typeobj_t **type_obj); /** * @brief Free the type object that was retrieved using dds_get_typeobj * @ingroup xtypes * * @param[in] type_obj The type object * * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The type_obj parameter is NULL * @retval DDS_RETCODE_UNSUPPORTED * Cyclone DDS built without type discovery * (cf. DDS_HAS_TYPE_DISCOVERY) */ DDS_EXPORT dds_return_t dds_free_typeobj ( dds_typeobj_t *type_obj); /** * @brief This function gets the type information from the * provided topic, reader or writer * @ingroup xtypes * * @param[in] entity A topic/reader/writer entity * @param[out] type_info The type information, untouched if returncode indicates failure * * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The type_info parameter is null * @retval DDS_RETCODE_NOT_FOUND * The entity does not have type information set * @retval DDS_RETCODE_ILLEGAL_OPERATION * The operation is invoked on an inappropriate object. * @retval DDS_RETCODE_UNSUPPORTED * Cyclone DDS built without type discovery * (cf. DDS_HAS_TYPE_DISCOVERY) */ DDS_EXPORT dds_return_t dds_get_typeinfo ( dds_entity_t entity, dds_typeinfo_t **type_info); /** * @brief Free the type information that was retrieved using dds_get_typeinfo * @ingroup xtypes * * @param[in] type_info The type information * * * @returns A dds_return_t indicating success or failure. * * @retval DDS_RETCODE_OK * The operation was successful. * @retval DDS_RETCODE_BAD_PARAMETER * The type_info parameter is NULL * @retval DDS_RETCODE_UNSUPPORTED * Cyclone DDS built without type discovery * (cf. DDS_HAS_TYPE_DISCOVERY) */ DDS_EXPORT dds_return_t dds_free_typeinfo ( dds_typeinfo_t *type_info); #if defined (__cplusplus) } #endif #endif /* DDS_H */