1 #ifndef OMG_DDS_PUB_DATA_WRITER_IMPL_HPP_ 2 #define OMG_DDS_PUB_DATA_WRITER_IMPL_HPP_ 46 pub.is_nil() ?
dds::pub::qos::DataWriterQos() : pub.default_datawriter_qos(),
48 dds::core::status::StatusMask::none()))
50 ISOCPP_REPORT_STACK_DDS_BEGIN(pub);
51 this->delegate()->init(this->impl_);
56 const ::dds::topic::Topic<T>& topic,
61 new DELEGATE<T>(pub, topic, qos, listener, mask))
63 ISOCPP_REPORT_STACK_DDS_BEGIN(pub);
64 this->delegate()->init(this->impl_);
76 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
77 this->delegate()->write(sample);
84 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
85 this->delegate()->write(sample, timestamp);
92 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
93 this->delegate()->write(sample, instance);
99 const ::dds::core::InstanceHandle&
instance,
102 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
103 this->delegate()->write(sample, instance, timestamp);
106 template <
typename T>
110 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
111 this->delegate()->write(i);
114 template <
typename T>
119 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
120 this->delegate()->write(i, timestamp);
123 template <
typename T>
124 template <
typename FWIterator>
128 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
130 FWIterator b = begin;
133 this->delegate()->write(*b);
138 template <
typename T>
139 template <
typename FWIterator>
144 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
146 FWIterator b = begin;
149 this->delegate()->write(*b, timestamp);
154 template <
typename T>
155 template <
typename SamplesFWIterator,
typename HandlesFWIterator>
158 const SamplesFWIterator& data_end,
159 const HandlesFWIterator& handle_begin,
160 const HandlesFWIterator& handle_end)
162 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
164 SamplesFWIterator data = data_begin;
165 HandlesFWIterator handle = handle_begin;
167 while(data != data_end && handle != handle_end)
169 this->delegate()->write(*data, *handle);
175 template <
typename T>
176 template <
typename SamplesFWIterator,
typename HandlesFWIterator>
179 const SamplesFWIterator& data_end,
180 const HandlesFWIterator& handle_begin,
181 const HandlesFWIterator& handle_end,
184 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
186 SamplesFWIterator data = data_begin;
187 HandlesFWIterator handle = handle_begin;
189 while(data != data_end && handle != handle_end)
191 this->delegate()->write(*data, *handle, timestamp);
197 template <
typename T>
201 this->delegate()->
qos(qos);
205 template <
typename T>
209 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
215 template <
typename T>
219 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
221 this->
write(data.first, data.second);
225 template <
typename T>
229 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
231 this->
write(data.first, data.second);
235 template <
typename T>
239 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
241 return manipulator(*
this);
244 template <
typename T>
248 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
253 template <
typename T>
258 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
260 return this->delegate()->register_instance(key, timestamp);
263 template <
typename T>
267 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
273 template <
typename T>
278 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
279 this->delegate()->unregister_instance(i, timestamp);
283 template <
typename T>
287 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
293 template <
typename T>
298 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
299 this->delegate()->unregister_instance(key, timestamp);
303 template <
typename T>
307 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
313 template <
typename T>
318 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
319 this->delegate()->dispose_instance(i, timestamp);
323 template <
typename T>
327 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
333 template <
typename T>
338 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
339 this->delegate()->dispose_instance(key, timestamp);
343 template <
typename T>
346 const ::dds::core::InstanceHandle& h)
348 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
350 return this->delegate()->key_value(i, h);
353 template <
typename T>
357 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
359 return this->delegate()->key_value(sample, h);
362 template <
typename T>
366 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
368 return this->delegate()->lookup_instance(key);
371 template <
typename T>
375 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
377 return this->delegate()->topic();
380 template <
typename T>
383 const ::dds::core::status::StatusMask& mask)
385 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
387 this->delegate()->listener(listener, mask);
390 template <
typename T>
394 ISOCPP_REPORT_STACK_DDS_BEGIN(*
this);
396 return this->delegate()->listener();
422 #include <org/opensplice/pub/AnyDataWriterDelegate.hpp> 424 template <
typename T>
425 dds::pub::detail::DataWriter<T>::DataWriter(
427 const ::dds::topic::Topic<T>&
topic,
431 : ::org::opensplice::pub::AnyDataWriterDelegate(qos, topic), pub_(pub), topic_(topic)
433 ISOCPP_REPORT_STACK_DDS_BEGIN(pub);
436 ISOCPP_THROW_EXCEPTION(ISOCPP_PRECONDITION_NOT_MET_ERROR,
"DataWriter cannot be created, topic information not found");
445 if (topic.qos()->force_merge()) {
449 org::opensplice::pub::qos::DataWriterQosDelegate dwQos = qos_.delegate();
453 u_writerQos uQos = dwQos.u_qos();
455 u_publisher uPublisher = (u_publisher)(pub_.delegate()->get_user_handle());
456 u_topic uTopic = (u_topic)(topic.delegate()->get_user_handle());
458 std::string name =
"writer <" + topic.name() +
">";
460 u_writer uWriter = u_writerNew(uPublisher, name.c_str(), uTopic, uQos);
461 u_writerQosFree(uQos);
464 ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR,
"Failed to create DataWriter");
466 topic_.delegate()->incrNrDependents();
469 this->setCopyIn(org::opensplice::topic::TopicTraits<T>::getCopyIn());
470 this->setCopyOut(org::opensplice::topic::TopicTraits<T>::getCopyOut());
472 this->userHandle = (u_object)uWriter;
473 this->listener_set((
void*)listener, mask);
474 this->set_domain_id(this->pub_.delegate()->get_domain_id());
477 template <
typename T>
478 dds::pub::detail::DataWriter<T>::~DataWriter()
489 template <
typename T>
491 dds::pub::detail::DataWriter<T>::init(ObjectDelegate::weak_ref_type weak_ref)
494 this->set_weak_ref(weak_ref);
496 this->pub_.delegate()->add_datawriter(*
this);
498 this->listener_dispatcher_set(this->pub_.delegate()->listener_dispatcher_get());
500 this->listener_enable();
502 if (this->pub_.delegate()->is_enabled() && this->pub_.delegate()->is_auto_enable()) {
507 template <
typename T>
509 dds::pub::detail::DataWriter<T>::write(
const T& sample)
512 AnyDataWriterDelegate::write((u_writer)(this->userHandle),
518 template <
typename T>
520 dds::pub::detail::DataWriter<T>::write(
const T& sample,
const dds::core::Time& timestamp)
523 AnyDataWriterDelegate::write((u_writer)(this->userHandle),
529 template <
typename T>
531 dds::pub::detail::DataWriter<T>::write(
const T& sample, const ::dds::core::InstanceHandle&
instance)
534 AnyDataWriterDelegate::write((u_writer)(this->userHandle),
540 template <
typename T>
542 dds::pub::detail::DataWriter<T>::write(
const T& sample,
543 const ::dds::core::InstanceHandle& instance,
547 AnyDataWriterDelegate::write((u_writer)(this->userHandle),
553 template <
typename T>
558 AnyDataWriterDelegate::write((u_writer)(this->userHandle),
564 template <
typename T>
570 AnyDataWriterDelegate::write((u_writer)(this->userHandle),
576 template <
typename T>
578 dds::pub::detail::DataWriter<T>::writedispose(
const T& sample)
580 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
582 AnyDataWriterDelegate::writedispose(
583 (u_writer)(this->userHandle),
589 template <
typename T>
591 dds::pub::detail::DataWriter<T>::writedispose(
const T& sample,
const dds::core::Time& timestamp)
593 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
595 AnyDataWriterDelegate::writedispose(
596 (u_writer)(this->userHandle),
602 template <
typename T>
604 dds::pub::detail::DataWriter<T>::writedispose(
const T& sample, const ::dds::core::InstanceHandle& instance)
606 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
608 AnyDataWriterDelegate::writedispose(
609 (u_writer)(this->userHandle),
615 template <
typename T>
617 dds::pub::detail::DataWriter<T>::writedispose(
619 const ::dds::core::InstanceHandle& instance,
622 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
624 AnyDataWriterDelegate::writedispose(
625 (u_writer)(this->userHandle),
631 template <
typename T>
635 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
637 AnyDataWriterDelegate::writedispose(
638 (u_writer)(this->userHandle),
644 template <
typename T>
646 dds::pub::detail::DataWriter<T>::writedispose(
650 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
652 AnyDataWriterDelegate::writedispose(
653 (u_writer)(this->userHandle),
659 template <
typename T>
660 template <
typename FWIterator>
662 dds::pub::detail::DataWriter<T>::writedispose(
const FWIterator& begin,
const FWIterator& end)
664 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
666 FWIterator b = begin;
674 template <
typename T>
675 template <
typename FWIterator>
677 dds::pub::detail::DataWriter<T>::writedispose(
const FWIterator& begin,
const FWIterator& end,
680 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
682 FWIterator b = begin;
690 template <
typename T>
691 template <
typename SamplesFWIterator,
typename HandlesFWIterator>
693 dds::pub::detail::DataWriter<T>::writedispose(
694 const SamplesFWIterator& data_begin,
695 const SamplesFWIterator& data_end,
696 const HandlesFWIterator& handle_begin,
697 const HandlesFWIterator& handle_end)
699 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
701 SamplesFWIterator data = data_begin;
702 HandlesFWIterator handle = handle_begin;
704 while(data != data_end && handle != handle_end)
712 template <
typename T>
713 template <
typename SamplesFWIterator,
typename HandlesFWIterator>
715 dds::pub::detail::DataWriter<T>::writedispose(
716 const SamplesFWIterator& data_begin,
717 const SamplesFWIterator& data_end,
718 const HandlesFWIterator& handle_begin,
719 const HandlesFWIterator& handle_end,
722 ISOCPP_REPORT_STACK_DELEGATE_BEGIN(
this);
724 SamplesFWIterator data = data_begin;
725 HandlesFWIterator handle = handle_begin;
727 while(data != data_end && handle != handle_end)
735 template <
typename T>
736 const ::dds::core::InstanceHandle
737 dds::pub::detail::DataWriter<T>::register_instance(
const T& key,
741 dds::core::InstanceHandle handle(AnyDataWriterDelegate::register_instance((u_writer)(this->userHandle), &key, timestamp));
745 template <
typename T>
747 dds::pub::detail::DataWriter<T>::unregister_instance(const ::dds::core::InstanceHandle& handle,
751 AnyDataWriterDelegate::unregister_instance((u_writer)(this->userHandle), handle, timestamp);
754 template <
typename T>
756 dds::pub::detail::DataWriter<T>::unregister_instance(
const T& sample,
760 AnyDataWriterDelegate::unregister_instance((u_writer)(this->userHandle), &sample, timestamp);
763 template <
typename T>
765 dds::pub::detail::DataWriter<T>::dispose_instance(const ::dds::core::InstanceHandle& handle,
769 AnyDataWriterDelegate::dispose_instance((u_writer)(this->userHandle), handle, timestamp);
772 template <
typename T>
774 dds::pub::detail::DataWriter<T>::dispose_instance(
const T& sample,
778 AnyDataWriterDelegate::dispose_instance((u_writer)(this->userHandle), &sample, timestamp);
782 template <
typename T>
785 const ::dds::core::InstanceHandle& h)
790 AnyDataWriterDelegate::get_key_value((u_writer)(this->userHandle), &sample, h);
797 template <
typename T>
799 dds::pub::detail::DataWriter<T>::key_value(T& sample, const ::dds::core::InstanceHandle& h)
803 AnyDataWriterDelegate::get_key_value((u_writer)(this->userHandle), &sample, h);
808 template <
typename T>
810 dds::pub::detail::DataWriter<T>::lookup_instance(
const T& key)
819 template <
typename T>
821 dds::pub::detail::DataWriter<T>::topic()
const 826 template <
typename T>
828 dds::pub::detail::DataWriter<T>::publisher()
const 833 template <
typename T>
836 const ::dds::core::status::StatusMask& mask)
839 this->listener_set((
void*)listener, mask);
840 this->listener_enable();
843 template <
typename T>
845 dds::pub::detail::DataWriter<T>::listener()
const 850 template <
typename T>
852 dds::pub::detail::DataWriter<T>::close()
855 this->listener_dispatcher_reset();
857 org::opensplice::core::ScopedObjectLock scopedLock(*
this);
859 topic_.delegate()->decrNrDependents();
861 this->pub_.delegate()->remove_datawriter(*
this);
863 org::opensplice::pub::AnyDataWriterDelegate::close();
868 template <
typename T>
870 dds::pub::detail::DataWriter<T>::wrapper()
872 typename DataWriter::ref_type ref =
873 OSPL_CXX11_STD_MODULE::dynamic_pointer_cast<
DataWriter<T> >(this->get_strong_ref());
879 template <
typename T>
881 dds::pub::detail::DataWriter<T>::listener_notify(
882 ObjectDelegate::ref_type source,
883 uint32_t triggerMask,
894 typename DataWriter::ref_type ref =
895 OSPL_CXX11_STD_MODULE::dynamic_pointer_cast<
DataWriter<T> >(source);
899 if (triggerMask & V_EVENT_LIVELINESS_LOST) {
901 status.delegate().v_status(((v_writerStatus)eventData)->livelinessLost);
905 if (triggerMask & V_EVENT_OFFERED_DEADLINE_MISSED) {
907 status.delegate().v_status(((v_writerStatus)eventData)->deadlineMissed);
911 if (triggerMask & V_EVENT_OFFERED_INCOMPATIBLE_QOS) {
913 status.delegate().v_status(((v_writerStatus)eventData)->incompatibleQos);
917 if (triggerMask & V_EVENT_PUBLICATION_MATCHED) {
919 status.delegate().v_status(((v_writerStatus)eventData)->publicationMatch);
DataWriter allows the application to set the value of the sample to be published under a given Topic...
virtual void on_liveliness_lost(dds::pub::DataWriter< T > &writer, const dds::core::status::LivelinessLostStatus &status)=0
DataWriter & operator<<(const T &data)
const ::dds::core::InstanceHandle register_instance(const T &key)
const ::dds::core::InstanceHandle handle() const
DataWriter & unregister_instance(const ::dds::core::InstanceHandle &i)
A TopicInstance encapsulates a dds::sub::Sample and its associated dds::core::InstanceHandle.
Topic is the most basic description of the data to be published and subscribed.
virtual void on_publication_matched(dds::pub::DataWriter< T > &writer, const dds::core::status::PublicationMatchedStatus &status)=0
void write(const T &sample)
dds::topic::TopicInstance< T > & key_value(dds::topic::TopicInstance< T > &i, const ::dds::core::InstanceHandle &h)
Support functionality to check if a given object type is a Topic.
Class to hold the handle associated with in sample instance.
static const Time invalid()
virtual void on_offered_deadline_missed(dds::pub::DataWriter< T > &writer, const dds::core::status::OfferedDeadlineMissedStatus &status)=0
void writedispose(const T &sample)
const dds::pub::qos::PublisherQos & qos() const
virtual void on_offered_incompatible_qos(dds::pub::DataWriter< T > &writer, const dds::core::status::OfferedIncompatibleQosStatus &status)=0
StatusMask is a bitmap or bitset field.
DataWriter events Listener.
DataWriter(const dds::pub::Publisher &pub, const ::dds::topic::Topic< T > &topic)
DataWriterListener< T > * listener() const
dds::core::InstanceHandle lookup_instance(const T &key)
This object provides the basic mechanism for an application to specify Quality of Service attributes ...
const dds::topic::Topic< T > & topic() const
The Publisher acts on the behalf of one or several DataWriter objects that belong to it...
dds::pub::qos::DataWriterQos qos() const
dds::sub::functors::InstanceManipulatorFunctor instance(const dds::core::InstanceHandle &h)
DataWriter & dispose_instance(const ::dds::core::InstanceHandle &i)